/* Projekt : Modul 118, Kompetenznachweis, Grundbildung Informatiker, 2. Sem. Datum : tt.mm.jjjj Programm : MP-CH-118_PGM-Aufgabe 3 Plattform : Windows ab V 2000 Compiler, IDE : g++, Dev-C++ V04.9.9.2 Autor : Hans R. Weber Beschreibung : Der Anqender kann jeweils max. 10 Artikel in ein Array artikel[] vom Typ strukt art_daten einlesen. Für den Artikelcode müssen ausführliche Eingabetests durchgeführt werden. Dies wird in der Funktion art_cd_kontr() erledigt. Anschliessend werden die erfassten Artikel auf einem Datenträger gespeichert. Die Datei wird jedes Mal geleert und neu beschrieben. Problem: Die Adressierung an der Stelle /" problem "/ scheint falsch zu sein. Das Programm stürzt ab. Es wird ein Fehlerbericht erstellt. */ #include // Standard-Bibliotheken einbinden #include #include // zusätzliche Bibliotheken #include // nur für MS-Windows using namespace std; // Namensraum für Compiler C++ struct art_daten { char art_cd[13]; // Artikelcode, nn.nnn.nnnn char art_bez1[25]; // Artikelbezeichnungen char art_bez2[25]; // je 10 bis 25 Zeichen short art_EKGrp; // Einkaufsgruppe, nnn double art_EKPreis; // Einkaufspreis (Wertebereich double) char art_RbtGrp[1]; // Rabattgruppe, a char art_PrsCd[5]; // Preiscode, aa.nn int art_HptLfnt; // Hauptlieferant, 100000 - 999999 }; const short ANZ_ARTIKEL = 10; struct art_daten artikel[ANZ_ARTIKEL]; // struct- Array für 'anz_artikel' // Funktionsprototypen void titel(void); int art_erfassen(void); bool art_cd_kontr(char artcd[]); int main() // Hauptprogramm, Hauptfunktion { char wiederholen = 'j'; // Var. für Pgm_Wiederh. dekl. und init. char lc_io; // Eingabe für Auswahl speichern j/n int li_Anz_erf = 0; // speichert Anzahl erfasste Artikel struct art_daten *ap; // Zeiger in Struktur FILE *fz_artDat; // Zeiger auf Struktur FILE do // Schleife für Programmwiederholung { li_Anz_erf = art_erfassen(); // Aufruf Funktion 'Artikel erfassen' if (li_Anz_erf > 0) { printf("\n Es wurden %i Artikel erfasst",li_Anz_erf); printf("\n Wollen Sie die erfassten Artikel speichern? (j/n) >> "); cin >> lc_io; if (lc_io == 'j') // speichern j/n { FILE *fz_artDat = fopen("MP-CH-118_art_name-vorname.txt.", "w"); if (fz_artDat = NULL) { printf("\n Fehler! Datei wurde nicht angelegt!"); break; } else printf("\n Datei angelegt oder geleert!"); for (int i = 0; i < li_Anz_erf; i++) { /*problem*/ ap = &artikel[i]; // ap = pointer to struct fputs(ap->art_cd, fz_artDat); fputs(ap->art_bez1, fz_artDat); fputs(ap->art_bez2, fz_artDat); fprintf(fz_artDat,"%d\n",ap->art_EKGrp); fprintf(fz_artDat,"%f\n",ap->art_EKPreis); fputs(ap->art_RbtGrp, fz_artDat); fputs(ap->art_PrsCd, fz_artDat); fprintf(fz_artDat,"%f\n",ap->art_HptLfnt); } fclose(fz_artDat); // Datei schliessen } } else printf("\n Es wurden keine Artikel erfasst!"); printf("\n\n Wiederholen (j/n)?\t"); do { cin >> wiederholen; if (wiederholen != 'j') if (wiederholen != 'n') wiederholen = 'f'; if (wiederholen == 'f') { system("cls"); printf("\n\n\a Fehler! Eingabe 'j' oder 'n'\n"); printf( "\n Bitte wiederholen Sie die Eingabe...\t"); } } while (wiederholen =='f'); } while (wiederholen == 'j'); printf("\n\n Betaetigen Sie irgend eine Taste...\t"); fflush(stdin); // Eingabebuffer leeren getchar(); // Funktion wartet auf Eingabe return 0; } // Funktionen /* Funktion Titel ausgeben Beschreibung Titel und ev. Anleitung werden ausgegeben Argumente keine Rückgabewert keine Seiteneffekte keine */ void titel(void) { printf("\n Beschlaege AG, Artikel verwalten\n"); } /* Funktion Artikel erfassen Beschreibung Es werden Artikel bis max. 'ANZ_ARTIKEL' erfasst. Argumente keine Rückgabewert Anzahl der erfassten Artikel Seiteneffekte Das Strukturarray wird mit den erfassten Daten gefüllt */ int art_erfassen(void) { bool f_io; // true, wenn ArtCode korrekt int anzahl_art = 0; // speichert Anz. erfasste Artikel char e_string[100]; // Eingabestring for (int i = 0; i < ANZ_ARTIKEL; i++) { system("cls"); // Bildschirm leeren für MS-Windows titel(); printf("\n Eingabe des %d. Artikels\n", i+1); f_io = false; while (!f_io) { fflush(stdin); printf("\n Artikelcode (nnn.nn.nnnn):\t\t"); fgets(artikel[i].art_cd,20,stdin); if (artikel[i].art_cd[0] == '0')// && strlen(artikel[i].art_cd) < 2) return anzahl_art; f_io = art_cd_kontr(artikel[i].art_cd); if (!f_io) printf("\n Eingabefehler. Bitte wiederholen!\n"); } artikel[i].art_cd[strlen(artikel[i].art_cd)-1] = '\0'; // '\n' entfernen printf("\n Eingabe der %d. Artikelbezeichnung 1\n", i+1); printf(" Artikelbezeichnung (max. 25 Zeichen):\t"); fgets(artikel[i].art_bez1,30,stdin); artikel[i].art_bez1[strlen(artikel[i].art_bez1)-1] = '\0'; // '\n' entfernen printf("\n Eingabe der %d. Artikelbezeichnung 2\n", i+1); printf(" Artikelbezeichnung (max. 25 Zeichen):\t"); fgets(artikel[i].art_bez2,30,stdin); artikel[i].art_bez2[strlen(artikel[i].art_bez2)-1] = '\0'; // '\n' entfernen printf("\n Eingabe der %d.Einkaufsgruppe (nnn)\t", i+1); fgets(e_string,100,stdin); // Keine Eingabkontr. für EK-Gruppe artikel[i].art_EKGrp = atoi(e_string); printf("\n Eingabe des %d.EK-Preises (nnnnnn.nn)\t", i+1); fgets(e_string,100,stdin); // keine Eingabekontr. für EK-Preis artikel[i].art_EKPreis = atof(e_string); printf("\n Eingabe der %d.Rabattgruppe (a)\t\t", i+1); fgets(e_string,100,stdin); // keine Eingabekontrolle für Rabatt-Gruppe strcpy(artikel[i].art_RbtGrp,e_string); artikel[i].art_RbtGrp[strlen(artikel[i].art_RbtGrp)-1] = '\0'; printf("\n Eingabe des %d.Preiscodes (aa.nn)\t", i+1); fgets(e_string,100,stdin); // keine Eingabekontrolle strcpy(artikel[i].art_PrsCd,e_string); artikel[i].art_PrsCd[strlen(artikel[i].art_PrsCd)-1] = '\0'; printf("\n Eingabe des %d.Hpt-Lieferanten(nnnnnn)\t", i+1); fgets(e_string,100,stdin); // keine Eingabekontrolle artikel[i].art_HptLfnt = atoi(e_string); anzahl_art = i + 1; } return anzahl_art; } /* Funktion Artikelcode kontrollieren Beschreibung Prüft die Struktur des Artikelcodes Argumente String für Artikelcode Rückgabewert true, wenn der Code korrekt ist, false, wenn nicht Seiteneffekte Der i.Artikelcode wird in der Struktur gespeichert */ bool art_cd_kontr(char artcd[]) { int pt_pos1 = 0; // Position des 1. Punktes int pt_pos2 = 0; // Position des 2. Punktes int anz_pt = 0; // speichert Anzahl Punkte char kontr_s[10]; // speichert Zeichen zw. Punkten artcd[(strlen(artcd)-1)] = '\0'; if (strlen(artcd) > 11) // Base 0 { printf("\n Zeichenkette zu lang!"); return false; } else { for (int i = 0; i <= strlen(artcd); i++) { // Anzahl Punkte zählen if (artcd[i] == '.') anz_pt = anz_pt + 1; } if (anz_pt < 2 || anz_pt > 2) { printf("\n Anzahl Punke falsch (%i))!", anz_pt); return false; } for (int i = 0; i < strlen(artcd); i++) { if (artcd[i] == '.' && pt_pos1 == 0) { pt_pos1 = i + 1; i++; // Läufer nach 1.Punkt schieben } if (artcd[i] == '.' && pt_pos2 == 0) pt_pos2 = i + 1; } if (pt_pos1 !=4 || pt_pos2 !=7) { printf("\n Punkte falsch gesetzt! (%i, %i)", pt_pos1, pt_pos2); return false; } for (int i = 0; i < pt_pos1-1; i++) { if (artcd[i] >= '0' && artcd[i] <= '9') { strncpy(kontr_s, artcd, 3); if (atoi(kontr_s) < 100) { printf("\n Zahl vor erstem Punkt < 100, %S!", kontr_s); return false; } } else { printf("\n Zeichenkette vor 1. Punkt ist keine Zahl!"); return false; } } for (int i = pt_pos1; i < pt_pos2-1; i++) { if (artcd[i] >= '0' && artcd[i] <= '9') { // Zeichen ist eine Zahl } else { printf("\n Zeichenkette zwischen 1. Punkt und 2. Punkt ist keine Zahl!"); return false; } } for (int i = pt_pos2; i < strlen(artcd); i++) { if (artcd[i] >= '0' && artcd[i] <= '9') { // Zeichen ist eine Zahl } else { printf("\n Zeichenkette nach 2. Punkt ist keine Zahl!"); return false; } } } return true; }