C Oder-Verknüpfung

sman

Cadet 4th Year
Registriert
Jan. 2007
Beiträge
70
Hallo Leute,

ich hab folgendes Programm geschrieben:

Code:
#include <stdio.h>
#include <conio.h>

void main(){
     
     unsigned int a;
     char bs;

     do {
          printf("\nGeben Sie eine dreistellige positive Ganzzahl ein: ");

          fflush(stdin);
          scanf("%3u",&a);

          printf("\nZeichen:\t%c",a);
          printf("\nDezimal:\t%u",a);
          printf("\nOktal:\t\t%o",a);
          printf("\nHexadezimal:\t%x",a);
                                         
             do {
                printf( "\n\nWenn Sie fortfahren m\x94\chten dr\x81\cken Sie die Taste J"
                        " wenn Sie das Programm beenden Möchten N: ");
                     fflush(stdin);
                     scanf("%c",&bs);
             
                     if (bs=='n'||bs=='N'){
                     break;
                     }  else if (bs=='j'||bs=='J'){
                     printf("\n\nEingabe Richtig");
                     }  else {
                     printf("\n\nUng\x81ltige Eingabe");
                     } 
             }  [COLOR="Red"]while (bs!='j'||bs!='J');[/COLOR]
                                                            
   } while (bs=='j'||bs=='J');

   printf("\n\n\nBeenden mit beliebiger Taste");
   getch();
}

Mein Problem liegt in der Bedingung der while Schleife (zeile 33), ich weiß wir hatten das in der Schule aber ich kann mir nicht mehr erklären warum das so nicht funktioniert vll. kann mir ja einer von euch mir das kurz erklären und einen tipp geben wie man das besser lösen kann. Vielen dank.
 
Die Whileschleifenbedingung ist immer erfüllt(bzw. ein Teil davon).
Drückst du 'J' ist es trotzdem noch ungleich 'j' und andersrum.
Dadurch bleibt man wegen der "oder-Abfrage immer in der Schleife. Somit kannst du mit 'j' oder 'J' nicht abbrechen.
Versuchs mal mit "und", also while (bs!='j' && bs!='J');

Edit: Ok, hatte mir nur die eine Schleife angeguckt und dachte bei j/J soll man beenden..
 
Zuletzt bearbeitet:
Huhu,

versuch den Ausdruck mal so:

while ((bs=='j')&&(bs=='J'));


Grüße
 
Du hast da eine do-while-Schleife zu viel!

Die innere Schleife läuft so lange, wie du "J" eingibst und fragt dich dann sofort wieder nach der Eingabe von "J" oder "N", weil du aus der Schleife erst mit "N" heraus kommst, dann aber dein Programm bis zum Ende weiter läuft, weil in bs ja noch die alte Eingabe steht.

Damit dein Programm funktioniert musst du also einfach die innere Schleife entfernen, aber den Code, der in der Schleife steht, beibehalten!

Edit:
@z0tti: Die äußere Schleife darf nicht "while (bs!='j' && bs!='J')" sein, weil er bei "j" ja weiterlaufen soll! So wie du es geschrieben hast läuft die Schleife so lange wie bs weder "j" noch "J" ist. Wenn also "j" eingegeben wird, dann bricht das Programm ab, was nicht das Ziel ist!

Gruß
BlackMark
 
Zuletzt bearbeitet:
Du hast da eine do-while-Schleife zu viel!

Die innere Schleife läuft so lange, wie du "J" eingibst und fragt dich dann sofort wieder nach der Eingabe von "J" oder "N", weil du aus der Schleife erst mit "N" heraus kommst, dann aber dein Programm bis zum Ende weiter läuft, weil in bs ja noch die alte Eingabe steht.

Damit dein Programm funktioniert musst du also einfach die innere Schleife entfernen, aber den Code, der in der Schleife steht, beibehalten!

Edit:
@z0tti: Die äußere Schleife darf nicht "while (bs!='j' && bs!='J')" sein, weil er bei "j" ja weiterlaufen soll! So wie du es geschrieben hast läuft die Schleife so lange wie bs weder "j" noch "J" ist. Wenn also "j" eingegeben wird, dann bricht das Programm ab, was nicht das Ziel ist!

Gruß
BlackMark

Nein das passt schon mit den 2 do-while-Schleifen. Das Programm sollte so aussehen:
Nach dem ersten Durchlauf soll der Benutzer gefragt werden ob er eine weitere Zahl eingeben will. Wenn der Benutzer j oder J für ja eingibt wiederholt sich das Programm einfach, wenn der Benutzer n oder N für nein eingibt wird das Prgramm beendet. wenn einbeliebig anderer Buchstabe eingegeben wird soll die Abrafge ob das Programm wiederholt werden soll oder beendet werden soll erneut erscheinen. Bis auf die Bedingung in meinem 2ten do-while schleife ist also nix falsch.

Huhu,

versuch den Ausdruck mal so:

while ((bs=='j')&&(bs=='J'));


Grüße

So funktioniert das leider nicht, wenn der eingegebene buchstabe nicht dem buchstaben j oder J entspricht dann soll der eine neue abfrage kommen, ob das programm beendet werden soll oder weiter fortgeführt werden soll.

ich hatte das Programm schon so geschrieben:
#include <stdio.h>
#include <conio.h>

void main(){

unsigned int a;
char bs;

do {
printf("\nGeben Sie eine dreistellige positive Ganzzahl ein: ");

fflush(stdin);
scanf("%3u",&a);

printf("\nZeichen:\t%c",a);
printf("\nDezimal:\t%u",a);
printf("\nOktal:\t\t%o",a);
printf("\nHexadezimal:\t%x",a);

do {
printf( "\n\nWenn Sie fortfahren m\x94\chten dr\x81\cken Sie die Taste J"
" wenn Sie das Programm beenden Möchten N: ");
fflush(stdin);
scanf("%c",&bs);

if (bs=='n'||bs=='N'){
break;
} else if (bs=='j'||bs=='J'){
printf("\n\nEingabe Richtig");
} else {
printf("\n\nUng\x81ltige Eingabe");
}
} while (bs!='j');

} while (bs=='j'||bs=='J');

printf("\n\n\nBeenden mit beliebiger Taste");
getch();
}

so hat es auch funktioniert aber ich will ja das der buchstabe groß J genauso berücksichtigt wird wie klein j.
 
Zuletzt bearbeitet:
Wenn du dir so sicher bist, dass du zwei Schleifen brauchst, dann erklär mir bitte, was die innere Schleife für einen Sinn hat?

Das Programm soll sich wiederholen, also braucht man eine Schleife. Die Bedingung der Schleife legt fest, in welchen Fällen sich das Programm wiederholen soll. Deine Schleife soll so lange laufen, bis der Nutzer etwas anderes als "J" eingegeben hat. Weil dadurch aber der Fall einer ungültigen Eingabe nicht behandelt wird, musst du noch eine if-Abfrage hinzufügen, die diesen Fall überprüft.
Also brauchst du eine Schleife und eine if-Abfrage! Die zweite Schleife ist überflüssig!

Edit:
Achso, du willst bei einer ungültigen Eingabe nicht nur eine Fehlermeldung ausgeben, sondern die Eingabe wiederholen. Dann stimmt das natürlich mit den zwei Schleifen. Ich bin davon ausgegangen, dass bei einer fehlerhaften Eingabe das Programm mit einer Fehlermeldung abgebrochen werden soll. Aber wenn dem nicht so ist, dann solltest du das so lösen können:
Code:
#include <stdio.h>
#include <conio.h>

void main(){
	unsigned int a;
	char bs;

	do {
		printf("\nGeben Sie eine dreistellige positive Ganzzahl ein: ");

		fflush(stdin);
		scanf("%3u",&a);

		printf("\nZeichen:\t%c",a);
		printf("\nDezimal:\t%u",a);
		printf("\nOktal:\t\t%o",a);
		printf("\nHexadezimal:\t%x",a);

		do {
			printf( "\n\nWenn Sie fortfahren m\x94\chten dr\x81\cken Sie die Taste J"
				" wenn Sie das Programm beenden Möchten N: ");
			fflush(stdin);
			scanf("%c",&bs);
			if (bs=='n'||bs=='N'){
				break;
			} else if (bs=='j'||bs=='J'){
				printf("\n\nEingabe Richtig");
			} else {
				printf("\n\nUng\x81ltige Eingabe");
			}
		} while( bs != 'j' && bs != 'J' && bs != 'n' && bs != 'N' );
	} while( bs == 'j' || bs == 'J' );

	printf("\n\n\nBeenden mit beliebiger Taste");
	getch();
}

Die innere Schleife läuft so lange, wie keine gültige Eingabe gemacht wurde und die äußere läuft bis etwas anderes als "J" angegeben wurde.

BTW: Dir ist bewusst, dass ein fflush auf einen Input-Stream undefiniertes Verhalten ist und unter allen Umständen vermieden werden sollte?

Gruß
BlackMark
 
Zuletzt bearbeitet:
ja jetzt passt es vom code her war ein denkfehler von mir ich muss die zeile ja mit und verknüpfen und nicht mit oder. danke für deine hilfe BlackMark.
 
Du solltest auch main() etwas zurückgeben lassen. Am besten int.
 
du willst es ja nochmal ausführen wenn kein j oder J angegeben wurde. das heißt du machst es entweder so
Code:
while (!(bs=='j' || bs=='J))
oder so
Code:
while (bs!='j' && bs!='J')

die umformung entspricht der der De Morgan'schen regel
 
Du solltest auch main() etwas zurückgeben lassen. Am besten int.

Da hast du schon recht an sich wäre es besser wenn die Funktion einen Wert zurückgeben würde, allerdings hatten wir das noch nicht in der Schule besprochen mit dem Wert zurückliefern deswegen möchte ich das auch noch nicht einbauen.
 
Zurück
Oben