WebSorcerer Geschrieben 6. Januar 2005 Geschrieben 6. Januar 2005 Hab hier ein Programm, welches 3 Zahlen sortiert. Funktioniert auch einwandfrei, nur mit meiner Schleife am Ende habe ich ein Problem. Diese sol bei Bedarf einfach einen weiteren Durchlauf starten, das Programm beendet sich stattdessen aber. ---------- #include <stdio.h> #include <conio.h> void swap(int *iZahl1, int *iZahl2) { int tmp; tmp = *iZahl1; *iZahl1 = *iZahl2; *iZahl2 = tmp; } void dreiersort(int *iZahl1, int *iZahl2, int *iZahl3) { if (*iZahl1 < *iZahl2) swap(iZahl1,iZahl2); if (*iZahl1 < *iZahl3) swap(iZahl1,iZahl3); if (*iZahl2 < *iZahl3) swap(iZahl2,iZahl3); } void main(void) { char cWeiter; do { int iZahl1,iZahl2,iZahl3; printf("Bitte drei Ganzzahlen eingeben:\n"); scanf("%d %d %d",&iZahl1,&iZahl2,&iZahl3); dreiersort(&iZahl1,&iZahl2,&iZahl3); printf("Die Zahlen abwaerts sortiert: %d %d %d\n",iZahl1,iZahl2,iZahl3); printf ("Nocheinmal? (j/n) "); scanf ("%c",&cWeiter); } while (cWeiter=='j'); getch(); } ---------- Ich bin soweit, dass ich weiß, dass der Fehler bei der Char-Variablen liegt, denn wenn ich das umstricke und stattdessen eine Integer-Variable nehme und eine 1 oder 0 eingegeben werden soll, funktioniert die Schleife. So meine ich das: ---------- do { ... printf ("\nEinen weiteren Vorgang? (1/0) "); scanf ("%d",&iWdh); } while(iWdh==1); ---------- Weiß jemand rat? Und wo ich schonmal dabei bin, kann mir wer sagen, wo ich Infos zu dem "swap" Befehl finde? Ich habe den Code im Netz gefunden und versuche ich 100pro zu verstehen. Habe bei google gesucht, aber finde nichts. Danke! Zitieren
Guybrush Threepwood Geschrieben 6. Januar 2005 Geschrieben 6. Januar 2005 Um das ganze Programm zu wiederholen musst du die Schleife auch um alles machen und nicht nur um die Frage+Eingabe. Um den Swap Befehl zu verstehen solltest du dich mit Pointern befassen. Zitieren
WebSorcerer Geschrieben 7. Januar 2005 Autor Geschrieben 7. Januar 2005 Aber das löst mein "Char" Problem keinesfalls. Auch wenn ich die Schleifen drumherum setze, stürzt das Programm weiterhin ab, sobald ich auf die Frage "Nocheinmal? (j/n) " "j" oder "n" oder eine andere beliebige Taste drücke. Mache ich es jedoch mit einer Integervariable und fordere zu einer Eingabe "1" oder "0" auf, läuft die Schleife problemlos. Zitieren
U-- °LoneWolf° Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 Also wegen dem Schleifenproblem. im 1.LJ hab ich ne adressverwalötung gebaut die sowas hatte hier der source, // adress.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. // //benötiget bibiotheken #include "stdafx.h" #include <stdio.h> #include <iostream.h> #include <fstream.h>//in file schreiben bzw. von file lesen #include <string.h>//umwandlung von string und andere string funktionen //vordefinition von funktionen int fehler(int); int menu(void); int erstellen(void);//hir werden neue datensätze angelegt int ausgeben(void);//anzeige aller datensätze auf dem monitor int suchen(void);//funktion zum suchen einzelner datensätze int loeschen(void);//funktion zum löschen einzelner datensätze int ausdatei(void);//auslesen der adress.data datei int indatei(void);//schreiben in adress.data int ende(void);//beenden des programms int allloeschen(void);//löschen aller datensätze //struckt ähnlich einem record in delphi struct kunden { char vorname[30]; char nachname[30]; char strasse[30]; char hausnr[30]; char ort[30]; char plz[30]; char tel[30]; char leer[30]; }; //globale variablen (allternative zu zeigern) kunden adress[100]; int speichermax=0; int speicherpos=0; int main()//stamm funktion { cout<<"Wilkommen zur neuen Adressverwaltung von U[[ °LoneWolf° \n"<<endl;//begrüßung ausdatei();//auslesen der datei in der die adressen stehen menu(); indatei();// schreiben erstellen der datei in der die daten stehen return 0; } int menu(void)//in dieser funktion ist das menü für den anwender gekapselt { char imenu= 0; while ((imenu!=1)&&(imenu!=2)&&(imenu!=3)&&(imenu!=4)&&(imenu!=5)&&(imenu!=6)&&(imenu!=7)) { cout<<" Was moechten Sie tun?\n"<<endl; cout<<" (1) Neue Eintraege Erstellen\n"<<endl; cout<<" (2) Einen Eintrag Suchen\n"<<endl; cout<<" (3) Ausgeben aller Daten\n"<<endl; cout<<" (4) Einen Eintrag Loeschen\n"<<endl; cout<<" (5) Alle Loeschen\n"<<endl; cout<<" (6) Beenden\n"<<endl; cin>>imenu; switch (imenu) { case '1': erstellen(); break; case '2': suchen(); break; case '3': ausgeben(); break; case '4': loeschen(); break; case '5': allloeschen(); break; case '6': ende(); return 0; break; default: fehler(1); break; } } return 0; } int fehler(int fehlercode = 0)// fehler funktion um fehler des benutzers abzufangen { switch (fehlercode) { case 1: cout<<"Bitte Koriegieren Sie ihre Eingabe\n"<<endl; break; } return 0; } int erstellen(void)//erstellt einen neuen eintrag { char weiter='j'; speicherpos=speichermax; cout<<"Bitte machen Sie ihre Eingaben"<<endl; while ((weiter=='j')&&(weiter!='n')) { cout<<"Vorname:"; cin>>adress[speicherpos].vorname;//eingaben des benutzers cout<<"Nachname:"; cin>>adress[speicherpos].nachname; cout<<"Strasse:"; cin>>adress[speicherpos].strasse; cout<<"HausNr:"; cin>>adress[speicherpos].hausnr; cout<<"Ort:"; cin>>adress[speicherpos].ort; cout<<"PLZ:"; cin>>adress[speicherpos].plz; cout<<"Tel:"; cin>>adress[speicherpos].tel; speicherpos++; cout<<"Moechten Sie fortfahren? (j/n)"; cin>>weiter; while ((weiter!='j')&&(weiter!='n'))//will der benutzer noch mehr datensätze erfassen ???? { cout<<"moechten Sie fortfahren? (j/n)"; cin>>weiter; } } speichermax=speicherpos; return 0; } int ausgeben(void)//ausgeben aller daten in einer list bzw. tabelle {speicherpos=0; cout<<"NR"<<" "<<"Vorname"<<" "<<"Nachname"<<" "<<"Strasse"<<"/"<<"HausNr"<<" "<<"Ort"<<" "<<"PLZ"<<" "<<"Tel\n"<<endl; while(speicherpos<=speichermax) { cout<<speicherpos<<" "//ausgabe der daten <<adress[speicherpos].vorname<<" " <<adress[speicherpos].nachname<<" " <<adress[speicherpos].strasse<<"/" <<adress[speicherpos].hausnr<<" " <<adress[speicherpos].ort<<" " <<adress[speicherpos].plz<<" " <<adress[speicherpos].tel; speicherpos++; cout<<endl; } return 0; } int suchen(void)//funktion zum suchen bestimmter daten { int ergebnis[10]; int i=0; cout<<"Geben Sie bitte ihr Suchwort ein"; cin>>adress[0].leer; speicherpos=0; while(speicherpos<=speichermax) { if ((!strcmpi(adress[speicherpos].vorname,adress[0].leer))||(!strcmpi(adress[speicherpos].nachname,adress[0].leer))|| (!strcmpi(adress[speicherpos].strasse,adress[0].leer))||(!strcmpi(adress[speicherpos].ort,adress[0].leer))|| (!strcmpi(adress[speicherpos].plz,adress[0].leer))||(!strcmpi(adress[speicherpos].tel,adress[0].leer))) {ergebnis[i]=speicherpos; i++; } speicherpos++; } speicherpos=i; i=0; cout<<"Ergebnis der Suche :\n"; cout<<"NR"<<" "<<"Vorname"<<" "<<"Nachname"<<" "<<"Strasse"<<"/"<<"HausNr"<<" "<<"Ort"<<" "<<"PLZ"<<" "<<"Tel\n"<<endl; while(i<speicherpos) { cout<<ergebnis[i]<<" " <<adress[ergebnis[i]].vorname<<" " <<adress[ergebnis[i]].nachname<<" " <<adress[ergebnis[i]].strasse<<"/" <<adress[ergebnis[i]].hausnr<<" " <<adress[ergebnis[i]].ort<<" " <<adress[ergebnis[i]].plz<<" " <<adress[ergebnis[i]].tel; cout<<endl; i++;} return 0; } int loeschen(void)//löschen eines datensatzes { cout<<"Bitte geben Sie die Speicherposition \n des speichers an den Sie loeschen moechetn"<<endl; cin>>speicherpos; while (speicherpos<speichermax)//die daten werden einfach nur verschoben und der speichermax wert minus 1 gerechent damit nicht auf einmal daten doppelt vorkommen {speicherpos++; adress[speicherpos-1]=adress[speicherpos]; } speichermax--; return 0; } int ausdatei(void)//auslesen der datei { int i=0; ifstream fin("adress.data");//gibt die zu lesende datei an while (fin>>adress[i].vorname) { fin>>adress[i].nachname;//list die zeile aus fin>>adress[i].strasse; fin>>adress[i].hausnr; fin>>adress[i].ort; fin>>adress[i].plz; fin>>adress[i].tel; i++; } speichermax=i; fin.close(); return 0; } int indatei(void)//schreibt die daten in eine datei { ofstream fout("adress.data");//gibt den dateinamen und den pfad an for(int i=0;i<speichermax;i++) { fout<<adress[i].vorname<<"\n";//schreibt die daten in eine zeile fout<<adress[i].nachname<<"\n"; fout<<adress[i].strasse<<"\n"; fout<<adress[i].hausnr<<"\n"; fout<<adress[i].ort<<"\n"; fout<<adress[i].plz<<"\n"; fout<<adress[i].tel<<"\n"; } fout.close(); return 0; } int ende(void)//überprüft ob der user sich sicher ist das er das programm beenden möchte { char cende='0'; while ((cende!='j')&&(cende!='n')) { cout<<"Sind Sie sicher das Sie das Programm beenden moechetn? (j/n)"; cin>>cende; if (cende=='n') { menu(); } } return 0; } int allloeschen(void)//löschte alle datensätze { char cende='0'; while ((cende!='j')&&(cende!='n')) { cout<<"Sind Sie sicher das Sie alles Datensaetze loeschen moechetn? (j/n)"; cin>>cende; if (cende=='n') { menu(); } else if (cende=='j') { ofstream fout("adress.data"); fout.close(); ifstream fin("adress.data"); fin.close(); speichermax=0; cout<<"Es wurden alle Datensätze Geloescht\n"<<endl; } } return 0; } Hoffe das hilft weiter Zitieren
bigpoint Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 also wo liegt das Problem ? char cWeiter; do { cout<<"Bitte j/n eingeben:"<<endl; cin>>cWeiter; } while (cWeiter=='j'); [/PHP] Zitieren
WebSorcerer Geschrieben 7. Januar 2005 Autor Geschrieben 7. Januar 2005 Vorweg nochmal, ich schreibe in C, C++ hilft mir leider nicht weiter, ebenso PHP nicht. Mein Programm im Ganzen nochmal und es stürzt definitv nach drücken einer Taste auf die Abfrage hin ab. ---------- #include <stdio.h> #include <conio.h> void main(void) { char cWeiter; int iZahl1,iZahl2,iZahl3; do { void swap(int *iZahl1, int *iZahl2) { int tmp; tmp = *iZahl1; *iZahl1 = *iZahl2; *iZahl2 = tmp; } void dreiersort(int *iZahl1, int *iZahl2, int *iZahl3) { if (*iZahl1 < *iZahl2) swap(iZahl1,iZahl2); if (*iZahl1 < *iZahl3) swap(iZahl1,iZahl3); if (*iZahl2 < *iZahl3) swap(iZahl2,iZahl3); } printf("Bitte drei Ganzzahlen eingeben:\n"); scanf("%d %d %d",&iZahl1,&iZahl2,&iZahl3); dreiersort(&iZahl1,&iZahl2,&iZahl3); printf("Die Zahlen abwaerts sortiert: %d %d %d\n",iZahl1,iZahl2,iZahl3); printf ("Nocheinmal? (j/n) "); scanf ("%c",&cWeiter); } while (cWeiter=='j'); getch(); } ---------- Zitieren
U-- °LoneWolf° Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 also eigentlich sollte das funzen Visual studio mosert nicht Zitieren
baba007 Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 stürtzt aber ab gerade getestet Zitieren
WebSorcerer Geschrieben 7. Januar 2005 Autor Geschrieben 7. Januar 2005 Mein Compiler (Dev-C++) mosert auch nicht, aber abstürzen tut das Programm dennoch. Zitieren
baba007 Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 printf ("Nocheinmal? (j/n) "); fflush(stdin); scanf ("%c",&cWeiter); } while (cWeiter=='j'); } lag am Tatstatur-Puffer Zitieren
U-- °LoneWolf° Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 kannst du denn auch debugen ? dann step mal durch und mach nen break point bei der schleife. schau dir an was in deiner variablen steht. ansonsten versuch mal cin cout Zitieren
WebSorcerer Geschrieben 7. Januar 2005 Autor Geschrieben 7. Januar 2005 Danke baba007, der Tipp war Gold wert. Zitieren
baba007 Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 in der variablen wird der speicherwert für ENTER stehen, wenn man ohne fflush(stdin) arbeitet Zitieren
bmg4ever Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 Vorweg nochmal, ich schreibe in C, C++ hilft mir leider nicht weiter, ebenso PHP nicht. Mein Programm im Ganzen nochmal und es stürzt definitv nach drücken einer Taste auf die Abfrage hin ab. ---------- #include <stdio.h> #include <conio.h> void main(void) { char cWeiter; int iZahl1,iZahl2,iZahl3; do { void swap(int *iZahl1, int *iZahl2) { int tmp; tmp = *iZahl1; *iZahl1 = *iZahl2; *iZahl2 = tmp; } void dreiersort(int *iZahl1, int *iZahl2, int *iZahl3) { if (*iZahl1 < *iZahl2) swap(iZahl1,iZahl2); if (*iZahl1 < *iZahl3) swap(iZahl1,iZahl3); if (*iZahl2 < *iZahl3) swap(iZahl2,iZahl3); } printf("Bitte drei Ganzzahlen eingeben:\n"); scanf("%d %d %d",&iZahl1,&iZahl2,&iZahl3); dreiersort(&iZahl1,&iZahl2,&iZahl3); printf("Die Zahlen abwaerts sortiert: %d %d %d\n",iZahl1,iZahl2,iZahl3); printf ("Nocheinmal? (j/n) "); scanf ("%c",&cWeiter); } while (cWeiter=='j'); getch(); } ---------- also erstmal kann ich garnicht glaube, was ich hier lesen muss..... du hast hier eine schleife komplett um mehrere Funktionen gemacht. das darf der compiler eigentlich auch nicht akzeptieren, denn es würde auch nie funzen. vielleicht ist das aufgrund von "Guybrush Threepwood" 's Einwand, den ich auch nicht ganz nachvollziehen kann, entstanden. aber kommen wir zu deinem ursprünglichen Programm Die Schleife sitzt hier völlig richtig, allerdings würde ich dir wärmstens empfehlen die Variableninitialisierung vor den beginn der Schleife zu setzten, da du die integer-variablen ja nicht bei jeden durchlauf neu erstellen musst. und nun machst du einfach folgendes ---------- void main(void) { char cWeiter; int iZahl1,iZahl2,iZahl3; do { printf("Bitte drei Ganzzahlen eingeben:\n"); scanf("%d %d %d",&iZahl1,&iZahl2,&iZahl3); dreiersort(&iZahl1,&iZahl2,&iZahl3); printf("Die Zahlen abwaerts sortiert: %d %d %d\n",iZahl1,iZahl2,iZahl3); printf ("Nocheinmal? (j/n) "); //<---- Zeile hier einfügen -----> while (getchar() != '\n'); //<---- Zeile hier einfügen -----> scanf ("%c",&cWeiter); } while (cWeiter=='j'); getch(); } ---------- dein problem war, dass du von den Zahleneingaben noch ein Enter im Tastaturpuffer hast, welches sofort in die Variable "cWeiter" eingelesen wird. die schleife wird also sofort verlassen und der einzigste grund, warum du überhaupt noch was eingeben kannst ist dein "getch()" am Ende, wobei ich auch nicht weiß wofür das gut sein soll. Du musst und solltest generell vor jedem Einlesen einer Variablen den Tastaturpuffer leeren. Entweder machst du dies über diese schicke Mini-Schleife, die da oben steht, oder in C++ benutzt du "fflush(stdin);" ich hoffe ich konnte dir weiterhelfen und das du mir ja nie wieder mehrere Funktionsdeklarationen in eine Schleife packst [EDIT] hoppla, da waren einige viel schneller als ich [/EDIT] Zitieren
Klotzkopp Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 Nur als Anmerkung: fflush(stdin) erzeugt laut Standard undefiniertes Verhalten. Viele Compiler leeren dabei den Tastaturpuffer, aber darauf kann man sich nicht verlassen. Wer Wert auf Portierbarkeit legt, sollte das nicht verwenden. Ich kenne allerdings keinen (nichtblockierenden) Weg, unter C den Puffer zu leeren. Wie es unter C++ geht, steht hier. Zitieren
WebSorcerer Geschrieben 7. Januar 2005 Autor Geschrieben 7. Januar 2005 Wie funktioniert while (getchar() != '\n'); denn genau? Funktionieren tut es. Danke! Ich würde ja nicht soviel dumme Fragen stellen, aber ich hab bisher noch keine guten Quelle im Net gefunden bezüglich einer guten Online-Anleitung/ Tutorials oder ähnliches. Zitieren
baba007 Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 Kuckst du hier und hier wegen while getch() bla bla Zitieren
Guybrush Threepwood Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 vielleicht ist das aufgrund von "Guybrush Threepwood" 's Einwand, den ich auch nicht ganz nachvollziehen kann, entstanden. Was soll daran nicht nachvollziehen zu sein?! Er will doch nicht nur die Abfrage immer wiederholen, also darf er die schleife auch nicht nur um diese machen Zitieren
baba007 Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 Was soll daran nicht nachvollziehen zu sein?! Er will doch nicht nur die Abfrage immer wiederholen, also darf er die schleife auch nicht nur um diese machen du schwimmst in die falsche richtung schon am anfang war seine klammer richtig gesetzt. do { . . . . . . . hauptargumente } while (*****) verstehe gar nicht was du willst ? Zitieren
Guybrush Threepwood Geschrieben 7. Januar 2005 Geschrieben 7. Januar 2005 du schwimmst in die falsche richtung schon am anfang war seine klammer richtig gesetzt. verstehe gar nicht was du willst ? Oh sorry ich seh grade das ich mich gestern Abend verguckt habe, hab gedacht er hätte die Schleife nur um den Teil printf ("\nEinen weiteren Vorgang? (1/0) "); scanf ("%d",&iWdh); gesetzt :floet: Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.