 |
www.polcz.fora.pl pcz
|
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
|
Wysł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 ). Drugie to nie przypisalem zmiennej 'j' wartosci w funkcji MaxZ i nie znal nazwiska bogacza z pierwszej pozycji. Dzieki za rady
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
|
 |
Ajla
Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5
|
Wysł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 |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysłany: Nie 14:36, 29 Mar 2009 Temat postu: |
|
|
Wojtuśśśś.... A do mojego kodu to Ci się zajrzeć nie chce To tak jak byś wszedł do rozlewni piwa i pytał się czy tutaj można zamówić parę hektolitrów piwa ))))
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
Ajla
Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5
|
Wysłany: Pon 7:50, 30 Mar 2009 Temat postu: |
|
|
ale Ty masz robione w normalnym C a ja chce w c++:)ale już nieaktualna sprawa:P
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysłany: Pon 19:16, 30 Mar 2009 Temat postu: |
|
|
Ojjj Leniwisz się Wojtuś
To działa też w C++ wystarczy te funkcje scanf i printf zamienić na cin oraz cout :p i masz już gotowe w C++   
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysłany: Śro 8:44, 01 Kwi 2009 Temat postu: |
|
|
Specjalny komentarz dla: paul.april )))
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
cos=100;
} //jeśli tak to jedziemy dalej
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) (((
//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)
ś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 ))
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 Wszystkie operacje na plikach odbywają się bez czekania na jakąkolwiek reakcje użytkownika ))
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 |
|
 |
Ajla
Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5
|
Wysł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ć
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 |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysł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łąd który będzie po tym
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 |
|
 |
Ajla
Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5
|
Wysł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 |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysłany: Śro 15:13, 01 Kwi 2009 Temat postu: |
|
|
Ehhh nie mów tak tu nie trzeba tak bardzo myśleć
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ę weź tak samo podchodź do tego na luzie )))
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
Ajla
Dołączył: 23 Paź 2008
Posty: 356
Przeczytał: 0 tematów
Pomógł: 3 razy Ostrzeżeń: 0/5
|
Wysł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łąd który będzie po tym
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 |
|
 |
Peter
Administrator
Dołączył: 17 Paź 2008
Posty: 543
Przeczytał: 0 tematów
Pomógł: 2 razy Ostrzeżeń: 0/5 Skąd: Exe
|
Wysł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)
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 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
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 wiec jak byś zrobił np. MENU_DRUGIE na wypisz to operujesz już na wartościach pobranych z funkcji wczytaj 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
Jaśniej to chyba już bym nie potrafił
Post został pochwalony 0 razy
|
|
Powrót do góry |
|
 |
|
|
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
|