Einen Denkanstoß?
-
Guten Abend die Damen und Herren,
Ich bin erst vor kurzem studiumbedingt mit dem Programmieren in Kontakt gekommen und habe zur Hausaufgabe eine kleine Aufgabe gestellt bekommen.
Die Aufgabe ist recht leicht erklärt.
Das programmierte Programm soll aus einer Datei eine Menge an Zahlen herauslesen und diese dann Ausgeben. Das Programm besteht aus einem Hauptprogramm "main" und einem Unterprogramm "ausgabe".main:
#include<stdio.h> /* Funktionsdeklarationen */ void ausgabe (int zahl[5], int richtung, int anzahl); int main (void) { /* Variablendeklarationen */ int i, zahl[5], anzahl; char wahl; FILE *datin; char buffer[100]; datin = fopen("zahlen.dat", "r"); /* öffnen der Datei daten.dat im Lesemodus */ if (datin == NULL) /* fehlgeschlagen? */ printf ("Fehler! Datei 'zahlen.dat' existiert nicht\n\n"); else { printf("Willkommen, ich bin ein fehlerhaftes Programm\n"); printf ("5 Zahlen werden aus Datei gelesen. Zum Einlesen bitte <Enter> drücken\n"); do { /* Schleife mit Austrittsbedingung */ printf ("Lese %i. Zahl", i+1); getchar(); /* getchar() wartet auf <Enter> */ fscanf (datin, "%i", &zahl[i+1]); /* einlesen aus Datei */ printf ("%i \n", zahl[i+1]); i++; /* entspricht i = i + 1; */ } while (! (i >= 5) ); do { printf ("Wie viele Zahlen sollen angezeigt werden? "); fgets (buffer, 100, stdin); /* einlesen von Tastatur */ sscanf (buffer, "%i", &anzahl); if(anzahl < 1 || anzahl > 5) printf ("Fehler! Maximal 5...\n\n"); } while ( (anzahl < 1 || anzahl > 5) ); do { printf ("Sollen die Zahlen [h]intereinander oder [u]ntereineander angezeigt werden? "); fgets (buffer, 100, stdin); sscanf (buffer, "%c", &wahl); if (wahl == 'h') /* Mehrfachverzweigung Typ I */ ausgabe (zahl, anzahl, 1); else if (wahl == 'u') ausgabe (zahl, anzahl, 2); else printf ("Bitte nur 'h' oder 'u' eingeben\n\n"); } while (! (wahl == 'h' || wahl == 'u') ); fclose (datin); } printf ("Und Tschüss...\n\n"); return 0; /* Ende des Programms */
ausgabe:
#include<stdio.h> void ausgabe(int zahl[5], int richtung, int anzahl) { /* Variablendeklaration */ int i; printf ("Dies sind die Zahlen:\n"); switch (richtung) /* Mehrfachverzweigung Typ II */ { case 1: for (i = 1; i <= anzahl; i++) /* Zählschleife */ { printf ("%i ",zahl[i+1]); } printf ("\n"); break; /* beendet case */ case 2: for (i = 1; i <= anzahl; i++) { printf ("%i\n", zahl[i]); } break; default: printf ("Fehler! Das hätte nicht passieren sollen!\n\n"); } return; /* Ende der nunktion, kein Rückgabewert */ }
So lauten meine zwei Programme. Ich komme ohne Probleme bis zum letzten Punkt wo gefragt wird, wie man die Zahlen ausgelesen bekommen haben möchte (also ob hintereinander oder nebeneinander.)Ab da habe ich Probleme wie ich das anstellen soll. Außerdem soll eine Switch verzweigung benutzt werden.
Hat jemand vielleicht einen Tipp wie ich da rangehe oder ob ich vielleicht schon im Vorfeld fehler gemacht habe?
Vielen dank für kommende Antworten!
-
anuviel schrieb:
... oder ob ich vielleicht schon im Vorfeld fehler gemacht habe?
Der Index bei Arrays in C fängt bei 0 an. Immer.
Welchen Wert hat i beim Begin der ersten do-while-Schleife?
Wenn du eine vorher abgezählten Anzahl an Durchläufen hast, dann nimm besser die for-Schleife.
Das ist übersichtlicher.Das fclose so nah wie möglich an die letzte Ein/Ausgabeoperation auf die Datei.
Und benutze bitte die Code-Tags. Code markieren und auf den C-Button unter dem
klicken.
Dann ist dein Code so formatiert wie du ihn eingestellt hast und farbig.
(Du als registrierter Nutzer kannst das auch noch nachträglich editieren).
-
DirkB schrieb:
anuviel schrieb:
... oder ob ich vielleicht schon im Vorfeld fehler gemacht habe?
Der Index bei Arrays in C fängt bei 0 an. Immer.
Welchen Wert hat i beim Begin der ersten do-while-Schleife?
Wenn du eine vorher abgezählten Anzahl an Durchläufen hast, dann nimm besser die for-Schleife.
Das ist übersichtlicher.Das fclose so nah wie möglich an die letzte Ein/Ausgabeoperation auf die Datei.
Und benutze bitte die Code-Tags. Code markieren und auf den C-Button unter dem
klicken.
Dann ist dein Code so formatiert wie du ihn eingestellt hast und farbig.
(Du als registrierter Nutzer kannst das auch noch nachträglich editieren).Entschuldige, mir war die code funktion nicht bekannt. Habs aber jetzt ausgebessert!
In meinem Fall wäre der Index i+1 also 1. Habe dies jetzt verbessert und dasfscanf(datin, "%i", &zahl[i]); printf("%i \n", zahl[i]); i++;
Aber das war nicht mein "Problem". Es läuft bei mir eigentlich so wie es sein soll, bis auf den Schluss. Wenn ich meine Dateien kompiliere erhalte ich ein funktionstüchtiges Programm.
Wenn ich Enter klicke zu beginn meines Programmes, erhalte ich 5 Zahlen aus meiner Datei, die auch in der richtigen Reihenfolge sind. Aber am ende wenn ich bei der switch-verzweigung ankomme, krieg ichs irgendwie nicht hin meine Zahlen hintereinander oder untereinander anzuzeigen.
Wenn ich z.B. bei der Schleife mit Eintrittsbedingung wo gefragt wird, wie viele Zahlen angezeigt werden sollen und ich 5 eingebe, kommt am ende eine Fehlermeldung (meine Default-Verzweigung) ohne dass ich verstehe wieso.
-
anuviel schrieb:
In meinem Fall wäre der Index i+1 also 1. Habe dies jetzt verbessert und das
fscanf(datin, "%i", &zahl[i]); printf("%i \n", zahl[i]); i++;
Fangen deine Schleifen auch bei 0 an? Da steht
for (i = 1; i <= anzahl; i++) /* Zählschleife */ { printf ("%i ",zahl[i+1]);
Du fängst als mit zahl[2] an.
anuviel schrieb:
Aber das war nicht mein "Problem". Es läuft bei mir eigentlich so wie es sein soll, bis auf den Schluss. Wenn ich meine Dateien kompiliere erhalte ich ein funktionstüchtiges Programm.
Das ist ein Trugschluß. Nur weil sich ein C-Programm compilieren lässt, heißt es noch lange nicht, dass es auch richtig ist.
Jetzt (mit den Code-Tags) kann man dein Program viel besser lesen.
anuviel schrieb:
... kommt am ende eine Fehlermeldung (meine Default-Verzweigung) ohne dass ich verstehe wieso.
Schau mal:
void ausgabe(int zahl[5], int richtung, int anzahl); // Prototyp .. ausgabe(zahl , anzahl , 1); // Aufruf von dir
Passt das zusammen?
-
DirkB schrieb:
anuviel schrieb:
In meinem Fall wäre der Index i+1 also 1. Habe dies jetzt verbessert und das
fscanf(datin, "%i", &zahl[i]); printf("%i \n", zahl[i]); i++;
Fangen deine Schleifen auch bei 0 an? Da steht
for (i = 1; i <= anzahl; i++) /* Zählschleife */ { printf ("%i ",zahl[i+1]);
Du fängst als mit zahl[2] an.
anuviel schrieb:
Aber das war nicht mein "Problem". Es läuft bei mir eigentlich so wie es sein soll, bis auf den Schluss. Wenn ich meine Dateien kompiliere erhalte ich ein funktionstüchtiges Programm.
Das ist ein Trugschluß. Nur weil sich ein C-Programm compilieren lässt, heißt es noch lange nicht, dass es auch richtig ist.
Jetzt (mit den Code-Tags) kann man dein Program viel besser lesen.
anuviel schrieb:
... kommt am ende eine Fehlermeldung (meine Default-Verzweigung) ohne dass ich verstehe wieso.
Schau mal:
void ausgabe(int zahl[5], int richtung, int anzahl); // Prototyp .. ausgabe(zahl , anzahl , 1); // Aufruf von dir
Passt das zusammen?
Nein, natürlich ist das Quatsch.
void ausgabe(int zahl[5], int richtung, int anzahl); // Prototyp .. ausgabe(zahl , 1 , anzahl);
und das mit der Zählschleife sollte
for(i = 1; ...) printf(...,zahl[i-1]);
aussehen, oder?
Danke, es klappt alles super!
Sorry, dass ich manchmal auf dem Schlauch stehe.
-
So wird das in C gemacht:
for(i = 0; i < anzahl; i++) // ^ ^ printf(...,zahl[i]);
DAs erkennt jeder C-Programmierer sofort.