Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
lucika Forumaš(ica)


Pridružen/a: 22. 11. 2007. (17:52:27) Postovi: (12F)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 3:20 ned, 21. 6. 2009 Naslov: |
|
|
Pa, moze, ali to je puno previse nepotrebno alocirane memorije. :)
Recimo, tvoj program bi za kvadratnu matricu realnih brojeva reda 1.000.000 potrosio oko 8TB memorije; rjesenje s obicnim nizom trosi cca 8MB. 8) Plus, ima manje koda sto znaci i manje mjesta za profulati. ;)
No, mislim da sam na vjezbama radio upravo s alokacijom matrice, jer mi se cini da studenti to lakse prihvacaju. :blista:
Pa, moze, ali to je puno previse nepotrebno alocirane memorije.
Recimo, tvoj program bi za kvadratnu matricu realnih brojeva reda 1.000.000 potrosio oko 8TB memorije; rjesenje s obicnim nizom trosi cca 8MB. Plus, ima manje koda sto znaci i manje mjesta za profulati.
No, mislim da sam na vjezbama radio upravo s alokacijom matrice, jer mi se cini da studenti to lakse prihvacaju.
_________________ 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] |
|
moi Forumaš(ica)

Pridružen/a: 21. 02. 2007. (13:39:09) Postovi: (26)16
Spol: 
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 23:26 ned, 21. 6. 2009 Naslov: |
|
|
[quote="moi"]
Ana Pero 100
Pero Ante 150
[/quote]
fscanf (dat, "%s %s %d", ime1,ime2,&broj);
gdje je dat pointer na ulaznu datoteku, ime1 i ime2 dovoljno veliki char[], a broj integer.
ako ima više linija koje imaju ista učitavanja onda:
[code:1]
while ( fscanf (dat, "%s %s %d", ime1,ime2,&broj)==3 )
{
....
}
[/code:1]
moi (napisa): |
Ana Pero 100
Pero Ante 150
|
fscanf (dat, "%s %s %d", ime1,ime2,&broj);
gdje je dat pointer na ulaznu datoteku, ime1 i ime2 dovoljno veliki char[], a broj integer.
ako ima više linija koje imaju ista učitavanja onda:
Kod: |
while ( fscanf (dat, "%s %s %d", ime1,ime2,&broj)==3 )
{
....
}
|
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy 
|
|
[Vrh] |
|
moi Forumaš(ica)

Pridružen/a: 21. 02. 2007. (13:39:09) Postovi: (26)16
Spol: 
|
|
[Vrh] |
|
lucika Forumaš(ica)


Pridružen/a: 22. 11. 2007. (17:52:27) Postovi: (12F)16
Spol: 
|
Postano: 0:29 pon, 22. 6. 2009 Naslov: |
|
|
[code:1]
/*
Zadatak 8.12. Napiˇsite funkciju koja kao argumente uzima ime datoteke, te realne parametre a, b i d > 0.
Neka je m := min{a, b} i M := max{a, b}.
Funkcija treba u datoteku zapisati tablicu s dva
stupca: u prvom stupcu trebaju biti sve vrijednosti
x E {m + k * d <= M : k E N0} u uzlaznom poretku,
a u drugom stupcu trebaju biti odgovaraju´ce vrijednosti funkcije
f(x) := sin x / (cos x + log x).
Izlazna datoteka treba biti u CSV formatu, s toˇcka-zarezima kao separatorima.
Odgovaraju´ce matematiˇcke funkcije nalaze se u biblioteci math.
*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double max(double x, double y){
if(x>y) return x;
else return y;
}
double min(double x, double y){
if(x<y) return x;
else return y;
}
void funkcija(FILE *out, double a, double b, double d){
double m, M, x, y, *polje=NULL;
int i, j, k=0, br=0;
m=min(a, b);
M=max(a, b);
while(1){
if(m+k*d >M) break;
polje=(double*)realloc(polje, br++ * sizeof(double));
polje[br-1]=m+k*d;
k++;
}
for(i=0; i<br-1; i++)
for( j=i+1; j<br; j++)
if( polje[i]>polje[j]){
double temp=polje[i];
polje[i]=polje[j];
polje[j]=temp;
}
for(i=0; i<br; i++){
x=polje[i];
y=(sin(x))/( cos(x) + log(x) );
fprintf( out, "%g; %g\n", x, y );
}
}
int main(){
FILE *out;
out=fopen("8.12.txt", "wt");
if(out==NULL){
printf("Greska pri otvaranju datoteke!\n");
exit(1);
}
funkcija(out, 1, 3, 2);
fclose(out);
scanf("%%");
return 0;
}
[/code:1]
uredno mi ispisuje x-eve u prvom stupcu ali ne dobivam odgovarajuće brojeve za f(x) u drugom stupcu... :?
jel možda problem u ovim fjama sin(x), cos(x), log(x)? u c-u se isto tak pišu, jel? barem tako piše na službenom šalabahteru :roll:
Kod: |
/*
Zadatak 8.12. Napiˇsite funkciju koja kao argumente uzima ime datoteke, te realne parametre a, b i d > 0.
Neka je m := min{a, b} i M := max{a, b}.
Funkcija treba u datoteku zapisati tablicu s dva
stupca: u prvom stupcu trebaju biti sve vrijednosti
x E {m + k * d <= M : k E N0} u uzlaznom poretku,
a u drugom stupcu trebaju biti odgovaraju´ce vrijednosti funkcije
f(x) := sin x / (cos x + log x).
Izlazna datoteka treba biti u CSV formatu, s toˇcka-zarezima kao separatorima.
Odgovaraju´ce matematiˇcke funkcije nalaze se u biblioteci math.
*/
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
double max(double x, double y){
if(x>y) return x;
else return y;
}
double min(double x, double y){
if(x<y) return x;
else return y;
}
void funkcija(FILE *out, double a, double b, double d){
double m, M, x, y, *polje=NULL;
int i, j, k=0, br=0;
m=min(a, b);
M=max(a, b);
while(1){
if(m+k*d >M) break;
polje=(double*)realloc(polje, br++ * sizeof(double));
polje[br-1]=m+k*d;
k++;
}
for(i=0; i<br-1; i++)
for( j=i+1; j<br; j++)
if( polje[i]>polje[j]){
double temp=polje[i];
polje[i]=polje[j];
polje[j]=temp;
}
for(i=0; i<br; i++){
x=polje[i];
y=(sin(x))/( cos(x) + log(x) );
fprintf( out, "%g; %g\n", x, y );
}
}
int main(){
FILE *out;
out=fopen("8.12.txt", "wt");
if(out==NULL){
printf("Greska pri otvaranju datoteke!\n");
exit(1);
}
funkcija(out, 1, 3, 2);
fclose(out);
scanf("%%");
return 0;
}
|
uredno mi ispisuje x-eve u prvom stupcu ali ne dobivam odgovarajuće brojeve za f(x) u drugom stupcu...
jel možda problem u ovim fjama sin(x), cos(x), log(x)? u c-u se isto tak pišu, jel? barem tako piše na službenom šalabahteru
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 1:47 pon, 22. 6. 2009 Naslov: |
|
|
Meni ispise
[code:1]1; 1.55741
3; 1.29921[/code:1]
i onda padne s porukom "[tt]Segmentation fault[/tt]", sto ce reci da negdje nesto krivo brljas s memorijom. :?
Sto ce ti dinamicka alokacija u ovakvom zadatku?!? :shock: Da sortiras brojeve za koje vec znas da su u rastucem poretku (jer je d > 0)? :joooj:
Usput, ta alokacija je kriva; treba ici [tt]++br[/tt], a ne [tt]br++[/tt]. :| Plus, fali oslobadjanje memorije. :?
Preporuka: ne kompliciraj si zivot; napisi to bez dinamicke alokacije. :) Slicni zadaci su se radili u prvom semestru, pod petljama (dakle cak prije "obicnih" nizova!), samo bez pisanja u datoteku. 8)
P.S. Ako je separator tocka zarez, onda stavljas nju, bez dodatnih razmaka. :) Dakle
[tt]fprintf(out, "%g;%g\n", x, y);[/tt]
a ne
[strike][tt]fprintf(out, "%g;[bg=#ffa0a0] [/bg]%g\n", x, y);[/tt][/strike]
8)
Meni ispise
Kod: | 1; 1.55741
3; 1.29921 |
i onda padne s porukom "Segmentation fault", sto ce reci da negdje nesto krivo brljas s memorijom.
Sto ce ti dinamicka alokacija u ovakvom zadatku?!? Da sortiras brojeve za koje vec znas da su u rastucem poretku (jer je d > 0)?
Usput, ta alokacija je kriva; treba ici ++br, a ne br++. Plus, fali oslobadjanje memorije.
Preporuka: ne kompliciraj si zivot; napisi to bez dinamicke alokacije. Slicni zadaci su se radili u prvom semestru, pod petljama (dakle cak prije "obicnih" nizova!), samo bez pisanja u datoteku.
P.S. Ako je separator tocka zarez, onda stavljas nju, bez dodatnih razmaka. Dakle
fprintf(out, "%g;%g\n", x, y);
a ne
fprintf(out, "%g; %g\n", x, y);
_________________ 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] |
|
lucika Forumaš(ica)


Pridružen/a: 22. 11. 2007. (17:52:27) Postovi: (12F)16
Spol: 
|
Postano: 2:10 pon, 22. 6. 2009 Naslov: |
|
|
evo ispravila sam ali opet ne ispisuje dobre vrijednostu...
[code:1]
void funkcija(FILE *out, double a, double b, double d){
int k=0;
double m, M, x;
m=min(a, b);
M=max(a, b);
while(1){
if(m+k*d >M) break;
x=m+k*d;
k++;
fprintf( out, "%g;%g\n", x, (sin(x))/( cos(x) + log(x) ) );
}
}
[/code:1]
evo ispravila sam ali opet ne ispisuje dobre vrijednostu...
Kod: |
void funkcija(FILE *out, double a, double b, double d){
int k=0;
double m, M, x;
m=min(a, b);
M=max(a, b);
while(1){
if(m+k*d >M) break;
x=m+k*d;
k++;
fprintf( out, "%g;%g\n", x, (sin(x))/( cos(x) + log(x) ) );
}
}
|
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 2:34 pon, 22. 6. 2009 Naslov: |
|
|
[code:1][vsego@petko tmp]$ gcc -lm t.c && ./a.out && cat 8.12.txt
1;1.55741
3;1.29921
[vsego@petko tmp]$ perl -e 'foreach(1,3){print $_,";",sin($_)/(cos($_)+log($_)),"\n";}'
1;1.5574077246549
3;1.29921081023573[/code:1]
Meni izgleda tocno. :) U cemu je problem? :grebgreb: Mozda si zaboravila da trigonometrijske funkcije rade s radijanima? :D
Usput:
[code:1] if(m+k*d >M) break;
x=m+k*d;
k++;[/code:1]
:arrow:
[code:1] x = m + k*d;
if (x > M) break;
k++;[/code:1]
ili, bolje,
[code:1] x += d;
if (x > M) break;[/code:1]
(uz inicijalizaciju [tt]x = m[/tt] prije petlje). 8)
Kod: | [vsego@petko tmp]$ gcc -lm t.c && ./a.out && cat 8.12.txt
1;1.55741
3;1.29921
[vsego@petko tmp]$ perl -e 'foreach(1,3){print $_,";",sin($_)/(cos($_)+log($_)),"\n";}'
1;1.5574077246549
3;1.29921081023573 |
Meni izgleda tocno. U cemu je problem? Mozda si zaboravila da trigonometrijske funkcije rade s radijanima?
Usput:
Kod: | if(m+k*d >M) break;
x=m+k*d;
k++; |
Kod: | x = m + k*d;
if (x > M) break;
k++; |
ili, bolje,
Kod: | x += d;
if (x > M) break; |
(uz inicijalizaciju x = m prije petlje).
_________________ 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] |
|
lucika Forumaš(ica)


Pridružen/a: 22. 11. 2007. (17:52:27) Postovi: (12F)16
Spol: 
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
Postano: 3:06 pon, 22. 6. 2009 Naslov: |
|
|
Sto znaci da na kalkulatoru uvrstavas 1 (odnosno 3) [strike]stupnja[/strike], a ne 1 (odnosno 3) [b]radijana[/b]; evo, kad PERL-u kazem da to isto racuna za stupnjeve:
[code:1][vsego@petko tmp]$ perl -e 'foreach(1,3){$f=atan2(1,0)/90;print $_,";",sin($f*$_)/(cos($f*$_) + log($_)),"\n";}'
1;0.0174550649282176
3;0.0249546598100604[/code:1]
No, u matematici (kao i u C-u, PERL-u,...) racuna se s radijanima. :tso: "Stupanj" znaci [latex]\pi / 180[/latex], nista drugo. 8) Zaboravi stupnjeve cim prije... bit ce ti lakse. ;)
Sto znaci da na kalkulatoru uvrstavas 1 (odnosno 3) stupnja, a ne 1 (odnosno 3) radijana; evo, kad PERL-u kazem da to isto racuna za stupnjeve:
Kod: | [vsego@petko tmp]$ perl -e 'foreach(1,3){$f=atan2(1,0)/90;print $_,";",sin($f*$_)/(cos($f*$_) + log($_)),"\n";}'
1;0.0174550649282176
3;0.0249546598100604 |
No, u matematici (kao i u C-u, PERL-u,...) racuna se s radijanima. "Stupanj" znaci , nista drugo. Zaboravi stupnjeve cim prije... bit ce ti lakse.
_________________ 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] |
|
Milojko Forumaš(ica)


Pridružen/a: 07. 11. 2008. (14:57:52) Postovi: (453)16
Spol: 
Lokacija: Hilbertov hotel
|
Postano: 16:14 sri, 24. 6. 2009 Naslov: |
|
|
[code:1]
typedef struct{
char ime[16];
int broj;
char nast[10];
} redak;
/* trazenje dali se element pojavljuje unutar niza i ako se pojavljuje
povećava mu se broj. u suprotnom, novi element se zapisuje u niz */
void search(redak lista[], char nejm[], char put[], int b, int *n) {
int i;
for (i = 0; i < *n; ++i) {
if (!strcmp(lista[i].ime, nejm)) {
lista[i].broj += b;
}
}
strcpy(lista[i].ime, nejm);
lista[i].broj = b;
strcpy(lista[i].nast, put);
++(*n);
}
void pon(FILE *in, FILE *out) {
redak lista[200];
int i, br, n = 0;
char nejm[16], put[10];
/* ovdje brojim i pišem u niz */
while (fscanf(in, " %s %d %s", nejm, &br, put)) {
search(lista, nejm, put, br, &n);
}
/* ovdje to čud ispisujem u datoteku out */
for (i = 0; i < n; ++i) {
int j = 0;
while (j < lista[i].broj) {
fprintf(out, "%s ", lista[i].ime);
j++;
}
fprintf(out, "\n");
}
}[/code:1]
radi se o zadatku sa datotekama iz C grupe kolokvija iz 06/07. negdje unutar ovih funkcija gazim po memoriji, ili tako nešto. "Application error" javlja i veli "memorry could not be read"
unutar glavnog programa datoteke su uredno otvorene kako treba.
Kod: |
typedef struct{
char ime[16];
int broj;
char nast[10];
} redak;
/* trazenje dali se element pojavljuje unutar niza i ako se pojavljuje
povećava mu se broj. u suprotnom, novi element se zapisuje u niz */
void search(redak lista[], char nejm[], char put[], int b, int *n) {
int i;
for (i = 0; i < *n; ++i) {
if (!strcmp(lista[i].ime, nejm)) {
lista[i].broj += b;
}
}
strcpy(lista[i].ime, nejm);
lista[i].broj = b;
strcpy(lista[i].nast, put);
++(*n);
}
void pon(FILE *in, FILE *out) {
redak lista[200];
int i, br, n = 0;
char nejm[16], put[10];
/* ovdje brojim i pišem u niz */
while (fscanf(in, " %s %d %s", nejm, &br, put)) {
search(lista, nejm, put, br, &n);
}
/* ovdje to čud ispisujem u datoteku out */
for (i = 0; i < n; ++i) {
int j = 0;
while (j < lista[i].broj) {
fprintf(out, "%s ", lista[i].ime);
j++;
}
fprintf(out, "\n");
}
} |
radi se o zadatku sa datotekama iz C grupe kolokvija iz 06/07. negdje unutar ovih funkcija gazim po memoriji, ili tako nešto. "Application error" javlja i veli "memorry could not be read"
unutar glavnog programa datoteke su uredno otvorene kako treba.
_________________ Sedam je prost broj
Bolonja je smeće i to pod hitno treba mijenjat
|
|
[Vrh] |
|
vsego Site Admin


Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3561)16
Spol: 
Lokacija: /sbin/init
|
|
[Vrh] |
|
Éomer Forumaš(ica)

Pridružen/a: 24. 04. 2009. (17:35:52) Postovi: (13)16
Lokacija: Edoras, Rohan
|
Postano: 4:14 čet, 25. 6. 2009 Naslov: |
|
|
[quote="Luuka"][quote="moi"]
Ana Pero 100
Pero Ante 150
[/quote]
fscanf (dat, "%s %s %d", ime1,ime2,&broj);
gdje je dat pointer na ulaznu datoteku, ime1 i ime2 dovoljno veliki char[], a broj integer.
[/quote]
OK ovo super funkcionira kada imamo razmake izmedju stringova i intova, pa program "vidi" kada je unesen prvi string, pa drugi string, pa int... ali sto ako nema razmaka nego je sve u jednom redu? Kako onda ucitati podatke iz datoteke? Npr:
[img]http://i41.tinypic.com/fm4az7.jpg[/img]
Kada bi umjesto [tt]192+3918[/tt] pisalo [tt]192[/tt][bg=red] [/bg][tt]3918[/tt] onda bi unos bio kao sto je Luuka napisao ali sto ako u jednom redu imamo dva broja i jos neke charove a moramo ucitati samo brojeve?
Luuka (napisa): | moi (napisa): |
Ana Pero 100
Pero Ante 150
|
fscanf (dat, "%s %s %d", ime1,ime2,&broj);
gdje je dat pointer na ulaznu datoteku, ime1 i ime2 dovoljno veliki char[], a broj integer.
|
OK ovo super funkcionira kada imamo razmake izmedju stringova i intova, pa program "vidi" kada je unesen prvi string, pa drugi string, pa int... ali sto ako nema razmaka nego je sve u jednom redu? Kako onda ucitati podatke iz datoteke? Npr:
Kada bi umjesto 192+3918 pisalo 192 3918 onda bi unos bio kao sto je Luuka napisao ali sto ako u jednom redu imamo dva broja i jos neke charove a moramo ucitati samo brojeve?
|
|
[Vrh] |
|
Gino Forumaš(ica)

Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 10:00 čet, 25. 6. 2009 Naslov: |
|
|
[quote="Éomer"]
[tt]192+3918[/tt] [/quote]
Ako znaš da će ti to pisat, nema problema, onda ovak:
fscanf (dat, "%d+%d", &broj1,&broj2); :D
Ako znaš da će ti to pisat, nema problema, onda ovak:
fscanf (dat, "%d+%d", &broj1,&broj2);
_________________ "Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy 
|
|
[Vrh] |
|
Gino Forumaš(ica)

Pridružen/a: 11. 09. 2008. (10:54:06) Postovi: (370)16
Lokacija: Pula
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
|
[Vrh] |
|
Éomer Forumaš(ica)

Pridružen/a: 24. 04. 2009. (17:35:52) Postovi: (13)16
Lokacija: Edoras, Rohan
|
|
[Vrh] |
|
matka Forumaš(ica)

Pridružen/a: 03. 03. 2008. (11:07:54) Postovi: (38)16
|
|
[Vrh] |
|
|