problem beim programmieren in c++ mit struct und anderem
-
Tag zusammen,
Ich hoffe ich bin hier richtig. Muss ein Programm in c++ mit visualstudio schreiben, aber der compiler scheint mich zu hassen, soll heißen ich kriegs nicht gebacken.
Ich hab schon mal ein stümperhaftes Programm angefangen, das eigentlich hauptsächlich aus unterprogrammen besteht.
Es soll im Idealfall mal folgendes können:
Daten in eine Struktur einlesen (max 12 strukturen)
die daten in ner datei speichern
die daten aus der datei wieder hochladen
ein bestimmtes element suchen und anzeigen
und die daten (strukturen) sortieren nach dem ersten element alphabetischHabe meine sehr dürftigen kenntnisse bereits ausgereizt, und steck jetzt irgendwie fest.
hab schon so ziemlich alles was annähernd brauchbar aussah versucht (vor allem aus dem internet, teils wohl auch hier), aber das ding tut nicht das was ich will.
Vielleicht ist das ja nur n Anfängerfehler und in n paar minuten erledigt, wer weiß.
wäre froh wenn mir jemand n kleinen tipp geben könnte. Und seid bitte nicht so fies zu mir, ich weiß dass ichs nicht kann, sonst müsst ich euch nicht um hilfe bitten:)
Primärproblem: Er liest die Daten nicht in die Struktur. Wem sonst noch was aufffällt, nur immer raus damit, bin für jede hilfe dankbar, da ich schon fast verzweifet bin.
Hier mal der Quellcode:#include "stdio.h" #include "goto_clrscr.h" #include <iostream.h> #include <vector> #include <algorithm> #include <list> #include <stdlib.h> #define N 12 #define NULL 0 #define BOOL int FILE *fpt; int i=0; //Struktur definieren typedef struct { char *name; unsigned long matrikelnummer; char fachrichtung; float note; } datensatz; datensatz student[12]; datensatz *studentptr = 0; datensatz *new_elem (char * ,unsigned long *, char * , float) ; //Unterfunktionen deklarieren int Datensatz_anlegen(void); int Daten_suchen (void); int Daten_sortieren (void); int Daten_speichern (void); int Daten_laden (void); int main(void) { int auswahl1; // printf("\n\t*** Willkommen zum Programm ***"); Anfang:; //Auswahlmenü printf("\n\n\nWas moechten Sie tun?\n\n\n1.Datensatz anlegen\n2.Datensatz suchen\n3.Daten speichern\n4.Daten laden\n5.Daten alphabetisch ordnen\n6.Beenden\n\nAuswahl durch Eingabe der Nummer und bestaetigen mit Eingabe-Taste\n\n\nIhre Auswahl:\t"); //Leeren des Tastaturpuffers// fflush (stdin); //Einlesen der Auswahl// scanf ("%d",&auswahl1); //Überprüfen welche Funktion gewählt wurde// switch (auswahl1) { //Fall 1: Datensatz anlegen// case 1: //Bildschirm leeren// {clrscr(); //Unterfunktionaufruf Datensatz_anlegen(); } break; //Fall 2:Datensatz suchen// case 2: {clrscr(); //Unterfunktionaufruf Daten_suchen(); } break; //Fall 3: Daten in Datei speichern case 3: {clrscr(); //Unterfunktionaufruf Daten_speichern(); } break; //Fall 4: Daten aus Datei laden case 4: {clrscr(); //Unterfunktionaufruf Daten_laden(); } break; //Fall 5: Sortieren// case 5: {clrscr(); //Unterfunktionaufruf Daten_sortieren(); } break; //Fall 6: Programm beenden// case 6: {clrscr(); //Ausgabe der Verabschiedung printf("\nUnd Tschuess\n\n"); //Sprung zum Ende des Programms goto Ende; } } clrscr (); // Sprung zum Anfang des Programms goto Anfang; //Sprungmarke goto Funktion Ende:; return 0; } //--------------------------------------------------------- //Erstes Unterprogramm: Datensatz anlegen// int Datensatz_anlegen (void) { unsigned long matr=0; datensatz *studentptr = (datensatz *) malloc (sizeof (datensatz)) ; if (studentptr == NULL) { printf ("Fehler beim Allokieren von Speicherplatz") ; system("pause"); return 1 ; } datensatz *speichern(datensatz tabelle[], unsigned long matrikelnummer); datensatz student[12]; student[i].matrikelnummer = matr; printf("Geben Sie die Daten ein\n\nName:\t"); scanf("%s",&(student[i].name)); printf("\nMatrikelnummer:\t"); do { scanf("%ul",&(student)->matrikelnummer); }while(getchar()!='\n' ); scanf("%ul",&matr); printf("\nFachrichtung:\t"); scanf("%s",&(student[i].fachrichtung)); printf("\nNote:\t"); scanf("%f",&(student[i].note),i++); system ("pause"); return 0; } //---------------------------------------------------------------------------- // Zweites Unterprogramm: Suchen von Einträgen// int Daten_suchen (void) { datensatz student[N]; long matrikelnummer; datensatz *pt; datensatz *suchen(datensatz tabelle[], long matrikelnummer); printf("Sie moechten einen Eintrag suchen?\n\n"); //Einsprungspunkt für goto Funktion// Anfang:; //Eingabeaufforderung// printf("Geben Sie die zu suchende Matrikelnummer ein, \n0 um ins Hauptmenue zurueckzukehren\n\nIhre Suche:\t"); ///Einlesen der Eingabe// scanf("%ld", &matrikelnummer); //While-Schleife wenn eine richtige Matrikelnummer eingegeben wurde// while(matrikelnummer !=0) { pt = suchen(student, matrikelnummer); //If-Schleife ob Eintrag vorhanden oder nicht// if(pt != NULL) { printf("\nName: %s\n", pt->name); printf("\nMatrikel-Nummer: %d\n", pt->matrikelnummer); printf("\nFachbereich: %c\n", pt->fachrichtung); printf("\nNote: %f\n", pt->note); } else printf("\nEintrag nicht vorhanden, Sie koennen zurueck ins Hauptmenue navigieren \nund den Eintrag erstellen\n\n"); system ("pause"); clrscr(); goto Anfang; } return 0; } datensatz *suchen(datensatz tabelle[N], long matrikelnummer) { int count; for(count=0; count<N; ++count) { if(tabelle[count].matrikelnummer == matrikelnummer) return (&tabelle[count]); } return (NULL); } //------------------------------------------------------------------ //3.Unterfunktion: Daten in Datei schreiben// int Daten_speichern (void) { //Datei öffnen if ((fpt = fopen("daten.txt", "wb")) == NULL) printf("Fehler"); else //Daten in Datei schreiben fwrite(&student, sizeof(datensatz), 12, fpt); student; fclose(fpt); clrscr(); printf("Daten wurden gespeichert\n\n"); system ("pause"); return 0; } //------------------------------------------------------------------- //4.Unterfunktion: Daten aus Datei laden// int Daten_laden (void) { //Datei öffnen if ((fpt = fopen("daten.txt", "wb")) == NULL) printf("Fehler"); else //Daten aus Datei lesen fread(&student, sizeof(datensatz), 12, fpt); student; fclose(fpt); clrscr(); printf("Datei wurde geoeffnet und Daten stehen nun zur Verfuegung\n\n"); system ("pause"); return 0; } //------------------------------------------------- //5. Unterfunktion: Einträge sortieren// using namespace std; int Daten_sortieren (void) { printf("Moechten Sie die Daten jetzt sortieren?\n\nBestaetigen Sie mit Eingabe um die Sortierung zu starten\n\n"); system ("pause"); return 0; }
macht mich nicht zu sehr runter 
:xmas2:
Teile sind manche überflüssig, hab mich aber nicht getraut die zu löschen, könnte sie ja mal noch brauchen.
Ich hoffe jemand kann mir n paar tipps geben, falls nicht auch ok, schonmal Vielen Dank im vorraus
-
Du hast einmal die globalen Variablen student und studentptr, die normalerweise für alle Funktionen sichtbar sind - und auf der anderen Seite in jeder Funktion lokale Variablen mit den selben Namen. Letztere (a) verdecken die globalen Variablen und (b) werden am Ende der jeweiligen Funktion wieder aufgeräumt.
Außerdem solltest du dich mal entscheiden, ob du mit einem Array fester Länge arbeiten willst oder mit einem dynamischen Array (in letzterem Fall ist ein std::vector<> einfacher zu handhaben als ein nackter Pointer).
PS: <iostream.h> ist Prä-Ansi (korrekt ist <iostream>) und <stdlib.h> ist aus C geerbt (besser ist <cstdlib>) - und anstelle von printf()/scanf() solltest du lieber die IO-Streams verwenden.
PPS: Nur für die Zukunft - sfds

-
danke für die bisherigen antworten von dir und entschuldigt bitte das mit dem stupiden reinkopieren in das forum, kommt nicht mehr vor.
das einlesen der daten scheint nun zu funktioniere.
Das mit dem scanf und printf ist so ne sache, leider ist mir das so vorgeschrieben worden, cin und cout darf ich nicht nehmen.
Hab das Prgramm entsprechend deinen anregungen geändert, wie erwartet hab ich jetzt natürlich neue probleme.
daten einlesen klappt nun, schreiben auch.
Aber suchen kann ich nichts (Programm bleibt bei ner vorhandenen nummer hängen)
Außerdem wenn ich die Datei öffne also die daten mit dem programm lade, wird der inhalt gelöscht.
Ich hoffe da sind es auch nur so kleinigkeiten, danke schonmal für eure bemühungen.
-
kein_c_fan schrieb:
Das mit dem scanf und printf ist so ne sache, leider ist mir das so vorgeschrieben worden, cin und cout darf ich nicht nehmen.
warum nicht? soll das c oder c++ werden? kennst du den unterschied? kennt der aufgabensteller den unterschied?
-
kein_c_fan schrieb:
Das mit dem scanf und printf ist so ne sache, leider ist mir das so vorgeschrieben worden, cin und cout darf ich nicht nehmen.
Wer verbietet dir das?
Aber suchen kann ich nichts (Programm bleibt bei ner vorhandenen nummer hängen)
Dann zeig mal die Suchfunktion - und wie du sie aufrufst (btw, ich würde noch die Größe des Datenfeldes mitgeben).
Außerdem wenn ich die Datei öffne also die daten mit dem programm lade, wird der inhalt gelöscht.
Vielleicht solltest du die Datei auch im Lese-Modus öffnen - "wb" öffnet zum Schreiben und zerstört den alten Dateiinhalt.
-
int Daten_suchen (void) { datensatz student[N]; long matrikelnummer; datensatz *pt; datensatz *suchen(datensatz tabelle[], long matrikelnummer); printf("Sie moechten einen Eintrag suchen?\n\n"); //Einsprungspunkt für goto Funktion// Anfang:; //Eingabeaufforderung// printf("Geben Sie die zu suchende Matrikelnummer ein, \n0 um ins Hauptmenue zurueckzukehren\n\nIhre Suche:\t"); ///Einlesen der Eingabe// scanf("%ld", &matrikelnummer); //While-Schleife wenn eine richtige Matrikelnummer eingegeben wurde// while(matrikelnummer !=0) { pt = suchen(student, matrikelnummer); //If-Schleife ob Eintrag vorhanden oder nicht// if(pt != NULL) { printf("\nName: %s\n", pt->name); printf("\nMatrikel-Nummer: %d\n", pt->matrikelnummer); printf("\nFachbereich: %c\n", pt->fachrichtung); printf("\nNote: %f\n", pt->note); } else printf("\nEintrag nicht vorhanden, Sie koennen zurueck ins Hauptmenue navigieren \nund den Eintrag erstellen\n\n"); system ("pause"); clrscr(); goto Anfang; } return 0; } datensatz *suchen(datensatz tabelle[N], long matrikelnummer) { int count; for(count=0; count<N; ++count) { if(tabelle[count].matrikelnummer == matrikelnummer) return (&tabelle[count]); } return (NULL); }hier die suchfunktion.
wie öffne ich denn die datei lesend so dass ich trotzdem was speichern kann?
keine ahnung ob c oder c++ , ich weiß nur cin und cout ist nicht erlaubt.
Danke
-
Erstmal arbeitest du schon wieder/immer noch mit einem lokalen Array.
Zweitens: goto solltest du besser vermeiden - nimm stattdessen eine vernünftige Schleifenkonstruktion:
do { printf("gesuchte Matrikelnummer:\n"); scanf("%d",&matnr); if(matnr!=0) { pt = suchen(student,matnr); ... } } while(matnr!=0);Drittens: Es gibt weder eine "goto-Funktion" (goto ist eine Anweisung) noch eine "if-Schleife"

-
cfan?? schrieb:
keine ahnung ob c oder c++ , ich weiß nur cin und cout ist nicht erlaubt.
ich weiß nicht ob man dir vernünftig helfen kann, wenn du nicht mal weißt in welcher sprache du programmierst bzw. programmieren sollst. vielleicht solltest du das erst mal klären.
-
also folgendes: programmiert wird in c, jedoch mit dem MS Visual Studio 6.8 c++
warum kann ich euch aber auch nicht sagen. die programmfragmente die ich mir aus deminternet zusammengehamstert habe stammen glaube ich aber größtenteils aus c++ übungen, beispielen, etc..
wo der unterschied zwischen c und c++ liegt hab ich eh keine ahnung, ich weiß nur dass c älter ist und wohl n bisschen weniger befehle kennt, d.h. komplizierter, näheres ist mir aber nicht bekannt.