c语言求教!需要详细解答!

17.统计从终端输入的字符中每个大写字母的个数。用#号作为输入结束标志,请填空。

#include 〈stdio.h〉

#include 〈ctype.h〉
void main( )
{
   int num[26],i; 

   char c,*p=&c;

   for(i=0; i<26; i++)  num[i]=0;

   while( ( ① =getchar())!=‘#‘)   /* 统计从终端输入的大写字母个数 */

      if(isupper(*p)) ② ;

   for(i=0;i<26;i++)               /* 输出大写字母和该字母的个数 */

      if(num[i]) printf("%c: %d\n", i+’A‘, ③ );

}
A.① c ② num[i]++ ③ num[i]
B.① c ② num[c-'A']++ ③ num[i]
C.① p ② num[c-'A']++ ③ num[i]
D.① *p ② num[i]++ ③ num[i]

本题需弄清楚的是数组num的下标问题,从最后的输出:
for(i=0;i<26;i++) /* 输出大写字母和该字母的个数 */
if(num[i]) printf("%c: %d\n", i+’A‘, ③ );
可以看出,num[i]中的i的取值范围是0-25,也就是说,num[0]内存的是字母‘A’的个数,num[1]内存的是字母‘B’的个数,......,以此类推。我们就会发现,num下标变量i和字符变量c作下标时的对应压关系,应该是每一个具体的i的值对应c-'A',我们暂时称之为“结论1”。
这样,也就不难看出,③的内容应该是字母表中‘A’后第i个字母的个数,也就是num[i]。
另外需要弄清楚的是变量c和p,
根据定义:char c,*p=&c;我们很容易知道:c是字符变量,而p是指针变量,且指向变量c的地址,也就是*p的值就是变量c的值。我们暂时称之为“结论2”。
由 while( ( ① =getchar())!=‘#‘) /* 统计从终端输入的大写字母个数 */
因为getchar()的返回值是一个字符,我们暂时称之为“结论3”。①处可以填入的内容就应该是 c 或者 *p(两种写法均可,但不能是 p,因为p是指针,存的是地址,而不是字符 ) 。
再由if(isupper(*p)) ② ;
我们可以知道,此处应该是对输入的字符进行统计(num做加1运算),我们暂时称之为“结论4”。
再综合“结论1”和“结论4”,我们就会得出②处应该是: num[c-'A']++。
综上所述,答案为B
温馨提示:答案为网友推荐,仅供参考
第1个回答  2017-12-27
B正确,选B。
① c——把输入的字符赋给c
② num[c-'A']++——在if(isupper(*p))成立时c-'A'即是大写字母的顺序下标
③ num[i]——i==0时num[0]是'A'的个数,依此类推。这一项4个选项一样,所以实际上此题只有①②两个判断
相似回答