Zum Inhalt springen

Kommandozeilenparameter und Kosinussatz (war: Kann mir jemand bei meiner Aufgaben...)


Empfohlene Beiträge

Geschrieben

Moin Moin zusammen,

ich habe da eine Aufgabenstellung, bei der ich mal Hilfe brauche.

Hier erstmal die Aufgabenstellung:

Aufgabe:

Erzeugen Sie ein C-Programm, dass mit Hilfe des Kosinussatzes die 3. Seite eines Dreiecks ausrechnet: c² = a² + b² - 2 * a * b * cos(y); y : Winkel; a, b, c: Seitenlängen

_________________________________________________________________

Das habe ich schon so weit. Jetzt kommt noch die Modifizierung und da komme ich nicht weiter. Unten kommt aber nach der Aufgabenstellung zur Modifizierung der Quelltext, damit ihr mal gucken könnt, wie weit ich ungefähr bin....

_________________________________________________________________

Aufgabenstellung:

Modifiziern Sie Ihr C-Programm dahingehend, dass optional zwei Seiten und der Winkel beim Programmaufruf direkt übergeben werden. In diesem Fall, sollen keine wweiteren Eingabeaufforderungen und keine weiteren Eingaben erfolgen.

_________________________________________________________________

Das ganze soll halt mit folgendem Befehl vollbracht werden:

int main (int argc, char * argv[])

Tja und hier kommt bei mir nur noch Bahnhof... :confused:

Weiß jemand wie ich das umsetzen kann? Mir fehlt da irgentwie das verständniss.......

Jetzt noch der Quelltext und ich sage schon mal Thanx im voraus...:

/*

Diese Programm ist Open Source. Kann also beliebig verändert und / oder bearbeitet werden.

Bei Fragen einfach eine EMail an mich schicken:

stefan.aust1@gmx.net

C U and have fun , Phade

*/

#include <stdio.h> // includen

#include <math.h> // der

#include <stdlib.h> // benötigten

#include <string.h> // Headerdateien

#define PI 3.14159265359 // Definition von Pi

float cosinuss(float a, float b, float y) // Kosinusfunktion

{

float c; // Hier c, da es gesucht wird!!

c = sqrt (a * a + b * b -2 * a * b * cos(y)); // Hier wird c ausgerechnet

if(c<0)

{

c = -1;

}

return c; // Wird nur zurückgegeben, wenn ein Fehler aufgetreten ist

}

int main (int argc, char * argv[]) // Hauptfunktion mit Kommandozeilenparameter interpretieren

{

if (argc == 1)

{

modus = atoi( argv[1]);

}

if (modus > 2 || modus < 1)

{

modus = menue;

}

printf ("\n argc: %i modus entspricht argv[1]: %i menue: %i \n", argc, modus, menue); // Ausgabe zu Testzwecken

float y, w, a, b, c, grad; // Deklaration

printf ("\nBitte 1 eingeben wenn ein Winkel in rad oder \n\neine 2 wenn ein Winkel in °(Grad) vorliegt: "); // Auswahl

scanf ("%f", &grad); // Auslesen der Auswahl

printf ("\n0 eingeben um Programm zu beenden!\n"); // Ausgabe Programmende

do

{

if(grad==1)

{

printf ("\nErste Seite eingeben: ");

scanf ("%f", &a);

printf ("\nZweite Seite eingeben: ");

scanf ("%f", &B);

printf ("\nWinkel eingeben: ");

scanf ("%f", &y);

}

else

{

printf ("\nErste Seite eingeben: ");

scanf ("%f", &a);

printf ("\nZweite Seite eingeben: ");

scanf ("%f", &B);

printf ("\nWinkel eingeben: ");

scanf ("%f", &w);

}

if(a != 0.0 && b != 0.0 && w != 0.0 && y != 0.0) // Berechnungsbedingung

{

y = (PI / 180) * w;

c = cosinuss (a, b, y);

printf ("\n\nDie dritte Seite beträgt: %.2f\n", c); // Ausgabe

}

else

{

printf("\nDas Programm ist beendet!!"); // Ausgabe

}

}

while(a != 0.0 && b != 0.0 && w != 0.0 && y != 0.0);

return 0; // Es wird nichts zurückgegeben

} // Ende des Quelltextes

Geschrieben

Hey!!

Was verstehst denn daran nicht??

In argc steht die Anzahl der Argumente, im argv array stehen die Argumente selber!

ACHTUNG: argv[0] ist der Programmname somit ist argc midestens immer 1!

Die Eingabe der Werte fällt jetzt weg..... stattdessen musst du die char arrays in float umwandeln und mit denen dann rechnen!

Geschrieben

Hallo

argc enthält die Anzahl der Parameter die du beim Programmstart angibst. Aber eine Besonderheit ist, dass der Programmname auch schon als Parameter zählt. Demzufolge hast du immer mindestens einen Parameter.

In dem char* array argv[] stehen die einzelnen Parameter drin. Dementsprechend enthält argv[0] immer den Programmnamen.

Wenn Deine ausführbare Datei "cos.exe" heißt, kannst Du sie mit dem Kommandoaufruf "cos.exe 10 10 70" ausführen. argc hat dann den Wert 4.

Das char*-Array argv enthält dann folgende Werte.

argv[0] = "cos.exe"

argv[1] = "10"

argv[2] = "10"

argv[3] = "70"

Du musst beachten, dass die Werte in argv alle als char* vorliegen. Dementsprechend muss man sie zum Rechnen in floats umwandeln.

Jetzt kann man argc abprüfen, ob die richtige Anzahl an Werten eingegeben wurden und dann auf die einzelnen Werte in argv zugreifen und braucht diese Werte dann nicht mehr über die Tastatur eingeben zu lassen.

Wurstpate

Geschrieben
Hallo

argc enthält die Anzahl der Parameter die du beim Programmstart angibst. Aber eine Besonderheit ist, dass der Programmname auch schon als Parameter ...

... dann auf die einzelnen Werte in argv zugreifen und braucht diese Werte dann nicht mehr über die Tastatur eingeben zu lassen.

Wurstpate

Schön erklärt! Kompliment!

Falls noch n Beispiel brauchst meld dich bei mir!

Geschrieben

Hi zum dritten,

habe versucht mein Progrämmchen zu Kompilieren und volgende Meldungen bekomme ich zurück:

kosi001.cpp: In function `int main(int, char**)':

kosi001.cpp:26: error: `modus' undeclared (first use this function)

kosi001.cpp:26: error: (Each undeclared identifier is reported only once for each function it appears in.)

kosi001.cpp:31: error: `menue' undeclared (first use this function)

Das bedeutet doch, dass ich noch irgendwo menue und modus deklarieren muss oder nicht??? (sch...ockolade, nur wo....... :( )

Geschrieben

Hi

Wozu willst du denn diese beiden Variablen verwenden?

Ich hab in deinem Programm keine sinnvolle Verwendung dafür gesehen.

Außerdem ist mir grade noch aufgefallen, dass du die float-Variablen nicht am Anfang des Blockes deklariert hast. Man muss Variablendeklarationen in C immer am Anfang eines Blockes, sprich einer geschweiften öffnenden Klammer, machen.

Wurstpate

Geschrieben

Hey,

sorry aber kannst du das genauer erklären?

Wozu willst du denn diese beiden Variablen verwenden?

Ich hab in deinem Programm keine sinnvolle Verwendung dafür gesehen.

Also um genau zu sein will nicht ich diese Variablen verwenden, sondern unser Klassenlehrer. Ich habe im Gurnde keine Ahnung von dieser Sache, ich mache dieshier zum aller ersten mal!!! :eek: So wie ungefähr jeder in meiner Klasse. Wir habe so ein tollen Aufgabenzettel bekommen wo die zweite Arbeitsanweisung, mit diesen Variablen, drauf stehen. :mod:

Geschrieben

Hi all,

also, ich habe das Programm wie unten zu sehen geändert. Kompilieren funktioniert! Nur wenn ich das Prorgamm versuche zu starten, wie es Wurstpate, siehe Zitat, angibt, startet es ganz normal und "ignoriert" quasi die Eingabe.

Wenn Deine ausführbare Datei "cos.exe" heißt, kannst Du sie mit dem Kommandoaufruf "cos.exe 10 10 70" ausführen.

Nun soll es aber die z.B.: 10 10 70 übernehmen, eine Ausgabe "auswerfen" und das programm beenden.

Die Ausgabe könnte dann zum Beispiel so ausehen:


Erste Seite: 10

Zweite Seite: 10 

Winkel y: 70 

Die Dritte Seite beträgt: xxx

(möchte ich jetzt nicht wirklich ausrechnen)

Hat da jemand eine Idee? Ich finde den Fehler zum Verrecken nicht.....

Geschrieben

Sorry hatte vegessen ihn mit zu Posten.

Hier ist der Quelltext:

#include <stdio.h> // includen

#include <math.h> // der

#include <stdlib.h> // benötigten

#include <string.h> // Headerdateien

#define PI 3.14159265359 // Definition von Pi

float cosinuss(float a, float b, float y) // Kosinusfunktion

{

float c; // Hier c, da es gesucht wird!!

c = sqrt (a * a + b * b -2 * a * b * cos(y)); // Hier wird c ausgerechnet

if(c<0)

{

c = -1;

}

return c; // Wird nur zurückgegeben, wenn ein Fehler aufgetreten ist

}

int main (int argc, char * argv[0]) // Hauptfunktion mit Kommandozeilenparameter interpretieren

{

int modus;

int menue;

if (argc == 1)

{

modus = atoi(argv[1]);

}

if (modus > 2 || modus < 1)

{

modus = menue;

}

float y, w, a, b, c, grad; // Deklaration

printf ("\nBitte 1 eingeben wenn ein Winkel in rad oder \n\neine 2 wenn ein Winkel in °(Grad) vorliegt: "); // Auswahl

scanf ("%f", &grad); // Einlesen der Auswahl

printf ("\n0 bei jedem Wert eingeben um Programm zu beenden!\n"); // Ausgabe Programmende

do

{

if(grad==1)

{

printf ("\nErste Seite eingeben: ");

scanf ("%f", &a);

printf ("\nZweite Seite eingeben: ");

scanf ("%f", &B);

printf ("\nWinkel eingeben: ");

scanf ("%f", &y);

}

else

{

printf ("\nErste Seite eingeben: ");

scanf ("%f", &a);

printf ("\nZweite Seite eingeben: ");

scanf ("%f", &B);

printf ("\nWinkel eingeben: ");

scanf ("%f", &w);

}

if(a != 0.0 && b != 0.0 && w != 0.0 && y != 0.0) // Berechnungsbedingung

{

y = (PI / 180) * w;

c = cosinuss (a, b, y);

printf ("\n\nDie dritte Seite beträgt: %.2f\n", c); // Ausgabe

}

else

{

printf("\nDas Programm ist beendet!!\n\n"); // Ausgabe

}

}

while(a != 0.0 && b != 0.0 && w != 0.0 && y != 0.0);

return 1; // Es wird nichts zurückgegeben

} // Ende des Quelltextes

Geschrieben

Hi

1. Du musst alle deine Variablen am Anfang des Programms deklarieren, sonst läufst du in einen Fehler.

2. Ich verstehe den Sinn der Stelle mit menue und modus immer noch nicht.

Du musst das Programm mit den Kommandozeilenparametern so gestalten, dass du argc überprüfst. Wenn argc den Wert 1 hat, dann wurde das Programm ohne weitere Parameter gestartet. Dann musst du die Werte manuell einlesen.

Wenn argc den Wert 4 hat, dann musst du die übergebenen Parameter (auf die du über argv[] zugreifen kannst) in deinen Variablen, die du zur Kosinusberechnung brauchst, abspeichern.

Danach musst du mit den entweder eingelesenen oder per Parameterübergabe übergebenen Werten deine kosinusberechnung durchführen.

Darüberhinaus könnte man, wenn argc weder 1 noch 4 ist, das Programm mit einer geeigneten Fehlermeldung beenden, weil dann eine falsche Anzahl an Parametern übergeben wurde.

Wurstpate

Geschrieben

Hier mal eine kleine Hilfestellung..... war ne 5 Minuten-Lösung also sorry für evtl. Rechtschreibfehler oder kleine Syntaxfehler..... habs nicht getestet!


int main (int argc, char * argv[]) // Hauptfunktion mit Kommandozeilenparameter interpretieren

{

int modus;

int menue;

int abbruch;

float y, w, a, b, c, grad; // Deklaration


	abbruch = 0;


  if (argc <= 1 || argc >= 5)

  {

  	//Dem Programm wurden eine falsche Anzahl von Parametern übergeben und folglich beendet!

  	return FEHLERWERT;  //<<--- erst noch definieren oder eine entsprechende Zahl angeben!

  }


  /*if (modus > 2 || modus < 1)

  {

 		modus = menue;								<<-- völlig sinnlos!!!!!

  } */


  printf ("\nBitte 1 eingeben wenn ein Winkel in rad oder \n\neine 2 wenn ein Winkel in °(Grad) vorliegt: "); // Auswahl

  scanf ("%f", &grad); // Einlesen der Auswahl   << Abfrage ob der 3te Parameter in RAD oder Grad angegeben ist!


  do

  {

    //HIer musst du argv[1] und argv[2] und argv[3] in floats umwandeln

    //das ergibt dann die Werte für a, b, y(w)



    y = (PI / 180) * w;  // <<<---- Was auch immer du hier machst..... auf jeden Fall steht bei

      											// grad == 1 hinterher was falsches drin! Du brauchst also hier ne if-Abfrage!


    c = cosinuss (a, b, y);

    printf ("\n\nDie dritte Seite beträgt: %.2f\n", c); // Ausgabe


    printf("Wollen Sie das Programm beenden??? 1 - Ja / 0 - Nein: ");

    scanf("%d", &abbruch);


  } while((a != 0.0 && b != 0.0 && w != 0.0 && y != 0.0) || abbruch == 1);


  return 1; // Es wird nichts zurückgegeben


} // Ende des Quelltextes


Geschrieben

Hi

In dem Quellcode meines Vorschreibers sind auch noch ein paar Fehler drin.

1. Das Programm gibt bei jedem Durchlauf denselben Wert aus, weil die Werte nicht eingelesen werden.

2. Die Abfrage, ob man einen Winkel in Rad oder in ° vorliegt muss auch in die do...while Schleife

3. Es wird zwar überprüft wieviele Kommandozeilenparameter angegeben werden, aber es wird nicht darauf reagiert, wenn z.B. nur einer angegeben ist. Dann müsste man ja die anderen Parameter einlesen.

Wurstpate

Geschrieben
Hi

In dem Quellcode meines Vorschreibers sind auch noch ein paar Fehler drin.

1. Das Programm gibt bei jedem Durchlauf denselben Wert aus, weil die Werte nicht eingelesen werden.

2. Die Abfrage, ob man einen Winkel in Rad oder in ° vorliegt muss auch in die do...while Schleife

3. Es wird zwar überprüft wieviele Kommandozeilenparameter angegeben werden, aber es wird nicht darauf reagiert, wenn z.B. nur einer angegeben ist. Dann müsste man ja die anderen Parameter einlesen.

Wurstpate

1. Sag ja war ne 5 min Lösung! Bei nem Test hätt ich das gemerkt!

2. Kann man machen, muss man aber nicht unbedingt, ist allerdings schöner und DAU-freundlicher!

3. Stimmt! Hab ich nicht dran gedacht, aber das kann man auch auf die 5 min Lösung schieben!

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...