[ pitomir @ 16.01.2012. 19:54 ] @
Pokusavam da napisem program koji broji reci. Hocu da korisnik izmedju reci moze da unosi ne samo space, nego i tabulator ili enter.

Code:

#include <stdio.h>
#define IN 1
#define OUT 0

int main()
{
  char c;
  int stanje;
  int br_reci = 0;
  
  stanje = OUT;
  
  while ((c = getchar()) != EOF)
  {
    if (c != ' ' && c != '\n' && c != '\t')
      stanje = IN;
    else
    {
      while (c == ' ' || c == '\n' || c == '\t')
      {
    stanje = OUT;
    c = getchar();
      }
      br_reci++;
    }
  }

  printf("Broj reci: %d\n", br_reci);
  
  return 0;
}


Medjutim, jedino ako pre EOF karaktera unesem neki blanko karakter, ispisace se tacan broj reci. U protivnom ce se ispisati da ima jedna rec manje nego sto treba. S druge strane, ako pre poslednjeg printf-a stavim
Code:
br_reci++;
onda ce mi se uvek ispisati tacan broj reci, osim ako pre EOF karaktera unesem neki blanko karakter.

Moze li mi neko pomoci kako to da ispravim?
[ FooLControL @ 17.01.2012. 00:23 ] @
Evo iz glave, valjda radi, nemam gde da testiram da bih proverio.

Code:

int main()
{
  char c;
  int stanje;
  int br_reci = 0;
  
  stanje = OUT;
  
  while ((c = getchar()) != EOF)
  {
    if (c != ' ' && c != '\n' && c != '\t')
      if(stanje = OUT) 
      {
          br_reci++;
          stanje = IN;
      }
    else
    {
          stanje = OUT;
     }
      
    }
  }

  printf("Broj reci: %d\n", br_reci);
  
  return 0;
}

[ pitomir @ 17.01.2012. 21:05 ] @
Ne radi :( Svaki put kaze "Broj reci: 0"
[ mish_ns @ 17.01.2012. 21:23 ] @
Code:

int main()
{
  char c;
  int stanje;
  int br_reci = 0;
  
  stanje = OUT;
  
  while ((c = getchar()) != EOF)
  {
    if (c != ' ' && c != '\n' && c != '\t')
   {
            br_reci++;  
    }
  }

   if ((c=getchar()) == EOF)
  {
        br_reci++;  
  }

  printf("Broj reci: %d\n", br_reci);
  
  return 0;
}


Nisam dugo radio u C-u ali probaj ovako.
E da i za šta ti služi stanje?
[ pitomir @ 17.01.2012. 22:07 ] @
Izgleda da ni ovo ne prolazi... Sada broji slova. Zbog ovog dela:

Code:
while ((c = getchar()) != EOF)
{
  if (c != ' ' && c != '\n' && c != '\t')
    br_reci++;  
}


Dakle, za svaki unet karakter koji nije space, novi red i tabulator, broj reci ce se inkrementirati.

Ta promenjiva stanje bi trebalo da oznacava da li se trenutno nalazimo unutar reci ili van reci, tj. "u blankovima". Pokusavala sam da nju skroz izbacim, ali mi tek onda ne radi nikako.
[ mish_ns @ 17.01.2012. 22:10 ] @
Code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int c,b;
   int br_reci = 0;



  while ((c = getchar())!= EOF)
  {
    if (c == ' ' || c == '\n' || c == '\t')
   {
            br_reci++;
    }
    b = c;
  }

   if (c == EOF && b !=' ')
  {
        br_reci++;
  }

  printf("Broj reci: %d\n", br_reci);

  return 0;
  
}


Evo male ispravke, radim napamet...probaj sad. Pa javi...
[ pitomir @ 17.01.2012. 22:21 ] @
Skoro pa radi super :) Jedino sto ubraja i blanko karaktere u reci ako se unese vise od jednog blanko karaktera.
p.s. Verovatno si hteo da napises
Code:
char c, b;
?
[ FooLControL @ 17.01.2012. 22:24 ] @
Nije me mrzelo da instaliram C prvi put na masini, jer mi je cudno da nije radio kod, bio je problem u jednoj zagradi. Moras malo i sam da se potrudis, da vidis gde bi mogla da bude greska.

Code:

#include <stdio.h>
#include <stdlib.h>
#define IN 1
#define OUT 0

int main()
{
  char c;
  int stanje;
  int br_reci = 0;

  stanje = OUT;

  while ((c = getchar()) != EOF)
  {
    if (c != ' ' && c != '\n' && c != '\t')
    {
       if(stanje == OUT)
      {
          br_reci++;
          stanje = IN;
      }
    }

    else
    {
          stanje = OUT;
     }
  }

  printf("Broj reci: %d\n", br_reci);

  return 0;
}

[ mish_ns @ 17.01.2012. 22:27 ] @
Dodaj onda samo ovo

Code:
if (b != ' ' && c == ' ' || c == '\n' || c == '\t')
   {
            br_reci++;
    }
    b = c;
  }


EOF je ustvari negativna vrednost -1.
nije karakter ako se ne varam.
Pogledaj malo po netu.
[ pitomir @ 17.01.2012. 22:37 ] @
@FooLControL

Izvini. I hvala.

@mish_ns

Opet nije to to. Ali hvala svejedno!
[ mish_ns @ 17.01.2012. 22:51 ] @
Code:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    char c,b;
   int br_reci = 0;


   while ((c = getchar())!= EOF)
  {

    if ((b != ' '  && b != '\n' && b != '\t') && (c == ' ' || c == '\n' || c == '\t'))
   {
            br_reci++;
    }
    b = c;
  }

   if (c == EOF && (b !=' ' && b!='\t' && b!='\n'))
  {
        br_reci++;
  }

  printf("Broj reci: %d\n", br_reci);

  return 0;

}


E ovo mora da radi... :)
Kao što reče FooLControL Moraš malo i sam da se potrdiš...
Dao sam primer za više blanko znakova trebao si samo malo korigovati uslov i za više tabova i entera...
Probaj i ovo čisto da vidiš dal radi...
[ pitomir @ 17.01.2012. 23:10 ] @
Sad radi. Hvala!

Naravno da sam prethodno pogledala vase kodove i cak ih prepisala na papir da bih ih bolje razumela, ali nije mi palo na pamet da ima neka sintaksna greska. Malo mi je cudno da ja trazim vama gresku, posto sam pocela da ucim C pre mesec dana, dakle, jos sam duduk.
[ mish_ns @ 18.01.2012. 06:00 ] @
OK. Najbitnije da si našla rešenje.
Cilj je da ti damo ideju kako da rešiš zadatak, a ne da ti damo konačno rešenje.
Samim tim ćeš i bolje naučiti.
Pozdrav...

PS. Kolegino rešenje je elegantnije :)
[ vlada_vlada @ 18.01.2012. 09:54 ] @
Evo i malo kraceg resenja (uz isspace() f-iju).

Code:

#include <ctype.h>
...
char p, c = ' ';

while(p=c, (c=getchar()) != EOF)
    if( !isspace(p) && isspace(c) ) br_reci++;

if( !isspace(p) ) br_reci++;
[ dragancesu @ 19.01.2012. 15:11 ] @
Original je http://www.gnu.org/software/cf...node/Source-of-wc-command.html

Linux ima komandu wc koja za to sluzi

Juce sam hteo da postavim ali sajtovi gde se ovo moze naci su "strajkovali"
[ idb @ 19.01.2012. 21:37 ] @

char * strtok ( char * str, const char * delimiters );
Split string into tokens

Code:

#include <string.h>
// .....

ili pogledas ovu temu:
http://www.elitesecurity.org/t...edosled-reci-inverznom-poretku
:)
Pozdrav.