Frage zu Strings...
-
Hab mittlerweile verstanden wie das obige funktioniert. Jetzt hab ich noch eine Frage. Folgendes Programm:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { char liste[NMAX], c; int vergleichszahl, len, i; vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); printf("Zahlen eingeben: "); i = 0; c = getchar(); while(c != '\n') { liste[i] = c; i = i + 1; c = getchar(); } liste[i] = '\0'; len = strlen(liste); return 0; }
Ich hab da jetzt das Problem, dass er mir ohne einen Tastendruck ein "\n" in c speichert, was zum sofortigen Erfüllen der while-Bedingun führt und ich keine Werte in die liste[] eingeben kann.
-
Du mußt einmal das '\n' aus der scanf - Instruktion 'weglesen'.
Also vor der Schleife zweimal getchar aufrufen.
-
Alternativ kannst Du Dein scanf so ändern:
scanf("%i%c", &vergleichszahl, &c);
Dann wird die Eingabetaste gleich mit dem scanf weggelesen, der Inputstream ist wieder leer, und Du brauchst in der Folge nur ein getchar vor der Schleife wie in Deinem ersten Versuch.
-
Wie kann man ein Programm schreiben, dass Zahlen vom Benutzer entgegennimmt und in ein array speichert? Da häng ich grad irgendwie... Mit nem String hat man ja das Problem, dass man nur die ASCII-Werte drinstehen hat. Ich möchte, aber dass der Benutzer auch mehr stellige Zahlen eingeben kann. Wie kann man das machen?
EDIT: Hintergrund der Frage ist folgende Aufgabenstellung:
Für eine ganze Zahl ist zu prüfen , wie of sie in einer Liste von maximal 100 Zahlen vorkommt und an welchen Stellen sie vor kommt.
Ich glaub nicht, dass da nur einstellige ganze Zahlen gemeint sind.
Kannst du mir weiterhelfen?
-
Hast doch schon gut angefangen. Ich hab's mal ein bißchen abgeändert:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int liste[NMAX]; int vergleichszahl, i, zahl, x; vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); printf("Zahlen eingeben: "); i = 0; //getchar(); scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } printf("\nVergleichszahl: %d\n", vergleichszahl); for(x = 0; x < i; ++x) printf("Liste[%i] = %i\n", x, liste[x]); return 0; }
-
Du mußt natürlich noch auf folgendes achten:
Man darf nicht mehr als NMAX Werte eingeben können, sonst schreibst Du hinter Dein Array, das darf nicht passieren.
Falls -1 und alle anderen ganzen Zahlen mögliche gültige Werte sind, brauchst Du eine andere Abbruchbedingung.Und nun mach mal ein bißchen was selbst!
-
Also ich hab hier jetzt mal mein Programm fertig gemacht. Ich habs mit Strings gemacht. Die "Ziffern" in diesem String rechne ich in echte Zahlen um.
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { char liste[NMAX], c; int array[NMAX], zaehler, stelle[NMAX]; int vergleichszahl, len, i, j; printf("Zahlen eingeben: "); i = 0; c = getchar(); while(c != '\n') { liste[i] = (c - 48); i = i + 1; c = getchar(); } liste[i] = '\0'; len = strlen(liste); vergleichszahl = 0; printf("Vergleichszahl eingeben: "); scanf("%i", &vergleichszahl); j = 0; zaehler = 0; for(i=0; i<len; i=i+1) { array[i] = liste[i]; if(array[i] == vergleichszahl) { zaehler = zaehler + 1; stelle[j] = (i + 1); j = j + 1; } } stelle[j] = '\0'; printf("Es gibt %i gleiche Zahlen!\n\n", zaehler); printf("Die Stellen sind: "); i = 0; while(stelle[i] != '\0') { printf("%i", stelle[i]); i = i + 1; } return 0; }
Das Problem dabei ist halt immer noch, dass ich nur einstellige Zahlen eingeben kann. Wie aber soll man dann mehrstellige Zahlen von anderen Zahlen unterscheiden? Da müsste man ja dann Kommas setzen, welche dann wieder erkannt werden müssten, oder?
-
Ich hab jetzt noch folgende Aufgabe:
Die kleinste Zahl einer Liste von n Zahlen findet man durch folgenden Algorithmus:
Bahupte, die erste Zahl sei die kleinste Zahl. Für die restlichen Zahlen (2,3,...,n) führe aus Falls die Zahlkleiner ist als die derzeit kleinste Zahl dann ist diese Zahl die neue kleinste Zahl.
Schreiben Sie ein Programm zu diesem Algorithmus. Stellen Sie zusätzlich fest, welche Position (Vektorindex) die kleinste Zahl hat.
Mein Code:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int i, c, kleinste_zahl, hilfs_var, j; char liste[NMAX]; i = 0; c = getchar(); while(c != '\n') { liste[i] = c; i = i + 1; c = getchar(); } kleinste_zahl = liste[0]; for(j=0; j<i; j=j+1) { if(kleinste_zahl > liste[j]) { hilfs_var = liste[j]; liste[j] = kleinste_zahl; kleinste_zahl = hilfs_var; } } printf("Position = %i, kleinste Zahl = %i", j, (kleinste_zahl-48)); return 0; }
Das Problem an meinem Code ist wahrschinlich wieder, dass ich keine mehrstelligen Zahlen eingeben kann. ABER: Ist das laut Aufgabe überhaupt gefordert? Aber man soll doch Programme immer so allgemein wie möglich halten; das stimmt doch, oder?
-
wieso ein char array?
dadurch werden die chars für den vergleich nach int gecasted und die ASCII repräsentation wird verglichen.
sicher nicht was du wolltest
-
Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:
Der Benutzer gibt genau das in die Konsole ein:
12 32 45 56 78 89 123 456 789 -> [ENTER]
Im Array soll dann folgendes stehen:
----------------------------------------------------------------------------- | 12|032| 32|032| 45|032| 56|032| 78|032| 89|032|123|032|456|032|789|032|010| -----------------------------------------------------------------------------
Irgendwie verstehe ich das aber trotzdem nicht. Denn wie soll man denn nun z.B. die ASCII-Zahl "32" für das Leerzeichen von der Zahl 32 die an der zweiten Stelle im Array steht unterscheiden können?
-
bandchef schrieb:
Hm, das ist immer eigentlich noch das gleiche Problem wie gestern Abend. Ich weiß nicht, wie ich in C eine Benutzereingabe programmiere, die dem Benutzer erlaubt ein int array mit int-Zahlen zu belegen; getrennt z.B. durch Leerzeichen. Folgende Eingabe soll es verdeutlichen:
Der Benutzer gibt genau das in die Konsole ein:
12 32 45 56 78 89 123 456 789 -> [ENTER]
Ich hab Dir doch gestern abend einen funktionierenden Quellcode dafür gepostet ...
-
Du meinst den hier?
i = 0; //getchar(); scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); }
-
Gut, das stimmt...
Die Abbruchbedingung der Schleife ist aber doch eine -1. Das heißt, damit ich aus der while-Schleife rauskomm, müsste der Benutzer eine -1 reinschreiben. Das ist aber doch auch nicht Sinn der Sache, oder?
-
Ich will mir in meinem Programm die Stelle im Array merken an der die kleinste Zahl gesessen hat.
Mein Code:
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int zahl, liste[NMAX]; int i, j, k, t, kleinste_zahl, hilfs_var, zaehler; i = 0; scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } kleinste_zahl = liste[0]; k = 1; zaehler = 0; for(j=k; j<i; j=j+1) //Suche der kleinsten Zahl { if(liste[j] < kleinste_zahl) { kleinste_zahl = liste[j]; zaehler = liste[j]; } } printf("kleinste Zahl = %i, Index-Stelle = %i\n\n", kleinste_zahl, zaehler); return 0; }
Ich weiß aber nicht wie ich das machen soll. Im zaehler soll sich das gemerkt werden. Kannst du mir helfen wie das gehen soll?
-
zaehler = j;
-
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int zahl, liste[NMAX], sortiert[NMAX]; int i, j, k, kleinste_zahl, stelle; i = 0; scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } kleinste_zahl = liste[0]; stelle = 0; for(j=1; j<i; j=j+1) //Suche der kleinsten Zahl { if(liste[j] < kleinste_zahl) { kleinste_zahl = liste[j]; stelle = j; } } printf("kleinste Zahl = %i, Index-Stelle der Zahl = %i", kleinste_zahl, j); return 0; }
Dieser Code liefert für die Zahlenfolge 5,7,9,8,1,4,3,2 zwar die 1 als kleinste Zahl aber die Stelle stimmt nicht. Er gibt mir als Indexstelle eine 8 aus. In Wirklichkeit ist es aber doch die 4... Ehrlich gesagt, hab ich das auch schon ausprobiert...
Oder hab ich dich falsch verstanden?
-
Dann schau mal, ob du in deiner Ausgabe die richtige Variable ausgibst
-
Ich hab jetzt meinen Code weiter vervollständigt. Jetzt gibts allerdings das Problem, dass bei der Zahlenreihenfolge 5,7,9,8,1,4,3,2 nach dem 5. Durchlauf die 5 in der "liste" zugleich auch die kleinste Zahl ist. Das bedeutet nun, dass er mir an die 6. Stelle wieder die 5 schreibt, obwohl da die 7 kommen würde. Ich weiß aber jetzt wieder nicht an was das liegt!
#include<stdio.h> #include<ctype.h> #include<string.h> #define NMAX 100 int main() { int zahl, liste[NMAX], hilfs_var; int i, j, k, len_liste, kleinste_zahl, stelle; i = 0; scanf("%i", &zahl); while(zahl != -1) { liste[i] = zahl; i = i + 1; scanf("%i", &zahl); } len_liste = i; stelle = 0; k = 0; do { kleinste_zahl = liste[k]; for(j=k; j<len_liste; j=j+1) //Suche der kleinsten Zahl { if(liste[j] < kleinste_zahl) { kleinste_zahl = liste[j]; stelle = j; } } hilfs_var = liste[k]; liste[k] = kleinste_zahl; liste[stelle] = hilfs_var; k = k + 1; }while(k != len_liste); for(i=0; i<len_liste; i=i+1) { printf("%i", liste[i]); } return 0; }
-
Sorry, nun bin ich drauf gekommen: es musste ein "kleiner-gleiche" in die if-Abfrage eingebaut werden!
Danke für eure Hilfe!