[c++]Program sortujacy baze danych.

0

Witam wszystkich.
Oto kod programu:

//biblioteki--------------------------------------------------------------------
#include <iostream>
#include <conio.h>
#include <fstream>
using namespace std;
//struktura---------------------------------------------------------------------

struct semestr {
    int przedmiot[8];
};

struct osoba {
    char imie[30];
    char nazwisko[30];
    int numeralbumu;
    semestr A[7];
    void wczytaj(void);
};

void osoba::wczytaj(void) {

    cout << "Podaj nazwisko:\n";
    cin >> nazwisko;
    cout << "Podaj imie:\n";
    cin >> imie;
    cout << "Podaj nr albumu:\n";
    cin >> numeralbumu;
    for (int I = 0; I < 7; I++) {
        for (int J = 0; J < 8; J++) {
            int a;
            cout << "Podaj ocene z semestru ";
            cout << I + 1;
            cout << " z ";
            switch (J + 1) {
                case 1:cout << "Analiza matematyczna(od 2 do 5) ";
                    break;
                case 2:cout << "Fizyka dla informatykow(od 2 do 5) ";
                    break;
                case 3:cout << "Jezyk angielski(od 2 do 5) ";
                    break;
                case 4:cout << "Matematyka dyskretna(od 2 do 5) ";
                    break;
                case 5:cout << "Podstawy elektroniki(od 2 do 5) ";
                    break;
                case 6:cout << "Podstawy programowania(2 lub 5) ";
                    break;
                case 7:cout << "Wf (0 lub 1) ";
                    break;
                case 8:cout << "Podstawy zarzadzania(0 lub 1) ";
                    break;
            };
            "[ :\n";
            cin >> A[I].przedmiot[J];
            int warunek;
            warunek = 0;
           do{
           if (((J == 7) || (J == 6)) && (!((A[I].przedmiot[J] == 1) || (A[I].przedmiot[J] == 0)))) {
               cout << "Podales nie dopuszczalna wartosc. Prosze o podanie jej poprawnie ";
              cin >> A[I].przedmiot[J];
              warunek = 1;
            } else warunek = 0;
            }while(warunek);
            do{
            if (((J < 6) && (J>-1)) && ((A[I].przedmiot[J] > 5) || (A[I].przedmiot[J] < 2))) {
               cout << "Podales nie dopuszczalna wartosc. Prosze o podanie jej poprawnie ";
               cin >> A[I].przedmiot[J];
               warunek = 1;
           } else warunek = 0;
           }while(warunek);
            int i = 6;
            int t[7];
            t[0] = A[I].przedmiot[0]; //analiza
            t[1] = A[I].przedmiot[1]; //fizyka
            t[2] = A[I].przedmiot[2]; //angielski
            t[3] = A[I].przedmiot[3]; //dyskretna
            t[4] = A[I].przedmiot[4]; //elektronika
            t[5] = A[I].przedmiot[5]; //programowanie
            t[6] = A[I].przedmiot[6]; //zarzadzanie
            t[7] = A[I].przedmiot[7]; //wf
            int h = 0;
            for (int j = 0; j < i; j++) {
                if (t[j] > 2) h++;
                if (t[6] == 1) h++;
                if (t[7] == 1) h++;
                if (h < 8) A[I].przedmiot[8] = 0;
                else A[I].przedmiot[8] = 1;
            }
        }
    }
}
//wartosc globalne
int X = 100;
osoba baza[100];
//funkcje-----------------------------------------------------------------------
void wyswietl(void);
void sortimie(void);
void sortNazwiska(void); 
void sortnumerualbumu(void);
void dodaj(void);
void sortowanie(int h);
void menu(void);
//cialo glowne-------------------------------------------------------------------

int main() {
    for (int q = 0; q < X; q++) {
        baza[q].numeralbumu = -1;
    }
    ifstream odczyt("dane.dat", ios::binary); // otwieramy plik do odczytu binarnego
    odczyt.read((char*) baza, sizeof (baza));
    odczyt.close();
    menu();
   
    system("pause");

}
//ciala funkcji-----------------------------------------------------------------
///dodaj

void dodaj(void) {
    int a = 1, w = 0;

    do {

        ofstream plik1("dane.dat", ios::binary ); 
        for (int q = 0; q < X; q++) {
            if (baza[q].numeralbumu != -1) w++;
        }
        baza[w].wczytaj();
        plik1.write(reinterpret_cast<char*> (&baza), sizeof (baza));
        plik1.close();
        cout << "Czy chcesz dodac kolejna osobe?(zero jesli nie) ";
        cin >> a;
    } while (a);
}
////sortowanie------------------------------------------------------------------
//sortownaie po imieniu---------------------------------------------------------

void sortimie(void) {
    osoba temp;
    int I;
    for (int h = 0; h < X - 1; h++)
        for (int i = h + 1; i < X; i++)
         {for(I=0;I<30;I++)
                if (baza[h].imie[I] == baza[i].imie[I]) ; 
                else if (baza[h].imie[I] < baza[i].imie[I]) {
                    temp = baza[h];
                    baza[h] = baza[i];
                    baza[i] = temp;
                    break; 
            }
        }
ofstream plik1("dane.dat", ios::binary );
plik1.write(reinterpret_cast<char*> (&baza), sizeof (baza));
        plik1.close();
}
//sortownaie po nazwisku--------------------------------------------------------

void sortNazwiska(void) {
    osoba temp;
    int I;
    for (int h = 0; h < X - 1; h++)
        for (int i = h + 1; i < X; i++) 
            {for(I=0;I<30;I++)
                if (baza[h].nazwisko[I] == baza[i].nazwisko[I]);
                else if (baza[h].nazwisko[I] > baza[i].nazwisko[I]) {
                    temp = baza[h];
                    baza[h] = baza[i];
                    baza[i] = temp;
                    break;
                }
            }
ofstream plik1("dane.dat", ios::binary );
plik1.write(reinterpret_cast<char*> (&baza), sizeof (baza));
        plik1.close();
}
//sortownaie po numerze albumu---------------------------------------------------
void sortnumeralbumu(void) {
    osoba temp;
    for (int h = 0; h < X - 1; h++) {
        for (int i = h + 1; i < X; i++) {
            if ((baza[h].numeralbumu > baza[i].numeralbumu) || (baza[h].numeralbumu == -1)) {
                temp = baza[h];
                baza[h] = baza[i];
                baza[i] = temp;
            }
        }
    }
ofstream plik1("dane.dat", ios::binary );
plik1.write(reinterpret_cast<char*> (&baza), sizeof (baza));
        plik1.close();
}
//sortownaie--------------------------------------------------------

void sortowanie(int h) {
    h--;

    int a = 0;
    cout << "Podaj po ktorym semestrze ma sortowac: ";
    cin >> a;
    a--;
    osoba temp;
    for (int I = 1; I < X - 1; I++) 
        for (int i = I + 1; i < X ; i++) { 
            if ((baza[I].A[a].przedmiot[h] > baza[i].A[a].przedmiot[h]) || (baza[h].numeralbumu == -1))
            temp = baza[I];
            baza[I] = baza[i];
            baza[i] = temp;
        }
ofstream plik1("dane.dat", ios::binary );
plik1.write(reinterpret_cast<char*> (&baza), sizeof (baza));
        plik1.close();
}
//wyswietlenie

void wyswietl(void) {
    osoba baza[100];
    fstream plik1("dane.dat", ios::binary | ios::in);
    plik1.read(reinterpret_cast<char*> (&baza), sizeof (baza));
    int a;
    cout << "Ktory semestr wyswietlic? ";
    cin >> a;

    for (int i = 0; i < 20; i++) {
        if ((baza[i].numeralbumu != -1)) {
            cout << (baza[i].imie) << " " << (baza[i].nazwisko) << " " << (baza[i].numeralbumu) << " ";
            for (int k = 0; k < 8; k++) cout << baza[i].A[a].przedmiot[k] << " ";
            cout << endl;
        }
    }

    plik1.close();

}
///menu

void menu(void) {
    int a, A, AA, AAAA, K, k;
    while (true) {
        cout << "Wybierz opcje:" << endl << "1.dodaj" << endl <<
                "2.Sortowanie" << endl << "3.Wyswietl" << endl << "0.Wyjscie" << endl;
        cin >> a;
        if ((a != 1) && (a != 2) && (a != 3) && (a != 0)) {
            cout << "Podales nie dopuszczalna wartosc. Porsze o podanie jej poprawnie";
            cin >> a;
        }
        switch (a) {
            case 1:
                dodaj();
                break;
            case 2:do {
                    cout << "Wybierz opcje:" << endl << "1.Po imieniu" <<
                            endl << "2.Po nazwisku" << endl << "3.Po numerze albumu" << endl <<
                            "4.Po przedmiocie" << endl;
                    cin >> k;
                    switch (k) {
                        case 1:sortimie();
                            break;
                        case 2:sortNazwiska();
                            break;
                        case 3:sortnumeralbumu();
                            break;
                        case 4:do {
                                cout << "Wybierz opcje:" << endl << "1.Po Analizie" 
                                << endl << "2.Po Fizyce" << endl << "3.Po Angielskim"
                                        << endl << "4.Po Dyskretna" << endl 
                                        << "5.Po Elektronice " << endl << "6.Po Programowaniu" 
                                        << endl << "7.Po WF" << endl << "8.Po Zarzadzaniu" 
                                        << endl << "9.Po zaliczeniu" << endl;
                                cin >> K;
                                switch (K) {
                                    case 1:sortowanie(K); //analiza
                                        break;
                                        break;
                                    case 2:sortowanie(K); //fiza
                                        break;
                                    case 3:sortowanie(K); //angielski
                                        break;
                                    case 4:sortowanie(K); //dyskretna
                                        break;
                                    case 5:sortowanie(K); //elektronika
                                        break;
                                    case 6:sortowanie(K); //programowanie
                                        break;
                                    case 7:sortowanie(K); //wf
                                        break;
                                    case 8:sortowanie(K); //pz
                                        break;
                                    case 9:sortowanie(K); //zal
                                        break;
                                };
                                    cout << "Zero by zakonczyc ";
                                cin >> AAAA;
                            } while (AAAA);
                            break;
                    };
                    cout << "Zero by zakonczyc ";
                    cin >> AA;
                } while (AA);
                break;
            case 3:wyswietl(); 
                break;

            case 0:
            {
                return;
            }
            break;
        }
    }
}

 

sortuje każde ale wychodzą krzaczki
dodaje w losowym miejscu i moze rozwalic baze danych przy próbie dodania 2naraz wywala z bledem z windowsa
PS:mam nadzieje ze tym razem jest lepiej sformatowany kod niż jak poprzednio wrzuciłem

0

Sformatuj kod to uzyskasz pomoc, a najlepiej napisz go od początku. Masz tupet, żądając darmowej pomocy utrudniasz udzielenie jej innym. Przychodzisz tutaj z takim chłamem nieczytelnym, a my mamy tracić czas aby sobie wciąć ten kod i analizować coś tam nabazgrał? Żeby pisać czytelny kod nie trzeba dobrze programować, wystarczy poświęcić troszkę więcej czasu na pisanie go.

0

tu masz pierwszy lepszy kod napisany konkretnym stylem. Nie musisz przyjmować jego stylistyki ale przejrzyj i postaraj się zrozumieć co to znaczy "sformatowany kod". Zwróć uwagę na wcięcia, klamry, odstępy między operatorami, nazwy zmiennych, funkcji itd. Możesz wyrobić swój własny styl jednak jak już to zrobisz to trzymaj się go, a nie zmieniaj w jednym kodzie dowolnie bo to psuje jego estetykę. Nie pisz niepotrzebnych komentarzy opisujących coś co jest oczywiste np:

if(){ // poczatek if
...
} //koniec if

void foo(); //deklaracja funkcji foo

To oznacza właśnie formatowanie kodu. Jak widzisz twój kod wymaga cały formatowania bo masz w nim zwyczajny burdel. Nie wiadomo co jest czym. Ważne jest aby kod organizować w bloki, które zagnieżdżasz zgodnie z hierarchią to znaczy jeśli przykładowo tworzysz pętle w pętli to niech pętla podrzędna znajdzie się z wcięciem pod nadrzędną:

    for(;;;)
    {
        for(;;;)
        {
        }
    }

Powielasz też dużo kodu. Gdy programujesz staraj się pisać tak aby nie pisać czegoś wiele razy. Wykorzystuj już wcześniej napisany kod, projektuj tak aby jakakolwiek zmiana w przyszłości nie wiązała się z edycją połowy kodu tylko z konkretną jej częścią. Projektuj również tak aby kod można było łatwo rozszerzyć o nowe funkcjonalności w przyszłości. To akurat nie jest proste dla początkujących jednak warto to ćwiczyć od początku, ogólnie chodzi o takie świadome pisanie kodu, a nie klepanie bezsensu byle działało.

0

jeśli dalej nie wiesz o czym piszę to poczekaj miesiąc czy dwa miesiące bez patrzenia na to źródło, zajmij się czymś innym, a potem otwórz i zobacz co napisałeś. Ciekawe ile czasu zajmie przejrzenie całego źródła i dojście do tego co chciałeś zrobić w danym miejscu albo odszukanie czegoś konkretnego (np gdzie po raz pierwszy wykorzystujesz jakąś zmienną albo gdzie nadajesz jej jakąś wartość, cokolwiek) potem powtórz to samo ale z dobrze sformatowanym źródłem. Zobaczysz różnice i docenisz to co piszę.

0

Powiedz o co ci chodzi z tym sformatowaniem to go sformatuje. Jestem początkujący i nie mam nawyków żadnych co do pisania raz pisze tak raz inaczej.

Dobra rada - zacznij już teraz nabierać dobrych praktyk.
Np. dlaczego po każdej linii jest dodatkowy enter? Żeby dłużej trwało przewijanie całości?

cout << "Podaj ocene z semestru "<<I+1<<" z Matematyki dyskretnej:\n";

cin >> A[I].md;

if ((A[I].md>1)&&(A[I].md<6)) a=0;
while (a)

{cout<<"Podales nie dopuszczalna wartosc. Prosze podac zero lub jeden.";

cin >> A[I].am;

if ((A[I].am>1)&&(A[I].am<6)) a=0;

else a=1;

}
cout << "Podaj ocene z semestru "<<I+1<<" z Matematyki dyskretnej:\n";
cin >> A[I].md;

while ((A[I].md>1)&&(A[I].md<6)) 
{
    cout<<"Podales nie dopuszczalna wartosc. Prosze podac zero lub jeden.";
    cin >> A[I].md;
}

Ciekawe btw, że prosisz o 0 lub 1, a przyrównujesz do 1 i 6...

Ty, patrz - ten sam fragment napisany przeze mnie i od razu połowę mniej linii, połowę mniej przewijania...
Chętnie pomogłabym więcej, ale firefox mi się zwiesza jak przewijam stronę 5 minut.
Weź ty sobie zrób taki eksperyment - spróbuj twój kod cały zaznaczyć i skopiować do edytora. Po tym ile trwało głupie przewinięcie do szybkiej odpowiedzi, słabo robi mi się na samą myśl.

edit:
A jednak niechcący spojrzałam jeszcze na kawałek twojego kodu, i sory, ale nie mogę powstrzymać się od komentarza:

cin>>K;

                        switch (K)

                        {

                        case 1:sortanaliza();//analiza

                        break;

                        break;

                        case 2:sortfiza();//fiza
						...
						...
						...

                        case 9:sortzal();//zal

                        break;

                        };

WTF???!!!
To nie można:

cin >> K;      //bo widocznie zmienne muszą nazywać się bez sensu...
sort(K);

?
Oczywiście wszystkie funkcje sortujące różnią się od siebie jedną zmienną. Świetny powód, żeby pisać to samo 20 razy.

No i oczywiście genialna tablica globalna. Nie mam pojęcia po co, bo za dużo tego kodu, żeby to czytać (nic dziwnego, jak się wszystko powtarza 20 razy i każdego entera pod dwa razy), ale z samej jej inicjalizacji widać, że jest na pewno bez sensu i do wywalenia.

0

Co wiedziałem jak zrobić to zrobiłem i sformatowałem kod (mam nadzieje że jest juz czytelny).

0
cin >> K;
                                switch (K) {
                                    case 1:sortowanie(K); //analiza
                                        break;
                                        break;
                                    case 2:sortowanie(K); //fiza
                                        break;
                                    case 3:sortowanie(K); //angielski
                                        break;
                                    case 4:sortowanie(K); //dyskretna
                                        break;
                                    case 5:sortowanie(K); //elektronika
                                        break;
                                    case 6:sortowanie(K); //programowanie
                                        break;
                                    case 7:sortowanie(K); //wf
                                        break;
                                    case 8:sortowanie(K); //pz
                                        break;
                                    case 9:sortowanie(K); //zal
                                        break;
                                };

Zastanów się nad tym fragmentem.

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