C语言统计大写字母个数,这个程序能不能给我超级的详细解析呀


#include"stdio.h"
main(void)
{
    int n[26],i;
    char ch;
    for(i=0;i<26;i++)
    n[i]=0;
    while((ch=getchar())!='\n')
    {
        if(ch>='A'&&ch<='Z')
        n[ch-65]+=1;
    }
    for(i=0;i<26;i++)
    if(n[i]!=0)
    printf("%c,%d\n",i+65,n[i]);
}
输入:AAAASSSDDDFFF
运行结果:
A,4
D,3
F,3
S,3
请按任意键继续. . .


供参考:

#include"stdio.h"
main(void)
{
    int n[26],i;
    char ch;
    for(i=0;i<26;i++)//循环 n[0] -- n[25] 数组初始化值为 0
    n[i]=0;
    while((ch=getchar())!='\n')//循环读入一个字符赋值给 ch ,直到读入'\n'回车换行符时退出循环
    {
        if(ch>='A'&&ch<='Z')//对读入的字符进行判断,是否是大写的字母,判断区间 'A' --- 'Z'之间
        n[ch-65]+=1;//ch-65等价于 ch-'A',字符'A'的ascii值为65,类推'Z'的值为65+25=90
    }               //n[ch-65] 如果读入的ch='A',n['A'-65]=n[0],类推'Z'时,n['Z'-65]=n[25]
    for(i=0;i<26;i++)
    if(n[i]!=0)     //当n[i]的值不为0 时输出
    printf("%c,%d\n",i+65,n[i]);// i=0时,i+65=65='A',输出字符 A,n[0]的值
                                // i=3时,i+65=68='D',输出字符 D,n[3]的值
                                //以此类推,输出n[i]!=0时的字符 和 个数值。
}


统计大写字母的个数,你要了解怎么实现则会个逻辑,你需要知道的知识点有以下:
1:A-Z总共有26个字母
2:我们定义一个char,底层其实是数字,按照ASSII码表进行存储的,这里在处理一个字符时,也是要根据这个码表中对应的值进行处理的。
3:字符是可以用数字标表示的,其实就是ASSII表查的,(例如你定义char a = 65 和char a='A'是一样的)

这里实现这个业务的逻辑就是:
1:使用长度位26数组标识大写字母A-Z每个对应的个数(定义存储变量)
2:查询以下ASSII码表 我们知道A-Z对应的实际底层存储的是 65-90
3:循环提取每个字符,判断该字符是否是大写字符,如果是则在对应存储为+1.
A B C D 。。。。Z
65 66 67 68 ... 90

n数组来存储每个字符对应的个数,数组从零开始,是不是A字符对应0,B字符对应1,。。。。Z字符对应90-65....
4:最终遍历我们的目标数组,按下标+65标识原字符,以及输出对应数组位。

#include"stdio.h"
int main(void)
{
    int n[26],i;
    char ch;
    for(i=0;i<26;i++) //初始化 26个位置存储A-Z每个字符的个数
    {
        n[i]=0;
    }
    
    while((ch=getchar())!='\n') //循环提取每个字符进行判断  判断这个字符是否是大写
    {
        if(ch>='A'&&ch<='Z')  //满足条件 则在对应下标下进行+1
        {
            n[ch-65]+=1; //有26个字符,数组下标0~26,对应大写字符A-Z()65~90
                //这里去搜索以下ASSII码表,查一下A-Z对应的十进制值
        }
    }
    for(i=0;i<26;i++) //根据数组下标 反推原字符及对应的个数
    {
        if(n[i]!=0)  //该字符数不为0
                printf("%c,%d\n",i+65,n[i]); //下标+差值(65) 输出个数
    }
    return 0;
}