Phade Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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", &; printf ("\nWinkel eingeben: "); scanf ("%f", &y); } else { printf ("\nErste Seite eingeben: "); scanf ("%f", &a); printf ("\nZweite Seite eingeben: "); scanf ("%f", &; 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 Zitieren
rscheyerle Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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! Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 Hi, leider komme ich durch deine Erleuterung total ins schlingern ..... hast du eventuell ein Beispiel??? (muss ja nichts mit dieser Aufage zu tun haben...) Zitieren
Wurstpate Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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 Zitieren
rscheyerle Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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! Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 Hi nochmal, Ok, meine es verstanden zu haben!!! Werde das jetzt mal versuchen umzusetzen und werde meine Lösung dann hier kunttun. bis später Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 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....... ) Zitieren
Wurstpate Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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 Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 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: Zitieren
rscheyerle Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 Die Variablen deklarierst du direkt nach m main und zwar sieht das dann folgendermaßen aus: int main(int argc, char * argv[]) { int menue; int modus; //restlicher Code } Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 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..... Zitieren
Wurstpate Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 Hi Wo ist denn der Quelltext dazu? Dann könnte ich dir eventuell weiterhelfen. Brauchst ja nur den von der main Funktion zu posten, die cosinus Funktion funktioniert ja. Wurstpate Zitieren
rscheyerle Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 Wie sieht deine main-Funktion jetzt aus? Wie hast du die Strings umgewandelt? wo rechnest du mit was? Poste am besten nochmal deinen kompletten Code! Zitieren
Phade Geschrieben 21. Dezember 2004 Autor Geschrieben 21. Dezember 2004 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", &; printf ("\nWinkel eingeben: "); scanf ("%f", &y); } else { printf ("\nErste Seite eingeben: "); scanf ("%f", &a); printf ("\nZweite Seite eingeben: "); scanf ("%f", &; 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 Zitieren
Wurstpate Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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 Zitieren
rscheyerle Geschrieben 21. Dezember 2004 Geschrieben 21. Dezember 2004 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 Zitieren
Wurstpate Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 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 Zitieren
rscheyerle Geschrieben 22. Dezember 2004 Geschrieben 22. Dezember 2004 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! Zitieren
Phade Geschrieben 23. Dezember 2004 Autor Geschrieben 23. Dezember 2004 Hi zusammen, @ rscheyerle, mein Klassenlehrer ist so ein dau und er hat mir halt auch diese Aufgabe gegeben.... (Und dazu heißt er auch noch so.......) Zitieren
Empfohlene Beiträge
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.