HILFE beim Telefonverzeichnis
-
Hoch verehrtes C Forum
Nun denn - nach langer Krankheit und dem üblichen Weihnachtshallas sitze ich nun wieder an meinem geliebten Telefonverzeichnis!
Dank Horst2, Konfusius & Co. habe ich meine Fehler korrigiert und das Programm läuft schon recht ordentlich.
Als da wären noch ein paar Fragen zum Feintuning:
1. I.d. Eingabefunkt. darf eine gewisse Zeichenanzahl nicht überschritten werden.
In meiner alten Version des Programmes hat dies auch gefuntzt.Durch den Austauch von scanf durch fgets geht diese Option verloren.WHY??
2. In der Suchfunkt. habe ichif (strcmp(liste[n].name,stichwort) == 0)
in die for - Schleife gelegt.
Es werden trotzdem keine Ergebnisse ausgespuckt, obwohl übereinstimmende Stichworte benutzt wurden
Für schnelle Hilfe wäre ich unendlich dankbar, da ich am Donnerstag den Rotz präsentieren muß!!
Das mit dem"convert coffein into code" klappt bei mir irgendwie nich!!!
Vielen vielen Dank!!!!Hier nochmal der code:
#include <stdio.h> #include <conio.h> //laden von Bibliotheken die benötigt werden #include <stdlib.h> #include <string.h> struct daten // Datenstruktur festlegen { char name[20]; char vorname[15]; //zu strukturierende Daten... char email[30]; //...mit fest vorgeschriebener Zeichenanzahl int nummer; char stichwort[31]; } liste[100]; //legt 100 Datensätze mit Namen "Liste" maximal int i=0,x; //dekl.einer Variablen i mit Wertzuweisung(Definition) 0 und... //..einer Var. x ohne Wert char szFile[] = "A:\\Liste.txt"; void menue(); void eingabe(); //anmelden aller Unterfunktionen des Progamms void ausgabe(); void suchen(); void beenden(); void main() //Hauptfunktion { int x; FILE *zeiger; zeiger=fopen(szFile,"r"); //öffnen der Datensätze zum lesen if (zeiger != NULL) { if(feof(zeiger)==0) //prüfen ob der Dateizeiger am Ende der Datei steht { fscanf(zeiger,"%i",&i); //liest Anzahl der Datensätze for(x=0;x<=i && feof(zeiger)==0;x=x+1) //wenn gilt dass beide Bedingungen zutreffen(wahr sind) //1.Bed.:Var x=0 xgrößergleich i UND... //2.Bed.:Zeiger am Ende der Datei { fscanf (zeiger,"%s",&liste[x].name); //Anweisung was gelesen werden soll fscanf (zeiger,"%s",&liste[x].vorname); fscanf (zeiger,"%i",&liste[x].nummer); fscanf (zeiger,"%s",&liste[x].email); } } fclose(zeiger); } for(;;) //FOR-Schleife ohne Abbruchbedingung - Endlosschleife menue(); } void menue() //1.Unterfunktion { clrscr(); gotoxy(1,5); printf (" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); printf (" X X\n"); printf (" X Online-Telefonverzeichnis X\n"); printf (" X----------------------------------------X\n"); printf (" X X\n"); printf (" X Bitte waehlen Sie: X\n"); printf (" X ----------------------- X\n"); printf (" X X\n"); printf (" X 1 Teilnehmer eingeben X\n"); printf (" X X\n"); printf (" X 2 Teilnehmer ausgeben X\n"); printf (" X X\n"); printf (" X 3 Teilnehmer suchen X\n"); printf (" X X\n"); printf (" X 4 Programm beenden X\n"); printf (" X X\n"); printf (" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); char a; a = getch(); switch(a) //Anweisung für Tastatureingaben oder Menü-Auswahl { case '1' : eingabe(); break; // case block: case '2' : ausgabe(); break; //Zuweisung bestimmter Tasten zu den jeweiligen Unterprogrammen case '3' : suchen(); break; //break Anweisung beendet einen case Block case '4' : beenden(); break; // default : menue(); // wenn alle case Blöcke nicht zutreffen... //...RÜcksprung ins Hauptmenue } } void eingabe() //2.Unterfunktion { do //führe aus { system("cls"); //gotoxy(1,3); printf (" Bitte geben Sie Ihre Daten ein \n"); printf (" ----------------------------------------------\n"); printf (" \n"); printf (" Name : "); // Namen einlesen fgets(liste[i].name, 20, stdin); // es werden maximal 20 Zeichen gelesen printf ("\n"); printf (" Vorname : "); fgets(liste[i].vorname, 15, stdin); // es werden maximal 15 Zeichen gelesen printf (" \n"); printf (" Nummer : "); scanf("%i", &liste[i].nummer); while(liste[i].nummer>9999) { //gotoxy(0,23); printf ("!!!Bitte nicht mehr als 10 Zeichen eingeben!!!\n"); printf ("!!!Bitte Eingabe wiederholen \n"); printf ("\t\t\t \n"); //gotoxy(26,12); scanf("%i", &liste[i].nummer); } printf (" \n"); printf (" Email : "); fflush(stdin); fgets(liste[i].email, 30, stdin); // liest max. 30 Zeichen printf (" \n"); //gotoxy(26,8); i++; //Nr. des Datensatzes der eingegeben wird erhöht sich um 1 //gotoxy(0,23); printf ("\t\t \n"); printf (" \n"); //gotoxy(0,23); printf ("\n\n\tMoechten Sie die Eingaben aendern? (j/n) \n"); } while(getch()=='j'); //wenn ja - erneute Eingabe FILE *zeiger; zeiger=fopen(szFile,"w"); //öffnen der Datensätze zum schreiben if (zeiger != NULL) { fprintf(zeiger,"%i\n",i); //schreibt die Anzahl der Datensätze in die "Liste" //\n an dieser Stelle bewirkt, dass im ARRAY //ein Zeilenumbruch stattfindet for (x=0; x<i; x=x+1) { fprintf (zeiger,"%s", liste[x].name); fprintf (zeiger,"%s", liste[x].vorname); fprintf (zeiger,"%i\n", liste[x].nummer); fprintf (zeiger,"%s", liste[x].email); } fclose(zeiger); } else { printf ("Programm konnte Ihre Daten nicht speichern..."); getch(); } printf ("\n\n\tDaten wurden erfolgreich gespeichert!\n"); printf ("\n\n\tDruecken Sie eine belibige Taste um ins Hauptmenue zurueckzukehren\n"); getch(); } void ausgabe() //3.Unterprogramm { int n; clrscr(); printf (" Telefonliste: \n"); printf (" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); printf (" Name Vorname Nummer Email \n"); for(n=0;n<i;n=n+1) { printf (" %s %s %i %s \n",liste[n].name,liste[n].vorname,liste[n].nummer,liste[n].email); } printf ("\n\n\n"); printf ("Bitte druecken Sie `h` um ins Hauptmenue zurueckzukehren\n"); while(getch()!='h') //Schleife solange andere Taste als hgedrückt wird printf ("Bitte druecken Sie `h` um ins Hauptmenue zurueckzukehren\n"); } void suchen() { char stichwort[31]; clrscr(); gotoxy(16,12); printf ("\n\t\t Namen suchen\n"); printf ("\n\t\t Bitte geben Sie ein Stichwort ein:\n"); gotoxy(35,17); scanf("%s",stichwort); char b,n; clrscr(); printf ("\t\t\nNamen mit gesuchtem Stichwort:\n\n\n"); printf ("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); printf("%s",liste[n].name); printf("%s",liste[n].stichwort); { clrscr(); printf (" Suchergebnis: \n"); printf (" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n"); printf (" Name Vorname Nummer Email \n"); for(n=0;n<i;n=n+1); { if (strcmp(liste[n].name,stichwort) == 0) //vergleicht die Eingabe mit den Einträgen aus den Datensätzen printf (" %s %s %i %s \n",liste[n].name,liste[n].vorname,liste[n].nummer,liste[n].email); b++; //Eingegebener Datensatz wird um 1 erhöht } } if (b==0) { printf ("\nTeilnehmer nicht vorhanden!\n"); printf ("\nDuecken Sie eine beliebige Taste um ins Hauptmenue zu gelangen\n"); getch(); } else { printf ("\nDuecken Sie eine beliebige Taste um ins Hauptmenue zu gelangen\n"); getch(); } } void beenden() { clrscr(); gotoxy(16,12); printf ("\t\tSie haben das Programm beendet.\a\n"); gotoxy(16,14); printf ("\t\t (beliebige Taste druecken)\n"); getch(); exit(0); }
-
stepop schrieb:
1. I.d. Eingabefunkt. darf eine gewisse Zeichenanzahl nicht überschritten werden.
In meiner alten Version des Programmes hat dies auch gefuntzt.Durch den Austauch von scanf durch fgets geht diese Option verloren.WHY??fgets ließt aus dem EIngabe Buffer. Wenn mehr eingegeben wurde, wird der Rest automatisch beim nächsten fgets eingelesen. Benutze am besten cin:
cin >> liste[i].vorname; while(strlen(liste[i].vorname) > 20) { printf ("!!!Bitte nicht mehr als 10 Zeichen eingeben!!!\n"); cin >> liste[i].vorname; }
Nachteil: Leerzeichen gehen nicht richtig. Hab nicht soviel ahnung von cin, aber das lässt sich auch irgentwie lösen.
mfg.
-
Schau dir mal die Funktion getline an, die sollte dir weiterhelfen.
mfg
v R
-
eingabe mit getline und string ( nimmt auch space ):
#include<iostream> #include<string>; using namespace std; int main() { string s; bool ok=false; while (!ok) { getline(cin,s); if (s.size()<20) ok=true; else cout<<"eingabe zu lang\n"; } return 0; }
ach ja, bei deinem menue hast du mit default: menue() einen rekursiven aufruf drin, das ist unschoen und ueberfluessig da sowieso eine endlosschleife drumherum ist...
-
Mist hab wohl ins falsche Forum geschrieben.Sorry vielmals!!!
Leider muss ich das ganze Ding in Ansi C realisieren.
Deshalb fällt getline aus.
Trotzdem vielen Dank...
-
Wenn ich mich nicht irre, ist struct doch C++??
mfg.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum ANSI C verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
da gehts weiter:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-125922.html