Nie działa rejestracja w bankomacie

0

Nie działa mi rejestracja. Nie wiem czy poprawnie piny są zapisywane do tablicy PIN[].
Program, jeśli można tak to nazwać, polega na tym, ze użytkownik wchodzi w rejestrację, podaje swój PIN i tworzy się nowe konto o pinie w tabeli PIN[0] i stanie konta w StanKonta[0], następnie przychodzi drugi użytkownik, zakłada swoje konto i jego PIN umieszczany jest w PIN[1] i StanKonta[1] itd. Ale gdy chcę sprawdzić czy dane zostają poprawnie wpisane do tabeli to pokazują się jakieś ogromne liczby i nie wiem ja to naprawić.

Walczę z tym już cały dzień i nikt nie może mi pomóc, począwszy od tego forum http://forum.miroslawzelent.pl/51064/jaki-typ-tablicy-aby-na-poczatku-moglo-byc-0#c51143, ale tam nie zdołałem znaleźć odpowiedzi to przychodzę tutaj. (Już nie chodzi o to 0 na początku PINu).

main.cpp

 #include <iostream>
#include "naglowki.h"

using namespace std;

int main()
{

    Uzytkownik u1;
    u1.pokaz();

    return 0;
}

naglowki.h

#include <iostream>
#include <fstream>

using namespace std;

class Uzytkownik
{
    string PPIN;
    int StanKontaPoczatkowy;
    fstream plik;
    int *PIN, *StanKonta;

public:

    void pokaz();
    void zaloguj();
    void zarejestruj();
};
 

funkcje.cpp

#include <iostream>
#include <windows.h>
#include <conio.h>
#include <fstream>
#include "naglowki.h"
#include <string>

using namespace std;

void zaloguj();
void zarejestruj();

void Uzytkownik::pokaz()
{
    char wybor;

    system("cls");
    cout << "\t" << "Witaj w banku!" << endl;

    cout << "1. Zaloguj" << endl;
    cout << "2. Zarejestruj" << endl << endl;

    cout << "Wybor: ";
    wybor = getch();

    switch(wybor)
    {
    case '1':
        {

        break;
        }
    case '2':
        {
        zarejestruj();
        break;
        }
    }
}

void Uzytkownik::zarejestruj()
{
    static int licznik = 0;
    licznik++;

    system("cls");
    cout << "\t" << "REJESTRACJA" << endl << endl;

    cout << "Podaj PIN: ";
    cin >> PPIN;

    int *PIN;
    PIN = new int[10];

    PIN[licznik-1] = atoi(PPIN.c_str());

    int *StanKonta;
    StanKonta = new int[10];

    StanKonta[licznik-1] = StanKontaPoczatkowy;

    plik.open("uzytkownicy.txt", ios::out | ios::app);
    if (plik.good() == false)
    {
        system("cls");
        cout << "\t" << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        plik << PIN[licznik-1];
        plik << endl << StanKonta[licznik-1] << endl;

        plik.close();
    }
}
 
0
int *PIN;
PIN = new int[10];

Pierwsza linia tworzy zmienną lokalną o nazwie PIN, która przesłania pole klasy o tej samej nazwie. Druga linia odnosi się już do tej lokalnej. Wywal pierwszą linię. To samo dotyczy StanKonta.
Druga linia powinna się wykonywać raz, na samym początku, bo przecież nie chcemy tworzyć nowej tablicy za każdym razem jak rejestrujemy nowego użytkownika.

Oprócz tego widzę new[], a nie widzę delete[] - wyciek.

0

Program, jeśli można tak to nazwać, polega na tym, ze użytkownik wchodzi w rejestrację, podaje swój PIN i tworzy się nowe konto o pinie w tabeli PIN[0] i stanie konta w StanKonta[0], następnie przychodzi drugi użytkownik, zakłada swoje konto i jego PIN umieszczany jest w PIN[1] i StanKonta[1]

Ale ten drugi użytkownik dodaje swój pin i stan konta w tym samym obiekcie klasy użytkownik czy w nowym?

Poza tym:
Dlaczego użytkownik pokazuje menu?
Dlaczego użytkownik odbiera wybór menu od samego siebie i decyduje co wyświetlać?
Dlaczego użytkownik może mieć wiele stanów kont i pinów? Czy użytkownik może mieć wiele kont?

Metoda zarejestruj:
Dlaczego licznik jest statyczną zmienną w metodzie, a nie polem klasy?
Dlaczego licznik najpierw zwiększasz, aby za chwilę odejmować jeden za każdym razem?

0

Ale mimo tego całego nie ładu to i tak wydaje mi się, że cout << PIN[1] powinno wyświetlać skoro stworzyłem 3 użytkowników.

void Uzytkownik::zarejestruj()
{
    static int licznik = 0;
    licznik++;

    system("cls");
    cout << "\t" << "REJESTRACJA" << endl << endl;

    cout << "Podaj PIN: ";
    cin >> PIN[licznik-1];

    StanKonta = new int;

    StanKonta[licznik-1] = StanKontaPoczatkowy;

    plik.open("uzytkownicy.txt", ios::out | ios::app);
    if (plik.good() == false)
    {
        system("cls");
        cout << "\t" << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        plik << PIN[licznik-1];
        plik << endl << StanKonta[licznik-1] << endl;

        plik.close();
    }
} 
0

Chyba za wysoki dla mnie poziom z konstruktorami.
No to masz dobry moment, żeby się o nich uczyć.

Alternatywą (ohydną) jest wywalenie PIN oraz StanKonta z klasy i uczynienie z nich globalnych tablic. Istnieją też opcje typu "przekazywanie tablic" jako parametru funkcji, ale to już łatwiej poczytać parę stron tutoriala o konstruktorach.

0

Już wszystko działa. Nie wiem jakim sposobem chciałem, aby po uruchomieniu konsoli(od razu) były dane w tablicy PIN[]. Zapętliłem to wszystko w main i po dodaniu kilku użytkowników, wyświetliłem PIN i było OK.

void Uzytkownik::zarejestruj()
{
    static int licznik = 0;
    licznik++;

    PIN = new int;
    StanKonta = new int;

    system("cls");
    cout << "\t" << "REJESTRACJA" << endl << endl;

    cout << "Podaj PIN: ";
    cin >> PIN[licznik-1];

    StanKonta[licznik-1] = StanKontaPoczatkowy;

    plik.open("uzytkownicy.txt", ios::out | ios::app);
    if (plik.good() == false)
    {
        system("cls");
        cout << "\t" << "Blad polaczenia z baza danych!";
        Sleep(2000);
    }
    else
    {
        plik << PIN[licznik-1];
        plik << endl << StanKonta[licznik-1] << endl;

        plik.close();
    }
} 
1

Działa tylko dla tego, że masz (nie)szczęście i Ci się program nie wywala. A powinien.

    PIN = new int;

Alokujesz pamięć na jednego inta.

    cin >> PIN[licznik-1];

to zadziała jak licznik będzie równy 1. Wtedy odwołasz się do fajnie zaalokowanej wcześniej pamięci bo zrobisz PIN[0]. Pomyśl co będzie jak licznik będzie większy od 1. Będziesz odwoływał się do nie swojej pamięci.
To samo ze StanKonta.

Tak szczerze to nie wiem po co w ogóle bawisz się z new tutaj. Czemu nie zwykły int?

Do tego za każdym wywołaniem zarejestruj() masz wyciek bo zapominasz wskaźników na PIN i StanKonta i przypisujesz do nich nowe.

0

PIN i StanKonta powinny to być inty, a nie wskaźniki. Każdy użytkownik trzyma po jednym egzemplarzu. Zmień to i wyrzuć zmienną licznik razem z odwołaniami (i nawiasami). Tworząc nowych użytkowników używaj nowych obiektów (nie pokazałeś jak tworzysz więcej niż jednego użytkownika).

Pole PPIN służy tylko do konwersji string->int więc może być zmienną lokalną funkcji pokaz zamiast być polem klasy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1