Powodem niedziałania programu są złe warunki:
- Na przykład zapis
'A'< ch <'Z'
w realiach języka C nie ma większego sensu. Wg kolejności wykonywania, wyrażenia z operatorami < są ewaluowane od lewej do prawej, gdzie operator < ma dwa argumenty (operandy). Oznacza to, że wyrażenie 'A' < ch, dla ch równego 'B', będzie prawdą, a 1 < 'Z' będzie również prawdą. Dla ch równego 'b', wyrażenie 'A' < ch będzie prawdą, a 1 < 'Z' również będzie prawdą. Oznacza to mniej więcej, że drugi if, po else, nigdy się nie wykona, nawet jeśli 'A' < ch byłoby fałszem, gdyż 0 < 'Z' też jest prawdą.
-
Zakresy powinny być zamknięte, ponieważ nie uwzględniasz liter skrajnych.
W ogólnym rozrachunku, kod powinien wyglądać mniej więcej tak:
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
char ch;
int litery_male=0;
int litery_duze=0;
int inne_znaki=0;
FILE *fp;
char nazwa[50];
printf("Podaj nazwe pliku: ");
scanf("%s",nazwa);
fp=fopen(nazwa,"r");
if(fp==NULL){
printf("BLAD");
exit(1);
}
while((ch=fgetc(fp))!=EOF){
if('A' <= ch && ch <= 'Z'){
litery_duze++;
}
else if('a' <= ch && ch <= 'z'){
litery_male++;
}
}
printf("%d malych liter, %d duzych liter, %d innych znakow",litery_male,litery_duze,inne_znaki);
fclose(fp);
return 0;
}