Zum Inhalt springen

Schleifenproblem mit Char-Variable


WebSorcerer

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();

}

----------

Link zu diesem Kommentar
Auf anderen Seiten teilen

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]

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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:

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...