Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Statyczne struktury danych - pomozecie

25 Nov 2008 11:14 1656 6
  • Level 10  
    Witam,

    Mam do napisania program:

    - Napisz program w języku C++, który:
    * wczytuje do pamięci dane o max 100 książkach, takie jak: tytuł, autor, rok wydania, ISBN, liczba egzemplarzy,
    *wypisuje wprowadzone książki,
    *wypisuje książki wg podanego kryterium (np. rok wydania), oraz liczbe znalezionych pozycji.

    Napisalem cos takiego:

    Code:


    #include <iostream>
    using namespace std;

    struct bilioteka{
       char tytul[20];
       char autor[30];
       int rok_wydania;
       int liba_egz;
       int isbn;
       void wczytaj(void);
    };

    void bilioteka::wczytaj(void){

       cout << "Podaj tytul:\n";
       cin >> tytul;
       cout << "Podaj autora:\n";
       cin >> autor;
       cout << "Podaj rok wydania:\n";
       cin >> rok_wydania;
       cout << "Podaj liczbe egzemplarzy:\n";
       cin >> liba_egz;
       cout << "Podaj ISBN:\n";
       cin >> isbn;
    }

    int main(void){
       bilioteka ladna;
       ladna.wczytaj();
       
       cout << "Podano wartosci dla biblioteki LADNA:\n";
       cout << "Tytul: " << ladna.tytul << endl;
       cout << "Autor: " << ladna.autor << endl;
       cout << "Rok wydania: " << ladna.rok_wydania << endl;
       cout << "Liczba egzemplarzy: " << ladna.liba_egz << endl;
       cout << "ISBN: "<< ladna.isbn << endl;

    getchar();
    getchar();
       return 0;
    }



    Oczywiscie program w tej postacji sie kompiluje, wszystko dziala bez zarzutow. Jednak chcialbym wiedziec jeszcze kilka rzeczy odnosnie zglaszanego przezemnie problemu.

    Nie wiem jak zrobic wczytywanie do pamięci dane o max 100 książkach oraz gdzie ten warunek postawic.

    Nie mam tez zielonego pojecia jak zrobic przeszukiwanie elementow w celu sprawdzenia czy dany egzemplarz jest w bazie czy nie.

    Dodano po 30 [minuty]:

    Moze powinienem to zapisac do pliku a potem przeszukiwac plik. Co wy myslicie na ten temat.

    Code:


    int main(void){
       bilioteka ladna;
       ladna.wczytaj();
       char zdanie[100], tekst[100];
        fstream plik("plik.txt",ios::in | ios::out | ios::trunc);
        cout << "Podano wartosci dla biblioteki LADNA:\n";
       cout << "Tytul: " << ladna.tytul << endl;
       cout << "Autor: " << ladna.autor << endl;
       cout << "Rok wydania: " << ladna.rok_wydania << endl;
       cout << "Liczba egzemplarzy: " << ladna.liba_egz << endl;
       cout << "ISBN: "<< ladna.isbn << endl;
     
        cin.getline(zdanie,100, '\n');
        plik << zdanie;
        plik.close();

        plik.open("plik.txt");
        while(!plik.eof()){
           plik >> tekst;
          cout << tekst << endl;
       }
        plik.close();



    Ale cos niechce chulac. Co myslicie o mym pomysle?
  • Level 31  
    Brakuje Ci struktury, która będzie przechowywała wszystkie książki. Strukturę "biblioteka" zmieniłbym na "książka", bo tak na prawdę, możesz w niej trzymać tylko jeden element.
    Skoro masz ograniczenie na 100 elementów, najbardziej prymitywnym rozwiązaniem byłaby tablica 100 obiektów typu "biblioteka" ("książka"). Przy czym tu musiałbyś rozważyć działanie operacji dodaj / usuń, bo jeśli usuniesz coś ze środka tablicy, to pozostanie Ci "dziura" (elementy przed i po istnieją). I teraz albo ją zapełniasz innym elementem by przywrócić "ciągłość" danych (np. przerzucasz ostatni element z tablicy albo przesuwasz wszystkie elementy o jedną pozycję) albo zostawiasz dziurę, ale przy wstawianiu musisz szukać wolnego miejsca. Sprowadza się to do zapewnienia części funkcjonalonści kontenera typu wektor.
    Bardziej sensowną opcją byłaby lista albo wektor, bo wielkość struktury dopasuje się do ilości danych.
    I tu pojawia się pytanie: czy musiałbyś to implementować z palca, czy możesz użyć wbudowanych elementów (biblioteka STL) typu list albo vector.
    To drugie rozwiązanie zdecydowanie ułatwia robotę, bo wszyskie potrzebne metody już są. Tylko musiałbyś dodać wymagane ograniczenie do 100 elementów - jak coś, to napiszę co i jak.
  • Level 26  
    Maly-207 wrote:
    Nie wiem jak zrobic wczytywanie do pamięci dane o max 100 książkach oraz gdzie ten warunek postawic.

    można by
    Code:
    struct bilioteka{
    
       char tytul[20];
       char autor[30];
       int rok_wydania;
       int liba_egz;
       int isbn;
       void wczytaj(void);
     }ladna[100];

    i masz tablice ladna gdzie każdy element jest strukturą biblioteka.

    Nie mam tez zielonego pojecia jak zrobic przeszukiwanie elementow w celu sprawdzenia czy dany egzemplarz jest w bazie czy nie.
    np.
    Code:

    int znajdz(char *szukany_tytul){
    for(int i=0;i<100;i++){
        if( strcmp(ladna[i].tytul, szukany_tytul) ==0 ){return i;}//zwraca nr książki
        }
    return -1;
    }



    edit: -> wieśniak byłeś szybszy
  • Level 31  
    skynet_2 -> Do wyszukiwania dodałbym jeszcze zmienną wejściową, która mówiłaby, wg. jakiego atrybutu przeszukiwać. Później tylko ładny case i szukanie po odpowiednim atrybucie.
  • Level 10  
    Narazie cos takiego wymyslilem, co wy na to:

    Code:


    #include <iostream.h>
    #include <conio.h>
    #include <fstream.h>
    #include <stdio.h>
    main()
    {
    struct biblioteka
    {
       char tytul[20];
       char autor[30];
       int rok_wydania;
       int liba_egz;
       int isbn;
       void wczytaj(void);
    };
    biblioteka tab[100];
    double wartosc;
    int licznik=0;
    int wybor ;
    int i;
    int j;
    int a, b, c, d, e, f;
    int usun;
    int wczyt;
    char nazwa_pliku[255];
    FILE *start, *wczytanie, *zapisanie;

    start=fopen("baza.txt","r");
    if (start!=NULL)
    {
    fscanf(start,"%d\n",&wczyt);
    for(i=0;i<wczyt;i++)
    {
                    fscanf(start,"%d\t%d\t%d.%d.%d\t%lu\n",&tab[i].tytul,
                            &tab[i].autor,&tab[i].rok_wydania,
                            &tab[i].liba_egz,&tab[i].isbn);
                            licznik = licznik++;
                           
         
    }
    fclose(start);
    }
    else
    {
    cout <<"nie ma pliku do wczytania\n\n" ;
    }
    start=fopen("baza.txt","w");




    powrot:
      while (wybor!=0)
      {
                    cout << "1. DODAJ KSIAZKE\n" ;
                    cout << "2. USUN KSIAZKE\n" ;
                    cout << "5. DRUKUJ LISTE KSIAZEK" ;
                    cout << "0. WYJSCIE\n";
                    cout << "Wybiesz opcje:\n" ;
                    cin >> wybor;

                    system("cls") ;

  • Level 26  
    -> wiesniak oczywiście że tak, napisałem tak na szybko żeby autorowi pokazać jak można porównywać tablice.

    -> Maly-207
    Code:
    #include <iostream.h>

    błąd, powinno być bez .h
    Code:
    main()

    bez typu[np. void, int]
    brakuje też końca jakby się urwały 2 klamerki "}"

    Code:
    powrot:

    staraj się nie stosować instrukcji goto ponieważ jest to zły nawyk, chyba że trudno było by to zrobić inaczej

    Code:
     while (wybor!=0)

    chyba nie zadziała spróbuj
    Code:
     while ( !wybor )


    ogólnie jest to sama obsługa odczytu pliku, przydało by się zrobić jakieś fikcyjne dane np.
    Code:
    strcpy(tab[0].tytul, "jakis_tytul");

    i dodać obsługę zapisu.
  • Level 10  
    Witam,

    Uporalem sie z problemem. Ale prosze was teraz o jego optymalizacje, czy da sie to jakos zrobic.

    Code:

    #include <iostream.h>
    #include <conio.h>
    #include <string>


    main(){
    struct ksiazki{
    string tytul;
    string autor;
    int rok;
    int miesiac;
    int dzien;
    char isbn[20];
    int le;
    };

    ksiazki tab[100];
    int licznik=0;
    int wybor=1,i,znal,r,m,d,l ;
    string tyt,aut,is;




    while (wybor!=0){
    cout << "1. DODAJ KSIAZKE\n" ;
    cout << "2. WYPISZ WPROWADZONE KSIAZKI\n" ;
    cout << "3. WYSZUKAJ\n" ;
    cout << "0. WYJSCIE\n";
    cout << "Wybiesz opcje:\n" ;
    cin >> wybor;

    system("cls") ;
    switch (wybor){
    case 1 :
    cout <<"Podaj tytul:\n";
    cin >> tab[licznik].tytul;

    cout <<"Podaj autora:\n";
    cin >> tab[licznik].autor;
    cout <<"Podaj rok wydania( rok[+enter] miesiac[+enter] dzien[+enter])\nrok:\n" ;
    cin >> tab[licznik].rok;
    cout << "miesiac:\n";
    cin >> tab[licznik].miesiac;
    cout << "dzien:\n";
    cin >> tab[licznik].dzien;
    cout <<"Podaj ISBN:\n";
    cin >> tab[licznik].isbn;
    cout <<"Podaj liczbe egzemplarzy:\n";
    cin >> tab[licznik].le;

    licznik=licznik++;
    system("cls");
    break;
    case 2:
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){


    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    }
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;
    case 3:
    cout << "Wyszukaj wedlug kryterium:\n" ;
    cout << "1. Tytul\n" ;
    cout << "2. Autor\n" ;
    cout << "3. Rok wydania\n" ;
    cout << "4. ISBN\n";
    cout << "5. Liczba egzemplarzy\n";
    cout << "0. Powrot do menu glownego\n";
    cout << "Wybiesz opcje:\n" ;
    cin >> wybor;
    system("cls") ;
    switch(wybor){
    case 1:
    cout<<"Podaj Tytul:\n";
    cin>>tyt;
    system("cls") ;
    znal=0;
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){
    if(tab[i].tytul==tyt){
    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    znal=znal+1;
    }
    }
    cout <<"Znalezionyc wynikow: " <<znal <<"\n";
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;
    case 2:
    cout<<"Podaj Autora:\n";
    cin>>aut;
    system("cls") ;
    znal=0;
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){
    if(tab[i].autor==aut){
    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    znal=znal+1;
    }
    }
    cout <<"Znalezionyc wynikow: " <<znal <<"\n";
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;


    case 3:
    cout<<"Podaj Rok wydania:\n Rok:\n";
    cin>>r;
    cout<<"Miesiac:\n";
    cin>>m;
    cout<<"Dzien:\n";
    cin>>d;
    system("cls") ;
    znal=0;
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){
    if(tab[i].rok==r && tab[i].miesiac==m && tab[i].dzien==d){
    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    znal=znal+1;
    }
    }
    cout <<"Znalezionyc wynikow: " <<znal <<"\n";
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;

    case 4:
    cout<<"Podaj ISBN:\n";
    cin>>is;
    system("cls") ;
    znal=0;
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){
    if(tab[i].isbn==is){
    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    znal=znal+1;
    }
    }
    cout <<"Znalezionyc wynikow: " <<znal <<"\n";
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;

    case 5:
    cout<<"Podaj liczbe egzemplarzy:\n";
    cin>>l;
    system("cls") ;
    znal=0;
    cout << "| " <<"Tytul" << " | ";
    cout << "Autor" << " | ";
    cout << "Rok wydania (dd.mm.rrr)" <<" | ";
    cout << "ISBN" << " | ";
    cout << "Liczba egzemplarzy" << " |\n\n";
    for(i = 0; i<licznik; i++){
    if(tab[i].le==l){
    cout << "| " <<tab[i].tytul << " | ";
    cout << tab[i].autor << " | ";
    cout << tab[i].dzien << "." <<tab[i].miesiac<<"." <<tab[i].rok <<" | ";
    cout << tab[i].isbn << " | ";
    cout << tab[i].le << " |\n";
    znal=znal+1;
    }
    }
    cout <<"Znalezionyc wynikow: " <<znal <<"\n";
    cout << "nacisnij dowolny klawisz aby przejsc do menu glownego" ;
    getch();
    system("cls") ;
    break;

    case 0:
    wybor=1;
    break;
    default:
    cout <<"bledny wybor\n" << "nacisnij dowolny klawisz aby kontynuowac";
    getch();
    system("cls");
    break;
    }


    case 0:
    break;
    default:
    cout <<"bledny wybor\n" << "nacisnij dowolny klawisz aby kontynuowac";
    getch();
    system("cls");
    break;
    }
    }
    }