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
|
Postano: 19:15 sri, 6. 3. 2013 Naslov: |
|
|
[quote="ivanaaaa"]ma prilično sam sigurna da se nećete snaći u tome, dost je komplicirani taj program i svašta nešto radi, pa sam ja izvukla van pojednostavljeno da pitam :D[/quote]
Na stranu prispodoba da se Marko nece snaci u nekom kodu [ :lol: ], meni se cini da si previse pojednostavila. Imam dojam da zapravo ne radis sa stringom nego s nizom stringova, a u tom slucaju ti je vjerojatno deklaracija kriva. No, za to provjeriti, treba vidjeti relevantne dijelove koda, bez pojednostavljivanja.
ivanaaaa (napisa): | ma prilično sam sigurna da se nećete snaći u tome, dost je komplicirani taj program i svašta nešto radi, pa sam ja izvukla van pojednostavljeno da pitam |
Na stranu prispodoba da se Marko nece snaci u nekom kodu [ ], meni se cini da si previse pojednostavila. Imam dojam da zapravo ne radis sa stringom nego s nizom stringova, a u tom slucaju ti je vjerojatno deklaracija kriva. No, za to provjeriti, treba vidjeti relevantne dijelove koda, bez pojednostavljivanja.
_________________ 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] |
|
ivanaaaa Forumaš(ica)
Pridružen/a: 24. 10. 2011. (19:36:26) Postovi: (31)16
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
|
[Vrh] |
|
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
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 22:21 ned, 31. 3. 2013 Naslov: |
|
|
Ovo je kod kako sortirati rjecnik:
[code:1]
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_BROJ 100
#define MAX_DULJ 80
char w[MAX_BROJ * MAX_DULJ];
char* p[MAX_BROJ];
int broj_rijeci;
int unos (char* p[]){
char* q=w;
int flag=1, broj=0, dulj;
while(flag){
if(gets(q)==NULL) return -1;
if ((dulj=strlen(q))==0) return broj;
if(broj>=MAX_BROJ) return -1;
p[broj]=q;
++broj;
q+=dulj+1;
}
}
void sort(char* p[], int n){
int i, j, ind_min;
char* temp;
for(i=0; i<n-1; ++i){
ind_min=i;
for(j=i+1; j<n; ++j)
if(strcmp(p[j], p[ind_min])<0)
ind_min=j;
if(i!=ind_min){
temp=p[i];
p[i]=p[ind_min];
p[ind_min]=temp;
}
}
return;
}
void ispis(char* p[]){
int i;
for(i=0; i<broj_rijeci; i++)
puts(p[i]);
return;
}
int main (void){
if((broj_rijeci=unos(p))>=0){
printf ("Broj rijeci: %d\n", broj_rijeci);
sort(p, broj_rijeci);
ispis(p);
}
else
printf ("Previse rijeci na ulazu\n");
return 0;
}
[/code:1]
E sad me zanima
1) kako promijeniti program tako da se polja w i p dinamicki alociraju.
2) i kako umjesto polja w koristiti dinamicku alokaciju za svaku ucitanu rijec, ako se zna max duljina rijeci
2.1)odnosno kad se ne zna
Ovo je kod kako sortirati rjecnik:
Kod: |
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_BROJ 100
#define MAX_DULJ 80
char w[MAX_BROJ * MAX_DULJ];
char* p[MAX_BROJ];
int broj_rijeci;
int unos (char* p[]){
char* q=w;
int flag=1, broj=0, dulj;
while(flag){
if(gets(q)==NULL) return -1;
if ((dulj=strlen(q))==0) return broj;
if(broj>=MAX_BROJ) return -1;
p[broj]=q;
++broj;
q+=dulj+1;
}
}
void sort(char* p[], int n){
int i, j, ind_min;
char* temp;
for(i=0; i<n-1; ++i){
ind_min=i;
for(j=i+1; j<n; ++j)
if(strcmp(p[j], p[ind_min])<0)
ind_min=j;
if(i!=ind_min){
temp=p[i];
p[i]=p[ind_min];
p[ind_min]=temp;
}
}
return;
}
void ispis(char* p[]){
int i;
for(i=0; i<broj_rijeci; i++)
puts(p[i]);
return;
}
int main (void){
if((broj_rijeci=unos(p))>=0){
printf ("Broj rijeci: %d\n", broj_rijeci);
sort(p, broj_rijeci);
ispis(p);
}
else
printf ("Previse rijeci na ulazu\n");
return 0;
}
|
E sad me zanima
1) kako promijeniti program tako da se polja w i p dinamicki alociraju.
2) i kako umjesto polja w koristiti dinamicku alokaciju za svaku ucitanu rijec, ako se zna max duljina rijeci
2.1)odnosno kad se ne zna
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 22:38 ned, 31. 3. 2013 Naslov: |
|
|
[quote="frutabella"]1) kako promijeniti program tako da se polja w i p dinamicki alociraju.[/quote]
[tt]char *w, **p;[/tt] + [tt]malloc()[/tt] / [tt]realloc()[/tt]
[quote="frutabella"]2) i kako umjesto polja w koristiti dinamicku alokaciju za svaku ucitanu rijec, ako se zna max duljina rijeci[/quote]
Napravis da je [tt]w[/tt] automatski niz elemenata tipa [tt]char[MAX_LEN+1][/tt] (ako je maximalni broj rijeci zadan) ili da je pointer na [tt]char[MAX_LEN+1][/tt] (ako maximalni broj rijeci nije zadan), pri cemu je [tt]MAX_LEN[/tt] najveca duljina pojedine rijeci.
[quote="frutabella"]2.1)odnosno kad se ne zna[/quote]
Napravis da je [tt]w[/tt] automatski niz pointera na [tt]char[/tt] (ako je maximalni broj rijeci zadan) ili da je tipa [tt]char**[/tt] (ako maximalni broj rijeci nije zadan). U oba slucaja, pojedine rijeci alociras s
[tt]w[i] = (char*)malloc((duljina+1) * sizeof(char));[/tt],
a u drugom slucaju, prije alociranja rijeci, trebas i produljiti niz:
[tt]w = (char**)realloc(w, (++n) * sizeof(char*));[/tt] (onda ovo gore [tt]w[i][/tt] postaje [tt]w[n-1][/tt])
frutabella (napisa): | 1) kako promijeniti program tako da se polja w i p dinamicki alociraju. |
char *w, **p; + malloc() / realloc()
frutabella (napisa): | 2) i kako umjesto polja w koristiti dinamicku alokaciju za svaku ucitanu rijec, ako se zna max duljina rijeci |
Napravis da je w automatski niz elemenata tipa char[MAX_LEN+1] (ako je maximalni broj rijeci zadan) ili da je pointer na char[MAX_LEN+1] (ako maximalni broj rijeci nije zadan), pri cemu je MAX_LEN najveca duljina pojedine rijeci.
frutabella (napisa): | 2.1)odnosno kad se ne zna |
Napravis da je w automatski niz pointera na char (ako je maximalni broj rijeci zadan) ili da je tipa char** (ako maximalni broj rijeci nije zadan). U oba slucaja, pojedine rijeci alociras s
w[i] = (char*)malloc((duljina+1) * sizeof(char));,
a u drugom slucaju, prije alociranja rijeci, trebas i produljiti niz:
w = (char**)realloc(w, (++n) * sizeof(char*)); (onda ovo gore w[i] postaje w[n-1])
_________________ 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: 1:49 pon, 1. 4. 2013 Naslov: |
|
|
Ovo ce pitanje zvucati glupo, ali jednostavno nisam ovo razumjela.
Znaci ovo je program koji ispisuje argumente komande linije:
[code:1]#include<stdio.h>
int main (int argc, char *argv[])
{
int i;
printf("argc: %d\n", argc);
for(i=0; i<argc; ++i)
printf("argv[%d]: %s\n", i, argv[i]);
return 0;
}
[/code:1]
Ja ocito ne znam sta je komanda linija :oops: , pa ne znam, gdje sad treba utipkati npr.
arg_1 Ja sam mala Ruza, mamina sam kci.
Ovo ce pitanje zvucati glupo, ali jednostavno nisam ovo razumjela.
Znaci ovo je program koji ispisuje argumente komande linije:
Kod: | #include<stdio.h>
int main (int argc, char *argv[])
{
int i;
printf("argc: %d\n", argc);
for(i=0; i<argc; ++i)
printf("argv[%d]: %s\n", i, argv[i]);
return 0;
}
|
Ja ocito ne znam sta je komanda linija , pa ne znam, gdje sad treba utipkati npr.
arg_1 Ja sam mala Ruza, mamina sam kci.
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 3:00 pon, 1. 4. 2013 Naslov: |
|
|
Upravo to predavanje iz kojeg si uzela kod, pise ti na prethodnom slideu:
[quote="[url=http://web.math.pmf.unizg.hr/~singer/P2_1213/06.pdf]Predavanje 6[/url], slide 58"]Ako program pozovemo s
[code:1]ime.exe jedan dva tri[/code:1]
...[/quote]
Dakle, digni Command prompt ili kako se vec komandna linija zove (pretpostavljam da koristis Win, jer ljudi koji koriste operativne sustave znaju sto je komandna linija), odi u direktorij gdje ti se nalazi program ([tt]c:[/tt] ili koja je vec particija, pa [tt]cd \put\do\direktorija[/tt]) i onda tamo upisi tocno sto ti tu gore pise.
Ako i dalje nije jasno, copi nekog demosa. Tekstualno opisivanje je nespretno, a pokaze se u minutu-dvije (cini mi se da prof. i pokazu na predavanjima).
Upravo to predavanje iz kojeg si uzela kod, pise ti na prethodnom slideu:
Predavanje 6, slide 58 (napisa): | Ako program pozovemo s
Kod: | ime.exe jedan dva tri |
... |
Dakle, digni Command prompt ili kako se vec komandna linija zove (pretpostavljam da koristis Win, jer ljudi koji koriste operativne sustave znaju sto je komandna linija), odi u direktorij gdje ti se nalazi program (c: ili koja je vec particija, pa cd \put\do\direktorija) i onda tamo upisi tocno sto ti tu gore pise.
Ako i dalje nije jasno, copi nekog demosa. Tekstualno opisivanje je nespretno, a pokaze se u minutu-dvije (cini mi se da prof. i pokazu na predavanjima).
_________________ 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
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
|
[Vrh] |
|
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: 1:35 uto, 2. 4. 2013 Naslov: |
|
|
Napisite funkciju int palindrom (char *s) koja vraća 1 ako je string s palindrom, inace treba vratiti 0.
Npr. "anavolimilovana" je palindrom, ali "ana voli milovana" nije.
Moj kod:
[code:1]
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int palindrom (char s[])
{
int n, i, j;
n=strlen(s);
j=n-1;
for(i=0; s[i]!='\0' ; ++i)
{
if (isblank(s[i])|| isblank(s[j])) return 0;
if(s[i]==s[j]) --j;
else return 0;
}
s[i]='\0';
return 1;
}
int main (void)
{
char s[100];
printf("Unesi string: ");
scanf("%s", s);
printf("Da li je string palindrom: %d", palindrom(s));
return 0;
}
[/code:1]
Ne znam zasto mi "ana voli milovana" ispisuje da je palindrom, dok recimo "petra rtep" ispisuje da nije (znaci ispisuje pravilno)?
Napisite funkciju int palindrom (char *s) koja vraća 1 ako je string s palindrom, inace treba vratiti 0.
Npr. "anavolimilovana" je palindrom, ali "ana voli milovana" nije.
Moj kod:
Kod: |
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int palindrom (char s[])
{
int n, i, j;
n=strlen(s);
j=n-1;
for(i=0; s[i]!='\0' ; ++i)
{
if (isblank(s[i])|| isblank(s[j])) return 0;
if(s[i]==s[j]) --j;
else return 0;
}
s[i]='\0';
return 1;
}
int main (void)
{
char s[100];
printf("Unesi string: ");
scanf("%s", s);
printf("Da li je string palindrom: %d", palindrom(s));
return 0;
}
|
Ne znam zasto mi "ana voli milovana" ispisuje da je palindrom, dok recimo "petra rtep" ispisuje da nije (znaci ispisuje pravilno)?
|
|
[Vrh] |
|
quark Forumaš(ica)
Pridružen/a: 22. 10. 2011. (16:47:39) Postovi: (DA)16
Spol:
|
Postano: 2:08 uto, 2. 4. 2013 Naslov: |
|
|
Dakle, [tt]%s[/tt] ti kupi do prve praznine; dakle, petr nije palindrom, a ana je palindrom :D
No, ako i točno učitaš string, ne radi ti kod.
Naime uvjet if [tt](isblank(s[i])|| isblank(s[j])) return 0;[/tt] ne štima.
Pitanje je logike - disjunkcija je istinita i ako su oba istinita: dakle, kada na simetričnim mjestima imaš razmak, f-ja ti vraća 0.
I ne shvaćam uopće čemu posebna briga za razmak? To je char kao i svaki drugi. Ako se na simetričnim mjestima nalazi razmak - ok, ako se ne nalazi, returnaš 0. Dakle, dovoljan ti je jedan if.
I čemu ovaj [tt]s[i]='\0'[/tt] ? :shock:
Dakle, %s ti kupi do prve praznine; dakle, petr nije palindrom, a ana je palindrom
No, ako i točno učitaš string, ne radi ti kod.
Naime uvjet if (isblank(s[i])|| isblank(s[j])) return 0; ne štima.
Pitanje je logike - disjunkcija je istinita i ako su oba istinita: dakle, kada na simetričnim mjestima imaš razmak, f-ja ti vraća 0.
I ne shvaćam uopće čemu posebna briga za razmak? To je char kao i svaki drugi. Ako se na simetričnim mjestima nalazi razmak - ok, ako se ne nalazi, returnaš 0. Dakle, dovoljan ti je jedan if.
I čemu ovaj s[i]='\0' ?
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 2:41 uto, 2. 4. 2013 Naslov: |
|
|
[quote="quark"]Dakle, [tt]%s[/tt] ti kupi do prve praznine; dakle, petr nije palindrom, a ana je palindrom :D
No, ako i točno učitaš string, ne radi ti kod.
Naime uvjet if [tt](isblank(s[i])|| isblank(s[j])) return 0;[/tt] ne štima.
Pitanje je logike - disjunkcija je istinita i ako su oba istinita: dakle, kada na simetričnim mjestima imaš razmak, f-ja ti vraća 0.
I ne shvaćam uopće čemu posebna briga za razmak? To je char kao i svaki drugi. Ako se na simetričnim mjestima nalazi razmak - ok, ako se ne nalazi, returnaš 0. Dakle, dovoljan ti je jedan if.
I čemu ovaj [tt]s[i]='\0'[/tt] ? :shock:[/quote]
Istina, radim nepotrebne stvari.
A ovo zadnje shvacam da ne treba,
ali, ako bi trebali ispisati taj palindrom, onda bi to trebali valjda napisati, jel da? (mozda sam to imala u mislima dok sam pisala)
Hvala!
[size=9][color=#999999]Added after 25 minutes:[/color][/size]
http://degiorgi.math.hr/prog2/materijali/p2-vjezbe.pdf
str. 89 (po skripti), zad 5.4.2.
Zadatak sam sama pokusala rijesiti bez gledanja u rjesenje,
dobro ispise ali nešto nije uredu (javlja da windows trazi rjesenje problema).
Zanima me gdje grijesim?
[code:1]
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main (void){
char s[20];
int n, t, m, i;
char *s2;
printf("Unesit broj n: ");
scanf("%d", &n);
printf("Unesi string: ");
scanf("%s", s);
t=strlen(s);
if(n%t==0) n=n/t;
else
n=n/t+1;
m=n*t;
s2=(char*)malloc((m+1)*sizeof(char)); /* m+1 zbog '\0' */
if(s2==NULL)
{
printf ("Greska!\n");
exit(0);
}
strcpy(s2, s);
for(i=0; i<m; ++i)
strcat(s2, s);
s2[i]='\0';
printf("Ispisi string: %s", s2);
free(s2);
return 0;
}
[/code:1]
quark (napisa): | Dakle, %s ti kupi do prve praznine; dakle, petr nije palindrom, a ana je palindrom
No, ako i točno učitaš string, ne radi ti kod.
Naime uvjet if (isblank(s[i])|| isblank(s[j])) return 0; ne štima.
Pitanje je logike - disjunkcija je istinita i ako su oba istinita: dakle, kada na simetričnim mjestima imaš razmak, f-ja ti vraća 0.
I ne shvaćam uopće čemu posebna briga za razmak? To je char kao i svaki drugi. Ako se na simetričnim mjestima nalazi razmak - ok, ako se ne nalazi, returnaš 0. Dakle, dovoljan ti je jedan if.
I čemu ovaj s[i]='\0' ? |
Istina, radim nepotrebne stvari.
A ovo zadnje shvacam da ne treba,
ali, ako bi trebali ispisati taj palindrom, onda bi to trebali valjda napisati, jel da? (mozda sam to imala u mislima dok sam pisala)
Hvala!
Added after 25 minutes:
http://degiorgi.math.hr/prog2/materijali/p2-vjezbe.pdf
str. 89 (po skripti), zad 5.4.2.
Zadatak sam sama pokusala rijesiti bez gledanja u rjesenje,
dobro ispise ali nešto nije uredu (javlja da windows trazi rjesenje problema).
Zanima me gdje grijesim?
Kod: |
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main (void){
char s[20];
int n, t, m, i;
char *s2;
printf("Unesit broj n: ");
scanf("%d", &n);
printf("Unesi string: ");
scanf("%s", s);
t=strlen(s);
if(n%t==0) n=n/t;
else
n=n/t+1;
m=n*t;
s2=(char*)malloc((m+1)*sizeof(char)); /* m+1 zbog '\0' */
if(s2==NULL)
{
printf ("Greska!\n");
exit(0);
}
strcpy(s2, s);
for(i=0; i<m; ++i)
strcat(s2, s);
s2[i]='\0';
printf("Ispisi string: %s", s2);
free(s2);
return 0;
}
|
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 8:44 uto, 2. 4. 2013 Naslov: |
|
|
U string [tt]s2[/tt] trpas [tt]m+1[/tt] kopiju stringa [tt]s[/tt] ([tt]strcpy()[/tt] ubaci jednu, a onda petlja sa [tt]strcat()[/tt]-om napravi jos [tt]m[/tt]), iako si alocirala memoriju za najvise [tt]m[/tt] [b]znakova[/b] (plus nul-znak).
Sto se prethodnog zadatka tice, quark je u pravu: [tt]s[i]='\0';[/tt] je cisti vishak, i to iz dva razloga.
1. String u funkciji ne mijenjas, pa on vec ima [tt]'\0'[/tt] tocno tamo gdje to treba biti.
2. Kad [tt]for()[/tt] petlja zavrsi, [tt]i[/tt] je upravo index od [tt]'\0'[/tt], pa [tt]s[i]='\0';[/tt] postavlja [tt]s[i][/tt] na vrijednost koju taj znak vec ima.
U string s2 trpas m+1 kopiju stringa s (strcpy() ubaci jednu, a onda petlja sa strcat()-om napravi jos m), iako si alocirala memoriju za najvise m znakova (plus nul-znak).
Sto se prethodnog zadatka tice, quark je u pravu: s[i]='\0'; je cisti vishak, i to iz dva razloga.
1. String u funkciji ne mijenjas, pa on vec ima '\0' tocno tamo gdje to treba biti.
2. Kad for() petlja zavrsi, i je upravo index od '\0', pa s[i]='\0'; postavlja s[i] na vrijednost koju taj znak vec ima.
_________________ 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: 22:41 uto, 2. 4. 2013 Naslov: |
|
|
[quote="vsego"]U string [tt]s2[/tt] trpas [tt]m+1[/tt] kopiju stringa [tt]s[/tt] ([tt]strcpy()[/tt] ubaci jednu, a onda petlja sa [tt]strcat()[/tt]-om napravi jos [tt]m[/tt]), iako si alocirala memoriju za najvise [tt]m[/tt] [b]znakova[/b] (plus nul-znak).
Sto se prethodnog zadatka tice, quark je u pravu: [tt]s[i]='\0';[/tt] je cisti vishak, i to iz dva razloga.
1. String u funkciji ne mijenjas, pa on vec ima [tt]'\0'[/tt] tocno tamo gdje to treba biti.
2. Kad [tt]for()[/tt] petlja zavrsi, [tt]i[/tt] je upravo index od [tt]'\0'[/tt], pa [tt]s[i]='\0';[/tt] postavlja [tt]s[i][/tt] na vrijednost koju taj znak vec ima.[/quote]
Ourajt, mislim da sam skontala.
Znaci moram alocirati (m+1)*t znakova, tj.
s2=(char*)malloc(((m+1)*t)*sizeof(char));
Sad radi za unos n=17, i Pero :D
ali opet ne radi za recimo n=15, Petar. :S
vsego (napisa): | U string s2 trpas m+1 kopiju stringa s (strcpy() ubaci jednu, a onda petlja sa strcat()-om napravi jos m), iako si alocirala memoriju za najvise m znakova (plus nul-znak).
Sto se prethodnog zadatka tice, quark je u pravu: s[i]='\0'; je cisti vishak, i to iz dva razloga.
1. String u funkciji ne mijenjas, pa on vec ima '\0' tocno tamo gdje to treba biti.
2. Kad for() petlja zavrsi, i je upravo index od '\0', pa s[i]='\0'; postavlja s[i] na vrijednost koju taj znak vec ima. |
Ourajt, mislim da sam skontala.
Znaci moram alocirati (m+1)*t znakova, tj.
s2=(char*)malloc(((m+1)*t)*sizeof(char));
Sad radi za unos n=17, i Pero
ali opet ne radi za recimo n=15, Petar. :S
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 23:42 uto, 2. 4. 2013 Naslov: |
|
|
Meni se cini da u [tt]n[/tt] trpas koliko kopija treba, a u [tt]m[/tt] duljinu novog stringa. Dakle, [tt]malloc()[/tt] je (bio) ok, ali for petlja je trebala ici od 1 do [tt]<n[/tt], umjesto od 0 do [tt]<m[/tt].
Ako i dalje ne radi, molim aktualnu verziju, da ne pricamo napamet.
Meni se cini da u n trpas koliko kopija treba, a u m duljinu novog stringa. Dakle, malloc() je (bio) ok, ali for petlja je trebala ici od 1 do <n, umjesto od 0 do <m.
Ako i dalje ne radi, molim aktualnu verziju, da ne pricamo napamet.
_________________ 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: 1:27 sri, 3. 4. 2013 Naslov: |
|
|
I meni je logicno da bi trebalo u for petlji ici do n, umjesto m, ali sad ispisuje pogresno (i jos trazi rjesenje problema).
[code:1]
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main (void){
char s[20];
int n, t, m, i;
char *s2;
printf("Unesit broj n: ");
scanf("%d", &n);
printf("Unesi string: ");
scanf("%s", s);
t=strlen(s);
if(n%t==0) n=n/t;
else
n=n/t+1;
m=n*t;
s2=(char*)malloc((m+1)*sizeof(char)); /* m+1 zbog '\0' */
if(s2==NULL)
{
printf ("Greska!\n");
exit(0);
}
strcpy(s2, s);
for(i=0; i<n; ++i)
strcat(s2, s);
s2[i]='\0';
printf("Ispisi string: %s", s2);
free(s2);
return 0;
}
[/code:1]
U sluzbenim rjesenjima stoji:
[code:1]
if (n%strlen(s))
n=(n/strlen(s)+1)*strlen(s) [/code:1] -----> sto je moj m
zatim
[code:1]
s2=(char*)malloc((n+1)*sizeof(char));
strcpy(s2,s);
while(strlen(s2)<n) strcat(s2, s);
/*ovo isto ide do n (sto je m iz moje price) */
[/code:1]
Sad sam tek zbunjena... :?
I meni je logicno da bi trebalo u for petlji ici do n, umjesto m, ali sad ispisuje pogresno (i jos trazi rjesenje problema).
Kod: |
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
int main (void){
char s[20];
int n, t, m, i;
char *s2;
printf("Unesit broj n: ");
scanf("%d", &n);
printf("Unesi string: ");
scanf("%s", s);
t=strlen(s);
if(n%t==0) n=n/t;
else
n=n/t+1;
m=n*t;
s2=(char*)malloc((m+1)*sizeof(char)); /* m+1 zbog '\0' */
if(s2==NULL)
{
printf ("Greska!\n");
exit(0);
}
strcpy(s2, s);
for(i=0; i<n; ++i)
strcat(s2, s);
s2[i]='\0';
printf("Ispisi string: %s", s2);
free(s2);
return 0;
}
|
U sluzbenim rjesenjima stoji:
Kod: |
if (n%strlen(s))
n=(n/strlen(s)+1)*strlen(s) | -----> sto je moj m
zatim
Kod: |
s2=(char*)malloc((n+1)*sizeof(char));
strcpy(s2,s);
while(strlen(s2)<n) strcat(s2, s);
/*ovo isto ide do n (sto je m iz moje price) */
|
Sad sam tek zbunjena...
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 3:34 sri, 3. 4. 2013 Naslov: |
|
|
Zadaca:
Napišite program koji učitava jednu riječ s najviše 11387 znakova, te ispisuje koliko se puta u toj riječi pojavljuje podstring "rlk".
[code:1]
#include<stdio.h>
#include<string.h>
int main (void)
{
char rijec[11388], podstring[]="rlk";
int br=0, i, j=0;
scanf("%s", rijec);
for(i=0; i<strlen(rijec); ++i)
{
if(rijec[i]==podstring[j]) ++j;
if(podstring[j]=='\0')
{
++br;
j=0;
}
}
printf("%d", br);
return 0;
}
[/code:1]
Ispisuje mi sve dobro (bar ja mislim), ali ne znam zbog cega onda nije prihvaceno kao tocno rjesenje.
Zadaca:
Napišite program koji učitava jednu riječ s najviše 11387 znakova, te ispisuje koliko se puta u toj riječi pojavljuje podstring "rlk".
Kod: |
#include<stdio.h>
#include<string.h>
int main (void)
{
char rijec[11388], podstring[]="rlk";
int br=0, i, j=0;
scanf("%s", rijec);
for(i=0; i<strlen(rijec); ++i)
{
if(rijec[i]==podstring[j]) ++j;
if(podstring[j]=='\0')
{
++br;
j=0;
}
}
printf("%d", br);
return 0;
}
|
Ispisuje mi sve dobro (bar ja mislim), ali ne znam zbog cega onda nije prihvaceno kao tocno rjesenje.
|
|
[Vrh] |
|
|