PDA

Pogledaj cijelu verziju : C++ pitanja



Deadwalker
27-08-2008, 18:49
e ljudi, može pomoć? Nema veze sa igrama i programiranje istih... imam ispit iz programiranja u petak i zanima me čemu služe neke naredbe...moram položit ispit i bio bih jako zahvalan da mi pomognete. dakle zadatak je da treba u program unesti matični broj studenta, prezime, ime, sifru i ocjenu nekog kolegija...dost toga sam skužil i proučil al neke mi stvari jos nisu jasne...kod je sljedeći za prvi dio programa:

#include <iostream>

using namespace std;

struct stud{
int mbr;
char prez_ime[35];
int sifra;
int ocjena;
};

stud *studenti=new stud;//funkcija te naredbe mi nije jasna
int n;

void prog1(){
system("cls");
cout<<"\nUnesi broj studenata: ";
cin>>n;
studenti=new stud[n];
cout<<"\nUnos studenata:"<<endl;
for(int i=0;i<n;i++){
cout<<"Student br. "<<i+1<<": "<<endl;
cout<<"Prezime i ime: ";
cin.ignore();
cin.getline(studenti[i].prez_ime,sizeof(studenti[i].prez_ime));//???
cout<<"Maticni broj: ";
cin>>studenti[i].mbr;
cout<<"Sifra mentora: ";
cin>>studenti[i].sifra;
cout<<"Ocjena: ";
cin>>studenti[i].ocjena;
}
}

prog jezik je C++ i programiram u dev-u...

Luka
27-08-2008, 19:08
stud *studenti=new stud;//funkcija te naredbe mi nije jasna
ovo nema smisla, ovo ima : stud *studenti;
to je deklaracija pokazivača na tip (strukturu) stud

cin.getline(studenti[i].prez_ime,sizeof(studenti[i].prez_ime));//???

ova funkcija služi za umetanje slova u polje chara, s tim da netko od slova može biti whitespace (ime i prezime npr.)
prvi argument je polje u koje želiš spremiti znakove - a to je studenti[i].prez_ime
drugi argument je količina znakova koju želiš pohraniti - sizeof(studenti[i].prez_ime)
sizeof vrača podatak o zauzeću memorije argumenta - a kako char zauzima 1 byte, količina dopuštenih znakova je jednaka duljini arraya

Deadwalker
27-08-2008, 19:24
e puno hvala :bravo: ...daj mi sam jos reci čemu služi naredba cin.ignore()?

Luka
27-08-2008, 19:27
Kao što i ime kaže, ignorira jedan znak u ulaznom toku.

matowin59
27-08-2008, 22:00
U biti kad je neka datoteka napravljena:
dat.ignore() ili dat.ignore(5) //preskoći slijedeći znak
//preskoći slijedećih pet znakova
....nema ti druge nego napamet naučiti(ali nema koristi) jer ne znam što da ti kažem ,morali bi krenuti ispočetka
s objašnjavanjem c++-a.

Tracer
27-08-2008, 22:03
e ljudi, može pomoć? Nema veze sa igrama i programiranje istih... imam ispit iz programiranja u petak i zanima me čemu služe neke naredbe...moram položit ispit i bio bih jako zahvalan da mi pomognete. dakle zadatak je da treba u program unesti matični broj studenta, prezime, ime, sifru i ocjenu nekog kolegija...dost toga sam skužil i proučil al neke mi stvari jos nisu jasne...kod je sljedeći za prvi dio programa:


#include <iostream>

using namespace std;

struct stud{
int mbr;
char prez_ime[35];
int sifra;
int ocjena;
};

stud *studenti=new stud;//funkcija te naredbe mi nije jasna
int n;

void prog1(){
system("cls");
cout<<"\nUnesi broj studenata: ";
cin>>n;
studenti=new stud[n];
cout<<"\nUnos studenata:"<<endl;
for(int i=0;i<n;i++){
cout<<"Student br. "<<i+1<<": "<<endl;
cout<<"Prezime i ime: ";
cin.ignore();
cin.getline(studenti[i].prez_ime,sizeof(studenti[i].prez_ime));//???
cout<<"Maticni broj: ";
cin>>studenti[i].mbr;
cout<<"Sifra mentora: ";
cin>>studenti[i].sifra;
cout<<"Ocjena: ";
cin>>studenti[i].ocjena;
}
}

prog jezik je C++ i programiram u dev-u...

1) Naredba stud *studenti=new stud;Sse nalazi na krivom mjestu u programu. Treba biti unutar funkcije u kojoj se ovaj pokazivač koristi (pretpostavljam prog1). Također, ovdje je zauzeta memorija za samo jednu strukturu, a u programu ju koristiš kao polje s više elemenata. To neće raditi kako treba, ako uopće bude htjelo raditi. Previše je krivih adresiranja.

2) Naredba cin.getline(studenti[i].prez_ime,sizeof(studenti[i].prez_ime));Ssluži za unos znakovnog niza s maksimalno 35 znakova u ovom slučaju.

3) Memorija nigdje nije dealocirana.

4) Gdje je funkcija main?

Sve u svemu ovo su zaista elementarne stvari. Ako se ti sada mučiš kako učitati običnu strukturu onda nikako nisi spreman za ispit. Previše je ovdje elementarnih grešaka.

Tracer
27-08-2008, 22:09
Kao što i ime kaže, ignorira jedan znak u ulaznom toku.
Ignorira koliko je god potrebno:


cin.ignore() // 1 znak
cin.ignore(6) // 6 znakova
cin.ignore(77, '\n'); //77 znakova ili dok ne dođe do novog retka.

Tracer
27-08-2008, 22:13
U biti kad je neka datoteka napravljena:
dat.ignore() ili dat.ignore(5) //preskoći slijedeći znak
//preskoći slijedećih pet znakova
....nema ti druge nego napamet naučiti(ali nema koristi) jer ne znam što da ti kažem ,morali bi krenuti ispočetka
s objašnjavanjem c++-a.
Ovdje nije riječ o datotekama jer se koriste obični cin i cout tokovi. Sličnosti postoje s fstream i ifstream, ali tu je već potrebno kreirati i objekte.

matowin59
27-08-2008, 22:20
Tako je, ali neka malo...ima dosta tutorijala......samo sam dodao i za datoteke.Shvatiti svakako mora.
....
&istream ulaz.ignore();
eto objekta ulaz.
Klasa istream ili bilo koja njena izvedena kao što si rekao fstream,ifstream,istrstream....
Kao parametri nam posluže ono što želimo preskakati i dokud to ide.
itd..itd....eto bar sad zna ignore();

Luka
27-08-2008, 22:40
@Tracer, da, ali je njegovo pitanje bilo konkretno za cin.ingore() ;)

Tracer
27-08-2008, 23:25
@Tracer, da, ali je njegovo pitanje bilo konkretno za cin.ingore() ;)
Znam ;) Govorio sam općenito.

Deadwalker
28-08-2008, 06:40
ovo je bio samo dio programa, Inače cijeli program je realiziran u obliku izbornika, jer program radi vise funkcija. Ovo je cijeli program:(u izborniku na kraju pise sta program radi)


#include <iostream>
#include <fstream>

using namespace std;

struct stud{
int mbr;
char prez_ime[35];
int sifra;
int ocjena;
};

stud *studenti=new stud;
int n;

void prog1(){
system("cls");
cout<<"\nUnesi broj studenata: ";
cin>>n;
studenti=new stud[n];
cout<<"\nUnos studenata:"<<endl;
for(int i=0;i<n;i++){
cout<<"Student br. "<<i+1<<": "<<endl;
cout<<"Prezime i ime: ";
cin.ignore();
cin.getline(studenti[i].prez_ime,sizeof(studenti[i].prez_ime));
cout<<"Maticni broj: ";
cin>>studenti[i].mbr;
cout<<"Sifra mentora: ";
cin>>studenti[i].sifra;
cout<<"Ocjena: ";
cin>>studenti[i].ocjena;
}
}

void prog2(){
system("cls");
//sortiramo uzlazno
int sort=0;
stud temp;
while(sort==0){
sort=1;
for(int i=1;i<n;i++){
if(studenti[i-1].sifra>studenti[i].sifra){
temp=studenti[i-1];
studenti[i-1]=studenti[i];
studenti[i]=temp;
sort=0;
}
}
}
}

void prog3(){
system("cls");
cout<<"\nIspis studenata uzlazno prema sifri mentora:"<<endl;
cout<<"\n\nPrzime i ime studenta\tSifra mentora\tOcjena rada"<<endl;
for(int i=0;i<n;i++){
cout<<studenti[i].prez_ime<<"\t"<<studenti[i].sifra<<"\t"<<studenti[i].ocjena;
if(studenti[i].ocjena==1){
cout<<" (nedovoljan)";
}
else if(studenti[i].ocjena==2){
cout<<" (dovoljan)";
}
else if(studenti[i].ocjena==3){
cout<<" (dobar)";
}
else if(studenti[i].ocjena==4){
cout<<" (vrlo dobar)";
}
else if(studenti[i].ocjena==5){
cout<<" (odlican)";
}
cout<<endl;
}
cout<<endl;
}

void prog4(){
system("cls");
fstream dat;
dat.open ("studenti.dat",ios::out | ios::binary);
for(int i=0;i<n;i++){
dat.write ((char*)&studenti[i],sizeof(stud));
}
dat.close();
dat.open ("studenti.dat",ios::in | ios::binary);
cout<<"\n\nIspis iz datoteke:"<<endl;
stud buff;
while(1){
dat.read ((char*)&buff,sizeof(stud));
if(dat.eof()){
break;
}
else{
cout<<buff.mbr<<"\t"<<buff.prez_ime<<"\t"<<buff.sifra<<"\t"<<buff.ocjena<<endl;
}
}
dat.close();
cout<<endl;
}

void main(){
int izbor;
do{
system("cls");
cout<<"\n1 Unos podataka"<<endl;
cout<<"2 Sort prema sifri"<<endl;
cout<<"3 Ispis prema sifri"<<endl;
cout<<"4 Upis u datoteku i ispis iz datoteke"<<endl;
cout<<"5 Izlaz iz programa"<<endl;
cout<<"\nOdaberi: ";
cin>>izbor;
switch(izbor){
case 1:
prog1();
system("pause");
break;
case 2:
prog2();
system("pause");
break;
case 3:
prog3();
system("pause");
break;
case 4:
prog4();
system("pause");
break;
}
}while(izbor>0 && izbor<5);
}
}
}

DragonSoul
28-08-2008, 07:40
Za ubuduće, na ovom forumu imaš [CODE]Stagove, tako da ti kôd bude fino izdvojen.