Wyświetlanie konkretnej zmiennej zapisanej w strukturze

0

Witam mam takie zadanie, że muszę stworzyć bazę danych. Mam problem, ponieważ nie wiem czemu program nie wyświetla mi poprawnie imienia pracownika ? Orientuję się może ktoś, gdzie popełniam błąd?
Kod:

#include <iostream>

using namespace std;

struct pracownik{
char imie[10];
char nazwisko[20];
char pesel[9];
int pensja_netto;
int ilosc_czlonkow_rodziny;
};

void menu()
{
cout<<"[0] Wpisz pracownika do bazy"<<endl;
cout<<"[1] Wyswietl konkretnego pracownika"<<endl;
cout<<"[2] Wyswietl ilosc kobiet w firmie"<<endl;
cout<<"[3] Wyswietl pracownika, ktory ma w imieniu litere:"<<endl;
cout<<"[4] Wyswietl prcownikow, ktorym nalezy sie premia i w jakiej wysokosci"<<endl;
cout<<"[5] Wyswietl pracownikow starszych niz data urodzenia:"<<endl;
cout<<"[6] Wyswietl posortowanych pracownikow wzgledem wieku"<<endl;
cout<<"[7] Wyswietl srednia pensje kobiet"<<endl;
cout<<"[8] Wyswietl srednia pensje mezczyzn"<<endl;
cout<<"[9] Wyswietl pracownika z najwieksza iloscia czlonkow w rodzinie"<<endl;
cout<<"[10] Edycja danych konkretnego pracownika"<<endl;

}

int wpisz(int liczba)
{
    cout<<"Ilu pracownikow chcesz wpisac?"<<endl;
    cin>>liczba;
    pracownik tab[liczba];
    for(int i=1;i<=liczba;i++)
    {
        cout<<"Podaj imie:"<<i<<" pracownika"<<endl;
        cin>>tab[i].imie;
        cout<<"Podaj nazwisko:"<<i<<" pracownika"<<endl;
        cin>>tab[i].nazwisko;
        cout<<"Podaj pesel:"<<i<<" pracownika"<<endl;
        cin>>tab[i].pesel;
        cout<<"Podaj pensje netto:"<<i<<" pracowika"<<endl;
        cin>>tab[i].pensja_netto;
        cout<<"Podaj ilosc czlonkow rodziny:"<<i<<" pracownika"<<endl;
        cin>>tab[i].ilosc_czlonkow_rodziny;

    }
}

int drukuj(int b)
{

    cout<<"Podaj nr pracownika, ktorego dane chcesz wydrukowac"<<endl;
    cin>>b;
    pracownik tab[b];
    cout<<tab[b].imie;
}

int main()
{
    int Wybor_Z_Menu,Ilosc_Pracownikow,dane;
    cout << "  BAZA DANYCH PRACOWNIKOW" << endl;
    cout<<"----------------------------------------------------------------"<<endl;
    menu();
    cout<<"----------------------------------------------------------------"<<endl;

    cout<<"Wybierz numer:"<<endl;
    cin>>Wybor_Z_Menu;

    wpisz(Ilosc_Pracownikow);
    drukuj(dane);
    return 0;
} 

Bardzo dziękuję za jakiekolwiek wskazówki :)

0

Wyglada dobrze. A dostajesz jakis blad? Czy moze pokaz jak sie to imie wyswoetla. Moze masz za mala tablice znakow? Pamietasz ze tablice w c numeruje sie od zera?

0

Nie wyświetla żadnego błędu. Lecz nie zależnie od podanego imienia wyświetla mi dziwny ciąg znaków (taki sam zawsze)

0
pracownik tab[liczba];
for(int i=1;i<=liczba;i++)

Tablice indeksowane są od zera. Tworząc tablicę zawierającą 10 elementów (int tab[10];) indeksowana jest ona 0, 1, 2, (...), 7, 8, 9.

0

Ogólnie, to przy "Wpisz pracownika do bazy" po wpisaniu wszystkich wartości jest błąd, konsola się zamyka przynajmniej w moim przypadku z błędem, a nie, że program zakończył działanie.

0

No to mówię, że źle indeksujesz i wychodzisz poza dostępny rozmiar tablicy, mażąc sobie po stosie.

1

Jestem Świeżak w programowaniu ale od razu widzę błąd:

  • struktura znacjonalizowana lokalnie, a trzeba globalnie.
 cout<<"Ilu pracownikow chcesz wpisac?"<<endl;
    cin>>liczba;
    pracownik tab[liczba]; 

Myślę, że tutaj należy stworzyć dynamiczną strukturę (new).

 for(int i=1;i<=liczba;i++) 

Nie podoba mi się warunek pętli. Ja bym to zrobił:

 for(int i=0; i<liczba; i++)
 cout<<"Podaj imie:"<<i +1<<" pracownika"<<endl;
        cin>>tab[i].imie;
0

To nie ma prawa działać. Tablica tab jest lokalna w funkcji wpisz, a w funkcji drukuj próbujesz się od niej odnieść. To się nawet nie skompiluje. Wyjść jest kilka:

  1. Skorzystać z std::vector albo czegoś podobnego.
  2. Wskaźniki i dynamiczne zarządzanie pamięcią.
  3. Globalna tablica, która ma stałą liczbę elementów. (nie polecam)
for(int i=1;i<=liczba;i++)

też jest źle, ponieważ i na początku będzie równe 1, a na końcu będzie równe liczba. A nie ma w tworzonej tablicy indeksu liczba. [0... liczba-1]

pracownik tab[liczba];

dynamiczna wielkość lokalnej tablicy jest zgodna tylko z C99 i niektórymi kompilatorami C++ więc radzę unikać.

1
  1. indeksuje się od 0!
pracownik tab[liczba]; 

w każdej funkcji to 2 rózne tablice, więc posiadają różne dane, a co za tym idzie to co wpisujesz i to co wypisujesz to inne dane, więc nie ma sie co dziwić, że wypisywane sa bzdury.

0

Bardzo dziękuję za tak liczne wskazówki. Lecz struktury to dla mnie nowy temat i mam problem ze wskaźnikami w tej tablicy. Jak w funkcji zadeklarować tablicę

pracownik tab 

ponieważ cały czas wywala mi błąd.

0

I mam pytanie. Czy przy tak zapisanych danych, będę mogła, w kolejnej funkcji, w dowolny sposób z nich korzystać. Np. wypisywanie osób, które zarabiają powyżej 2000 ?

0

2 pytanie: tak, o ile stworzysz sobie odpowiednią zmienną, do której później będziesz się odwoływać.

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