[C] Hilfe bei Projekt

PepTic

Grünschnabel
Hallo erstmal!

Ich komme mit meinem Projekt nicht weiter...

Wenn ich Konto anzeigen auswähle, sagt er mir es existiert nicht.
in die Datei wird es aber geschrieben, nur der Kontostand ist 0.00

bekomme außerdem diesen Compilerfehler:
Nicht initialisierter Speicher "kontoID" wird verwendet.: Lines: 8, 9, 10, 11, 12, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 29, 31, 32

Die möglicherweise nicht initialisierte lokale Variable "kontoID" wurde verwendet. Zeile 32

Diverse Rückgabewert wird ignoriert -Warnungen zu scanf und getch.

Wäre nett, wenn mir Jemand helfen kann!

main.c
C:
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "konto.h" 
#include <conio.h>
int main(void) 
{ 
    int auswahl; 
	int IDZaehler = 100; 
	int kontoID;
	int kontoID2;
    double guthaben; 
    
	do
    { 
		printf("-----------------------------------KONTOFUEHRUNG--------------------------------\n");
		printf("Herzlich Willkommen \n");
		printf("------------------- \n\n");
        printf("1) Konto erstellen\n"); 
        printf("2) Konto anzeigen\n"); 
        printf("3) Konto loeschen\n"); 
        printf("4) Ueberweisung\n"); 
        printf("0) Beenden\n\n"); 
		printf("------------------- \n");
        printf("Auswahl: "); 
		scanf("%i", &auswahl);
		
        
		switch(auswahl) 
        { 
            case 0: 
				speichere_konto(kontoID);
                return 0; 
                break; 
            case 1: 
                erstelle_konto(IDZaehler); 
                IDZaehler++; 
                break; 
            case 2: 
                printf("Geben sie die Kontonummer ein: "); 
				scanf("%d", &kontoID); 
                zeige_konto(kontoID); 
                break; 
            case 3: 
                printf("Geben sie die Kontonummer ein: "); 
				scanf("%d", &kontoID); 
                loesche_konto(kontoID); 
				printf("Konto wurde geloescht\n");
                break; 
            case 4: 
                printf("Geben sie die Kontonummer ein, von der abgebucht werden soll: "); 
				scanf("%d", &kontoID); 
                printf("Geben sie die Kontonummer ein, an die ueberwiesen werden soll: "); 
				scanf("%d", &kontoID2); 
                printf("Geben sie den Betrag ein, der ueberwiesen werden soll: "); 
				scanf("%f", &guthaben); 
                ueberweisung(kontoID, kontoID2, guthaben); 
                break; 
            default: 
                break; 
        } 
		printf("Druecken Sie eine beliebige Taste um vorzufahren");
		getch();
		system("cls");
    } while(auswahl);
		return;
}

void erstelle_konto(int ID) 
{ 
	
	printf("\n\nVorname:     "); 
	scanf("%s", konten[ID].vorname); 
    printf("Nachname:    "); 
	scanf("%s", konten[ID].nachname); 
    printf("Kontostand:  "); 
	scanf("%f", &konten[ID].kontostand); 
    printf("Kontonummer: %d\n", ID); 
	konten[ID].kontonummer = ID;
    printf("Konto wurde erstellt!\n\n\n"); 
	
} 

void loesche_konto(int ID) //man kann nichtvorhandene konten löschen
{ 
    strcpy(konten[ID].vorname, ""); 
    strcpy(konten[ID].nachname, ""); 
    konten[ID].kontostand = 0; 
} 

void zeige_konto(int ID) 
{ 
    if(strlen(konten->vorname) == 0 || strlen(konten->nachname) == 0) 
	{ 
        printf("\n\nDieses Konto existiert nicht!\n\n\n"); 
    } 
    else 
    { 
        printf("\n\nVorname:     %s\n", konten[ID].vorname); 
        printf("Nachname:    %s\n", konten[ID].nachname); 
        printf("Kontostand:  %.2f\n", konten[ID].kontostand); 
        printf("Kontonummer: %d\n\n\n", konten[ID].kontonummer); 
    } 
} 

void speichere_konto(int ID) 
{ 
	
	FILE *datei; 
    datei = fopen("Konten.txt", "a+"); 
	
	if(datei == NULL)
		
	{
		printf("\nFEHLER BEIM SPEICHERN"); 
		return;
	}

	else
	{
		fprintf(datei, "Kontonummer: %d\nVorname:     %s\nNachname:    %s\nKontostand:  %.2f\n\n", konten[ID].kontonummer, konten[ID].vorname, konten[ID].nachname, konten[ID].kontostand); 
	}
    fclose(datei); 
	
} 

void ueberweisung(int vonID, int zuID, double guthaben) 
{ 
	

    if(konten->kontostand - guthaben < 0) 
    { 
        printf("\n\nNicht genug Guthaben!\n\n"); 
    } 
    else 
    { 
        konten[vonID].kontostand = konten[vonID].kontostand - guthaben; 
        konten[zuID].kontostand = konten[zuID].kontostand + guthaben; 
        printf("\n\nUeberweisung erfolgreich!\n\n"); 
    } 
}
konto.h
C:
struct konto
{ 
    char vorname[20]; 
    char nachname[20]; 
    double kontostand; 
    int kontonummer; 
}konten[1000];
typedef struct konto konto;

void erstelle_konto(int); 
void loesche_konto(int); 
void zeige_konto(int); 
void speichere_konto(int);
void ueberweisung(int, int, double);
 
Hallo und guten Abend,

eventuell bin ich etwas blind, aber wo wird denn das Array von Konten gefüllt? Ich sehe zwar das Schreiben in die Datei, aber nirgends das wieder einlesen der Daten und das Einfügen in das Array.

Gruß,
Wolf
 
Beim öffnen der Datei bin ich noch nicht angelangt...

Es funktioniert ja nichtmal während dem das Programm läuft und da weiß ich eben nicht weiter.
 
Servus!
ich würde strlen() in diesem Kontext vermeiden und stattdessen ein "bool istErstellt;" o.Ä. benutzen.
Edit: außerdem sollte man in Zeile 93 sowie in Zeile 131 Klammern hinzufügen (ich hab die Prioritäten grad nicht im Kopf, aber lieber zu viel als zu wenig):
C++:
//--snip--
    if((strlen(konten->vorname) == 0 )|| (strlen(konten->nachname) == 0))
//--snip--
    if((konten->kontostand - guthaben) < 0) 
//--snip--
Edit2:
Dein case '0' fragt nicht nach, welches Konto gespeichert werden soll. Deswegen erscheint auch die Fehlermeldung.
Simon
 
Zuletzt bearbeitet:
Und wie kann ich das Nachfragen realisieren?

Das erstellte Konto wird erst in die Datei geschrieben, wenn ich Konto Anzeigen auswähle, dennoch wird im Ausgabefenster "Dieses Konto existiert nicht!" ausgegeben. Wo liegt da der Fehler?
 
Moin
Konto erstellen geht analog zu den anderen Methoden (ich kenn mich jetzt nicht mit scanf aus, aber ich denke mal, das stimmt so)
C++:
//--snip--
            case 0: 
                printf("Geben sie die Kontonummer ein: "); 
                scanf("%d", &kontoID); 
                speichere_konto(kontoID);
                return 0; 
                break;
//--snip--
Warum, er das Konto nicht anzeigt, sehe ich auch gerade nicht ... kann es sein, das du noch keines erstellt hast?
Und füg mal die Klammern hinzu, vielleich liegt es daran.
Simon
 
Jetzt passt soweit alles, nur möchte ich, dass ich zu Beginn des Programms auf den Inhalt der Datei zugreifen und ihn verwenden kann.
 
Bevor ich dir jetzt eine (sowieso nicht funktionierende Lösung) präsentiere, versuche es erstmal selber!
Wenn es nicht klappt, dann poste deinen Code und ich helf dir weiter.

Simon

Edit: jetzt hab ich den Fehler (den du warscheinlich schon ausgebessert hast): konten-> greift nur aus das ERSTE element zu, du solltest stattdessen konten[NrdesKontos] verwenden (NrdesKontos natürlich ersetzen):
C++:
//Zeile 93
    if(strlen(konten[ID].vorname) == 0 || strlen(konten[ID].nachname) == 0)
//Zeile 131
    if(konten[vonID].kontostand - guthaben < 0)
 
Zuletzt bearbeitet:
Bevor ich dir jetzt eine (sowieso nicht funktionierende Lösung) präsentiere, versuche es erstmal selber!
Wenn es nicht klappt, dann poste deinen Code und ich helf dir weiter.

Es klappt nicht :confused:

Code:
//Bibliotheken=====================================================================================
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include "konto.h"

//Erstellt das Navigationsmenü=====================================================================
//Greift durch Auswählen der Menüpunkte auf die jeweilige Funktion zu==============================
int main(void)
{
    int auswahl = 0;
	int IDZaehler = 100;
	int kontoID = 0;
	int kontoID2 = 0;
    double betrag = 0;

	do
    {
		oeffne_konto(kontoID);
		printf("-----------------------------------KONTOFUEHRUNG--------------------------------\n");
		printf("Herzlich Willkommen \n");
		printf("------------------- \n\n");
        printf("1) Konto erstellen\n");
        printf("2) Konto anzeigen\n");
        printf("3) Konto loeschen\n");
        printf("4) Ueberweisung\n");
		printf("5) Speichern\n");
        printf("0) Beenden\n\n");
		printf("------------------- \n");
        printf("Auswahl: ");
		scanf("%d", &auswahl);
		 

		switch(auswahl)
        {
            case 0:
				exit(1);
			case 1:
                erstelle_konto(IDZaehler);
                IDZaehler++;
                break;
            case 2:
                printf("Geben sie die Kontonummer ein: ");
				scanf("%d", &kontoID);
				 
                zeige_konto(kontoID);
                break;
            case 3:
                printf("Geben sie die Kontonummer ein: ");
				scanf("%d", &kontoID);
				 
                loesche_konto(kontoID);
                break;
            case 4:
                printf("Geben sie die Kontonummer ein, von der abgebucht werden soll: ");
				scanf("%d", &kontoID);
				 
                printf("Geben sie die Kontonummer ein, an die ueberwiesen werden soll: ");
				scanf("%d", &kontoID2);
				 
                printf("Geben sie den Betrag ein, der ueberwiesen werden soll: ");
				scanf("%lf", &betrag);
				 
                ueberweisung(kontoID, kontoID2, betrag);
                break;
			case 5:
				printf("Geben sie die Kontonummer ein: ");
                scanf("%d", &kontoID);
				 
				speichere_konto(kontoID);
				break;
            default:
                break;
        }
		printf("Druecken Sie eine beliebige Taste um vorzufahren");
		getch();
		system("cls");
    }
	while(auswahl);
	return 1;
}

//Erstellt ein Konto mit Vor-Nachnamen und Kontostand, durch Abfragen der einzelnen Eingaben======
//Die Kontonummer wird zugewiesen==================================================================
int erstelle_konto(int ID)
{
	printf("\n\nVorname:     ");
	scanf("%s", konten[ID].vorname);
	 
    printf("Nachname:    ");
	scanf("%s", konten[ID].nachname);
	 
    printf("Kontostand:  ");
	scanf("%lf", &konten[ID].kontostand);
	 
    printf("Kontonummer: %d\n", ID);
	konten[ID].kontonummer = ID;
    printf("Konto wurde erstellt!\n\n\n");
	return 0;
}

//Abfragen der Kontonummer und Löschen des dazugehörigen Kontos====================================
void loesche_konto(int ID)
{
    if((strlen(konten[ID].vorname) == 0) || (strlen(konten[ID].nachname) == 0))
	{
        printf("\n\nDieses Konto existiert nicht!\n\n\n");
    }
	else
	{
		strcpy(konten[ID].vorname, "");
		strcpy(konten[ID].nachname, "");
		konten[ID].kontostand = 0;
		printf("Konto wurde geloescht\n");
	}
}

//Abfragen der Kontonummer und Anzeigen des dazugehörigen Kontos===================================
void zeige_konto(int ID)
{
    if((strlen(konten[ID].vorname) == 0) || (strlen(konten[ID].nachname) == 0))
	{
        printf("\n\nDieses Konto existiert nicht!\n\n\n");
    }
    else
    {
        printf("\n\nVorname:     %s\n", konten[ID].vorname);
        printf("Nachname:    %s\n", konten[ID].nachname);
        printf("Kontostand:  %.2lf\n", konten[ID].kontostand);
        printf("Kontonummer: %d\n\n\n", konten[ID].kontonummer);
    }
}

//Abfragen der Kontonummer und Speichern des dazugehörigen Kontos==================================
void speichere_konto(int ID)
{
	if((strlen(konten[ID].vorname) == 0) || (strlen(konten[ID].nachname) == 0))
	{
        printf("\n\nDieses Konto existiert nicht!\n\n\n");
    }
	else
	{
		FILE *datei;
		datei = fopen("Konten.txt", "a+");

		if(datei == NULL)
		{
			printf("\nFEHLER BEIM SPEICHERN");
			return;
		}
		else
		{
			fprintf(datei, "%d;%s;%s;%.2lf", konten[ID].kontonummer, konten[ID].vorname, konten[ID].nachname, konten[ID].kontostand);
		}
		fclose(datei);
		printf("Konto wurde gespeichert!\n\n\n");
	}
}

//Abfragen der beiden Kontonummern und des Betrages der überwiesen werden soll,====================
//um von einem auf das andere Konto zu überweisen==================================================
void ueberweisung(int vonID, int zuID, double betrag)
{
    if((konten[vonID].kontostand - betrag) < 0)
    {
        printf("\n\nNicht genug Guthaben!\n\n\n");
    }
    else
    {
        konten[vonID].kontostand = konten[vonID].kontostand - betrag;
        konten[zuID].kontostand = konten[zuID].kontostand + betrag;
        printf("\n\nUeberweisung erfolgreich!\n\n");
    }
}


int oeffne_konto(int ID)
{
	char tmpKontonummer[7];
	char tmpKontostand[20];
	char tmpVorname[20];
	char tmpNachname[20];

	
	int kontonummer;
	int kontostand;
	int zeichen;
	int position=0;
	int trennzeichen=0;
	FILE *datei;

	datei = fopen("konten.txt", "r");

	if(datei != NULL)
	{
		zeichen=fgetc(datei);
		
		while(!feof(datei))
		{
			if(zeichen == ';')
			{
				position=0;
				trennzeichen++;
			}
			else
			{
				switch(trennzeichen)
				{
					case 0: 
						tmpKontonummer[position] = zeichen;
						break;
					case 1: 
						tmpVorname[position] = zeichen;
						tmpVorname[position+1] = '\0'; 
						break;
					case 2: 
						tmpNachname[position] = zeichen;
						tmpNachname[position+1] = '\0'; 
						break;
					case 3:	
						tmpKontostand[position] = zeichen;
						break;
					default:
						break;
				}
				position++;
			}
			zeichen=fgetc(datei);
		}
		
		fclose(datei);

		
		kontonummer = atoi(tmpKontonummer);
		kontostand = atof(tmpKontostand);

		strcpy(konten[ID].vorname, tmpVorname);
		strcpy(konten[ID].nachname, tmpNachname);
		konten[ID].kontonummer = kontonummer;
		konten[ID].kontostand = kontostand;

		return 1;
	}

	else
	{
		return 0;
	}
}
Code:
struct konto
{
    char vorname[20];
    char nachname[20];
    double kontostand;
    int kontonummer;
}
konten[1000];

typedef struct konto konto;

int erstelle_konto(int);
void loesche_konto(int);
void zeige_konto(int);
void speichere_konto(int);
void ueberweisung(int, int, double);
int oeffne_konto(int ID);
 
Guten Morgen,
du brauchs sowohl bei tmpKontostand als auch bei der tmpKontonummer wieder das "tmpIrgendwas[position+1] = '\0'; "
C++:
 switch(trennzeichen)
                {
                    case 0: 
                        tmpKontonummer[position] = zeichen;
                        tmpKontonummer[position+1] = '\0'; 
                        break;
                    case 1: 
                        tmpVorname[position] = zeichen;
                        tmpVorname[position+1] = '\0'; 
                        break;
                    case 2: 
                        tmpNachname[position] = zeichen;
                        tmpNachname[position+1] = '\0'; 
                        break;
                    case 3: 
                        tmpKontostand[position] = zeichen;
                        tmpKontostand[position+1] = '\0';
                        break;
                    default:
                        break;
                }
Grüße,
Simon
 

Neue Beiträge

Zurück