Može mala pomoć!!
može
Može mala pomoć!!
može
Može mala pomoć!!
Čekaj samo da nađem magičnu kuglu. :)
Glumiš Vidovitog Milana? :D
Može li mi tko objasniti koja je uloga i funkcija datoteka, i sam rad s datotekama(spremanje z čitanje ispisivnje na ekran itd.) jer mi profesor nije to objasnio a zahtjeva da znamo(koji glupan), a i sam bih volio da znam... imam jedan zadatak s datotekama rijesio sam ga sve do rada s tim datotekama.Zadatak glasi:
Napravi program koji definira strukturu za zapis podataka o pilotima sa članovima: prezime i ime, staž i broj letova. iz datoteke piloti.txt pročitaju se podaci o svim pohranjenim pilotima, soriraju po broju letova ili po stažu ako je broj letova isti i tako sortirani ispisuju na ekran.
#include <iostream>
#include<stdio.h>
include <cstring>
using namespace std;
struct piloti
{
char ime [30];
int staz;
int brletova;
};
int main()
{
piloti P[4],k;
cout<<"Unos pilota: "<<endl;
for(int i=0;i<4;i++){
cout<<"Unos "i+1<<". pilota"<<endl;
cout<<"Unesi ime: ";
fflush(stdin);
cin.getline(P[i].ime,30);
cout<<endl;
cout<<"Unesi staz u godinama: ";
cin>>P[i].staz;
cout<<endl;
cout<<"Unesi broj letova: ";
cin>>P[i].brletova;
cout<<endl;
}
for(int i=0;i<3;i++){
for(int j=i+1;j<4;j++){
if(p[j].brletova>P[i].brletova ||
(P[j].brletov==P[i].brletova &&
P[j].staz>P[i].staz))
k=P[i];
P[i]=P[j];
P[j]=k;
}
}
cout<<"Ispis pilota sortiranih po letovima(ili stazu): "<<endl;
for(int i=0;i<4;i++){
cout<<i+1<<"."<<P[i].ime<<" "<<P[i].brletova<<endl;
}
return 0;
}
Pa trebao si ga pitati da ti objasni, a ne čekati objašnjenje :)
Evo ti: http://web1.ss-amkaramaneo-vis.skole.hr/informatika/Cpp_school/Datoteke%20u%20C++.htm
Inače ako planiraš učiti C++ imaš dobru knjigu: C++ Analiza i Primjena od Željka Kovačevića (TracerCPP), imaš unutra i rad s datotekama.
Slobodno malo i proučiš po netu (bar nije teško naći, napišeš c++ datoteke u google) prije nego pitaš ovdje, a ako ne razumiješ onda pitaj.
Može li mi tko objasniti koja je uloga i funkcija datoteka, i sam rad s datotekama(spremanje z čitanje ispisivnje na ekran itd.) jer mi profesor nije to objasnio a zahtjeva da znamo(koji glupan), a i sam bih volio da znam...
Ovo je jako neobično pitanje. Datoteke služe kako bi nešto mogao spremiti "za kasnije" na neku trajnu memoriju (tvrdi disk recimo) da ne izgubiš sve kada ugasiš računalo ili nestane struje.
Napravi program koji definira strukturu za zapis podataka o pilotima sa članovima: prezime i ime, staž i broj letova. iz datoteke piloti.txt pročitaju se podaci o svim pohranjenim pilotima, soriraju po broju letova ili po stažu ako je broj letova isti i tako sortirani ispisuju na ekran.
Sve pet, samo... kako su formatirani podatci u datoteci piloti.txt? Jedna vrijednost po liniji? Sve vrijednosti za jednog pilota u istoj liniji odvojene zarezima (bez zareza?)? Nalaze li se prazne linije između zapisa o pilotima?
Pa pronađi na google-u kako se radi sa datotekama u C++u. Možeš koristiti modul fstream (ofstream i ifstream) ili stdio modul gdje se nalaze funkcije poput fscanf ili fprintf. Rad sa datotekama nije nimalo težak. Sve što si ti uradio je dobro (valjda :)), ali sada umjesto da vršiš upis/ispis sa RAM memorijom, to radi sa tekstualnim datotekama.
Evo pogledaj ovdje jednostavne prijmere:
http://www.cplusplus.com/doc/tutorial/files/
Onda to prebaci u tvoj program. Također pazi da imaš neformatirane i formatirane datoteke.
Reci profesoru da se to tako ne radi i da ne možeš pisati program nagađajući kako su podatci u datoteci poslagani. Ili neka ti da datoteku kako bi ju mogao analizirati i napisati program ili neka ti objasni točno format datoteke.
Mislim stvarno, kakve su to fore?
Da, i? Je li vam rekao kako da radite sa njima, binarno ili formatirano, ako formatirano koji je format, kako će se predstavljati zapis jednog pilota, kako će se odvajati ime od staža... Ili sve vama na volju?
Da, ali ne kužiš da trebaš znati što se i gdje nalazi u toj datoteci kako bi mogao podatke stavljati tamo gdje im je i mjesto?
Evo recimo da imaš datoteku piloti.txt u ovom formatu:
ime prezime staž broj_letova
ime prezime staž broj_letova
ime prezime staž broj_letova
...
ime prezime staž broj_letova
Onda bi čitanje podataka iz takve datoteke koristeći C++ streamove ja izveo ovako:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
#define BROJ_PILOTA 4
struct piloti
{
char ime[30];
int staz;
int brletova;
};
int main()
{
piloti p[BROJ_PILOTA]={0};
ifstream datoteka;
datoteka.open("piloti.txt");
for (int n=0; n<BROJ_PILOTA; n++)
{
datoteka >> p[n].ime;
datoteka >> p[n].ime + strlen(p[n].ime) + 1;
datoteka >> p[n].staz;
datoteka >> p[n].brletova;
p[n].ime[strlen(p[n].ime)]=' ';
}
datoteka.close();
for (int n=0; n<BROJ_PILOTA; n++)
cout << p[n].ime << " " << p[n].staz << " " << p[n].brletova << endl;
return 0;
}
Da se razumijemo ovo tu ti je samo čitanje i ispis pročitanog, nema nikakvog sortiranja ili ručnog unosa...
I bilo bi jednostavnije npr. da imaš posebno polje za ime a posebno za prezime, ili da je svaki podatak u datoteci u zasebnoj liniji...
EDIT: sad sam se sjetio i još nečega. Imaš li naveden broj pilota ili se od tebe traži da samo čitaš datoteku "dokle ide"?
Taj sam dio skužio, ali ću prepustiti tebi da malo razmišljaš o sortiranju (pogledaj si bubble sort algoritam na netu).
Pozz, možete li mi reći čemu služi dinamička i statička alokacija memorije, radi čega je to bitno?
Pozz, možete li mi reći čemu služi dinamička i statička alokacija memorije, radi čega je to bitno?
Staticka alokacija memorije vrsi se u compile-timeu, dinamicka u run-timeu.
Kod staticke unaprijed znas (dok pises kod) koliko ti memorije treba, dinamicku koristis kad ne znas koliko ce ti memorije trebati. Npr., zelis napisati program koji ce u polje spremati integere. No koliko njih? Mozes unaprijed odrediti recimo 10 i to je to. No sto ako korisnik sam zeli odrediti koliko ih zeli unijeti? Tada dinamicki alociras memoriju.
Pozz, možete li mi reći čemu služi dinamička i statička alokacija memorije, radi čega je to bitno?
Za statičku alokaciju memorije koristi se stack memorija. Statička alokacija memorije se događa za vrijeme kompajliranja programa i koristi se za deklaraciju svake varijable u tvom programu. Količinu memorije unaprijed određuje programer i ona se za vrijeme izvršavanja programa ne može dinamički povećati po potrebi. Ako si deklarirao polje od 200 članova i programu ne treba više od toga sve je ok, ali što ako mu zatreba više? Npr. čitaš iz neke datoteke i ne znaš unaprijed koliko je ona velika?
Npr:
int a; // varijabla 'a' je smještena na stack memoriju
int b[200]; // polje 'b' je smješteno na stack memoriju
Koristiš ju kada unaprijed znaš točno koliko ti memorije treba za nešto, i kada količina memorije koja je potrebna za "to nešto" nije prevelika jer je stack ograničen svojom veličinom i mnogo je manji od heap memorije. Statički alociranu memoriju ne možeš osloboditi, ona se oslobodi sama kada varijabla izađe iz scopea (osim ako nije riječ o statičkoj varijabli).
Za dinamičku alokaciju memorije koristi se heap memorija. Koristi se kada veličina nečega što treba staviti u memoriju nije unaprijed poznata, ili kada je veličina toga nečega poprilična pa nam treba više memorije nego što stack može pružiti.
Npr.
// dinamički alociran blok memorije od 1 MB
char *a = malloc(1048576); // C način, koristeći funkciju malloc
char *a = new char[1048576]; // C++ način, koristeći operator new
Dinamički alociranu memoriju se može osloboditi usred izvršavanja programa kada ona više nije potrebna kako bi se oslobodila memorija za neke druge podatke.
Npr.
// oslobađanje dinamički alocirane memorije
free(a); // C način, koristeći funkciju free
delete[] a; // C++ način, koristeći operator delete
Imaš zapravo dobar primjer u ovom postu. Ako pogledaš definiciju strukture 'piloti' vidjet ćeš da je njen član 'ime' statički alociran na 30 znakova (bajtova). Autor programa je pretpostavio da ime i prezime nikada neće biti dulje od 30 znakova (uključujući znak za razmak između njih), ali što ako se iz datoteke ipak pročita ime koje je dulje od toga? To je prilično dobar kandidat za dinamičku alokaciju memorije umjesto statičke koja se trenutno koristi, jer kada bi se koristila dinamička alokacija za član 'ime' bi se moglo zauzeti točno onoliko memorije koliko je ime dugačko. Time bi nam program zauzimao manje memorije ako je ime kraće od 30 znakova (ne bi bilo rasipavanja memorije jer bi bilo alocirano točno onoliko koliko je potrebno), a ako je ime dulje od 30 znakova program bi alocirao više memorije i ime bi uvijek stalo u memoriju.
Ovdje kod dinamičke da si za char stavio char *a=new char[20] znači kada bih ja upisao nešto što mi premaši 20 znakova ta će se memorija proširiti za još dodatni 20 mjesta?
Je li ima neko ograničenje koliko se memorije može alocirati?
1)Ovdje kod dinamičke da si za char stavio char *a=new char[20] znači kada bih ja upisao nešto što mi premaši 20 znakova ta će se memorija proširiti za još dodatni 20 mjesta?
2)Je li ima neko ograničenje koliko se memorije može alocirati?
1) Ne, za to koristi vektore.
2) Koliko ti OS dopusti.
Imam jedno pitanje, konkretno vezano za C++ Builder XE2.
Dosta često mi se događa da mi izbacuje grešku (u privitku je slika).
Npr. napravim novi projekt (za primjer konzolna aplikacija) bez ikakvog koda (osim main funkcije) i kad probam kompajlirati se ta greska javlja.
Nekad nakon restarta racunala nestane ali se ponovno vrati i ne mogu kompajlirati kod. Gledao sam po netu ali nisam rješenje nikakvo našao.
Slabo tražiš
https://forums.embarcadero.com/thread.jspa?messageID=188244
Čitajući tu temu čini se da je uzrok pronađen, a postoji i zaobilazno rješenje. Više od toga ti ne mogu pomoći ne koristim C++ Builder. Čekaj tracera :)
Nikad takav error nisam dobio. Koliko vidim po netu to je već ispravljeno u jednom od update-a tako da probaj ih nekako nabaviti. Meni se automatski instaliraju pošto je riječ o legalnoj verziji.
Za XE2 imam update 3 , mozda da probam update 4 instalirati (cini mi se da sam vidio da i četvorka postoji) !?
Iskreno, nemam pojma. Kažem - sami mi se automatski instaliraju.
Edit: popis ispravljenih bugova u update 4. S obzirom koliko ima ispravaka i taj bi mogao biti tu.
Aha, hvala.
Imam samo jedno pitanje u vezi pointera ako može:
int * p, polje[3] = {2,4,6};
p = &polje[0];
cout <<*p<<endl;
Zanima me (ovo je primjer s neta), čemu sad to točno služi i što se dobiva takvom uporabom pointera ako se može
jednostavno ispisati cout <<polje[0] << endl; umjesto rada s pointerom ?
Kakva je točno sad tu korist od pointera, ne kužim baš.
Pa u ovom konkretnom slucaju je svejedno, vjerojatno je to samo neki skolski primjer za pokazati kako se radi s pokazivacima.
jednostavno ispisati cout <<polje[0] << endl; umjesto rada s pointerom ?
Kakva je točno sad tu korist od pointera, ne kužim baš.
To je vjerojatno neki primjer koji pokazuje da pointer 'p' pokazuje na prvi element polja i da njegovo dereferenciranje daje isti rezultat kao i p[0]
Zašto misliš da tu ima nužno neke koristi? Pa radi se o tri linije koda, i sam si skužio što se događa...
EDIT: domagoj me opet pretekao, to mu danas prelazi u naviku ^^