Forum www.polcz.fora.pl
pcz
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Treść ostatniego zadania z laborek
Idź do strony Poprzedni  1, 2
 
Napisz nowy temat   Odpowiedz do tematu    Forum www.polcz.fora.pl Strona Główna -> Paradygmaty programowania
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
damian.zaskorski




Dołączył: 15 Paź 2008
Posty: 122
Przeczytał: 0 tematów

Pomógł: 1 raz
Ostrzeżeń: 0/5

PostWysłany: Czw 9:46, 26 Mar 2009    Temat postu:

Kod:
#include "stdafx.h"
#include<iostream>
#include<fstream>
using namespace std;

struct Osoba
{
   char imie [30];
   char nazw [40];
   double zarobek;
};
//-------------------------------------------
void wpisz (Osoba *t, int r)
{
   for (int i=0; i<r; ++i)
   {
      cout<<i<<". Podaj imie: ";
      cin>>t[i].imie;
      cin.ignore();
      cout<<"   Podaj nazwisko: ";
      cin>>t[i].nazw;
      cin.ignore();
      cout<<"   Podaj zarobek: ";
      cin>>t[i].zarobek;
      cin.ignore();
   }
}
//-------------------------------------------
void wypisz(Osoba *t, int r)
{
   cout<<endl;

   for (int i=0; i<r; ++i)
   {
      cout<<"Osoba nr. "<<i<<endl;
      cout<<"Imie: "<<t[i].imie<<endl;
      cout<<"Nazwisko: "<<t[i].nazw<<endl;
      cout<<"Zarobek: "<<t[i].zarobek<<"\n\n";
   }
}
//-------------------------------------------
void wpisz2 (char plik[], Osoba *t, int &r)
{
   fstream cos;
   cos.open("c:\\kat\\plik.txt", std::ios::out);
   if (cos.is_open() )
   {
      cos<<r<<endl;

      for (int i=0; i<r; ++i)
      {
         cos<<t[i].imie<<" ";
         cos<<t[i].nazw<<" ";
         cos<<t[i].zarobek<<"\n";
      }
      cos.flush();

      cos.close();
   }
}
//-------------------------------------------
void wypisz2 (char plik[], Osoba *t, int &r)
{
   fstream cos;
   cos.open("c:\\kat\\plik.txt", std::ios::in);
   if (cos.is_open() )
   {
      cos>>r;

      for (int i=0; i<r; ++i)
      {
         cos>>t[i].imie;
         cos>>t[i].nazw;
         cos>>t[i].zarobek;

         cout<<t[i].imie<<' '<<t[i].nazw<<' '<<t[i].zarobek<<'\n';
      }
      cos.flush();
      cos.close();
   }
}
//-------------------------------------------
void MaxZ (Osoba *t, int r)
{
   double max=t[0].zarobek;
   int j=0;

   for (int i=1; i<r; ++i)
   {
      if (t[i].zarobek>max)
      {
         max = t[i].zarobek;
         j = i;
      }
   }

   cout<<"\n\nOsoba o nazwisku "<<t[j].nazw<<" zarabia najwiecej, czyli "<<max;
}
//-------------------------------------------
void AvgZ (Osoba *t, int r)
{
   double sra=0.0;

   for (int i=0; i<r; ++i)
   {
      sra = sra + t[i].zarobek;
   }

   cout<<"\n\nSrednie zarobki wynosza: "<<sra/r;
}
//-------------------------------------------

int _tmain(int argc, _TCHAR* argv[])
{
   int roz=0;
   cout<<"Podaj rozmiar: ";
   cin>>roz;
   
   Osoba *t = new Osoba [roz];
   
   wpisz(t, roz);
   wypisz(t, roz);

   wpisz2("c:\\kat\\plik.txt", t, roz);
   wypisz2("c:\\kat\\plik.txt", t, roz);
   
   MaxZ(t, roz);
   AvgZ(t, roz);
   
   delete [] t;
   getchar();
   return 0;
}


Dwa podstawowe bledy, pierwsze to rzeczywiscie zapomnialem o delete, (chociaz co to dla windowsa wyciek Smile ). Drugie to nie przypisalem zmiennej 'j' wartosci w funkcji MaxZ i nie znal nazwiska bogacza z pierwszej pozycji. Dzieki za rady Wink


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Ajla




Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Pią 11:47, 27 Mar 2009    Temat postu:

a ma ktoś może do tego zrobione menu wyboru:)?

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Nie 14:36, 29 Mar 2009    Temat postu:

Wojtuśśśś.... A do mojego kodu to Ci się zajrzeć nie chce Razz To tak jak byś wszedł do rozlewni piwa i pytał się czy tutaj można zamówić parę hektolitrów piwa Smile))))

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Ajla




Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Pon 7:50, 30 Mar 2009    Temat postu:

ale Ty masz robione w normalnym C Razz a ja chce w c++:)ale już nieaktualna sprawa:P

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Pon 19:16, 30 Mar 2009    Temat postu:

Ojjj Leniwisz się Wojtuś Razz

To działa też w C++ wystarczy te funkcje scanf i printf zamienić na cin oraz cout :p i masz już gotowe w C++ Very HappyVery HappyVery HappyVery Happy


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Śro 8:44, 01 Kwi 2009    Temat postu:

Specjalny komentarz dla: paul.april Smile)))

Cytat:

void zapisz(char plik[]){
FILE *fptr; // zmienna plikowa o nazwie fptr
cos=150; // nie ma znaczenia taki mój wymysł
long int offset; //zmienna typu long int o nazwie "offset"
if((fptr=fopen(plik,"r+"))==NULL){
printf("\nNie mozna otworzyc pliku %s", plik); //sprawdzam czy mogę otworzyć plik, który kryje się pod zmienną FPTR
}else {
if(!((aut[0]=='P')and(aut[6]=='P'))){
plik=strcat(plik,plik); // tym se nie zawracajcie głowy takie moje widzi mi sie Very Happy
cos=100;
} //jeśli tak to jedziemy dalej Very Happy
offset=sizeof(baza)+baza.ilosc*sizeof(osoba); // Ustalamy przesunięcie tzn.. położenie kursora w pliku po którym zostanie coś zapisane(czyli pierwszy rekord Bazowy+ ilośc rekordów w bazie osoba razy rozmiar)
if(fseek(fptr, offset+cos, 0) != 0){ //przesuwamy wskaźnik(tzn.. położenie kursora) w pliku
printf("\nNie mozna przesunac wskaznika");
}else{ //jak sie uda to jedziemy dalej
fwrite(&osoba,sizeof(osoba),1,fptr); //zapisujemy nową osobę do bazy
fseek(fptr, 0, 0); //teraz musimy zmienić ilosć os. w bazie(tzn.. takie moje ułatwienie ta pierwsza struktura pt. baza)
fread(&baza,sizeof(baza),1,fptr); //odczytujemy najpierw ile os. jest w bazie
baza.ilosc=baza.ilosc+1; //dodajemy jeden
baza.placa_all=baza.placa_all+osoba.placa; //dodajemy place
if ((baza.min_max_id_0==0) or (baza.min_max_id_1==0)) {
baza.min_max_id_0=osoba.id;
baza.min_max_id_1=osoba.id;
baza.min_max_placa_0=osoba.placa;
baza.min_max_placa_1=osoba.placa; //Jeśli to pierwsza osoba w bazie to jest zarazem MIN jak i MAX
}else{
if (baza.min_max_placa_0>osoba.placa){
baza.min_max_placa_0=osoba.placa;
baza.min_max_id_0=osoba.id;
}
if (baza.min_max_placa_1<osoba.placa){
baza.min_max_placa_1=osoba.placa;
baza.min_max_id_1=osoba.id;
} //Jeśli to nie pierwsza tylko druga i następna osoba w bazie to(te6linijek kodu) to sprawdzamy czy nowa osoba jest "lepszym" MIN czy MAX(cały czas mówimy o płacy)
}
fseek(fptr, 0, 0); //znowu przesuwamy sie na pozycje ZERO
fwrite(&baza,sizeof(baza),1,fptr);//no i ją zapisujemyu
}
fclose(fptr); //zamykamy plik
}
}


No i mały komentarz jeszcze:
Plik ma strukturę taką:

//pierwszy unikatowy rekord(wpis)
double version_db;
int ilosc;
double placa_all;
int min_max_id_0;
int min_max_id_1; // 0-min, 1-max,
double min_max_placa_0;
double min_max_placa_1; // 0-min, 1-max,

// 100bitów przerwy bo mi coś tak się ubzdurało i musi tak być bo ten rekord gdzieś się sam powiększa i nadpisuje mi następne - dlatego tka przerwa (działa bez problemu do 20 wpisów więcej nie sprawdzałem)Sad(((

//1 osoba

char imi[20];
char naz[20];
double placa;
int id;

//2 osoba

char imi[20];
char naz[20];
double placa;
int id;
//3 osoba

char imi[20];
char naz[20];
double placa;
int id;
//3 osoba

char imi[20];
char naz[20];
double placa;
int id;
//4 osoba

char imi[20];
char naz[20];
double placa;
int id;

//itd...

MIN i MAX jest odczytywane z pierwszego rekordu zawsze w takim przypadku nie jest wymagane przeszukiwanie całej bazy(pomysł co będzie z przeszukiwaniem jak baza będzie liczyła z 10000000000 os ile czasu to zajmie) Very Happy
średnia płaca to Suma wszystkich płac(jest zapisana w na samym początku) podzielona przez ilość os. w bazie(proste liczenie ponieważ za każdym razem jak dodam nową osobę to dodaje jej płacę do sumy wszystkich plac i dodaje do bazy że jest nowa osoba(zwiększam ilość os. o 1))

Przy usuwaniu os. odejmuje jej płace, sprawdzam czy czasem nie jest MIN lub MAX jeśli jest no to muszę znaleźć nowego MIN lub MAX i przypisać ID i wartość płacy do nowego MIN lub MAX(nie przeskoczy się tego, trzeba przeszukać cała bazę)

Jak masz jeszcze jakieś pytania to słucham Smile))

Add///
Nie robiłem tego na tablicach dynamicznych ponieważ dla dużej ilości wpisów możne z czasem braknąć pamięci i jest niebezpieczeństwo utraty całych danych Very Happy Wszystkie operacje na plikach odbywają się bez czekania na jakąkolwiek reakcje użytkownika Smile))


Post został pochwalony 0 razy

Ostatnio zmieniony przez Peter dnia Śro 8:46, 01 Kwi 2009, w całości zmieniany 1 raz
Powrót do góry
Zobacz profil autora
Ajla




Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Śro 12:10, 01 Kwi 2009    Temat postu:

mam prośbę może mi ktoś sprawdzić co w tym programie jest nie tak, to jest program od Tomka Korgóla tylko menu chciałem dorobić no i dorobiłem:) tylko że podczas kompilacji wywala mi taki błąd

17 C:\Documents and Settings\wgiel\Pulpit\program4.cpp too few arguments to function `void wczytaj(Osoba*&, int&)'
164 C:\Documents and Settings\wgiel\Pulpit\program4.cpp at this point in file

i niestet nie mam pojęcia co to może być bo na programowanie to jestem za głupi:) podejrzewam że coś bardzo głupiego zrobiłem i prostego do naprawienia ale to nie dla mnie;/jak ktoś coś umie powiedzieć co może być nie tak to dajcie znaćSmile


Kod:
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <conio>

using namespace std;

struct Osoba
{
       char imie[20];
       char nazwisko[20];
       double zarobek;
       
};

void wczytaj(Osoba*&wsk,int& ile)
{
      cout<<"Ile chcesz wprowaadzic? ";
     cin>>ile;
     
     wsk=0;
     wsk=new Osoba[ile];
     
     for(int i=0;i<ile;i++)
     {
         cout<<"Podaj dane "<<i+1<<"osoby:"<<endl<<endl;
         cout<<"Podaj imie: ";
         cin>>wsk[i].imie;
         cout<<"Podaj nazwisko: ";
         cin>>wsk[i].nazwisko;
         cout<<"Ile zarabia: ";
         cin>>wsk[i].zarobek;
         cout<<endl;
     }
}



void wypisz(Osoba*wsk,int ile)
{
     cout<<"------------------------WYPISUJEMY DANE-----------------------"<<endl<<endl;
     
     for(int i=0;i<ile;i++)
     {
             cout<<"Dane "<<i+1<<" osoby"<<endl;
             cout<<wsk[i].imie<<" ";
             cout<<wsk[i].nazwisko;
             cout<<"  zarabia: "<<wsk[i].zarobek<<endl<<endl;
     }

}



void odczyt(const char*nazwa,Osoba*wsk,int ile)
{
   
    ifstream plik;
    plik.open(nazwa,ios::in);
   
     if(!plik)
    cout<<"brak pliku"<<endl>>ile;
    wsk=new Osoba[ile];

   
    for(int i=0;i<ile>>wsk[i].imie;
            plik>>wsk[i].nazwisko;
            plik>>wsk[i].zarobek;
    }
    plik.close();
   
     cout<<"-------------------WYPISUJEMY DANE z pliku--------------------"<<endl<<endl;
   
    for(int i=0;i<ile;i++)
    {
            cout<<"Dane "<<i+1<<" osoby"<<endl;
            cout<<wsk[i].imie<<" ";
            cout<<wsk[i].nazwisko;
            cout<<"  zarabia: "<<wsk[i].zarobek<<endl<<endl;
    }
   
}

void zapis(const char*nazwa,Osoba*wsk,int ile)
{
     ofstream plik;
     
   
     
     plik.open(nazwa,ios::out);
     if(!plik)
     cout<<"brak pliku"<<endl;
     plik<<ile<<endl;
     
     for(int i=0;i<ile;i++)
     {
            plik<<wsk[i].imie<<" ";
            plik<<wsk[i].nazwisko<<" ";
            plik<<wsk[i].zarobek<<endl;;
     }
     plik.close();
}

void max(Osoba*wsk,int ile)
{
     double max=0;
     max=wsk[0].zarobek;
     int a;
     
     for(int i=0;i<ile>max)
             {
                           max=wsk[i].zarobek;
                         
             }
             
     }
     cout<<"---------------------------------------------------------------"<<endl;
     cout<<"Maksymalny zarobek wynosi: "<<max<<endl;
      cout<<"---------------------------------------------------------------"<<endl;
     
     for(int i=0;i<ile;i++)
     {
             if(wsk[i].zarobek==max)
             {
                  cout<<"Najwiecej zarabia "<<wsk[i].imie<<" "<<wsk[i].nazwisko<<" ";
                  cout<<", jego placa wynosi: "<<max<<endl;
             }
     }
                                   
   
     
     
   
}
     
void avg(Osoba*wsk,int ile)
{
     double s;
     
     for(int i=0;i<ile;i++)
     {
             s+=wsk[i].zarobek;
     }   
     
     cout<<"Sredni zarobek wynosi: "<<s/ile<<endl;
}

    void menu()
   {
         cout << " program";
         char znak1, znak2;
         bool koniec = false;
         cout << " ............" << endl;
         while (koniec == false) {
               cout << " w - wczytaj";
               cin >> znak1;
               switch(znak1){
               case ('w'): wczytaj();
               break;
               case ('k'): cout << " czy napewno chcesz wyjsc?";
               cin >> znak2;
               switch (znak2){
                      koniec = true;
                      break;
                      case ('n'): cout << " bler bloe ble ";
                      break;
                      }
               break;
               default: cout << "dozwolone ble ble ble";   
               }
               }
               
               }     

int main()
{
    Osoba*tab=0;
    int ilosc=0;
   
    wczytaj(tab,ilosc);
    cout<<"---------------------------------------------------------------"<<endl;
    wypisz(tab,ilosc);
     cout<<"---------------------------------------------------------------"<<endl;
   
    odczyt("d:\\p/cos.txt",tab,ilosc);
    zapis("d:\\p/cos.txt",tab,ilosc);
     cout<<"---------------------------------------------------------------"<<endl;
    max(tab,ilosc);
    cout<<"---------------------------------------------------------------"<<endl;
    cout<<endl;
    avg(tab,ilosc);
   

   

   
    system("PAUSE");
    return 0;
}


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Śro 12:31, 01 Kwi 2009    Temat postu:

void wczytaj(Osoba*&wsk,int& ile)
To jest oryginał a ty masz:
case ('w'): wczytaj();

Czyli z angielskiego: too few arguments to function `void wczytaj(Osoba*&, int&)'
funkcje którą próbowałeś użyć ma zbyt mało argumentów !!

Ale ja Ci powiem następny błądRazz który będzie po tym Very Happy

musisz przekazać do funkcji "menu" zmienną TAB oraz ILOSC która jest zadeklarowana w MAIN(chyba że to inaczej rozwiążesz)


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Ajla




Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Śro 14:57, 01 Kwi 2009    Temat postu:

ehh kurwa jestem za glupi na to:)śerdnio mi to wychodzi:)

Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Śro 15:13, 01 Kwi 2009    Temat postu:

Ehhh nie mów tak Razz tu nie trzeba tak bardzo myśleć Razz
Ja wychodzę z założenia że Sesja nie zając nie ucieknie, a dziewczyna może "uciec", a po za tym takie bary, lokale, chcą abym się narodził więc widzisz jak ja się tego uczę Razz weź tak samo podchodź do tego Laughing na luzie Smile)))


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Ajla




Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów

Pomógł: 3 razy
Ostrzeżeń: 0/5

PostWysłany: Czw 13:31, 02 Kwi 2009    Temat postu:

Piotr Pluta napisał:
void wczytaj(Osoba*&wsk,int& ile)
To jest oryginał a ty masz:
case ('w'): wczytaj();

Czyli z angielskiego: too few arguments to function `void wczytaj(Osoba*&, int&)'
funkcje którą próbowałeś użyć ma zbyt mało argumentów !!

Ale ja Ci powiem następny błądRazz który będzie po tym Very Happy

musisz przekazać do funkcji "menu" zmienną TAB oraz ILOSC która jest zadeklarowana w MAIN(chyba że to inaczej rozwiążesz)


a powiedz mi czy dokladnie to samo musze zrobić jak sobie zrobię jeszcze zamiast wczytaj to wypisz? też muszę przekazać zmienną tab oraz ilosc w taki sam sposób czy jakoś inaczej:)?bo w tym wypadku zrobiłem to tak:

Kod:
 case ('w'):
                    {
                    Osoba*tab=0;
                    int ilosc=0;
                    wczytaj(tab,ilosc);
                    }


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Peter
Administrator



Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów

Pomógł: 2 razy
Ostrzeżeń: 0/5
Skąd: Exe

PostWysłany: Czw 15:52, 02 Kwi 2009    Temat postu:

Ojjjjj Wojtuś zamieszałeś i to ładnie :PPP

w MAIN musisz mieć lub przed WHILE(w twoim przypadku) Smile
Dlaczego? Bo Jak zrobisz to w Switch to będzie to zmienne tyko w zakresie tej "opcji" zakładając że ograniczysz je klamrami {} bo nie wiem czy bez nich pójdzie Razz W tedy nie będziesz miał dostępu do tych wartości z pod innej części Switch'a,


Jeśłi chodzi o wypisz, zapisz to w orginale masz: wypisz(tab,ilosc); Czyli musisz przekazać dostęp do tablicy i podać wartosć ILOSC do funkcji a jak toz robisz to twoja broszka Razz

Ja bym to zrobil tak:
Kod:
int main()
{
    Osoba*tab=0;
    int ilosc=0;
   
   menu(tab,ilosc);
 //.......
}
 //we funkcji menu:
void menu(tablica*wsk, int ile){

//bla bla bla
 
 void wczytaj(tablica,ile);

// bla bla bla
}


I masz deklaracje TABLICY i ILOSCI w głównym MAINIE a dalej już tylko operujesz na nich przekazując je do funkcji Smile wiec jak byś zrobił np. MENU_DRUGIE na wypisz Razz to operujesz już na wartościach pobranych z funkcji wczytaj Smile bo jak byś to inaczej zrobił(jak chciałeś znowu deklarować zmienne) to nie miałbyś dostępu do tych wcześniejszych danych bo by były tylko one dostępne w zasięgu funkcji w której zostały "stworzone" i po jej wykonaniu by się"usunęły" to już tak łopatologicznie wytłumaczyłem Smile

Jaśniej to chyba już bym nie potrafił Razz


Post został pochwalony 0 razy
Powrót do góry
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum www.polcz.fora.pl Strona Główna -> Paradygmaty programowania Wszystkie czasy w strefie CET (Europa)
Idź do strony Poprzedni  1, 2
Strona 2 z 2

 
Skocz do:  
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach


fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2002 phpBB Group
Regulamin