Hvala, imam racun na carnetu
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.588.661
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Bjarne Stoustrup - The C++ Programming Language!
ovako, radim program za upis n ucenika u datoteku.. uz ime i prezime ide i prosjek ocjena i broj izostanaka, i trebam ispisati imena po abecedi, ja sam sve rijesio osim ovoga sortiranja po abecedi, jel moze netko rec kako cu to, bio bih veoma zahvalan kad bi mi napisao dio koda jer sutra moran predati seminarski a tu sam zapeo :?
ovako, radim program za upis n ucenika u datoteku.. uz ime i prezime ide i prosjek ocjena i broj izostanaka, i trebam ispisati imena po abecedi, ja sam sve rijesio osim ovoga sortiranja po abecedi, jel moze netko rec kako cu to, bio bih veoma zahvalan kad bi mi napisao dio koda jer sutra moran predati seminarski a tu sam zapeo :?
Sort po imenu i prezimenu sam i ja neki dan pokušao napraviti, s tim da sam ja radio upis iz datoteke i ispis u stdout. Nisam završio pošto sam imao jedan problem.
Zamislio sam to tako da učitavam imena, uspoređujem ih s već učitanim imenima u petlji funkcijom strcmp koja daje -1 ako je niz "manji" po brojčanim ascii vrijednostima, 0 ako je jednak i 1 ako je "veći" po ascii-ju, te ih tako sortiram. Problem mi je bio što sam za sva imena koristio jedno polje tako da ih nisam mogao uspoređivati pravilno, a nisam vidio način da stavim imena u različita polja pošto je broj imena bio varijabilan.
Tako da i mene zanima rješenje :D
Trebao bih neki dobar a relativno jednostavan (razumljiv) tutorial za višenitno programiranje u c++.
Ako netko zna neki dobar (bilo u pisanom ili video obliku), zamolio bih da mi da link ili nešto slično.
Zamislio sam to tako da učitavam imena, uspoređujem ih s već učitanim imenima u petlji funkcijom strcmp koja daje -1 ako je niz "manji" po brojčanim ascii vrijednostima, 0 ako je jednak i 1 ako je "veći" po ascii-ju, te ih tako sortiram. Problem mi je bio što sam za sva imena koristio jedno polje tako da ih nisam mogao uspoređivati pravilno, a nisam vidio način da stavim imena u različita polja pošto je broj imena bio varijabilan.
Dinamički preko pokazivača alociraj polje točno one duljine koje ti treba te ga onda popuni imenima i sortiraj.
Trebao bih neki dobar a relativno jednostavan (razumljiv) tutorial za višenitno programiranje u c++.
Ako netko zna neki dobar (bilo u pisanom ili video obliku), zamolio bih da mi da link ili nešto slično.
Za višenitno (multi-threading) programiranje nema podrške u standardnoj biblioteci već trebaš koristiti neke druge biblioteke poput boost, vcl i sl.
bio sam nasao i neku funkciju string.compare i isto nije tilo radit :!
u vezi lotetature, ima ona knjiga program c sa nekakvim narancama i prilicno je dobra, bar meni a imas tu negdi na forumu linkove sa litetaturom u pdf formatu, procackaj malo :)
Dinamički preko pokazivača alociraj polje točno one duljine koje ti treba te ga onda popuni imenima i sortiraj.
Nisam još učio dinamičku alokaciju... :D pitao bi ja i prije za pomoć, ali sam znao da je tu u igri vjerojatno nešto što ja još ne znam.
To su funkcije :) Dinamička alokacija bi trebala biti ovo.
U tvojoj je glavi kupus! Zato što si učio prebrzo i predaleko. Vrati se na početak od varijabli, i polako.
Što se ftella i fseeka tiče, to su funkcije za rad sa dadotekama.
http://www.cplusplus.com/reference/clibrary/cstdio/ftell/
To su funkcije :) Dinamička alokacija bi trebala biti ovo.
I alokacija se probitno implementirala preko funkcija malloc i realocirala pomoću realloc, a oslobađala pomoću free funkcijom.
U strukturno-proceduralnom programiranju sve su funkcije i strukture.
P.S u C-u i danas se alocira pomoću gore navedenih funkcija, tek u C++-u imaš mogućnost alocirati pomoću new i delete operatora.
Malloc i realloc su iz C-a ,u C++-u možeš koristiti new i delete.
EDIT:Sad vidim da je kolega već gore napisao.
iskreno, prvi put cujem pa sam napisao ftell i fseek pa kud puklo da puklo xD
A u c++ nisam otisao predaleko jer ne ucim samostalno vec u skoli po planu i programu, valjda oni znaju sta rade :D
iskreno, prvi put cujem pa sam napisao ftell i fseek pa kud puklo da puklo xD
A u c++ nisam otisao predaleko jer ne ucim samostalno vec u skoli po planu i programu, valjda oni znaju sta rade :D
Sumnjam da bas znaju sto rade, jer je skolski program jednostavno prespor i preslab. Ako se zanima programiranje onda moras puno vise raditi samostalno jer nije bas velika sansa da ces u srednjoj skoli u razredu nesto nauciti.
Sumnjam da bas znaju sto rade, jer je skolski program jednostavno prespor i preslab. Ako se zanima programiranje onda moras puno vise raditi samostalno jer nije bas velika sansa da ces u srednjoj skoli u razredu nesto nauciti.
Malo je reći. Jednostavno ni profesori nisu kompetentni, bolje bi predavali mi iz ove teme (osim Tracera, koji već predaje). Ali idemo u OffTopic...
Imas vise rjesenja. Ili prealocirati polje koje ce biti mnogo vece od najveceg ocekivanog broja imena (sirov pristup), ili pomocu funkcije "realloc" mijenjati velicinu polja dinamicki, ili koristiti nekakav inteligentniji oblik pohrane podataka koji se lagano moze prosirivati (recimo vezana lista, ili c++ vektor).
Recimo da se odlucis na ovo prvo, i znas da nikad, ali bas nikad neces imati posla sa vise od 1000 imena, onda napravis nesto ovakvo:
staticka alokacija polja na stacku:
char *imena[1001]={NULL};
dinamicka alokacija polja na heapu:
char **imena=(char**)calloc(1001, sizeof(char*));
Time ces napraviti polje od 1001 pokazivaca koje ces odmah inicijalizirati na NULL
Evo kako bi to koristio u praksi:
#include <stdlib.h>
#include <stdio.h>
int main()
{
//varijabla "tekst" je polje od 20 pokazivaca
//inicijaliziranih na NULL
char *tekst[20]={NULL};
char spremnik[1000];
int linija=0;
FILE *fh;
//otvorimo datoteku
if (!(fh=fopen("test.txt", "r")))
{
printf("Datoteka \"test.txt\" ne moze biti otvorena!\n");
return 1;
}
//procitamo sadrzaj
while (!feof(fh) && linija<20)
{
fgets(spremnik, 999, fh);
tekst[linija]=(char*)calloc(1, strlen(spremnik)+1);
strcpy(tekst[linija], spremnik);
linija++;
}
//zatvorimo datoteku
fclose(fh);
//ispisemo sadrzaj na ekran
for (linija=0; tekst[linija]; linija++)
printf("%s", tekst[linija]);
//oslobodimo alociranu memoriju
for (linija=0; tekst[linija]; linija++)
free(tekst[linija]);
return 0;
}
Problemi s ovim pristupom:
- Ocigledno hardkodirano ogranicenje broja linija teksta.
- Pretpostavka da ce najdulja linija teksta biti kraca od 1000 znakova (razumna pretpostavka, ali ipak umanjuje robusnost programa).
- feof je prilicno sirov pristup za detekciju kraja datoteke, pa ce petlja recimo procitati i praznu liniju teksta na kraju (ako ju imas).
- Svaka procitana linija u pravilu zavrsava newline znakom kojeg bi se mozda zelio rijesiti, pa bi ga trebalo nekako filtrirati.
Istina, odosmo u offtopic, nego ima li itko da zna rijesenje bez te neke alokacije :D
Trebao bih neki dobar a relativno jednostavan (razumljiv) tutorial za višenitno programiranje u c++.
Ako netko zna neki dobar (bilo u pisanom ili video obliku), zamolio bih da mi da link ili nešto slično.
Za višenitno (multi-threading) programiranje nema podrške u standardnoj biblioteci već trebaš koristiti neke druge biblioteke poput boost, vcl i sl.
Pa dobro, onda trebam neki tutorial za to. Radili smo višenitne aplikacije pod jednim kolegijem na faksu prije nekoliko godina, problem je što ne nađem više tu literaturu a trebao bih isprogramirati nešto višenitno.
Imam mali problem doma sa microsoft visual studiom.
Kad kontrolirano pokrenem program (ctrl+f5) font u cmd.exe mi je premali i ne vidim sta pise, kad ga provam full screenat poveca se prozor al font ostaje isti. zna iko rjesenje?
EDIT: i btw zna li iko sta radi '!' kao matematicka naredba. Koliko sam ja svatia sve brojeve razlicite od nule pretvara u nulu, a nulu pretvara u 1?
Pa tko je spominjao da tebi treba dinamicka alokacija memorije? Tebi treba obican bubble sort polja struktura.
Evo gle kako bih ja to recimo napravio:
#include <stdlib.h>
#include <stdio.h>
struct ucenik
{
char ime[20];
float prosjek;
int izostanci;
};
int main()
{
struct ucenik ucenici[4]={{"Marko", 4.2, 0},
{"Matej", 3.4, 3},
{"Ivan", 3.8, 5},
{"Luka", 4.3, 0}};
struct ucenik temp;
int n, i;
//ovo je petlja koja sortira polje
for (n=0; n<4; n++)
for (i=0; i<3; i++)
if (strcmp(ucenici[i].ime, ucenici[i+1].ime)>0)
{
temp=ucenici[i+1];
ucenici[i+1]=ucenici[i];
ucenici[i]=temp;
}
//ova petlja samo ispisuje sortirano polje na ekran
for (n=0; n<4; n++)
{
printf("Ime: %s\n", ucenici[n].ime);
printf(" Prosjek: %.02f\n", ucenici[n].prosjek);
printf(" Izostanci: %d\n\n", ucenici[n].izostanci);
}
return 0;
}
Podatci su ovdje hardkodirani, ti prekroji da radi onako kako tebi treba.
Imam mali problem doma sa microsoft visual studiom.
Kad kontrolirano pokrenem program (ctrl+f5) font u cmd.exe mi je premali i ne vidim sta pise, kad ga provam full screenat poveca se prozor al font ostaje isti. zna iko rjesenje?
EDIT: i btw zna li iko sta radi '!' kao matematicka naredba. Koliko sam ja svatia sve brojeve razlicite od nule pretvara u nulu, a nulu pretvara u 1?
Ako želiš povećat ekran.U CMD-u klikneš gore u traci desni tipku miša-properties-font i povećaš.
Pa dobro, onda trebam neki tutorial za to. Radili smo višenitne aplikacije pod jednim kolegijem na faksu prije nekoliko godina, problem je što ne nađem više tu literaturu a trebao bih isprogramirati nešto višenitno.
Zelis li putem Windows API-ja kreirati i kontrolirati niti, ili bi koristio nesto poput OpenMP?
"!" je takozvani logicki "not" operator.
To jest logicka negacija. Zamisli svugdje gdje pise taj usklicnik da pise "not" pa ce ti imati vise smisla kada citas. To bi ti tracer bolje znao objasniti :)
Trebao bih neki dobar a relativno jednostavan (razumljiv) tutorial za višenitno programiranje u c++.
Ako netko zna neki dobar (bilo u pisanom ili video obliku), zamolio bih da mi da link ili nešto slično.
Za višenitno (multi-threading) programiranje nema podrške u standardnoj biblioteci već trebaš koristiti neke druge biblioteke poput boost, vcl i sl.
Pa dobro, onda trebam neki tutorial za to. Radili smo višenitne aplikacije pod jednim kolegijem na faksu prije nekoliko godina, problem je što ne nađem više tu literaturu a trebao bih isprogramirati nešto višenitno.
Kao što sam rekao, ako ćeš višenitno programiranje trebaš reći koju biblioteku/razvojno okruženje koristiš. VS i MFC, C++ Builder i VCL ili nešto treće?
Kao što sam rekao, ako ćeš višenitno programiranje trebaš reći koju biblioteku/razvojno okruženje koristiš. VS i MFC, C++ Builder i VCL ili nešto treće?
MS Visual Studio 2008 na Windows 7 professional x64 sp1.
Kao što sam rekao, ako ćeš višenitno programiranje trebaš reći koju biblioteku/razvojno okruženje koristiš. VS i MFC, C++ Builder i VCL ili nešto treće?
MS Visual Studio 2008 na Windows 7 professional x64 sp1.
Onda kopaj po googlu za MFC threading. Npr;
http://www.functionx.com/visualc/jamesprasanna/CWinThread.htm
"!" je takozvani logicki "not" operator.
To jest logicka negacija. Zamisli svugdje gdje pise taj usklicnik da pise "not" pa ce ti imati vise smisla kada citas. To bi ti tracer bolje znao objasniti :)
Nije mi jasno zasto C sve cijele brojeve razlicite od nula vidi ko 1 i onda ih '!' pretvara u nulu, a zasto samo nulu pretvara u jedinicu ?
Nije mi jasno zasto C sve cijele brojeve razlicite od nula vidi ko 1 i onda ih '!' pretvara u nulu, a zasto samo nulu pretvara u jedinicu ?
To trebas gledati na True/False nacin.
True ti se obicno povezuje sa brojem 1, dok se False obicno povezuje sa brojem 0. U C-u ti vrijedi nesto drukcije pravilo. Svaki broj razlicit od nule je True, dok je False nula.
Ako napises !2 ili !1 ili !bilo_koji_broj_a_da_nije_nula, C to vidi kao "not true", a ako nije "true" onda mora biti "false". Ili ako napises !0 onda ti je to "not false", a ako nije "false" onda mora biti "true" :D
Pa tko je spominjao da tebi treba dinamicka alokacija memorije? Tebi treba obican bubble sort polja struktura.
Evo gle kako bih ja to recimo napravio:
#include <stdlib.h>
#include <stdio.h>
struct ucenik
{
char ime[20];
float prosjek;
int izostanci;
};
int main()
{
struct ucenik ucenici[4]={{"Marko", 4.2, 0},
{"Matej", 3.4, 3},
{"Ivan", 3.8, 5},
{"Luka", 4.3, 0}};
struct ucenik temp;
int n, i;
//ovo je petlja koja sortira polje
for (n=0; n<4; n++)
for (i=0; i<3; i++)
if (strcmp(ucenici[i].ime, ucenici[i+1].ime)>0)
{
temp=ucenici[i+1];
ucenici[i+1]=ucenici[i];
ucenici[i]=temp;
}
//ova petlja samo ispisuje sortirano polje na ekran
for (n=0; n<4; n++)
{
printf("Ime: %s\n", ucenici[n].ime);
printf(" Prosjek: %.02f\n", ucenici[n].prosjek);
printf(" Izostanci: %d\n\n", ucenici[n].izostanci);
}
return 0;
}
Podatci su ovdje hardkodirani, ti prekroji da radi onako kako tebi treba.
hvala na pomoci, sinoc sam napravio neki primjer bezveze, danas cu to isto primjenit na seminarski rad..
btw. pogresno sam ja shvatio, bio na satu pa nisam moga procitat postove kako treba xD
Kako da izdvojim cifre bilo kojeg broja?
Ne treba mi kod,samo neko da objasni.