Sprungbefehl goto funzt nicht.

azdr

Lieutenant
Registriert
Feb. 2005
Beiträge
685
HI allerseits
Ich hab da ein problem nähmlich der Sprungbefehl goto in der if anweisung tut nicht was er sollte. Also es ist so wenn ich eine 8 oder eine 9 eintippe sollte ich wieder zur eingabe "cin" zurückspringen da es ja bei einem Oktalsystem, die ziffer 8 und 9 nicht gibt aber das programm tut das aber nicht. Es kommt auch keien Fehlermedlung. Habe ich da was mit der goto anweisung falsch gemacht. danke schon mal.



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

int main (void) {
int zahl,x,a,b,c,d;

while(1) {

cout<< "Bitte geben Sie eine 4 stellige Oktalzahl ein: ";
Eingabe: cin>>zahl;  //[COLOR="Red"]---> Marke (Eingabe) sollte von der if anweisung (goto)  hierher springen, macht das Programm aber nicht.  [/COLOR]
a=(zahl%10);
b=(zahl%100)/10;
c=(zahl%1000)/100;
d=(zahl%10000)/1000;

if (a||b||c||d==8||9) {goto Eingabe;}
else{
x=(a*pow(8,0))+(b*pow(8,1))+(c*pow(8,2))+(d*pow(8,3));
printf("Dezimalzahl lautet: %d", x);}


getch();}}
 
Hallo,
die Funktion goto ruiniert wirklich den ganzen programmierstil und sollte absolut niemals verwendet werden. Sowas kann man auch eleganter lösen und einigen Problemen gehst du damit auch aus dem Weg. Sowas wie goto benutzt man wirklich nur in Assambler.

Gruß Andy
 
Au man lass bloß die Finger von goto. Das kann man viel einfacher und schöner ohne machen. Und son Tipp am Rande deine if-Abfrage ist immer true.
 
gleich empfehlung wie bei den anderen: lass den goto kram weg. mit schleifen kannst du das glaube ich immer umgehen.

p.s. welche sprache ist das eigentlich? ich kann nur ein bisschen delphi ;)
 
Eigentlich gilt: Nie die goto-Sprunganweisung nehmen! Das wird schnell zum berühmt berüchtigten "Spaghetti-Code", der unkontrollierbar ist... ;)

@martin
das sollte c++ sein...
 
@Götterwind echt c++ sieht mir irgendwie nach TCL aus
 
Dass du GOTO nicht benutzen solltest, haben dir ja schon die Vorposter gesagt. Aber dein eigentliches Problem ist die IF-Abfrage.

Was du damit erreichen willst ist:

Wenn a, b, c oder d entweder 8 oder 9 ist dann spring

Das versteht der C-Compiler nicht. Der braucht das häppchenweise:
Wenn a gleich 8 ist oder a gleich 9 ist oder b gleich 8 ist oder b gleich 9 ist oder.... dann spring


Das ganze kannst du etwas optimieren:
Wenn a mindestens 8 ist oder b mindestens 8 ist oder c... dann spring

In C heißt deine IF-Abfrage dann:
Code:
if ( (a>=8) || (b>=8) || (c>=8) || (d>=8) ) {goto Eingabe;}

1. Du solltest das ganze aber unbedingt ohne GOTO lösen.
2. Die möglicherweise sehr rechenintensive Verwendung von pow bei der Umrechnung ins Dezimalsystem kannst du in diesem Fall durch Bitshiftoperationen optimieren. Der Compiler wird es dir danken.
3. Zu guter letzt solltest du auch noch prüfen, ob die eingegebene Zahl mehr als vier Stellen hat. In dem Fall würde dein Programm ein falsches Ergebnis ausgeben.

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

int main (void) {
	int zahl,x,a,b,c,d;

	while(1) {
		do {
			cout << "\nBitte geben Sie eine 4 stellige Oktalzahl ein: ";

			cin >> zahl; 

			a = (zahl%10);
			b = (zahl%100) / 10;
			c = (zahl%1000) / 100;
			d = (zahl%10000) / 1000;
		} while( ((a>=8) || (b>=8) || (c>=8) || (d>=8)) || ((zahl / 10000) != 0) );
 
		x = a + (b<<3) + (c<<6) + (d<<9);

		printf("Dezimalzahl lautet: %d", x);

		getch();
	}
	return 1;
}

j o e
 
Danke für deine Hilfe JOE ! klappt wunderbar!
Das mit bitshift ist ne sehr gute idee hab halt gleich die idee genommen die mir im mom eingefallen ist (pow).
jep das mit goto werde ich wohl in zukunft sein lassen.
 
joe67 schrieb:
[...]
In C heißt deine IF-Abfrage dann:
Code:
if ( (a>=8) || (b>=8) || (c>=8) || (d>=8) ) {goto Eingabe;}
[..]
Geht da nicht sowas wie
Code:
 if ( (a in [8,9]) || (ba in [8,9]) || (ca in [8,9]) || (a in [8,9]) ) {goto Eingabe;}
? Hab mir jetzt nicht den ganzen Code angesehn um zu prüfen ob es auch mit >= 8 geht... ([8,9] soll ein Array darstellen)

David
 
davidbaumann schrieb:
Geht da nicht sowas wie
Code:
 if ( (a in [8,9]) || (ba in [8,9]) || (ca in [8,9]) || (a in [8,9]) ) {goto Eingabe;}
? Hab mir jetzt nicht den ganzen Code angesehn um zu prüfen ob es auch mit >= 8 geht... ([8,9] soll ein Array darstellen)

Ein solches Konstrukt gibt es in C leider nicht. Mein Vorschlag mit einem Vergleich auf >=8 funktioniert auch nur, weil die Modulooperation und die Division vorher stattgefunden haben und der Variableninhalt in a, b, c und d deshalb jeweils nicht größer als 9 ist.

j o e
 
Zurück
Oben