Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 22:26 čet, 23. 5. 2013 Naslov: |
|
|
Evo, mislim da je sad ok. Zaboravila sam ---> prvi=temp
[code:1]
#include<stdio.h>
typedef struct _razlomak* lista;
typedef struct _razlomak{
int brojnik;
int nazivnik;
lista next;
}razlomak;
void ispisi_listu (lista prvi)
{
lista pom;
int brojac=0;
for(pom=prvi; pom!=NULL; pom=pom->next)
{
printf("%d. element liste = %d/%d\n", ++brojac, pom->brojnik, pom->nazivnik);
}
return;
}
lista ubaci_razlomak_na_pocetak(lista prvi, lista novi)
{
novi->next=prvi;
prvi=novi;
return prvi;
}
int main (void)
{
lista prvi=NULL;
lista novi, temp, pom, pom2;
while(1){
novi=(lista)malloc(sizeof(razlomak));
printf("Brojnik: ");
scanf("%d", &novi->brojnik);
printf("Nazivnik: ");
scanf("%d", &novi->nazivnik);
if(novi->nazivnik==0) break;
temp=ubaci_razlomak_na_pocetak(prvi, novi);
prvi=temp;
printf("Brojnik/Nazivnik: %d/%d\n\n", temp->brojnik, temp->nazivnik);
}
ispisi_listu(temp);
for(pom=prvi; pom!=NULL; pom=pom2){
pom2=pom->next;
free(pom);
}
return 0;
}
[/code:1][/code]
Evo, mislim da je sad ok. Zaboravila sam → prvi=temp
Kod: |
#include<stdio.h>
typedef struct _razlomak* lista;
typedef struct _razlomak{
int brojnik;
int nazivnik;
lista next;
}razlomak;
void ispisi_listu (lista prvi)
{
lista pom;
int brojac=0;
for(pom=prvi; pom!=NULL; pom=pom->next)
{
printf("%d. element liste = %d/%d\n", ++brojac, pom->brojnik, pom->nazivnik);
}
return;
}
lista ubaci_razlomak_na_pocetak(lista prvi, lista novi)
{
novi->next=prvi;
prvi=novi;
return prvi;
}
int main (void)
{
lista prvi=NULL;
lista novi, temp, pom, pom2;
while(1){
novi=(lista)malloc(sizeof(razlomak));
printf("Brojnik: ");
scanf("%d", &novi->brojnik);
printf("Nazivnik: ");
scanf("%d", &novi->nazivnik);
if(novi->nazivnik==0) break;
temp=ubaci_razlomak_na_pocetak(prvi, novi);
prvi=temp;
printf("Brojnik/Nazivnik: %d/%d\n\n", temp->brojnik, temp->nazivnik);
}
ispisi_listu(temp);
for(pom=prvi; pom!=NULL; pom=pom2){
pom2=pom->next;
free(pom);
}
return 0;
}
| [/code]
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 18:51 uto, 28. 5. 2013 Naslov: |
|
|
Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
[code:1]
#include<stdio.h>
double trag(FILE *in)
{
int n, i, j;
double x, tr=0.0;
fscanf(in, "%d", &n);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j){
fscanf(in, "%lf", &x);
if(i==j) tr+=x;
}
return tr;
}
int main (void){
FILE *in;
if ((in=fopen("matrica.txt", "rt"))== NULL)
{ printf("Greska prilikom ptrvaranja datoteke.\n");
exit(1);
}
printf("Trag je %lg.\n", trag(in));
return 0;
}
[/code:1]
Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
Kod: |
#include<stdio.h>
double trag(FILE *in)
{
int n, i, j;
double x, tr=0.0;
fscanf(in, "%d", &n);
for(i=0; i<n; ++i)
for(j=0; j<n; ++j){
fscanf(in, "%lf", &x);
if(i==j) tr+=x;
}
return tr;
}
int main (void){
FILE *in;
if ((in=fopen("matrica.txt", "rt"))== NULL)
{ printf("Greska prilikom ptrvaranja datoteke.\n");
exit(1);
}
printf("Trag je %lg.\n", trag(in));
return 0;
}
|
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
Postano: 20:11 uto, 28. 5. 2013 Naslov: |
|
|
[quote="frutabella"]Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
[code:1]
...
[/code:1][/quote]
Meni radi, nisi stavila očito datoteku u isti folder gdje ti je program, a i nedostaje ti stdlib.h zbog exit-a.
frutabella (napisa): | Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
|
Meni radi, nisi stavila očito datoteku u isti folder gdje ti je program, a i nedostaje ti stdlib.h zbog exit-a.
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 21:39 uto, 28. 5. 2013 Naslov: |
|
|
[quote="Shirohige"][quote="frutabella"]Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
[code:1]
...
[/code:1][/quote]
Meni radi, nisi stavila očito datoteku u isti folder gdje ti je program, a i nedostaje ti stdlib.h zbog exit-a.[/quote]
Nisu bili u istom folder. Hvala puno!
Shirohige (napisa): | frutabella (napisa): | Dilema:
Kad zelim isprobati neki program s datotekama, npr, izracunati trag u vec napisanoj datoteci, napisem u notepadu sve sto treba za tu matricu i nazovem tu tekstulanu datoteku matrica.
Ako je to tako, zasto mi ovaj program onda ne radi?
|
Meni radi, nisi stavila očito datoteku u isti folder gdje ti je program, a i nedostaje ti stdlib.h zbog exit-a. |
Nisu bili u istom folder. Hvala puno!
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 22:52 čet, 30. 5. 2013 Naslov: |
|
|
ja više ne znam što da radim...napisala sam zadaću u svim mogućim oblicima, načinima i sve živo probala i pitala i opet mi ne prihvaća zadaću..ako ima ko volje ovako kasno (da znam da je dan prije ispita) da mi kaže u čemu je problem:
1.problem:
Napišite program koji učitava prirodni broj n ≤ 17 i niz od 2n−1 cijelih brojeva. Program treba kreirati gornjetrokutastu matricu M reda n kojoj se učitani brojevi nalaze po redu u prvom retku i zadnjem stupcu, a za elemente gornjeg trokuta vrijedi:
Mi,j=(2M(i−1,j) −2M(i,j+1)) mod 10287612,
gdje mod označava nenegativni ostatak pri dijeljenju lijevog broja s desnim.
Program treba ispisati elemente glavne dijagonale matrice M (ispisane brojeve odvojite razmakom).
prvo što sam primijetila da neke elementi će izračunavati preko elemenata koji još ne postoje, pa ne znam onda jel to tako treba biti ili je krivo postavljen zadatak ili sam ja luda pa ne vidim di je definiran taj element..
Moj kod:
[code:1]#include <stdio.h>
int main(){
int n, i, j, br;
int mat[20][20];
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &mat[i][i]);
for(i=1; i<n; i++)
for(j=0; j<i; j++){
br=5*mat[i-1][j]-5*mat[i][j+1];
if(br<0) br=br*(-1);
br=br%10453729;
mat[i][j]=br;
}
for(i=0; i<n; i++)
for(j=i+1; j<n; j++)
mat[i][j]==0;
for(j=0; j<n; j++)
printf("%d ", mat[n-1][j]);
return 0;}[/code:1]
2.problem:
Napišite program koji učitava jednu liniju teksta s najviše 16692 znakova. Tom tekstu treba izbrisati svaku 7. riječ, a ostalima izokrenuti redoslijed slova (same riječi ostaju u originalnom poretku). Tako dobiveni tekst treba ispisati. Možete pretpostaviti da tekst sadrži samo slova i razmake.
Moj kod:
[code:1]#include <stdio.h>
#include <stdlib.h>
void sljedeca_rijec(char* string, int odakle, int* pocetak, int* kraj){
int i = odakle;
while(string[i] == ' ') i += 1;
*pocetak = i;
if(string[*pocetak] == '\0') return;
while(string[i+1] != ' ' && string[i+1] != '\0') i += 1;
*kraj = i;
}
void invertiraj(char* string, int pocetak, int kraj){
while(pocetak < kraj){
char tmp = string[pocetak];
string[pocetak] = string[kraj];
string[kraj] = tmp;
kraj -= 1;
pocetak += 1;}
}
void obrisi(char* string, int pocetak, int kraj){
int i = pocetak, j = kraj + 1;
while(string[j] != '\0'){
string[i] = string[j];
i += 1;
j += 1;}
string[i] = string[j];
}
int main(){
char linija[16700];
int pocetak, kraj;
int index_rijeci;
scanf("%[^\n]", linija);
sljedeca_rijec(linija, 0, &pocetak, &kraj);
index_rijeci = 1;
while(linija[pocetak] != '\0'){
if(index_rijeci % 7 == 0) {
obrisi(linija, pocetak, kraj);
sljedeca_rijec(linija, pocetak, &pocetak, &kraj);}
else {
invertiraj(linija, pocetak, kraj);
sljedeca_rijec(linija, kraj + 1, &pocetak, &kraj);}
index_rijeci += 1;}
puts(linija);
return 0;}[/code:1]linija
ja više ne znam što da radim...napisala sam zadaću u svim mogućim oblicima, načinima i sve živo probala i pitala i opet mi ne prihvaća zadaću..ako ima ko volje ovako kasno (da znam da je dan prije ispita) da mi kaže u čemu je problem:
1.problem:
Napišite program koji učitava prirodni broj n ≤ 17 i niz od 2n−1 cijelih brojeva. Program treba kreirati gornjetrokutastu matricu M reda n kojoj se učitani brojevi nalaze po redu u prvom retku i zadnjem stupcu, a za elemente gornjeg trokuta vrijedi:
Mi,j=(2M(i−1,j) −2M(i,j+1)) mod 10287612,
gdje mod označava nenegativni ostatak pri dijeljenju lijevog broja s desnim.
Program treba ispisati elemente glavne dijagonale matrice M (ispisane brojeve odvojite razmakom).
prvo što sam primijetila da neke elementi će izračunavati preko elemenata koji još ne postoje, pa ne znam onda jel to tako treba biti ili je krivo postavljen zadatak ili sam ja luda pa ne vidim di je definiran taj element..
Moj kod:
Kod: | #include <stdio.h>
int main(){
int n, i, j, br;
int mat[20][20];
scanf("%d", &n);
for(i=0; i<n; i++)
scanf("%d", &mat[i][i]);
for(i=1; i<n; i++)
for(j=0; j<i; j++){
br=5*mat[i-1][j]-5*mat[i][j+1];
if(br<0) br=br*(-1);
br=br%10453729;
mat[i][j]=br;
}
for(i=0; i<n; i++)
for(j=i+1; j<n; j++)
mat[i][j]==0;
for(j=0; j<n; j++)
printf("%d ", mat[n-1][j]);
return 0;} |
2.problem:
Napišite program koji učitava jednu liniju teksta s najviše 16692 znakova. Tom tekstu treba izbrisati svaku 7. riječ, a ostalima izokrenuti redoslijed slova (same riječi ostaju u originalnom poretku). Tako dobiveni tekst treba ispisati. Možete pretpostaviti da tekst sadrži samo slova i razmake.
Moj kod:
Kod: | #include <stdio.h>
#include <stdlib.h>
void sljedeca_rijec(char* string, int odakle, int* pocetak, int* kraj){
int i = odakle;
while(string[i] == ' ') i += 1;
*pocetak = i;
if(string[*pocetak] == '\0') return;
while(string[i+1] != ' ' && string[i+1] != '\0') i += 1;
*kraj = i;
}
void invertiraj(char* string, int pocetak, int kraj){
while(pocetak < kraj){
char tmp = string[pocetak];
string[pocetak] = string[kraj];
string[kraj] = tmp;
kraj -= 1;
pocetak += 1;}
}
void obrisi(char* string, int pocetak, int kraj){
int i = pocetak, j = kraj + 1;
while(string[j] != '\0'){
string[i] = string[j];
i += 1;
j += 1;}
string[i] = string[j];
}
int main(){
char linija[16700];
int pocetak, kraj;
int index_rijeci;
scanf("%[^\n]", linija);
sljedeca_rijec(linija, 0, &pocetak, &kraj);
index_rijeci = 1;
while(linija[pocetak] != '\0'){
if(index_rijeci % 7 == 0) {
obrisi(linija, pocetak, kraj);
sljedeca_rijec(linija, pocetak, &pocetak, &kraj);}
else {
invertiraj(linija, pocetak, kraj);
sljedeca_rijec(linija, kraj + 1, &pocetak, &kraj);}
index_rijeci += 1;}
puts(linija);
return 0;} | linija
|
|
[Vrh] |
|
Shirohige Forumaš(ica)
Pridružen/a: 16. 11. 2012. (20:19:56) Postovi: (ED)16
Spol:
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 12:44 pet, 31. 5. 2013 Naslov: |
|
|
@nuclear:
Prvi zadatak ti nema veze s textom (vidi formulu). Cini mi se da si zalijepila text od krivog zadatka (onog koji ucitava rub matrice, umjesto onog koji ucitava dijagonalu).
Drugi zadatak: cini mi se da ne radi dobro kad zadnju rijec NE brises i kad nema razmake na kraju. Naime, u tom slucaju, imas [tt]kraj[/tt] koji je index zadnjeg znaka zadnje rijeci i onda pozoves
[tt]sljedeca_rijec(linija, kraj + 1, &pocetak, &kraj);[/tt]
No, u samoj funkciji imas ovo:
[code:1]void sljedeca_rijec(char* string, int odakle, int* pocetak, int* kraj){
int i = odakle;
while(string[i] == ' ') i += 1;
*pocetak = i;
if(string[*pocetak] == '\0') return;
while(string[i+1] != ' ' && string[i+1] != '\0') i += 1;
*kraj = i;
}[/code:1]
Dakle, tvoj [tt]i[/tt] ([tt]odakle[/tt]) krece od znaka [tt]'\0'[/tt] i povecava se dok god je to nesto razlicito od razmaka, sto moze biti tko zna kad/gdje. I onda nadjes neku nepostojecu rijec (i pitanje je sto se dalje desi) ili ti index izleti iz memorije koja pripada programu, pa program padne. Ne pitaj zasto ti doma radi; moze biti puno faktora kad se izlijece iz "dozvoljene" memorije.
Ne znam ima li jos gresaka. Ovo sam nabrzinu pregledao dok vam jos nije poceo kolokvij (bio sam dva dana na nekom workshopu, pa nisam mogao prije).
@nuclear:
Prvi zadatak ti nema veze s textom (vidi formulu). Cini mi se da si zalijepila text od krivog zadatka (onog koji ucitava rub matrice, umjesto onog koji ucitava dijagonalu).
Drugi zadatak: cini mi se da ne radi dobro kad zadnju rijec NE brises i kad nema razmake na kraju. Naime, u tom slucaju, imas kraj koji je index zadnjeg znaka zadnje rijeci i onda pozoves
sljedeca_rijec(linija, kraj + 1, &pocetak, &kraj);
No, u samoj funkciji imas ovo:
Kod: | void sljedeca_rijec(char* string, int odakle, int* pocetak, int* kraj){
int i = odakle;
while(string[i] == ' ') i += 1;
*pocetak = i;
if(string[*pocetak] == '\0') return;
while(string[i+1] != ' ' && string[i+1] != '\0') i += 1;
*kraj = i;
} |
Dakle, tvoj i (odakle) krece od znaka '\0' i povecava se dok god je to nesto razlicito od razmaka, sto moze biti tko zna kad/gdje. I onda nadjes neku nepostojecu rijec (i pitanje je sto se dalje desi) ili ti index izleti iz memorije koja pripada programu, pa program padne. Ne pitaj zasto ti doma radi; moze biti puno faktora kad se izlijece iz "dozvoljene" memorije.
Ne znam ima li jos gresaka. Ovo sam nabrzinu pregledao dok vam jos nije poceo kolokvij (bio sam dva dana na nekom workshopu, pa nisam mogao prije).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
nuclear Forumaš(ica)
Pridružen/a: 13. 11. 2011. (17:40:12) Postovi: (74)16
Spol:
|
Postano: 10:42 pon, 3. 6. 2013 Naslov: |
|
|
Da, popravila sam sad sve greške. Nisam uopće pomislila da bi kretala od desno na lijevo za matricu. I vidim tek sad da sam dala krivi zadatak, al nema veze, fora je ista :D a ovo s riječima, ne znam zašto, al na kraju je prihvatilo....
Da, popravila sam sad sve greške. Nisam uopće pomislila da bi kretala od desno na lijevo za matricu. I vidim tek sad da sam dala krivi zadatak, al nema veze, fora je ista a ovo s riječima, ne znam zašto, al na kraju je prihvatilo....
|
|
[Vrh] |
|
zvons Forumaš(ica)
Pridružen/a: 18. 11. 2012. (16:13:44) Postovi: (1B)16
|
Postano: 15:47 uto, 11. 6. 2013 Naslov: |
|
|
Može pomoć oko samo ovog dijela ovog zadatka:
Osmosmjerka je kvadratna matrica slova, u kojoj rijeci mogu biti ispisane u svih 8 smjerova, pocevsi od
bilo kojeg polja. Smijete pretpostaviti da je red osmosmjerke izmedu 1 i 90.
Napisite funkciju ucitaj koja ucitava osmosmjerku reda n, redak po redak, kao n rijeci (svaka duljine n)
odvojenih prelaskom u novi red. Funkcija vraca osmosmjerku, za koju mora alocirati tocno onoliko memorije
koliko je potrebno za drzanje n n matrice charova. Vrijednost n se vraca preko varijabilnog argumenta. Ako
bilo koji znak u osmosmjerci nije slovo izmedu A i Z, ili nisu svi reci jednake duljine, funkcija mora ispisati poruku
o gresci i vratiti nul-pokazivac (za n treba vratiti 0). Izlaskom iz funkcije mora biti oslobodena sva memorija,
osim (ako nije nastupila greska) one potrebne za povratnu vrijednost.
:twisted: :?: :?:
Može pomoć oko samo ovog dijela ovog zadatka:
Osmosmjerka je kvadratna matrica slova, u kojoj rijeci mogu biti ispisane u svih 8 smjerova, pocevsi od
bilo kojeg polja. Smijete pretpostaviti da je red osmosmjerke izmedu 1 i 90.
Napisite funkciju ucitaj koja ucitava osmosmjerku reda n, redak po redak, kao n rijeci (svaka duljine n)
odvojenih prelaskom u novi red. Funkcija vraca osmosmjerku, za koju mora alocirati tocno onoliko memorije
koliko je potrebno za drzanje n n matrice charova. Vrijednost n se vraca preko varijabilnog argumenta. Ako
bilo koji znak u osmosmjerci nije slovo izmedu A i Z, ili nisu svi reci jednake duljine, funkcija mora ispisati poruku
o gresci i vratiti nul-pokazivac (za n treba vratiti 0). Izlaskom iz funkcije mora biti oslobodena sva memorija,
osim (ako nije nastupila greska) one potrebne za povratnu vrijednost.
_________________ "Hard work never killed anybody, but why take a chance?"
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 16:42 uto, 11. 6. 2013 Naslov: |
|
|
Pisem napamet, pa mozda ima gres(a)ka...
[code:1]char **greska(const char *poruka, char **mat, int i, int *n) {
while (i--) free(mat[i]);
free(mat);
*n = 0;
printf("Greska: %s.\n", poruka);
return NULL;
}
char **ucitaj(int *n) {
int i, j;
char **mat, s[92];
scanf("%d", n);
mat = (char**)malloc(n * sizeof(char *));
for (i = 0; i < *n; i++) {
scanf("%91[^\n]", s); /* dozvoljavam rijeci do 91 znaka, zato da detektiram predugacke rijeci i kad je n == 90 */
if (strlen(s) <> *n)
return greska("Rijec krive duljine", mat, i, n);
for (j = 0; s[j]; j++) /* umjesto s[j] moze ici i j < n, ali ovo bi trebalo biti neznatno brze */
if (s[i] < 'A' || s[i] > 'Z')
return greska("Rijec sadrzi nedozvoljeni znak", mat, i, n);
mat[i] = (char*)malloc(n * sizeof(char));
for (j = 0; s[j]; j++) mat[i][j] = s[j]; /* ne koristim strcpy() jer on kopira i zavrsni '\0', a to ne zelimo */
}
return mat;
}[/code:1]
Ako te funkcija [tt]greska()[/tt] zbunjuje, napravi bez nje (samo moras dva puta pisati isti kod).
Pisem napamet, pa mozda ima gres(a)ka...
Kod: | char **greska(const char *poruka, char **mat, int i, int *n) {
while (i--) free(mat[i]);
free(mat);
*n = 0;
printf("Greska: %s.\n", poruka);
return NULL;
}
char **ucitaj(int *n) {
int i, j;
char **mat, s[92];
scanf("%d", n);
mat = (char**)malloc(n * sizeof(char *));
for (i = 0; i < *n; i++) {
scanf("%91[^\n]", s); /* dozvoljavam rijeci do 91 znaka, zato da detektiram predugacke rijeci i kad je n == 90 */
if (strlen(s) <> *n)
return greska("Rijec krive duljine", mat, i, n);
for (j = 0; s[j]; j++) /* umjesto s[j] moze ici i j < n, ali ovo bi trebalo biti neznatno brze */
if (s[i] < 'A' || s[i] > 'Z')
return greska("Rijec sadrzi nedozvoljeni znak", mat, i, n);
mat[i] = (char*)malloc(n * sizeof(char));
for (j = 0; s[j]; j++) mat[i][j] = s[j]; /* ne koristim strcpy() jer on kopira i zavrsni '\0', a to ne zelimo */
}
return mat;
} |
Ako te funkcija greska() zbunjuje, napravi bez nje (samo moras dva puta pisati isti kod).
_________________ U pravilu ignoriram pitanja u krivim topicima i kodove koji nisu u [code]...[/code] blokovima.
Takodjer, OBJASNITE sto vas muci! "Sto mi je krivo?", bez opisa u cemu je problem, rijetko ce zadobiti moju paznju.
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 19:49 uto, 11. 6. 2013 Naslov: |
|
|
Zasto mi ne ispisuje sadrzaj datoteke na ekran?
[code:1]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
drzava drzave[3]={
"Esp", 1000, 12345,
"Gre", 2000, 54321,
"Ita", 3000, 67890,
};
void kreiraj(const char* f_name)
{
FILE* in;
if((in=fopen(f_name, "wb"))==NULL)
{
fprintf(stderr, "Ne mogu pisati u: %s!\n", f_name);
exit(0);
}
if(fwrite(drzave, sizeof(drzava), 3, in)!=3)
{
fprintf(stderr, "Greska u pisanju.\n");
exit(1);
}
fclose(in);
return;
}
void ispisi(const char *f_name)
{
FILE *in;
drzava drz;
int broj=0;
if((in=fopen(f_name, "rb")== NULL))
{
fprintf(stderr, "Ne mogu citati iz datoteke %s!\n", f_name);
exit(2);
}
printf("\nSadrzaj datoteke %s: \n", f_name);
while(fread(&drz, sizeof(drzava), 1, in)==1)
{
++broj;
printf("zapis %2d: %20s, %6u, %8.2f\n \n",
broj, drz.ime, drz.brojStan, drz.povrsina);
}
if(ferror(in))
{
fprintf(stderr, "Greska u citanju.\n");
exit(3);
}
fclose(in);
return;
}
int main (void)
{
kreiraj("drzavice.txt");
ispisi("drzavice.txt");
return 0;
}
[/code:1] :roll:
[size=9][color=#999999]Added after 19 minutes:[/color][/size]
Deklarirajte strukturu drzava koja se sastoji (samo) od sljedecih stavki: ime drzave (string do 20 znakova), broj stanovnika (cijeli broj bez predznaka), te povrsina u km^2 (realni broj dvostruke preciznosti). Niz ovakvih struktura
cuvat ce se u binarnoj datoteci.
Napisite funkciju int usporedi(drzava a, drzava b);
koja, po uzoru na strcmp, usporeduje te dvije drzave po gustoci naseljenosti (rjede naseljena je \manja").
Da li ovo trazeni kod?
[code:1]
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
int usporedi (drzava a, drzava b)
{
if(a.brojStan < b.brojStan) return -1;
if(a.brojStan > b.brojStan) return 1;
else
return 0;
}
[/code:1]
[size=9][color=#999999]Added after 33 minutes:[/color][/size]
b) Napisite funkciju unsigned duljina(FILE* niz);
koja vraca duljinu niza gore opisanih struktura zapisanog u binarnoj datoteci otvorenoj preko pokazivaca niz.
Ako je ovo dobro zapisan poziv funkcije u main-u, onda ne razumijem zasto mi ispisuje samo 1.
[code:1]
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE* niz;
if((niz=fopen("niz.txt", "rb"))==NULL)
{
printf("Greska pri otvaranju-\n");
exit(0);
}
printf("Duljina niza struktura je: %u\n", duljina(niz));
fclose (niz);
return 0;
}[/code:1]
Zasto mi ne ispisuje sadrzaj datoteke na ekran?
Kod: |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
drzava drzave[3]={
"Esp", 1000, 12345,
"Gre", 2000, 54321,
"Ita", 3000, 67890,
};
void kreiraj(const char* f_name)
{
FILE* in;
if((in=fopen(f_name, "wb"))==NULL)
{
fprintf(stderr, "Ne mogu pisati u: %s!\n", f_name);
exit(0);
}
if(fwrite(drzave, sizeof(drzava), 3, in)!=3)
{
fprintf(stderr, "Greska u pisanju.\n");
exit(1);
}
fclose(in);
return;
}
void ispisi(const char *f_name)
{
FILE *in;
drzava drz;
int broj=0;
if((in=fopen(f_name, "rb")== NULL))
{
fprintf(stderr, "Ne mogu citati iz datoteke %s!\n", f_name);
exit(2);
}
printf("\nSadrzaj datoteke %s: \n", f_name);
while(fread(&drz, sizeof(drzava), 1, in)==1)
{
++broj;
printf("zapis %2d: %20s, %6u, %8.2f\n \n",
broj, drz.ime, drz.brojStan, drz.povrsina);
}
if(ferror(in))
{
fprintf(stderr, "Greska u citanju.\n");
exit(3);
}
fclose(in);
return;
}
int main (void)
{
kreiraj("drzavice.txt");
ispisi("drzavice.txt");
return 0;
}
|
Added after 19 minutes:
Deklarirajte strukturu drzava koja se sastoji (samo) od sljedecih stavki: ime drzave (string do 20 znakova), broj stanovnika (cijeli broj bez predznaka), te povrsina u km^2 (realni broj dvostruke preciznosti). Niz ovakvih struktura
cuvat ce se u binarnoj datoteci.
Napisite funkciju int usporedi(drzava a, drzava b);
koja, po uzoru na strcmp, usporeduje te dvije drzave po gustoci naseljenosti (rjede naseljena je \manja").
Da li ovo trazeni kod?
Kod: |
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
int usporedi (drzava a, drzava b)
{
if(a.brojStan < b.brojStan) return -1;
if(a.brojStan > b.brojStan) return 1;
else
return 0;
}
|
Added after 33 minutes:
b) Napisite funkciju unsigned duljina(FILE* niz);
koja vraca duljinu niza gore opisanih struktura zapisanog u binarnoj datoteci otvorenoj preko pokazivaca niz.
Ako je ovo dobro zapisan poziv funkcije u main-u, onda ne razumijem zasto mi ispisuje samo 1.
Kod: |
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE* niz;
if((niz=fopen("niz.txt", "rb"))==NULL)
{
printf("Greska pri otvaranju-\n");
exit(0);
}
printf("Duljina niza struktura je: %u\n", duljina(niz));
fclose (niz);
return 0;
} |
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 20:06 uto, 11. 6. 2013 Naslov: |
|
|
[quote="frutabella"]Zasto mi ne ispisuje sadrzaj datoteke na ekran?[/quote]
Zbog ovoga:
[code:1]
if((in=fopen(f_name, "rb")== NULL))
[/code:1]
Naime, [tt]==[/tt] ima veći prioritet od [tt]=[/tt]. Ukratko, krivo si stavila zagrade.
[quote]
Napisite funkciju int usporedi(drzava a, drzava b);
koja, po uzoru na strcmp, usporeduje te dvije drzave po gustoci naseljenosti (rjede naseljena je \manja").
Da li ovo trazeni kod?
[code:1]
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
int usporedi (drzava a, drzava b)
{
if(a.brojStan < b.brojStan) return -1;
if(a.brojStan > b.brojStan) return 1;
else
return 0;
}
[/code:1]
[/quote]
Ne. Države treba usporediti prema [b]gustoći naseljenosti[/b], a ne prema broju stanovnika.
[quote]
b) Napisite funkciju unsigned duljina(FILE* niz);
koja vraca duljinu niza gore opisanih struktura zapisanog u binarnoj datoteci otvorenoj preko pokazivaca niz.
Ako je ovo dobro zapisan poziv funkcije u main-u, onda ne razumijem zasto mi ispisuje samo 1.
[code:1]
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE* niz;
if((niz=fopen("niz.txt", "rb"))==NULL)
{
printf("Greska pri otvaranju-\n");
exit(0);
}
printf("Duljina niza struktura je: %u\n", duljina(niz));
fclose (niz);
return 0;
}[/code:1][/quote]
Možeš li attachati datoteku [tt]niz.txt[/tt]. Mislim da bi problem mogao biti u formatu datoteke.
frutabella (napisa): | Zasto mi ne ispisuje sadrzaj datoteke na ekran? |
Zbog ovoga:
Kod: |
if((in=fopen(f_name, "rb")== NULL))
|
Naime, == ima veći prioritet od =. Ukratko, krivo si stavila zagrade.
Citat: |
Napisite funkciju int usporedi(drzava a, drzava b);
koja, po uzoru na strcmp, usporeduje te dvije drzave po gustoci naseljenosti (rjede naseljena je \manja").
Da li ovo trazeni kod?
Kod: |
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
int usporedi (drzava a, drzava b)
{
if(a.brojStan < b.brojStan) return -1;
if(a.brojStan > b.brojStan) return 1;
else
return 0;
}
|
|
Ne. Države treba usporediti prema gustoći naseljenosti, a ne prema broju stanovnika.
Citat: |
b) Napisite funkciju unsigned duljina(FILE* niz);
koja vraca duljinu niza gore opisanih struktura zapisanog u binarnoj datoteci otvorenoj preko pokazivaca niz.
Ako je ovo dobro zapisan poziv funkcije u main-u, onda ne razumijem zasto mi ispisuje samo 1.
Kod: |
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE* niz;
if((niz=fopen("niz.txt", "rb"))==NULL)
{
printf("Greska pri otvaranju-\n");
exit(0);
}
printf("Duljina niza struktura je: %u\n", duljina(niz));
fclose (niz);
return 0;
} |
|
Možeš li attachati datoteku niz.txt. Mislim da bi problem mogao biti u formatu datoteke.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 20:11 uto, 11. 6. 2013 Naslov: |
|
|
Evo ga:
Evo ga:
Description: |
|
Download |
Filename: |
niz.txt |
Filesize: |
53 Bytes |
Downloaded: |
125 Time(s) |
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 20:18 uto, 11. 6. 2013 Naslov: |
|
|
[quote="frutabella"]Evo ga:[/quote]
Kao što sam pretpostavio iz ekstenzije, u datoteci se nalazi tekst, a ne binarne reprezentacije struktura. Samim time, binarno čitanje ne može dati ispravne rezultate.
Edit: U attachmentu je ispravno formatirana datoteka. Podaci su isti, samo sada stvarno imate tri strukture binarno zapisane u datoteku. Naziv sam ostavio isti kako bi bilo očito da ekstenzija nema veze s formatom zapisa datoeke.
frutabella (napisa): | Evo ga: |
Kao što sam pretpostavio iz ekstenzije, u datoteci se nalazi tekst, a ne binarne reprezentacije struktura. Samim time, binarno čitanje ne može dati ispravne rezultate.
Edit: U attachmentu je ispravno formatirana datoteka. Podaci su isti, samo sada stvarno imate tri strukture binarno zapisane u datoteku. Naziv sam ostavio isti kako bi bilo očito da ekstenzija nema veze s formatom zapisa datoeke.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
Description: |
|
Download |
Filename: |
niz.txt |
Filesize: |
120 Bytes |
Downloaded: |
82 Time(s) |
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 20:47 uto, 11. 6. 2013 Naslov: |
|
|
Znaci u kompletu to bi trebalo sad ovako izgledati:
[code:1]
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
drzava drzave[3]={
"Esp", 1000, 12345,
"Gre", 2000, 54321,
"Ita", 3000, 67890,
};
void kreiraj(const char* f_name)
{
FILE* in;
if((in=fopen(f_name, "wb"))==NULL)
{
fprintf(stderr, "Ne mogu pisati u: %s!\n", f_name);
exit(0);
}
if(fwrite(drzave, sizeof(drzava), 3, in)!=3)
{
fprintf(stderr, "Greska u pisanju.\n");
exit(1);
}
fclose(in);
return;
}
void ispisi(const char *f_name)
{
FILE *in;
drzava drz;
int broj=0;
if((in=fopen(f_name, "rb"))== NULL)
{
fprintf(stderr, "Ne mogu citati iz datoteke %s!\n", f_name);
exit(2);
}
printf("\nSadrzaj datoteke %s: \n", f_name);
while(fread(&drz, sizeof(drzava), 1, in)==1)
{
++broj;
printf("zapis %2d: %20s, %6u, %8.2f\n \n",
broj, drz.ime, drz.brojStan, drz.povrsina);
}
if(ferror(in))
{
fprintf(stderr, "Greska u citanju.\n");
exit(3);
}
fclose(in);
return;
}
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE *in;
kreiraj("drzavice.txt");
ispisi("drzavice.txt");
if((in=fopen("drzavice.txt", "rb"))==NULL)
{
printf("Greska.\n");
exit(2);
}
printf("Duljina niza struktura: %d", duljina(in));
return 0;
}
[/code:1]
Znaci u kompletu to bi trebalo sad ovako izgledati:
Kod: |
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
typedef struct _drzava{
char ime[21];
unsigned brojStan;
double povrsina;
}drzava;
drzava drzave[3]={
"Esp", 1000, 12345,
"Gre", 2000, 54321,
"Ita", 3000, 67890,
};
void kreiraj(const char* f_name)
{
FILE* in;
if((in=fopen(f_name, "wb"))==NULL)
{
fprintf(stderr, "Ne mogu pisati u: %s!\n", f_name);
exit(0);
}
if(fwrite(drzave, sizeof(drzava), 3, in)!=3)
{
fprintf(stderr, "Greska u pisanju.\n");
exit(1);
}
fclose(in);
return;
}
void ispisi(const char *f_name)
{
FILE *in;
drzava drz;
int broj=0;
if((in=fopen(f_name, "rb"))== NULL)
{
fprintf(stderr, "Ne mogu citati iz datoteke %s!\n", f_name);
exit(2);
}
printf("\nSadrzaj datoteke %s: \n", f_name);
while(fread(&drz, sizeof(drzava), 1, in)==1)
{
++broj;
printf("zapis %2d: %20s, %6u, %8.2f\n \n",
broj, drz.ime, drz.brojStan, drz.povrsina);
}
if(ferror(in))
{
fprintf(stderr, "Greska u citanju.\n");
exit(3);
}
fclose(in);
return;
}
unsigned duljina (FILE *niz)
{
drzava drz;
unsigned br=0;
while(fread(&drz, sizeof(drzava), 1, niz)==1) ++br;
return br;
}
int main (void)
{
FILE *in;
kreiraj("drzavice.txt");
ispisi("drzavice.txt");
if((in=fopen("drzavice.txt", "rb"))==NULL)
{
printf("Greska.\n");
exit(2);
}
printf("Duljina niza struktura: %d", duljina(in));
return 0;
}
|
|
|
[Vrh] |
|
Leolinus Forumaš(ica)
Pridružen/a: 30. 11. 2012. (16:36:41) Postovi: (10)16
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
Leolinus Forumaš(ica)
Pridružen/a: 30. 11. 2012. (16:36:41) Postovi: (10)16
|
Postano: 22:41 uto, 11. 6. 2013 Naslov: |
|
|
[quote="mdoko"]
[b]Disclaimer:[/b] Govorim samo za svoj način
bodovanja.[/quote]
Trebam li upoznati asistente/ispravljače osobno i
probati pogoditi koje su zadatke sastavljali xD?
Jer za ove pomoćne funkcije zna biti jedan
određen miris neoduševljenosti i skine se dosta
bodova.
Što se pomoćnih polja tiče, misli li se na
pomoćna polja u int main-u ili bilo gdje jer
primjećujem u nekim rješenjima u funkciji
(popravni 2012.) pomoćno polje s[92] u koje se
učitava nešto.
Što da se to polje zamijenilo s alociranim poljem
iste duljine?
Što je na kraju dozvoljeno?
Pretpostavljam da se in-place rješenje ne traži?
EDIT: Zbunjen sam jer, ne znam je l' opće poznato,
ali bilo kakvo statičko deklariranje polja
(ne samo u mainu nego i u ostalim funkcijama)
odlazi također u iste memorijske lokacije(stog, bss, data),
a ne na heap tako da deklaracija pomoćnog polja unutar
funkcije nema apsolutno nikakve razlike.
Recimo:
[code:1]#include<stdio.h>
#include<malloc.h>
int func() {
int *sa = (int*) malloc(sizeof(int) * 100);
int s[100] = {0};
printf("Adresa s[2] = %p\n", (void *)&s[2]);
printf("Adresa sa[2] = %p\n", (void *)&sa[2]);
return 0;
}
int main() {
int s[100] = {0};
printf("Adresa s[2] = %p\n", (void *)&s[2]);
func();
func();
return 0;
}[/code:1]
[code:1]
Adresa s[2] = 0x7ffffd0b5428
Adresa s[2] = 0x7ffffd0b5288
Adresa sa[2] = 0xeca018
Adresa s[2] = 0x7ffffd0b5288
Adresa sa[2] = 0xeca1b8
[/code:1]
Ovaj kod jasno pokazuje da polje "s" unutar funkcije
ima statičku adresu i da zauzima prostor u nekom
od navedenih memorijskih blokova.
Tako da je rješenje ili krivo ili ja
nisam dobro upoznat s konvencijama koje asistenti
prihvaćaju/ne prihvaćaju.
EDIT2:
Mislim, ovakve stvari koštaju ljude prolaza(80%
prag), pitam samo zato jer mi nije jasno zašto
vidim toliko kontradiktornosti u rješenjima.
Ili su rješenja tu samo kao algoritamski pristup
i ne drže se zadanih ograničenja na ispitu?
Mislim, da budem jasan, našao sam ovo rješenje
na [url=http://degiorgi.math.hr/forum/viewtopic.php?p=182975#182975]forumu[/url], ali slične stvari znaju biti i u službenim.
mdoko (napisa): |
Disclaimer: Govorim samo za svoj način
bodovanja. |
Trebam li upoznati asistente/ispravljače osobno i
probati pogoditi koje su zadatke sastavljali xD?
Jer za ove pomoćne funkcije zna biti jedan
određen miris neoduševljenosti i skine se dosta
bodova.
Što se pomoćnih polja tiče, misli li se na
pomoćna polja u int main-u ili bilo gdje jer
primjećujem u nekim rješenjima u funkciji
(popravni 2012.) pomoćno polje s[92] u koje se
učitava nešto.
Što da se to polje zamijenilo s alociranim poljem
iste duljine?
Što je na kraju dozvoljeno?
Pretpostavljam da se in-place rješenje ne traži?
EDIT: Zbunjen sam jer, ne znam je l' opće poznato,
ali bilo kakvo statičko deklariranje polja
(ne samo u mainu nego i u ostalim funkcijama)
odlazi također u iste memorijske lokacije(stog, bss, data),
a ne na heap tako da deklaracija pomoćnog polja unutar
funkcije nema apsolutno nikakve razlike.
Recimo:
Kod: | #include<stdio.h>
#include<malloc.h>
int func() {
int *sa = (int*) malloc(sizeof(int) * 100);
int s[100] = {0};
printf("Adresa s[2] = %p\n", (void *)&s[2]);
printf("Adresa sa[2] = %p\n", (void *)&sa[2]);
return 0;
}
int main() {
int s[100] = {0};
printf("Adresa s[2] = %p\n", (void *)&s[2]);
func();
func();
return 0;
} |
Kod: |
Adresa s[2] = 0x7ffffd0b5428
Adresa s[2] = 0x7ffffd0b5288
Adresa sa[2] = 0xeca018
Adresa s[2] = 0x7ffffd0b5288
Adresa sa[2] = 0xeca1b8
|
Ovaj kod jasno pokazuje da polje "s" unutar funkcije
ima statičku adresu i da zauzima prostor u nekom
od navedenih memorijskih blokova.
Tako da je rješenje ili krivo ili ja
nisam dobro upoznat s konvencijama koje asistenti
prihvaćaju/ne prihvaćaju.
EDIT2:
Mislim, ovakve stvari koštaju ljude prolaza(80%
prag), pitam samo zato jer mi nije jasno zašto
vidim toliko kontradiktornosti u rješenjima.
Ili su rješenja tu samo kao algoritamski pristup
i ne drže se zadanih ograničenja na ispitu?
Mislim, da budem jasan, našao sam ovo rješenje
na forumu, ali slične stvari znaju biti i u službenim.
Zadnja promjena: Leolinus; 23:24 uto, 11. 6. 2013; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
|