| Prethodna tema :: Sljedeća tema   | 
	
	
	
		| Autor/ica | 
		Poruka | 
	
	
		vsego Site Admin
  
  
  Pridružen/a: 06. 10. 2002. (22:07:09) Postovi: (3562)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: (3562)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: (3562)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: (3562)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: (3562)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] | 
		 | 
	
	
		 |