Baza Danych Pracowników

0

Witam! Jestem początkujący i potrzebuję pomocy, sam siedziałem nad kodem już długo i po prostu nie mam pomysłów gdzie jest błąd.
Program ma pobierac dane; imie, nazwisko, pensje pracownika,
Wpisac moge poprawnie ale gdy chę wyświetlić baze danych wyskakuje dziwny błąd: liczby z kosmosu, nazwisko ma wartość null jakby nie istnialo w pamieci...
Po drugie. w funkcji "usun" tez dzieja sie dziwne rzeczy,
wklejam mój cały kod i liczę na jakąś pomoc gdzie popełniłem błędy, bo program się kompiluje poprawnie:

#include <stdio.h>
#include <stdlib.h>
#define MAX 21
int licznik = 0;
int index;
struct pracownicy {
    unsigned int ID;
    char imie[40];
    char nazwisko[40];
    float pensja;
} baza[MAX];
void koniec()
{
    system("pause");
    exit(0);
}
void dopisz()
{
    ++licznik;
    if (licznik < MAX) {
        printf("Podaj imie pracownika. ");
        scanf("%s", &baza[licznik].imie);
        printf("Teraz podaj nazwisko. ");
        scanf("%s", &baza[licznik].nazwisko);
        printf("Teraz podaj pensje.");
        scanf("%f", &baza[licznik].pensja);
        baza[licznik].ID = licznik;
    }
    else
        printf("Baza danych pełna!");
}
void wyswietl()
{
    puts("Oto lista Twoich pracownikow: ");
    for (index = 0; index < licznik; index++)
        printf("id pracownika: %.f, imie: %s, nazwisko: %s, pensja: %.2f zl\n", baza[index].ID, baza[index].imie, baza[index].nazwisko, baza[index].pensja);
}
void blad()
{
    printf("Nie ma takiej opcji.\n");
}
void usun()
{
    float id2;
    if (licznik == 0)
        printf("Baza danych pusta!");
    else {
        printf("Podaj nr id pracownika: ");
        scanf("f", &id2);
        for (index = 1; index < licznik; index++) {
            if (baza[index].ID == id2) {
                for (index; index < licznik; index++)
                    baza[index].ID = baza[index + 1].ID;
            }
            else if (index == licznik - 1)
                printf("podany nr ID nie istnieje!");
        }
    }
}
int main(void)
{
    unsigned int wybor;
    while (1) {
        printf(" M E N U");
        printf("0 - koniec dzialania programu\n");
        printf("1 - dopisanie pracownika do bazy\n");
        printf("2 - usuniecie pracownika z bazy (wedlug ID)\n");
        printf("3 - wyswietlenie aktualnej zawartosci bazy\n\n");
        printf("Co wybierasz ? ");
        scanf("%u", &wybor);
        switch (wybor) {
        case 0:
            koniec();
            break;
        case 1:
            dopisz();
            break;
        case 2:
            usun();
            break;
        case 3:
            wyswietl();
            break;
        default:
            blad();
            break;
        }
    }
    system("PAUSE");
    return 0;
}
1

scanf("f", &id2); zły format

Poza tym, używaj liczb całkowitych zamiast zmiennoprzecinkowych do wartości takich jak id.

Ponadto, niepotrzebnie indeksujesz tablicę od 1. Przez to jej pierwsze pole jest zawsze nieużywane.

0

indeksuje od 1 bo dla zero jest warunek ze baza wtedy jest pusta w funkcji usun,
ale gdzie leży błąd ten opisany w pierwszym poście to niem wiem nadal

2

Nie do końca rozumiem w czym problem. Nawet w najbardziej prymitywny sposób, możesz sobie ustalić wielkość na -1 jak jest pusta. Albo, lepiej, nie używać wielkości jako bezpośredniego indeksu.

1

Tutaj próbujesz wyświetlić zmienną typu unsigned int(baza[index].ID) jako float (id pracownika: %.f,):

printf("id pracownika: %.f, imie: %s, nazwisko: %s, pensja: %.2f zl\n", baza[index].ID, baza[index].imie, baza[index].nazwisko, baza[index].pensja);

Tworzysz w strukturze unsigned int ID, a następnie w funkcji usun() porównujesz: do float id2.
Kolejny błąd to źle napisany warunek: for (index = 0; index < licznik; index++) to przez niego nie wyświetlało ci poprawnie.
Ja bym to z grubsza tak napisał:
http://ideone.com/baYz5A

2

Do tego co napisał @kq dodałbym jeszcze:
zamiast

scanf("%s", &baza[licznik].imie);

raczej

scanf("%s", baza[licznik].imie);

a najlepiej

scanf("%39s", baza[licznik].imie);

Tu przypadkowo działa, ale jak zaczniesz pisać poprawniej i przekazywać dane do wczytania w osobnej funkcji, to można się zdziwić....

0

bl4ster dzięki nielicząc funkcji usun działa już poprawnie, oczywiście głupie błędy które ostatnio popełniam.
Funkcje usun juz sam zrobilem w te sposob:

void usun()
{
	unsigned int id2;
    if (licznik == 0)
        printf("Baza danych pusta!");
    else {
        printf("Podaj nr id pracownika: ");
        scanf("%i", &id2);
        for (index = 0; index < licznik; index++) {
            if (baza[index].ID == id2) {
                for (index; index < licznik; index++){
                    baza[index].ID = baza[index + 1].ID;
            		strcpy(baza[index].imie,baza[index+1].imie);
            		strcpy(baza[index].nazwisko,baza[index+1].nazwisko);
            		baza[index].pensja=baza[index+1].pensja;
			}
            licznik=licznik-1;
			puts("pracownik usuniety!\n");
			}
            else if (index == licznik - 1)
                printf("podany nr ID nie istnieje!");
        }
    }
}

Dzięki za pomoc

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