program
Select messages from
# through # FAQ
[/[Print]\]

Forum@DeGiorgi -> Programiranje 1 i 2

#1: program Autor/ica: zrinkaLokacija: Grad Zagreb PostPostano: 20:40 sri, 5. 7. 2006
    —
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje? Question Rolling Eyes

#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;
}

Krava pleshe

#2:  Autor/ica: petrich PostPostano: 8:21 čet, 6. 7. 2006
    —
zrinka (napisa):
Ako bi mi netko mogao objasniti sljedeći program (naredbu po naredbu) i što se ispisuje?

probat cu. Wink
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 Shocked . znaci samo obavi neku radnju (btw ova ce zamjenit vrijednosti x i y). Wink
Kod:
int temp;

deklarirali smo jedan pomocni int, da ne bi izgubili vrijednost jedne od varijabli koje hocemo zamjeniti.
Kod:
temp=*a;

prvo u tog pomocnog spremimo vrijednost koja je spremljena na adresi od a. * znaci da uzimamo bas vrijednost koja se nalazi na toj adresi.
Kod:
 *a=*b;

u ono sto pokazuje a, spremi ono sto pokazuje b.
Kod:
*b=temp;

i na kraju u b spremi ono sto je u pomocnom,a to je bas ono sto je na pocetku bilo u a. Cool
a sad program:
Kod:
 int x=2; y=5;

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
Kod:
int x=2, y=5;
postavlja vrijednosti 2 za x i 5 za y.
Kod:
void z(int*, int*);

moram priznat da nisam ziher dal to nesto uopce radi. Think
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.. Wink
Kod:
z(&x, &y);

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.

#3:  Autor/ica: renata PostPostano: 13:33 čet, 6. 7. 2006
    —
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;
}

#4:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 14:07 čet, 6. 7. 2006
    —
renata (napisa):
char *novi,*ili="ne znam";


Ovo ne smijes napraviti, jer je ili pointer na char kojem nisi dala memoriju (malloc()). Ccc.... Sram te bilo...

Ne smijes staviti niti naizgled dobru varijantu: char ili[9] = "ne znam" (pogodi zasto ne smijes Wink hint: stvar je u return-u). Smile

renata (napisa):
while (*rijec!='\0'){
if (*rijec=='!' && *(rijec+1)=='#'){
*(novi)='U';
rijec=rijec+2;
}
else if (*rijec=='!' && *(rijec+1)!='#'){
*(novi)='A';
rijec++;
}
novi++;
}
return novi;
}


Sto vracas kao novi? Think Adresu nakon zadnjeg znaka u tom stringu?! Shocked Treba:
1. *novi = '\0';
2. return novi - br;

Wave

#5:  Autor/ica: Gost PostPostano: 16:22 čet, 6. 7. 2006
    —
Rjesavala sam drugi zadatak grupe C,al neznam sto mi je krivo
Rolling Eyes
(pr. za string "Dosao 1 Perica u 12 sati." funkcija treba vratiti
".itas 21 u acire 1 oaso" )


#include<stdio.h>
#include<malloc.h>

char *pero(char *src){

int i=0,j,d,z=0;
char *rez;

while(src[i]!='\0') i++;
d=i;

for(j=0;j<i;j++)
if(('A'⇐src[j]) && (src[j]⇐'Z'))d–;

rez=(char *)malloc((d+1)*sizeof(char));

for(j=i;j>0;j–)
if(('A'⇐src[j]) && (src[j]⇐'Z'))
continue;
else rez[z]=src[j–];

rez[d]='\0';

return rez;
}

#6:  Autor/ica: mdokoLokacija: Heriot-Watt University, Edinburgh PostPostano: 17:01 čet, 6. 7. 2006
    —
vsego (napisa):
renata (napisa):
char *novi,*ili="ne znam";


Ovo ne smijes napraviti, jer je ili pointer na char kojem nisi dala memoriju (malloc()). Ccc.... Sram te bilo...

Koliko god to cudno zvucalo, ali - vsego nisi u pravu Shocked

Ako se napise
Kod:
char *s = "nesto"
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.

#7:  Autor/ica: petrich PostPostano: 17:14 čet, 6. 7. 2006
    —
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 Cool :
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. Wink

ostalo je ok. O-kay!

#8:  Autor/ica: Gost PostPostano: 19:21 čet, 6. 7. 2006
    —
Taman kad sam pomislio da nesto znam shvatio sam da sam na pocetku
Embarassed Embarassed
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 Embarassed Rolling Eyes

#9:  Autor/ica: petrich PostPostano: 19:50 čet, 6. 7. 2006
    —
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 Shocked 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. Cool
Citat:

kako i kamo se pohranjuje string pri pozivu funkcije f Embarassed Rolling Eyes

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. Cool

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. Wink

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.

#10:  Autor/ica: vsegoLokacija: /sbin/init PostPostano: 22:04 čet, 6. 7. 2006
    —
mdoko (napisa):
Ako se napise
Kod:
char *s = "nesto"
kompajler ce alocirati memorijski prostor potreban za pohranu stringa nesto, te ce postaviti pointer s da pokazuje na pocetak tog stringa.


Shocked Taj comipler zna nesto i sam napraviti?! Shocked Laughing

Hvala na ispravci; mislio sam da to radi samo za char x[...] = "...". Embarassed

#11:  Autor/ica: venovako PostPostano: 22:57 čet, 6. 7. 2006
    —
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

#12:  Autor/ica: mdokoLokacija: Heriot-Watt University, Edinburgh PostPostano: 8:33 pet, 7. 7. 2006
    —
venovako (napisa):

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)?

U pravu si. Nisam htio komplicirati, ali kao obicno pojednostavljivanje vodi nepreciznosti. Smile

#13:  Autor/ica: Hiroaki PostPostano: 18:38 pon, 24. 7. 2006
    —
venovako (napisa):

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...


Sve bi bilo dobro da nije sramne odluke iz nastanka C-a kojom se dozvoljava preusmjeravanje non-const pointera na string literal...



Forum@DeGiorgi -> Programiranje 1 i 2


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Stranica 1 / 1.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin