Baza danych w c++

0

Witam, na forum sprowadza mnie chęć rozwiązania problemu z programem, nad którym aktualnie pracuje. Zadanie brzmiało:Wykorzystując struktury i dynamiczną alokację pamięci napisz program obsługujący prosta bazę danych- listę studentów,która składa się z pół 1mie,nazwisko,numer indesku, kierunek, srednia ocen. Program powinien umozliwić dodawanie nowych rekordów oraz wyświetlanie zapis i odczyt bazy danych. Przysiadłem i udało mi się stworzyć taki kod, prosiłbym o wytknięcie ewentualnych błędów i pomoc w doprowadzeniu programu do kompilacji.

 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct {
    char imie[30];
    char nazwisko[50];
    int index;
    char kierunek[40];
    float srednia;
}student;
  
FILE * plik = 0; 
 
void wyswietlBaze(student * student) {
    if(!plik)
        return;
 
    plik = fopen("baza_danych","rb");
 
    fread(student,sizeof((*student)),1,plik);
    fclose(plik);
 
 if((*student).imie[0] != 0) {
        puts("Imię studenta: ");
        puts((*student).imie);
 
   if((*student).nazwisko[0] != 0) {
        puts("Nazwisko studenta: ");
        puts((*student).nazwisko);
 
    if((*student).index != 0) {
        printf("Nr indeksu: %d\n", (*student).index);
    }
 
    if((*student).kierunek[0] != 0) {
        puts("Nazwa kierunku: ");
        puts((*student).kierunek);
    }
    if((*student).srednia != 0) {
        printf("Średnia wynosi %f\n", (*student).srednia);
    }
 
    
    system("pause > null");
    system("cls");
}
 
 void modyfikujRekordy(Student * student) {  //od tego miejsca zaczynają się sypać błędy w programie 
 
    int opcja;
    int dane;
    float freq;
 
    plik = fopen("baza_danych", "wb");
 
    puts("1 Dodaj rekord\n");
    puts("2 Usun rekord\n");
 
    scanf("%i", &opcja);
 
    system("cls");
 
    puts("1 Imię studenta \n");
    puts("2 Nazwisko studenta\n");
    puts("3 Nr indeksu \n");
    puts("4 Nazwa kierunkuj \n");
    puts("5 srednia \n"); 
   
 
 
    if(opcja == 1) {
 
        scanf("%i", &opcja);
        system("cls");
 
        switch(opcja) {
        case 1:
           fflush(stdin);
            gets((*student).imie);
            break;;
        case 2:
            fflush(stdin);
            gets((*student).nazwisko);
            break;
        case 3:
           fflush(stdin);
            gets((*student).kierunek);
            break;
        case 4:
           scanf("%f", &freq);
            (*student).index = freq;
            break;
        case 5:
            scanf("%f", &freqq);
            (*komputer).srednia = freqq;
            break;
      
    }
    else {
        scanf("%d", &opcja);
        system("cls");
        switch(opcja) {
        case 1:
  			memset((*student).imie,0,sizeof((*student).imie));           
			break;
        case 2:
			memset((*student).nazwisko,0,sizeof((*student).nazwisko));            
			break;
        case 3:
          	memset((*student).kierunek,0,sizeof((*student).kierunek));
            break;
        case 4:
            (*student).index = 0;
            break;
        case 5:
			(*student).srednia = 0;
            break;
       
        }
 
    } 
 
 
   
   fwrite(student, sizeof((*student), 1,plik);
 	fclose(plik);
    system("cls");
};
 
int main() {
    int wyjscie = 0;
    int opcja;
    Student student;
    memset(&student,0,sizeof(student));
 
    while(!wyjscie) {
        puts("1 Modyfikuj rekordy\n");
        puts("2 Wyswietl baze danych\n");
        puts("3 Wyjscie\n");
        scanf("%d", &opcja);
        switch(opcja) {
        case 1:
            system("cls");
            modyfikujRekordy(&studen);
            break;
        case 2:
            system("cls");
            wyswietlBaze(&student);
            break;
        case 3:
            wyjscie = 1;
            break;
        }
    }
 
} 
3
  1. to C, a nie C++
  2. to się nie kompiluje (modyfikujRekordy(&studen);)
  3. nie obsługujesz zapisu bazy
  4. nie obsługujesz odczytu bazy
  5. nie masz dynamicznej alokacji pamięci
  6. cała baza to 1 element? Widzę tylko jedną zmienną globalną student
  7. aha: Dlaczego nikt nie odpowiada w moim wątku?
1

Ja bym to zrobił tak:
http://pastebin.com/JEG2wK9p

  1. Poczytaj o Kontenerach i Iteratorach
    http://cpp0x.pl/kursy/Kurs-STL-C++/Kontener-tablicy-std-vector/119
  2. Poczytaj o klasach http://cpp0x.pl/kursy/Kurs-C++/Klasy-obiekty/311
  3. Rozbijaj duże funkcje na mniejsze (większa czytelność)
0

Co uważacie o tym kodzie? Jakieś pomysły, dlaczego dodaje rekordy do mojej bazy, a nie mogę ich potem odczytać z programu?

 #include <stdio.h>
#include <stdlib.h>

struct Student{
    char imie[20];
    char nazwisko[30];
    int indeks;
    char kierunek[30];
    float srednia;
    int id;
};

void dodaj(struct Student *baza){
    struct Student s;
    printf("Imie: ");
    scanf("%s", &s.imie);
    printf("Nazwisko: ");
    scanf("%s", &s.nazwisko);
    printf("Indeks: ");
    scanf("%i", &s.indeks);
    printf("Kierunek: ");
    scanf("%s", &s.kierunek);
    printf("Srednia: ");
    scanf("%f", &s.srednia);

    int i=0;

    while(baza[i].id != 0){
        i++;
    }

    baza[i] = s;
    s.id = i;

    while(baza[i].id != 0){
        i++;
    }
}

void wyswietl(struct Student *baza){
    int i=0;
    while(baza[i].id != 0){
        printf("Imie: %s\n", baza[i].imie);
        printf("Nazwisko: %s\n", baza[i].nazwisko);
        printf("Indeks: %i\n", baza[i].indeks);
        printf("Kierunek: %s\n", baza[i].kierunek);
        printf("Srednia: %f\n", baza[i].srednia);
        i++;
    }
}

void zapisz(struct Student *baza){
    FILE *plik;
    plik = fopen("baza.txt", "w");
    int i = 0;
    if(plik != NULL){
        while(baza[i].id != 0){
            fprintf(plik, "%s\t%s\t%i\t%s\t%f\n", baza[i].imie, baza[i].nazwisko, baza[i].indeks, baza[i].kierunek, baza[i].srednia);
            i++;
        }
    }else{
        printf("Blad!");
    }

    fclose(plik);
}

void odczyt(){
    FILE *plik;
    plik = fopen("baza.txt", "r");
    char im[20];
    char naz[30];
    char kier[20];
    int ind;
    float sr;


    while(fscanf(plik, "%s%s%i%s%f", im, naz, &ind, kier, &sr) != EOF){
        printf("Imie: %s\nNazwisko: %s\nIndeks: %i\nKierunek: %s\nSrednia: %f\n\n", im, naz, ind, kier, sr);
    }

    fclose(plik);

}

int main()
{
    struct Student baza[50];

    int i;

    for(i=0; i<50; i++){
        baza[i].id = 0;
    }

    int w;

    do{
        printf("1. Dodaj studenta do bazy.\n2. Wyswietl baze.\n3. Zapisz do pliku.\n4. Odczytaj z pliku.\n0. Wyjscie\n");
        scanf("%i", &w);
        switch(w){
        case 1:
            dodaj(baza);
            break;
        case 2:
            wyswietl(baza);
            break;
        case 3:
            zapisz(baza);
            break;
        case 4:
            odczyt();
            break;
        }

    }while(w!=0);


    return 0;
}
0
PoczątkującyProgram napisał(a):
...
    scanf("%s", &s.imie);
    ...

i to działa?

0

Twój błąd jest tutaj:

    while(baza[i].id != 0){ // a tutaj jest sprawdzanie czy id jest równe zero a później wstawiasz nowy rekord z id=0 i chcesz żeby program wiedział, że są w bazie nowe rekordy :)
        i++;
    }
 
    baza[i] = s;
    s.id = i; // gdy wstawiasz pierwszy rekord to i = 0 więc do s.id podstawiasz zero, a skoro podstawiasz zero to program "myśli", że nie ma żadnych rekordów w bazie więc albo powinieneś podstawiać s.id = i + 1; albo utwórz dodatkową zmienną, w której będziesz przechowywał liczbę rekordów w bazie (co moim zdaniem ma większy sens)

A i gdzie jest sprawdzanie, czy liczba elementów nie uzyskała maksymalnej wartości tablicy (czyli 50 elementów)? Będziesz miał problemy z pamięcią w tym twoim programie jak przekroczysz 50 elementów.

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