Hilfe für Array-Funktion
-
Guten Abend
Es geht um folgendes:
Ich soll versch. Funktionen mit Arrays schreiben, welche einmal den zweitkleinsten Werd im Feld mit einer bestimmten Länge zurückgibt und einmal eine Funktion welche entsprechend die Quersummen aller Werte im Feld zurückgibt.
Diese soll ich dann in meiner main-Funktion mit bestimmten Vorgaben testen:
Fordern Sie zuerst den Benutzer zur Eingabe einer positiven ganzen Zahl length
auf, die im Intervall [1; 10] liegt. Legen Sie die obere Intervallgrenze als symbolische Konstante fest.Die Zahl length reprasentiert die Anzahl an Zahlen, die der Benutzer eingeben soll.
Speichern Sie die eingegebene Zahlenfolge in einem Feld.
Es soll jede Eingabe auf Korrektheit überpruft werden und im Fehlerfall der Benutzer zur Wiederholung der Eingabe aufgefordert werden.
Berucksichtigen Sie das Auftreten des Fehlerindikators EOF beim Lesen aus dem
Standard-Eingabestrom.Sobald length viele Zahlen in Ihrem Feld gespeichert wurden, testen Sie damit
Ihre Funktionen aus den vorhergehenden Teilaufgaben.Nun habe ich speziell ein Problem, wenn es um das Überprüfen und Speichern der Zahlenfolge geht.
Desweiteren, will meine main-Funktion die Quersummenfunktion nicht mehr auf der Kommandozeile herausgeben, da sie vorher vermutlich hängen bleibt/timeout hat o.ä.
Hier ist mein Code:
#include <stdio.h> #include <ctype.h> #define MAX 10 #define MIN 1 long int calc_second_smallest(long int ary[], int length); long int calc_digit_sum(long int ary[], int length); int main() { int length = 0; long int ary[MAX]; int i; printf("Bitte eine ganze Zahl zwischen 1 und 10 eingeben: \n"); do { scanf("%d", &length); if(length < MIN || length > MAX) { printf("Ungueltige Eingabe! Bitte wiederholen....\n"); continue; } else { break; } } while(1); printf("Bitte geben Sie nun %d Zahlen ein: \n", length); for(i = 0; i < length; ++i) { /* Problembereich */ scanf("%ld", &ary[i]); printf("test %ld\n", i+1); } printf("Length %d", length); printf("\n", calc_second_smallest(ary, length)); printf("Test %ld", calc_digit_sum(ary, length)); return 0; } long int calc_second_smallest(long int ary[], int length) { int i, x, hilf, zweit_klein; for(i = 0; i < length; ++i) { x = ary[0]; if(x > ary[i]){ hilf = ary[0]; ary[0] = ary[i]; ary[i] = hilf; } } zweit_klein = ary[1]; printf("Stelle 1 %ld\n", ary[0]); printf("Stelle 2 %ld\n", ary[1]); printf("Stelle 3 %ld\n", ary[2]); return zweit_klein; } long int calc_digit_sum(long int ary[], int length) { int i, x; long int q_summe = 0; for(i = 0; i < length; ++i) { x = ary[i]; while(x >= 1); { q_summe += x % 10; x /= 10; } } return q_summe; }
Ich weiß es ist schon etwas spät, würde mich aber trotzdem über Tipps freuen.
MfG
Shin
-
printf("test %ld\n", i+1);
Ist das so gewollt?
printf("\n", calc_second_smallest(ary, length));
Hier hast du den formatspecifier vergessen.
while(x >= 1); { q_summe += x % 10; x /= 10; }
Und das ';' ist hier wohl auch fehl am Platz
-
Hey, danke für die Antwort.
Das printf ist bewusst drinne, weil ich an dieser Stelle probleme hatte und sehen wollte "ob es soweit kommt", sozusagen.Hab den specifier drin, danke!
Auch danke für den Hinweiß bei der while-Schleife.
Kommt davon wenn man immer mit do-while Programmiert und dann einmal eine while-Schleife macht.Blöder Strichpunkt.
Funktioniert immerhin schonmal ohne das es sich aufhängt.
Jetzt habe ich nur noch mit der Überprüfung bezüglich der zahleneingabe Probleme.Mein Tutor hatte mir dazu empfholen:
zum Länge der eingabe kontrollieren: Les doch einfach dementsprechend oft mit scanf aus, wenn die eingabe passend war, sollte das im Puffer verbleibende Zeichen \n sein. Ist das nicht der Fall, dann wurde zu viel eingegeben.
Nur komme ich da nicht so ganz drauf wie genau ich es einbauen soll.
MfG
-
Komaeda schrieb:
Das printf ist bewusst drinne, weil ich an dieser Stelle probleme hatte und sehen wollte "ob es soweit kommt", sozusagen.
Der Formatspecifier ist falsch (für i)
Komaeda schrieb:
Mein Tutor hatte mir dazu empfholen:
zum Länge der eingabe kontrollieren: Les doch einfach dementsprechend oft mit scanf aus, wenn die eingabe passend war, sollte das im Puffer verbleibende Zeichen \n sein. Ist das nicht der Fall, dann wurde zu viel eingegeben.
Nur komme ich da nicht so ganz drauf wie genau ich es einbauen soll.
scanf
liest solange Zeichen ein, bis eins kommt, das nicht zum Formatspecifier passt.
Dieses Zeichen wird wieder (in den Eingabestrom) zurück geschrieben.Du musst jetzt dieses (eine) Zeichen einlesen und prüfen.
scanf hat auch einen Rückgabewert, den man Auswerten kann: http://www.cplusplus.com/reference/cstdio/scanf/
-
Hi DirkB,
Das printf ist jetzt komplette draußen, da es auch eigentlich nicht teil der Aufgabe war, nur was für mich.
Das mit dem Scanf und Eingabestrom ist mir generell klar, nur geht es darum das ich eine Wert für length einspeichern soll, dieser Wert soll mir sagen wieviele Zahlen ich in meinem array speichern möchte.
Also z.B.
length = 5
Geben sie 5 Zahlen ein:
12345Das soll es mir im array speichern und falls mehr oder weniger als, jetzt hier 5 Zahlen, eingegeben worden sind, soll es eine Fehlermeldung rausgeben und die Schleife auf continue, also zur Wiederholung, aufrufen.
Trotzdem Danke für den Link
Falls das heut nichts mehr wird, auch nicht so schlimm.
P.S. Es kann natürlich sein das ich die Aufgabenstellung in der hinsicht falsch verstanden habe, hoffe mal das das nicht der Fall ist
-
Komaeda schrieb:
Also z.B.
length = 5
Geben sie 5 Zahlen ein:
12345Das ist eine Zahl aus 5 Ziffern.
scanf
trennt bei ungültigen Zeichen oder Whitespace (' ', '\n', '\r'\, '\t')Ein Fehler wäre die Eingabe von Buchstaben. Auch danach. Z.B. 10x 1z0 Hallo
Oder der Abbruch der Eingabe mittels EOF (das geht unter Windows mit Strg-Z und Linux Ctrl-D)Wenn jetzt ungültigen Zeichen im Eingabestrom stehen, werden die (von
scanf
) nicht entfernt.
Es nützt also nichts, die Eingabe zu wiederholen. Die Fehlerhaften Zeichen müssen erst eingelesen werde.
Die Whitespace bleiben auch im Eingabestrom stehen, werden aber von den meisten Formatspecifiern vonscanf
überlesen.continue
wiederholt auch nicht die Schleife sondern setzt diese mit dem nächsten Durchlauf fort.
Bei deinerfor
-Schleife wird das ++i ausgeführt und dann die Bedingung geprüft.