Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
zrinka Forumaš(ica)
Pridružen/a: 27. 06. 2006. (20:33:54) Postovi: (7F)16
Spol:
Lokacija: Grad Zagreb
|
Postano: 20:40 sri, 5. 7. 2006 Naslov: program |
|
|
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? :?: :roll:
#include<stdio.h>
main(){
int x=2; y=5;
void z(int*, int*);
z(&x, &y);
printf("x=%d, y=%d\n", x, y);
}
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
:happycow:
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje?
#include<stdio.h>
main(){
int x=2; y=5;
void z(int*, int*);
z(&x, &y);
printf("x=%d, y=%d\n", x, y);
}
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
_________________ ZRINKA
|
|
[Vrh] |
|
petrich Forumaš(ica)
Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol:
|
Postano: 8:21 čet, 6. 7. 2006 Naslov: |
|
|
[quote="zrinka"]Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? [/quote]
probat cu. :wink:
krenimo od f-ije:
[code:1]
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
[/code:1]
[code:1]void z(int*a, int*b){[/code:1]
znaci to je f-ije koju smo nazvali z. koja prima dva pokazivaca(odnosno dvije adrese) na int, a ne vraca nista u glavni program :shock: . znaci samo obavi neku radnju (btw ova ce zamjenit vrijednosti x i y). :wink:
[code:1]int temp;[/code:1]
deklarirali smo jedan pomocni int, da ne bi izgubili vrijednost jedne od varijabli koje hocemo zamjeniti.
[code:1]temp=*a;[/code:1]
prvo u tog pomocnog spremimo vrijednost koja je spremljena na adresi od a. [b]*[/b] znaci da uzimamo bas vrijednost koja se nalazi na toj adresi.
[code:1] *a=*b;[/code:1]
u ono sto pokazuje a, spremi ono sto pokazuje b.
[code:1]*b=temp;[/code:1]
i na kraju u b spremi ono sto je u pomocnom,a to je bas ono sto je na pocetku bilo u a. 8)
a sad program:
[code:1] int x=2; y=5;[/code:1]
pretpostavljam da je tu trebao biti ',' izmedju x i y, jer ovak kak si ti napisala, ne znamo sta je y(y nije deklariran). dakle [code:1]int x=2, y=5;[/code:1] postavlja vrijednosti 2 za x i 5 za y.
[code:1]void z(int*, int*);[/code:1]
moram priznat da nisam ziher dal to nesto uopce radi. :-k
mozda je to zato sto je f-ija nakon maina? ja inace stavim sve f-ije na vrh, a main na kraj pa to bas i ne koristim.. ;)
[code:1]z(&x, &y);[/code:1]
ovime pozivas f-iju z i dajes joj adrese od x i y. da joj nisi poslala adrese, vec vrijednosti, f-ija ne bi znala gdje staviti zamjenjene vrijednosti.
[code:1]printf("x=%d, y=%d\n", x, y);[/code:1]
na kraju ispisujes na ekran x=5 y=2. jer su sad, nakon izlaska iz f-ije njihove vrijednosti zamjenjene.
prodjimo jos jednom kroz f-iju z sa konkretno onime sto si joj poslala, dakle adresu od x i adresu od y:
[code:1]void z(int*a, int*b){ /*stavi da a pokazuje na x i da b pokazuje na y*/
int temp; /* deklariramo neki pomocni int*/
temp=*a; /*tom pomocnom pridruzimo ono sto se nalazi na mjestu na koje pokazuje a, a to je x=2, znaci temp=2*/
*a=*b; /* *a=5 */
*b=temp; /* *b=2 */
}[/code:1]
zrinka (napisa): | Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? |
probat cu.
krenimo od f-ije:
Kod: |
void z(int*a, int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
|
Kod: | void z(int*a, int*b){ |
znaci to je f-ije koju smo nazvali z. koja prima dva pokazivaca(odnosno dvije adrese) na int, a ne vraca nista u glavni program . znaci samo obavi neku radnju (btw ova ce zamjenit vrijednosti x i y).
deklarirali smo jedan pomocni int, da ne bi izgubili vrijednost jedne od varijabli koje hocemo zamjeniti.
prvo u tog pomocnog spremimo vrijednost koja je spremljena na adresi od a. * znaci da uzimamo bas vrijednost koja se nalazi na toj adresi.
u ono sto pokazuje a, spremi ono sto pokazuje b.
i na kraju u b spremi ono sto je u pomocnom,a to je bas ono sto je na pocetku bilo u a.
a sad program:
pretpostavljam da je tu trebao biti ',' izmedju x i y, jer ovak kak si ti napisala, ne znamo sta je y(y nije deklariran). dakle postavlja vrijednosti 2 za x i 5 za y.
moram priznat da nisam ziher dal to nesto uopce radi.
mozda je to zato sto je f-ija nakon maina? ja inace stavim sve f-ije na vrh, a main na kraj pa to bas i ne koristim..
ovime pozivas f-iju z i dajes joj adrese od x i y. da joj nisi poslala adrese, vec vrijednosti, f-ija ne bi znala gdje staviti zamjenjene vrijednosti.
Kod: | printf("x=%d, y=%d\n", x, y); |
na kraju ispisujes na ekran x=5 y=2. jer su sad, nakon izlaska iz f-ije njihove vrijednosti zamjenjene.
prodjimo jos jednom kroz f-iju z sa konkretno onime sto si joj poslala, dakle adresu od x i adresu od y:
Kod: | void z(int*a, int*b){ /*stavi da a pokazuje na x i da b pokazuje na y*/
int temp; /* deklariramo neki pomocni int*/
temp=*a; /*tom pomocnom pridruzimo ono sto se nalazi na mjestu na koje pokazuje a, a to je x=2, znaci temp=2*/
*a=*b; /* *a=5 */
*b=temp; /* *b=2 */
} |
Zadnja promjena: petrich; 6:43 pet, 7. 7. 2006; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
renata Forumaš(ica)
Pridružen/a: 26. 11. 2005. (20:25:12) Postovi: (71)16
|
Postano: 13:33 čet, 6. 7. 2006 Naslov: |
|
|
Da ne otvaram novu temu, stavljam ovdje jedan riješeni zadatak koji mi nikako ne radi. Ako se nekome da potražiti grešku i objasniti, bila bih jako zahvalna.
Zadatak je sa roka 27.rujna 2004.
znak ! se prevodi u A,kombinacija ! i # u U (samo # se ne prevodi)
treba napisati funkciju koja prima string rijec od gornjih znakova (!,#)i prevodi ga. Rijec ne smije biti promijenjena, a za novi string treba alocirati tocno onoliko memorije koliko je potrebno.Ako rijec ne znamo prevesti, funkcija treba vratiti string ne znam.
#include <stdio.h>
#include<malloc.h>
char *prijevod(char *rijec){
char *novi,*ili="ne znam";
int br=0;
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
br++;
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
br++;
rijec++;
}
else return ili;
}
novi=(char*)malloc((br+1)*sizeof(char));
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}
int main(){
char string[1000];
printf("ucitaj string: ");
gets(string);
printf("%s",prijevod(string));
scanf("%%");
return 0;
}
Da ne otvaram novu temu, stavljam ovdje jedan riješeni zadatak koji mi nikako ne radi. Ako se nekome da potražiti grešku i objasniti, bila bih jako zahvalna.
Zadatak je sa roka 27.rujna 2004.
znak ! se prevodi u A,kombinacija ! i # u U (samo # se ne prevodi)
treba napisati funkciju koja prima string rijec od gornjih znakova (!,#)i prevodi ga. Rijec ne smije biti promijenjena, a za novi string treba alocirati tocno onoliko memorije koliko je potrebno.Ako rijec ne znamo prevesti, funkcija treba vratiti string ne znam.
#include <stdio.h>
#include<malloc.h>
char *prijevod(char *rijec){
char *novi,*ili="ne znam";
int br=0;
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
br++;
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
br++;
rijec++;
}
else return ili;
}
novi=(char*)malloc((br+1)*sizeof(char));
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}
int main(){
char string[1000];
printf("ucitaj string: ");
gets(string);
printf("%s",prijevod(string));
scanf("%%");
return 0;
}
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
Gost
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
Postano: 17:01 čet, 6. 7. 2006 Naslov: |
|
|
[quote="vsego"][quote="renata"] char *novi,*ili="ne znam";[/quote]
Ovo ne smijes napraviti, jer je [tt]ili[/tt] pointer na [tt]char[/tt] kojem nisi dala memoriju ([tt]malloc()[/tt]). :ccc:
[/quote]
Koliko god to cudno zvucalo, ali - [i]vsego nisi u pravu[/i] :shock:
Ako se napise [code:1]char *s = "nesto"[/code:1] kompajler ce alocirati memorijski prostor potreban za pohranu stringa [tt]nesto[/tt], te ce postaviti pointer [tt]s[/tt] da pokazuje na pocetak tog stringa.
Ovo vrijedi samo prilikom inicijalizacije, tj.
[code:1]
char *s;
s = "nesto";
[/code:1]
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju [tt]strcpy[/tt].
vsego (napisa): | renata (napisa): | char *novi,*ili="ne znam"; |
Ovo ne smijes napraviti, jer je ili pointer na char kojem nisi dala memoriju (malloc()).
|
Koliko god to cudno zvucalo, ali - vsego nisi u pravu
Ako se napise kompajler ce alocirati memorijski prostor potreban za pohranu stringa nesto, te ce postaviti pointer s da pokazuje na pocetak tog stringa.
Ovo vrijedi samo prilikom inicijalizacije, tj.
Kod: |
char *s;
s = "nesto";
|
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju strcpy.
_________________ Extraordinary claims require extraordinary evidence. – Carl Sagan
|
|
[Vrh] |
|
petrich Forumaš(ica)
Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol:
|
Postano: 17:14 čet, 6. 7. 2006 Naslov: |
|
|
[code:1]for(j=i;j>0;j--)
if(('A'<=src[j]) && (src[j]<='Z'))
continue;
else rez[z]=src[j--]; [/code:1]
malo ti prepravih ovaj dio, sad radi 8) :
[code:1]
for(j=i-1;j>=0;j--){
if(('A'<=src[j]) && (src[j]<='Z')) continue;
else {
rez[z]=src[j];
printf("%c",rez[z]);
z++;
}
} [/code:1]
1. greska ti je bila sto si u for petlji izasla iz granica stringa.
2. falile su ti {} za for petlju.
3. za else-> ne trebas pomicati j, njega pomices for petljom, ali zato trebas pomaknuti z, jer inace ga on uvijek sprema u istog.
btw. ovaj printf sam stavila da vidim kaj ce ispisat. ;)
ostalo je ok. :ok:
Kod: | for(j=i;j>0;j--)
if(('A'<=src[j]) && (src[j]<='Z'))
continue;
else rez[z]=src[j--]; |
malo ti prepravih ovaj dio, sad radi :
Kod: |
for(j=i-1;j>=0;j--){
if(('A'<=src[j]) && (src[j]<='Z')) continue;
else {
rez[z]=src[j];
printf("%c",rez[z]);
z++;
}
} |
1. greska ti je bila sto si u for petlji izasla iz granica stringa.
2. falile su ti {} za for petlju.
3. za else→ ne trebas pomicati j, njega pomices for petljom, ali zato trebas pomaknuti z, jer inace ga on uvijek sprema u istog.
btw. ovaj printf sam stavila da vidim kaj ce ispisat.
ostalo je ok.
|
|
[Vrh] |
|
Gost
|
Postano: 19:21 čet, 6. 7. 2006 Naslov: |
|
|
Taman kad sam pomislio da nesto znam shvatio sam da sam na pocetku
:oops: :oops:
Naime u kodu
#include <stdio.h>
#include <string.h>
char *f(char *p){
static char s[20]={0};
strcpy(s,p);
return s;
}
int main(){
char *s=f("ABC");
printf("%s\n",s);
s=f("XY");
printf("%s\n",s+1);
scanf("%");
return 0;
}
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?Vec dugo listam predavanja i skriptu prof. Juraka, ali izgleda da sam nesto krivo interpretirao,stoga ako mi netko moze molim vas objasniti sto se tocno dogadja u ovom zadatku tj.kako i kamo se pohranjuje string pri pozivu funkcije f :oops: :roll:
Taman kad sam pomislio da nesto znam shvatio sam da sam na pocetku
Naime u kodu
#include <stdio.h>
#include <string.h>
char *f(char *p){
static char s[20]={0};
strcpy(s,p);
return s;
}
int main(){
char *s=f("ABC");
printf("%s\n",s);
s=f("XY");
printf("%s\n",s+1);
scanf("%");
return 0;
}
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?Vec dugo listam predavanja i skriptu prof. Juraka, ali izgleda da sam nesto krivo interpretirao,stoga ako mi netko moze molim vas objasniti sto se tocno dogadja u ovom zadatku tj.kako i kamo se pohranjuje string pri pozivu funkcije f
|
|
[Vrh] |
|
petrich Forumaš(ica)
Pridružen/a: 07. 11. 2005. (22:23:35) Postovi: (F6)16
Spol:
|
Postano: 19:50 čet, 6. 7. 2006 Naslov: |
|
|
[quote="Anonymous"]
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok?[/quote]
pa ona i nije bas lokalna varijabla, bas zbog tog static, ona se inicijalizira samo prilikom prvog ulaska u blok,i ostaje joj ta vrijednost.
mozda te zbunjuje sto ti ispisuje:
ABC
Y
to je zato sto u f-iji koristis strcpy(a,b), koji izbrise ono sto je u a :shock: i 'kopira' ono iz b u a. znaci kad drugi put zoves f-iju u s-u ti je 'ABC', ali strcpy to izbrise i spremi 'XY' u s. 8)
[quote]
kako i kamo se pohranjuje string pri pozivu funkcije f :oops: :roll:[/quote]
pa, tvoja f-ija vraca pokazivac na string, a to pridruzujes s-u u glavnom programu, tj. s ti sad pokazuje isto na taj string. 8)
hint. probaj:
1. strcpy zamjenit sa strcat, da vidis sta ce se dogodit (strcat(a,b) u a, na kraj doda b).
2. u 2.printf ostavi samo s
uglavnom, poigraj se malo s tim da vidis kak ti programcic dise. ;)
Edit: imas nesto o tom static-u u vjezbama 44_fibonacci_static.c i u singerovim predavanjima (br 9.) njih imas na http://web.math.hr/~singer/
Anonymous (napisa): |
nije mi jasno, ako je staticka lokalna varijabla,kako je ona vidljiva u funkciji main,i zar se ne bi trebala inicijalizirati samo prilikom prvog ulaska u blok? |
pa ona i nije bas lokalna varijabla, bas zbog tog static, ona se inicijalizira samo prilikom prvog ulaska u blok,i ostaje joj ta vrijednost.
mozda te zbunjuje sto ti ispisuje:
ABC
Y
to je zato sto u f-iji koristis strcpy(a,b), koji izbrise ono sto je u a i 'kopira' ono iz b u a. znaci kad drugi put zoves f-iju u s-u ti je 'ABC', ali strcpy to izbrise i spremi 'XY' u s.
Citat: |
kako i kamo se pohranjuje string pri pozivu funkcije f |
pa, tvoja f-ija vraca pokazivac na string, a to pridruzujes s-u u glavnom programu, tj. s ti sad pokazuje isto na taj string.
hint. probaj:
1. strcpy zamjenit sa strcat, da vidis sta ce se dogodit (strcat(a,b) u a, na kraj doda b).
2. u 2.printf ostavi samo s
uglavnom, poigraj se malo s tim da vidis kak ti programcic dise.
Edit: imas nesto o tom static-u u vjezbama 44_fibonacci_static.c i u singerovim predavanjima (br 9.) njih imas na http://web.math.hr/~singer/
Zadnja promjena: petrich; 20:04 čet, 6. 7. 2006; ukupno mijenjano 1 put.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
venovako Forumaš(ica)
Pridružen/a: 07. 11. 2002. (22:46:38) Postovi: (2F9)16
|
Postano: 22:57 čet, 6. 7. 2006 Naslov: |
|
|
[quote="mdoko"][code:1]char *s;
s = "nesto";[/code:1]
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju [tt]strcpy[/tt].[/quote]
Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?
Kada bi gornji kod deklarirao [tt]s[/tt] kao [tt]const char*[/tt], bio bi perfektno legalan dok god netko ne bi pozelio preko [tt]s[/tt]-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka:
[code:1]#include <stdio.h>
#include <stdlib.h>
static const char *nesto(void) {
const char *s;
s = "Hm...";
return s;
}
int main(void) {
printf("%s\n", nesto());
return EXIT_SUCCESS;
}[/code:1]
Naravno, lako je zaboraviti se i poceti pisati po readonly memoriji, pa je zgodno ipak stvari kopirati, kako si i napomenuo.
[size=10]edit: primjer i detalji[/size]
mdoko (napisa): | Kod: | char *s;
s = "nesto"; |
nije ispravno jer memorija nije alocirana. Cak i da je alocirana, ovakvo pridruzivanje nije dozvoljeno, nego je potrebno koristiti funkciju strcpy. |
Ne bih bas isao s tako strogim nedozvoljavanjem.
Ispravi me ako grijesim, no nisu li string konstante dostupne citavo vrijeme i, do na vidljivost, u citavom tijelu programa (tj. ne sprema li ih kompajler u neku readonly sekciju)?
Kada bi gornji kod deklarirao s kao const char*, bio bi perfektno legalan dok god netko ne bi pozelio preko s-a pisati po stringu "nesto", ali receni string ne bi ispario nakon izlaska iz bloka:
Kod: | #include <stdio.h>
#include <stdlib.h>
static const char *nesto(void) {
const char *s;
s = "Hm...";
return s;
}
int main(void) {
printf("%s\n", nesto());
return EXIT_SUCCESS;
} |
Naravno, lako je zaboraviti se i poceti pisati po readonly memoriji, pa je zgodno ipak stvari kopirati, kako si i napomenuo.
edit: primjer i detalji
|
|
[Vrh] |
|
mdoko Forumaš(ica)
Pridružen/a: 30. 11. 2002. (22:17:12) Postovi: (71A)16
Spol:
Lokacija: Heriot-Watt University, Edinburgh
|
|
[Vrh] |
|
Hiroaki Forumaš(ica)
Pridružen/a: 16. 11. 2002. (23:50:56) Postovi: (D)16
|
|
[Vrh] |
|
|