Program do zliczania znaków z klawiatury

Odpowiedz Nowy wątek
2014-11-30 12:56
0

Napisałem program do zliczania znaków, ale nie wiem gdzie jest błąd, bo wpisuje znaki i nie chce mi zliczyć :(((

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

int main(int argc, char *argv[])
{
    int c=0, nc=0, nml=0, nwl=0, nb=0, nw=0, ns=0;
    fflush (stdin);
     c=getchar();
    while ((c = getchar ()) && c!= EOF)
{   
if (c >= 'a' && c <= 'z')
    nml++;
if (c >= 'A' && c <= 'Z')
    nwl++;
if (c >= '0' && c <= '9')
    nc++;
if (c==' ' || c =='\t')
    nb++;
if (c=='\n')
    nw++;
}
    printf("Liczba cyfr: %d\n",nml);
    printf("Liczba malych liter: %d\n",nc);
    printf("Liczba duzych liter: %d\n",nwl);
    printf("Liczba bialych znaków: %d\n",nb);
    printf("Liczba wierszy: %d\n",nw);
    printf("Liczba wszystkich znakow: %d\n",nc+nml+nwl+nb+nw);

//printf("\n");
 system("PAUSE");
 return 0;
} 

Pozostało 580 znaków

2014-11-30 12:58
1

c!= EOF
CTRL+Z; Musisz postawić znak końca pliku.

edytowany 1x, ostatnio: spartanPAGE, 2014-11-30 12:59

Pozostało 580 znaków

2014-11-30 13:19
0

EOF jest to znak końca pliku, nie będzie się komponować z getchar(), oprócz tego w czasie wyświetlania pomyliłeś zmienne:


//tak powinno być
    printf("Liczba cyfr: %d\n",nc);
    printf("Liczba malych liter: %d\n",nml);
    printf("Liczba duzych liter: %d\n",nwl);
    printf("Liczba bialych znaków: %d\n",nb);
    printf("Liczba wierszy: %d\n",nw);
    printf("Liczba wszystkich znakow: %d\n",nc+nml+nwl+nb+nw);

Ogólnie to proponuje to zrobić inaczej, stracisz możliwość wyświetlania ilości wierszy, ale wszytko będzie działać, po prostu w czasie wklepywania tekstu, nie wciskaj entera:


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

int main(int argc, char *argv[])
{
    int c=0, nc=0, nml=0, nwl=0, nb=0, nw=0, ns=0;
    fflush (stdin);

    //c=getchar(); ta linijka jest zbędna

    while ((c = getchar ()) && c!= '\n')
    {
        if (c >= 'a' && c <= 'z')
            nml++;
        if (c >= 'A' && c <= 'Z')
            nwl++;
        if (c >= '0' && c <= '9')
            nc++;
        if (c==' ' || c =='\t')
            nb++;
        if (c=='\n')
            nw++;
    }
    printf("Liczba cyfr: %d\n",nc);
    printf("Liczba malych liter: %d\n",nml);
    printf("Liczba duzych liter: %d\n",nwl);
    printf("Liczba bialych znaków: %d\n",nb);
    printf("Liczba wierszy: %d\n",nw);
    printf("Liczba wszystkich znakow: %d\n",nc+nml+nwl+nb+nw);

//printf("\n");
 system("PAUSE");
 return 0;
}
Źle się wyraziłem. Miałem na myśli, że w tym programie nie współgra, bo kolega zakładający temat chce zliczać znaki pobrane z klawiatury, a nie z pliku. - Tomek_z_W11 2014-11-30 13:37
To poczytaj poprzedni post. - _13th_Dragon 2014-11-30 13:46

Pozostało 580 znaków

2014-11-30 13:46
1
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
  {
   int c=0,upper=0,lower=0,digit=0,space=0,lines=0,chars=0;
   while((c=getchar())!=EOF)
     {
      digit+=isdigit(c)?1:0;
      lower+=islower(c)?1:0;
      upper+=isupper(c)?1:0;
      space+=isspace(c)?1:0;
      lines+=(c=='\n');
      ++chars;
     }
   printf("Liczba cyfr: %d\n",digit);
   printf("Liczba malych liter: %d\n",lower);
   printf("Liczba duzych liter: %d\n",upper);
   printf("Liczba bialych znaków: %d\n",space);
   printf("Liczba wierszy: %d\n",lines);
   printf("Liczba wszystkich znakow: %d\n",chars);
   // while(getchar()!='\n') {} - jeżeli potrzebujesz tego wiersza to zmień lepiej IDE na jakieś z tego tysiąclecia.
   return 0;
  }

Można jeszcze tak:

#include <stdio.h>
#include <ctype.h>

int isline(int ch) { return ch=='\n'; }

int main()
  {
   static struct { const char *name; int (*check)(int); size_t count; } Tb[]=
     {
         {"cyfr",&isdigit},
         {"malych liter",&islower},
         {"duzych liter",&isupper},
         {"bialych znaków",&isspace},
         {"wierszy",&isline},
         {"wszystkich znakow",0,0}
     };
   int c,i;
   for(i=0;(c=getchar())!=EOF;++Tb[i].count) for(i=0;Tb[i].check;++i) if(Tb[i].check(c)) ++Tb[i].count;
   for(i=0;i<sizeof(Tb)/sizeof(*Tb);++i) printf("%d - %s\n",Tb[i].count,Tb[i].name);
   return 0;
  }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 2x, ostatnio: _13th_Dragon, 2014-11-30 14:40
A Ty w jakim IDE piszesz, bo na moim Qt Twój program nie działa, pomijając literówke: "lines=0.chars=0" - Tomek_z_W11 2014-11-30 13:53
No może być problem przy niektórych implementacjach, np islower nie musi zwracać 1 w przypadku kiedy to mała litera, wystarczy że zwróci liczbę np 666 - _13th_Dragon 2014-11-30 14:06

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0