C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Schnelle objektorientierte, kompilierende Programmiersprache.
Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 3:27 pm

Hi!
Hab wieder ein Problem :/

Ich habe eine Funktion geschrieben, die mich 6 Zahlen eingeben lässt. Falls ein Zeichen eingegeben wird, muss man erneut die Zahl eingeben. Zusätzlich möchte ich aber noch prüfen lassen ob die Zahl schon eingegeben wurde.

Der Vergleich soll nach der Eingabe stattfinden. Dort wo auch geprüft wird ob die Zahl ein Zeichen ist oder zwischen 1 und 49 liegt. Ich bin mir nicht sicher wie die Schleife aussehen muss.

Hier mein Code:

Code: Alles auswählen

void DruckeFeld(int *x,int spalten) {
   int j;
   printf("\n\n");
      for(j=0; j<spalten; j++)
         printf("  %d",x[j]);
      printf("\n");
   }



void holezahl(int *x)
{
    char strnum[20];
    char *ep;
	int i;
    
	for(i=0;i<6;i++) {
		
		while (1) {
			printf("\n %d. Zahl: ",i+1);
			scanf( "%s", strnum );             
				errno = 0;
				x[i] = strtol( strnum, &ep, 10);
				if ((errno == 0) && (*ep == '\0' )) {
					if (x[i] > 0 && x[i] <= 49)
								break;
					
				printf( "Zahl liegt nicht zwischen 1-49 oder wurde bereits eingegeben!\n");
					}
				else
					printf( "Eingabe war keine Zahl!\n" );
				}
	}
}

int main (void) {
	int a[7];


	printf("\n\t\t\t Lotto");

	holezahl(&a[0]);
	printf("\nIhre Zahlen lauten:");
	DruckeFeld(&a[0],6);


	printf("\n\nBeliebige Taste druecken...");
	getch();
	return 0;
}
MfG Lone

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mo Sep 30, 2013 3:37 pm

Lone hat geschrieben:Der Vergleich soll nach der Eingabe stattfinden. Dort wo auch geprüft wird ob die Zahl ein Zeichen ist oder zwischen 1 und 49 liegt. Ich bin mir nicht sicher wie die Schleife aussehen muss.
Im Prinzip musst Du die ganze Eingabe in eine Schleife packen. Du brauchst eine Schleife, die 6 Zahlen abfragt und eine zweite Schleife darin, die solange abfragt bis eine gültige Zahl eingegeben wurde. Die innere schleife kannst Du ja so formulieren, dass Du unendlich oft fragst (while(true)) und die Schleife mit break abbrichst, sobald Du eine gültige Zahl identifiziert hast.

Was eine gültige Zahl ist, hast Du ja bereits gesagt: Sie muss (umgangssprachlich) zwischen 1 und 49 liegen und sie darf in x[0] bis x[i-1] noch nicht vorgekommen sein.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 5:14 pm

und sie darf in x[0] bis x[i-1] noch nicht vorgekommen sein.
Genau da verrenn ich mich immer. Die Lösung mag ja einfach sein aber ich komme überhaupt nicht drauf. Ich weiß wie ich eine Zahl vorher mit der eingegebenen überprüfe aber das bringt mich ja auch nicht weiter. Ich erzeuge entweder Endlosschleifen oder ich kanns nicht compilen.

Edit: War totaler Schwachsinn den ich gepostet habe. Nee keine AHnung.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mo Sep 30, 2013 5:20 pm

Lone hat geschrieben:
und sie darf in x[0] bis x[i-1] noch nicht vorgekommen sein.
Genau da verrenn ich mich immer. Die Lösung mag ja einfach sein aber ich komme überhaupt nicht drauf. Ich weiß wie ich eine Zahl vorher mit der eingegebenen überprüfe aber das bringt mich ja auch nicht weiter. Ich erzeuge entweder Endlosschleifen oder ich kanns nicht compilen.
Du hast auch zwei Endlosschleifen. Die äußere muss ja über die Anzahl der Zahlen laufen, die Du einlesen möchtest. Du willst ja nicht unendlich oft eine Zahl einlesen.

Die innere Schleife läuft unendlich. Innerhalb der inneren Schleife fragst Du eine Zahl ab und prüfst, ob die Zahl gültig ist. Wenn sie gültig ist, brichst Du die innere Schleife mit break ab. Mit der äußeren Schleife fragst Du dann die nächste Zahl ab.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 5:42 pm

Das macht die Funktion doch auch.
Aber mir fehlt der Code für das Vergleichen. Ich habe ja bereits if-Anweisungen die dafür sorgen das die Zahlen zwischen 1 und 49 und keine Zeichen sind.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mo Sep 30, 2013 5:51 pm

Lone hat geschrieben:Das macht die Funktion doch auch.
Lies Dir doch mal Deinen Quelltext laut vor und überlege was da steht - nicht, was Du möchtest, dass da steht.

Du hast den Code ja inzwischen gelöscht - es ist immer etwas schwierig eine Unterhaltung zu führen, wenn sich nachfolgende Postings auf Dinge beziehen, die gelöscht wurden.
Dass Du Schwachsinn postest ist normal. Wenn wir alles wüssten, müsste hier keiner etwas schreiben. Jeder der fragt, versucht besser zu verstehen, was er hier tut.
Lone hat geschrieben:Aber mir fehlt der Code für das Vergleichen. Ich habe ja bereits if-Anweisungen die dafür sorgen das die Zahlen zwischen 1 und 49 und keine Zeichen sind.
Ich will nicht, dass Du vergleichst. :-)

Du willst doch programmieren lernen. Also schreib Deine Gedanken auf und versuche sie in der gleichen Reihenfolge in C zu übersetzen. Das ist programmieren. Und wenn Du erstmal nur den Vergleich mit den Zahlen zwischen 1 und 49 machst und die Wiederholung weglässt. Es programmiert schließlich auch niemand eine fertige Textverarbeitung. Schritt für Schritt, Feature einbauen, testen, nächstes Feature...
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 6:53 pm

Hat mich nicht weitergebracht, Nimms mir nicht übel aber ich sitz da jetzt so lange dran das ich mit Sicherheit sagen kann, das ich da nicht mehr drauf kommen werde.

Ich schreibd en vermüllten Code dann mal trotzdem hier rein.

Code: Alles auswählen

void holezahl(int *x)
{
    char strnum[20];
    char *ep;
	int i,j;
    
	for(i=0;i<6;i++) {
      
      while (1) {
         printf("\n %d. Zahl: ",i+1);
         scanf( "%s", strnum );             
            errno = 0;
            x[i] = strtol( strnum, &ep, 10);
            if ((errno == 0) && (*ep == '\0' )) {
               if (x[i] > 0 && x[i] <= 49 )
				   for(j=0; j<6;j++)
					   
					   while(x[j] != x[i])

					break;
               
            printf( "Zahl liegt nicht zwischen 1-49 oder wurde bereits eingegeben!\n");
               }
            else
               printf( "Eingabe war keine Zahl!\n" );
            }
   }
}

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von cloidnerux » Mo Sep 30, 2013 7:12 pm

Du schreibst sehr unsauberen Code und deswegen verrennst du dich.
Sowas z.B:

Code: Alles auswählen

for(j=0; j<6;j++)
                  
                  while(x[j] != x[i])

               break;
ist ein sehr gutes Beispiel dafür. Du iterierst von 0 bis 6 um dann damit dein Array "x" durchzugehen, wobei du aber missachtest, dass du ja gerade erst bis i werte da hineingeschrieben hast.
Nun schau dir aber mal was while an: Was passiert bei dem Vergleich? Kann man das nicht sinnvoller und logischer durch ein if ersetzen?

Nun zu deinem ganzen Problem. Deine algorithmus versucht in etwa das folgende:

Code: Alles auswählen

for(int i = 0; i < 6 ; i++)       //Wir wollen 6 zahlen
{
    while(1)
    {
        printf("Zahl %i eingeben", i+1);
        scanf("%s", buffer);            //Die Eingabe in einen buffer schreiben, hier sind irgendwelche ASCII Zeichen drinn
        if(strlen(buffer) > 2)        //Die größte zahl ist 49, das sind 2 stellen, mehr ist erstmal nicht drin
            continue;                //Man hat also etwas über 2 Zeichen eingeben, gleich von vorne Beginnen
        //Zu int konvertieren
        if(number < 0 || number > 49)         //Nicht im geforderten Bereich
            continue;
        //Ist die Zahl schonmal eingeben worden?
        x[i] = number;
        break;            //Erfolgreich
    }
}
Wenn es dir hilft, kannst du dir auch einen Programm-Ablauf-Plan oder ein Blockschaltbild auf Papier zeichnen, damit kannst du deinen Algorithmus grafisch darstellen, das kann helfen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 8:24 pm

Du schreibst sehr unsauberen Code und deswegen verrennst du dich.
Sowas z.B:

Code: Alles auswählen

for(j=0; j<6;j++)
                  
                  while(x[j] != x[i])

               break;
ist ein sehr gutes Beispiel dafür.
Deswegen habe ich auch vermüllter Code geschrieben. An weclher Stelle ist der noch unsauber?

Code: Alles auswählen

if(number < 0 || number > 49)         //Nicht im geforderten Bereich
            continue;
        //Ist die Zahl schonmal eingegeben worden?
        x[i] = number;
        break;            //Erfolgreich
Ja und wie vergleicht man jetzt number mit den vorherigen Zahlen ?
if (number != x[])

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von cloidnerux » Mo Sep 30, 2013 9:02 pm

Ja und wie vergleicht man jetzt number mit den vorherigen Zahlen ?
if (number != x[])
Trennt dich mal von deiner Anwendung und konzentriere dich auf folgendes:
Du hast ein Array von ints M der lange i, eine Zahl n und sollst jetzt eine Funktion schreiben, die dir die Position von n in M zurückgibt, ansonsten -1:

Code: Alles auswählen

f(M, n)
Wie würdest du eine solche Funktion implementieren?
Redundanz macht wiederholen unnötig.
quod erat expectandum

Antworten