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: 9:28 sri, 3. 4. 2013 Naslov: |
|
|
Ref. prvi:
1. Kako sam naveo u prethodnim porukama, petlja treba ici od 1, jer prvu kopiju kreiras sa [tt]strcpy()[/tt]. Alternativno, mozes [tt]strcpy()[/tt] zamijeniti sa [tt]s[0] = '\0'[/tt], pa onda [tt]strcat()[/tt] stvarno ide [tt]n[/tt] puta.
2. Moras se oduciti od toga da bezveze stavljas [tt]s2[i]='\0';[/tt], jer ovdje to izaziva gresku (skratis [tt]s2[/tt] na [tt]n[/tt] znakova, a skroz bespotrebno jer string-funkcije same paze gdje ide string-terminator).
Ref. drugi:
Isprobaj za string [tt]"rxlxk"[/tt]. Treba osigurati da prihvaca stringove samo [tt]"rlk"[/tt] u komadu, a ne sa smecem (a la moji [tt]'x'[/tt]-evi) unutra.
Ref. prvi:
1. Kako sam naveo u prethodnim porukama, petlja treba ici od 1, jer prvu kopiju kreiras sa strcpy(). Alternativno, mozes strcpy() zamijeniti sa s[0] = '\0', pa onda strcat() stvarno ide n puta.
2. Moras se oduciti od toga da bezveze stavljas s2[i]='\0';, jer ovdje to izaziva gresku (skratis s2 na n znakova, a skroz bespotrebno jer string-funkcije same paze gdje ide string-terminator).
Ref. drugi:
Isprobaj za string "rxlxk". Treba osigurati da prihvaca stringove samo "rlk" u komadu, a ne sa smecem (a la moji 'x'-evi) unutra.
_________________ 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: 16:33 sri, 3. 4. 2013 Naslov: |
|
|
1. radi sad sve uredno :D
2.
[code:1]
#include<stdio.h>
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);
for(i=0; i<strlen(s); ++i)
{
if(s[i]==p[j])
{
++j;
if(p[j]=='\0')
{
++br;
j=0;
}
}
else j=0;
}
printf("%d", br);
return 0;
}
[/code:1]
Mislim da bi ovo sad trebalo biti dobro.
[size=9][color=#999999]Added after 58 minutes:[/color][/size]
Nije dobro... :?
1. radi sad sve uredno
2.
Kod: |
#include<stdio.h>
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);
for(i=0; i<strlen(s); ++i)
{
if(s[i]==p[j])
{
++j;
if(p[j]=='\0')
{
++br;
j=0;
}
}
else j=0;
}
printf("%d", br);
return 0;
}
|
Mislim da bi ovo sad trebalo biti dobro.
Added after 58 minutes:
Nije dobro...
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 17:08 sri, 3. 4. 2013 Naslov: |
|
|
Gdje u zadatku pise da sve bacis na mala slova? :-s
P.S. Izbjegavaj [tt]strlen()[/tt] u uvjetu petlje kad string ne mijenja duljinu, jer to u svakom pozivu petlje prolazi kroz string (cit. imas nepotrebnu kvadratnu slozenost). Stavi jednostavno [tt]s[i][/tt] ili, ekvivalentno, [tt]s[i] != '\0'[/tt].
Gdje u zadatku pise da sve bacis na mala slova?
P.S. Izbjegavaj strlen() u uvjetu petlje kad string ne mijenja duljinu, jer to u svakom pozivu petlje prolazi kroz string (cit. imas nepotrebnu kvadratnu slozenost). Stavi jednostavno s[i] ili, ekvivalentno, s[i] != '\0'.
_________________ 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] |
|
AvastSecure Forumaš(ica)
Pridružen/a: 22. 10. 2012. (20:31:12) Postovi: (E)16
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
|
[Vrh] |
|
delilah01. Forumaš(ica)
Pridružen/a: 10. 11. 2011. (22:50:23) Postovi: (39)16
|
|
[Vrh] |
|
AvastSecure Forumaš(ica)
Pridružen/a: 22. 10. 2012. (20:31:12) Postovi: (E)16
|
|
[Vrh] |
|
frutabella Forumaš(ica)
Pridružen/a: 09. 10. 2010. (16:35:36) Postovi: (24E)16
|
Postano: 20:07 sri, 3. 4. 2013 Naslov: |
|
|
Da li je ovo sad ok? (znaci ispisati koliko se puta u stringu pojavljuje "rlk")
[code:1]
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; s[i]!='\0'; ++i)
if(s[i]==p[0] && s[i+1]==p[1] && s[i+2]==p[2])
++br;
printf("%d", br);
return 0;
}
[/code:1]
Da li je ovo sad ok? (znaci ispisati koliko se puta u stringu pojavljuje "rlk")
Kod: |
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; s[i]!='\0'; ++i)
if(s[i]==p[0] && s[i+1]==p[1] && s[i+2]==p[2])
++br;
printf("%d", br);
return 0;
}
|
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:33 sri, 3. 4. 2013 Naslov: |
|
|
Skoro. Gotovo sigurno ce raditi ispravno, ali nije dobro. Primijeti da [tt]s[i+2][/tt] nije nuzno u stringu, nego moze pobjeci izvan memorije koja pripada programu, sto ga moze srusisi (mada, sanse da se to desi su solidno male).
Ako zelis tako, onda stavi:
[code:1]last = strlen(s) - 3; /* 3 je strlen(p) */
for (i = 0; i <= last; i++) ...[/code:1]
Cini mi se da bi i ono prvo radilo, samo da si maknula
[tt]for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);[/tt]
Naravno, moguce je da mi je nesto promaklo. Nisam testirao.[/tt]
Skoro. Gotovo sigurno ce raditi ispravno, ali nije dobro. Primijeti da s[i+2] nije nuzno u stringu, nego moze pobjeci izvan memorije koja pripada programu, sto ga moze srusisi (mada, sanse da se to desi su solidno male).
Ako zelis tako, onda stavi:
Kod: | last = strlen(s) - 3; /* 3 je strlen(p) */
for (i = 0; i <= last; i++) ... |
Cini mi se da bi i ono prvo radilo, samo da si maknula
for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);
Naravno, moguce je da mi je nesto promaklo. Nisam testirao.[/tt]
_________________ 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: 20:41 sri, 3. 4. 2013 Naslov: |
|
|
[quote="vsego"]Skoro. Gotovo sigurno ce raditi ispravno, ali nije dobro. Primijeti da [tt]s[i+2][/tt] nije nuzno u stringu, nego moze pobjeci izvan memorije koja pripada programu, sto ga moze srusisi (mada, sanse da se to desi su solidno male).
Ako zelis tako, onda stavi:
[code:1]last = strlen(s) - 3; /* 3 je strlen(p) */
for (i = 0; i <= last; i++) ...[/code:1]
Cini mi se da bi i ono prvo radilo, samo da si maknula
[tt]for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);[/tt]
Naravno, moguce je da mi je nesto promaklo. Nisam testirao.[/tt][/quote]
Uauuu, cak mi je prihvatilo da je tocno. :D :D :D :D
Sto se tice onog prvog programa, maknula sam "mijenjanje sve u mala slova", ali nije prihvaceno kao tocno.
I provjerila sam, za unos: rrlk izbacuje 0 pojavljivanja, sto naravno nije tocno.
(eh, kad smo vec tu, sta bi morala promijeniti da bi radilo dobro - znaci u mom prvom programu)
Evo ga jos jednom:
[code:1]
#include<stdio.h>
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; i<strlen(s); ++i)
{
if(s[i]==p[j])
{
++j;
if(p[j]=='\0')
{
++br;
j=0;
}
}
else j=0;
}
printf("%d", br);
return 0;
}
[/code:1]
vsego (napisa): | Skoro. Gotovo sigurno ce raditi ispravno, ali nije dobro. Primijeti da s[i+2] nije nuzno u stringu, nego moze pobjeci izvan memorije koja pripada programu, sto ga moze srusisi (mada, sanse da se to desi su solidno male).
Ako zelis tako, onda stavi:
Kod: | last = strlen(s) - 3; /* 3 je strlen(p) */
for (i = 0; i <= last; i++) ... |
Cini mi se da bi i ono prvo radilo, samo da si maknula
for(i=0; i<strlen(s); ++i) s[i]=tolower(s[i]);
Naravno, moguce je da mi je nesto promaklo. Nisam testirao.[/tt] |
Uauuu, cak mi je prihvatilo da je tocno.
Sto se tice onog prvog programa, maknula sam "mijenjanje sve u mala slova", ali nije prihvaceno kao tocno.
I provjerila sam, za unos: rrlk izbacuje 0 pojavljivanja, sto naravno nije tocno.
(eh, kad smo vec tu, sta bi morala promijeniti da bi radilo dobro - znaci u mom prvom programu)
Evo ga jos jednom:
Kod: |
#include<stdio.h>
#include<string.h>
int main (void)
{
char s[11388], p[]="rlk";
int br=0, i, j=0;
scanf("%s", s);
for(i=0; i<strlen(s); ++i)
{
if(s[i]==p[j])
{
++j;
if(p[j]=='\0')
{
++br;
j=0;
}
}
else j=0;
}
printf("%d", br);
return 0;
}
|
|
|
[Vrh] |
|
vsego Site Admin
Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3560)16
Spol:
Lokacija: /sbin/init
|
Postano: 20:53 sri, 3. 4. 2013 Naslov: |
|
|
Ah, pa da... :facepalm:
Problem je upravo ako imas "rrkl" ili "rkrkl", tj. podstring od [tt]s[/tt] je oblika [tex]xp[/tex], pri cemu je [tex]x \subsetneq p[/tex]. Recimo, za "rrkl":
1. [tt]i = 0[/tt] => [tt]s[i] == 'r'[/tt] => [tt]j = 1[/tt]
2. [tt]i = 1[/tt] => [tt]s[i] == 'r'[/tt] => [tt]j = 0[/tt] --> ovo je problem, jer utvrdis da to nije drugo slovo (k), ali [b]ne[/b] utvrdis da [b]je[/b] prvo.
Ispravak:
[code:1]for(i = 0; s[i]; ++i) {
if (s[i] == p[j]) {
j++;
if (p[j] == '\0') {
br++;
j = 0;
}
} else
j = (s[i] == p[0]); /* ili j = (s[i] == p[0] ? 1 : 0); ili if (s[i] == p[0]) j = 1; else j = 0; */
}[/code:1]
Dakle, [tt]j[/tt] resetiras na 1 ako je [tt]s[i][/tt] prvi znak od [tt]p[/tt]; inace resetiras na nulu.
Ah, pa da...
Problem je upravo ako imas "rrkl" ili "rkrkl", tj. podstring od s je oblika [tex]xp[/tex], pri cemu je [tex]x \subsetneq p[/tex]. Recimo, za "rrkl":
1. i = 0 ⇒ s[i] == 'r' ⇒ j = 1
2. i = 1 ⇒ s[i] == 'r' ⇒ j = 0 → ovo je problem, jer utvrdis da to nije drugo slovo (k), ali ne utvrdis da je prvo.
Ispravak:
Kod: | for(i = 0; s[i]; ++i) {
if (s[i] == p[j]) {
j++;
if (p[j] == '\0') {
br++;
j = 0;
}
} else
j = (s[i] == p[0]); /* ili j = (s[i] == p[0] ? 1 : 0); ili if (s[i] == p[0]) j = 1; else j = 0; */
} |
Dakle, j resetiras na 1 ako je s[i] prvi znak od p; inace resetiras na nulu.
_________________ 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] |
|
|