Program zliczający litery w zadanym tekście.

0

program ma policzyć ile razy wystąpiły w tekście literki alfabetu. na tą chwilę mam program który zlicza ile razy wystapily w "tekscie" cyfry i musze go po prostu przerobic na wczesniej opisany program. mógłby ktoś troche pokierować? na pewno musze zmienic tablice na 26 elementowa - na razie wystarczy ze program bedzie operowal na malych znakach... i na pewno beda to znaki a nie liczby. jak wykonac zabieg nadpisywania ile razy wystapil konkretny znak? oczywiscie wszystko w C.

#include <stdio.h>

int main()
{
    int cyferki[10] = {0};   
    FILE * plik = fopen("plik.txt", "r"); 

    if(plik)
    {
        char znak;
        do
        {
            znak = fgetc(plik);    
            int cyfra = znak - '0';

            if(cyfra >= 0 && cyfra < 9) ++cyferki[cyfra];

        } while(znak != EOF);

        int i;
        for(i = 0; i < 10; ++i)
            printf("cyfra %d wystapila %d razy\n", i, cyferki[i]);
    }
    else
    {
        printf("plik nie odpowiada\n");
    }
fclose(plik);
    return 0;
}
0

http://msdn.microsoft.com/en-us/library/aa245259%28v=vs.60%29.aspx

jeżeli znak z pliku jest z przedzialow: <zobacz w linku powyżej> to ten znak jest litera.

0

po prostu musisz stworzyć tablice o rozmiarze ilości liter - kolejne komórki tablicy muszą odpowiadać literkom.
Np. jeżeli są to tylko małe litery czyli kody ascii: 97-122 to

robisz to tak dla każdej wczytanej litery:

k = wczytana litera;
tablica[k-97] = tablica[k-97] + 1; //zliczanie.

Potem wypisujesz odpowiednio zawartość tablicy.

0

zwiększ tablicę z 10 do 26 elementów i zamiast '0' odejmuj 'a'.

0

Powinieneś sczytywać dane do inta, nie do chara. Nie masz jak rozróżnić znaku '\xff' od EOF, dodatkowo może być nie przenośne (np. gdy char jest unsigned).

0

heh zacząłem kombinować i chyba troche nie w tym kierunku tzn nie do konca... wygląda to tak: znak a wystapil ś razy. gdzieś coś narobiłem :D

znak b wystapil D razy
znak c wystapil Ó razy
znak d wystapil ` razy
znak e wystapil razy
znak f wystapil ║ razy
znak g wystapil @ razy
znak h wystapil J razy
znak i wystapil î razy
znak j wystapil ▲ razy
znak k wystapil razy
znak l wystapil [ razy
znak m wystapil Č razy
znak n wystapil 2 razy
znak o wystapil Ó razy
znak p wystapil razy
znak q wystapil razy
znak r wystapil ═ razy
znak s wystapil Ó razy
znak t wystapil B razy
znak u wystapil $ razy
znak v wystapil 6 razy
znak w wystapil razy
znak x wystapil ╚ razy
znak y wystapil \ razy
znak z wystapil ^ razy
#include <stdio.h>
#include <stdlib.h>

int main()
{
int cyferki[26] = {97};
FILE * plik = fopen("plik.txt", "r");

if(plik)
{
    char znak;
    do
    {
        znak = fgetc(plik);    
        int cyfra = znak - 'a';

        if(cyfra >= 97 && cyfra < 123) ++cyferki[cyfra];

    } while(znak != EOF);

    char i;
    for(i = 97; i < 123; ++i)
        printf("znak %c wystapil %c razy\n", i, cyferki[i]);
}
else
{
    printf("plik nie odpowiada\n");
}

fclose(plik);
getchar();
return 0;
}

0

znak a wystapil ś razy -nie skopiowałem tego przypadkiem wyzej

0
[...] 
char i;
        for(i = 97; i < 123; ++i)
            printf("znak %c wystapil %c razy\n", i, cyferki[i]);
[...]

Wyjeżdżasz poza zakres tablicy ;> Nie musisz zaczynać od i = 97.
Poza tym jak drukujesz pole cyferki, to czemu używasz %c? Przecież to jakiś int, więc formatuje się go %d.
Tak samo char i; w pętli nie wygląda dobrze - w/g mnie lepiej zostawić inta, a rzutować na chara.

int i;
for(i = 0; i < 26; ++i) printf("znak %c wystapil %d razy\n", (char)(i+97), cyferki[i]);
0

(Dopiero zalogowany, więc sry za podwójny post)

Jak już piszesz

..
    if(plik)
    {
        ...
    }
    else
    {
        ...
    }
fclose(plik);
...

Sprawdzenie ładne, ale lepiej tego f(close) wrzucić w miejscu, gdzie wiemy, że nie jest on nullem tj.

 
..
    if(plik)
    {
        ...
        fclose(plik);
    }
    else
    {
        ...
    }
...
0

po przeróbkach taki efekt :
znak a wystapil 101 ra
znak b wystapil 0 razy
znak c wystapil 0 razy
znak d wystapil 0 razy
znak e wystapil 0 razy
znak f wystapil 0 razy
znak g wystapil 0 razy
znak h wystapil 0 razy
znak i wystapil 1 razy
znak j wystapil 0 razy
znak k wystapil 1 razy
znak l wystapil 2 razy
znak m wystapil 1 razy
znak n wystapil 2 razy
znak o wystapil 2 razy
znak p wystapil 0 razy
znak q wystapil 0 razy
znak r wystapil 0 razy
znak s wystapil 0 razy
znak t wystapil 1 razy
znak u wystapil 0 razy
znak v wystapil 0 razy
znak w wystapil 0 razy
znak x wystapil 0 razy
znak y wystapil 0 razy
znak z wystapil 0 razy

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

int main()
{
int cyferki[26] = {'a'};
FILE * plik = fopen("plik.txt", "r");

if(plik)
{
    char znak;
    do
    {
        znak = fgetc(plik);    
        int cyfra = znak - 'a';

        if(cyfra >= 0 && cyfra < 26) ++cyferki[cyfra];

    } while(znak != EOF);

    int i;
    for(i = 0; i < 26; ++i)
        printf("znak %c wystapil %d razy\n", (char)(i+97), cyferki[i]);
}
else
{
    printf("plik nie odpowiada\n");
}

fclose(plik);
getchar();
return 0;
}

zapomniałem o najważniejszym :D literka a nie wystapila w tekscie 101 razy "ra"

gdy w pliku wejsciowym umieszcze tylko literke "a" po zliczeniu program pokazuje wynik a wystapil 98 razy

aaa juz znalazlem blad
int cyferki[26] = {'a'}; zamienilem na int cyferki[26] = {0};
i po problemie - zerowanie?

aa i oczywiscie dzieki Panowie za pomoc :)

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