Rozwiązanie za pomocą wielu wyrażeń warunkowych jest bardzo czasochłonne i nie efektywne. Wykorzystał bym fakt że każdy znak w komputerze ma jakiś swój unikalny numer. Weźmy np. kodowanie ASCII tam literze a przypisuje się numer 97 zaś litera A kodowana jest jako liczba 65. Jeśli chciałbyś zliczać wszystkie znaki z ASCII to musiał byś stworzyć tablicę 256 elementów wypełnioną zerami. Indeks tej tablicy odpowiadał by numerowi znaku z ASCII. Zaś wartość jaka była by pod danym indeksem to jest liczba ile razy dany znak się powtórzył.
W twoim przypadku, jeśli chcesz zliczać tylko litery to wystarczyła by ci tablica 26 element-owa. Ewentualnie dwie tablicy jeśli chciałbyś rozróżniać czy to jest mała czy duża litera. Przykładowy kod realizujący takie zliczanie dostępny jest poniżej:
#include <stdio.h>
int main()
{
char * nazwa="plik.txt";
FILE *plik=fopen(nazwa,"r");
int alfabet_duzy[26]={0};
int alfabet_maly[26]={0};
if(plik!=NULL)
{
char znak;
while((znak=fgetc(plik))!=EOF)
{
if(znak>='A' && znak<='Z')
{
alfabet_duzy[znak-'A']++;
}
else if(znak>='a' && znak<='z')
{
alfabet_maly[znak-'a']++;
}
}
fclose(plik);
printf("Litery male:\n");
for(int i=0;i<26;i++)
{
if(alfabet_maly[i]!=0)
{
printf("%c:%d\n",i+'a',alfabet_maly[i]);
}
}
printf("\nLitery duze:\n");
for(int i=0;i<26;i++)
{
if(alfabet_duzy[i]!=0)
{
printf("%c:%d\n",i+'A',alfabet_duzy[i]);
}
}
}
else
{
printf("Problem z plikiem!!!\n");
return 1;
}
return 0;
}