鱼C论坛

 找回密码
 立即注册
查看: 4004|回复: 13

一道C语言的编程题

[复制链接]
发表于 2017-8-5 10:54:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:编写一个用来统计输入的各个数字,空白符(空格,制表符,换行符),以及所有其他字符出现的次数的程序,要求用函数编写。
改了几次都是错的。。实在是找不出来原因了,求大家指导一下。
  1. #include <stdio.h>
  2. int main()
  3. {
  4.         int num[10]={0};
  5.         int blank(int x);
  6.         int others(int y);
  7.         int i,c,a=0,b=0;
  8.         int Q=0,W=0,E=0,R=0,T=0,Y=0,U=0,I=0,O=0,P=0;
  9.         //定义所有变量;

  10.         printf("Please input a string:\n");

  11.         //计算0~9出现的频率,并将其分别赋值给数组num;
  12.         while(c=getchar()!='\n')                                               
  13.         {
  14.                 if(c=='0') Q++;
  15.                 if(c=='1') W++;
  16.                 if(c=='2') E++;
  17.                 if(c=='3') R++;
  18.                 if(c=='4') T++;
  19.                 if(c=='5') Y++;
  20.                 if(c=='6') U++;
  21.                 if(c=='7') I++;
  22.                 if(c=='8') O++;
  23.                 if(c=='9') P++;
  24.                 num[0]=Q;
  25.             num[1]=W;
  26.                 num[2]=E;
  27.                 num[3]=R;
  28.                 num[4]=T;
  29.                 num[5]=Y;
  30.                 num[6]=U;
  31.                 num[7]=I;
  32.                 num[8]=O;
  33.                 num[9]=P;
  34.         }

  35.         //输出各类字符的个数;
  36.         for(i=0;i<=9;i++)                                                       
  37.         {
  38.                 printf("%d的个数为%d\n",i,num[i]);
  39.         }
  40.         printf("空白符的个数为%d\n",blank(a));
  41.         printf("其他字符的个数为%d\n",others(b));
  42.    
  43.         return 0;
  44. }

  45. //输出空白符的个数的函数;
  46. int blank(int x)                                                               
  47. {
  48.         int c,A=0,S=0,sum=0;
  49.         while(c=getchar()!='\n')
  50.         {
  51.                 if(c==' ') A++;
  52.                 if(c==9) S++;
  53.         }
  54.         sum=A+S;

  55.         return sum;
  56. }

  57. //输出其他字符的个数的函数;
  58. int others(int y)                                                               
  59. {
  60.         int c,m;
  61.         while(c=getchar()!='\n')
  62.         {
  63.                 if(c!='0'&&c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7'&&c!='8'&&c!='9'&&c!=' '&&c!=9)
  64.                         m++;
  65.         }

  66.         return m;
  67. }
复制代码



以下是我运行的结果:
6X~490C5IXX[EJ(~8)EX0)X.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-5 12:23:26 From FishC Mobile | 显示全部楼层
本帖最后由 xjy99 于 2017-8-5 19:20 编辑

1,getchar()!='\n'的值应该是0或1,所以c被赋值为1
2,按照你的这种算法,数字空格其他三项必须并联
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 12:36:49 | 显示全部楼层
给你个参考代码:
  1. #include <stdio.h>

  2. #define ASCIILEN 126

  3. void countNum(char str[], int count[126][2]);

  4. int main(void)
  5. {
  6.         char str[100] = {'\0'};
  7.         int count[ASCIILEN][2] = {0};
  8.         int i;
  9.        
  10.         for(i=0; i < ASCIILEN; i++)
  11.         {
  12.                 count[i][0] = i;
  13.         }

  14.         printf("请输入一串字符串:");

  15.         i = 0;
  16.         while((str[i]=getchar())!='\n')                                                
  17.     {
  18.                 i++;
  19.         }

  20.         countNum(str, count);

  21.         for(i=0; i<126; i++)
  22.         {
  23.                 if (count[i][1] != 0)
  24.                 {
  25.                         printf("%c -> %d\n", count[i][0], count[i][1]);
  26.                 }
  27.         }

  28.         return 0;
  29. }

  30. void countNum(char str[], int count[126][2])
  31. {
  32.         int i, j;

  33.         for (i = 0; i <= ASCIILEN ;i++)
  34.         {
  35.                 for (j = 0; j <= 200; j++)
  36.                 {
  37.                         if(str[j]=='\0')
  38.                                 break;
  39.                
  40.                         if (count[i][0] == str[j])
  41.                         {
  42.                                 count[i][1]++;
  43.                         }
  44.                 }
  45.         }
  46. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-5 17:33:33 | 显示全部楼层
本帖最后由 xjy99 于 2017-8-7 21:03 编辑
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     void count();
  5.     count();
  6.    
  7.         return 0;
  8. }
  9. void count()
  10. {
  11.         int num[10]={0};
  12.         int i,c,a=0,b=0;
  13.         int Q=0,W=0,E=0,R=0,T=0,Y=0,U=0,I=0,O=0,P=0;
  14.                 int sum=0,A=0,S=0;
  15.                 int m=0;
  16.       

  17.         printf("Please input a string:\n");

  18.       
  19.         while((c=getchar())!='\n')     //注意()                                          
  20.         {
  21.                 if(c=='0') Q++;
  22.                 if(c=='1') W++;
  23.                 if(c=='2') E++;
  24.                 if(c=='3') R++;
  25.                 if(c=='4') T++;
  26.                 if(c=='5') Y++;
  27.                 if(c=='6') U++;
  28.                 if(c=='7') I++;
  29.                 if(c=='8') O++;
  30.                 if(c=='9') P++;
  31.                 num[0]=Q;
  32.             num[1]=W;
  33.                 num[2]=E;
  34.                 num[3]=R;
  35.                 num[4]=T;
  36.                 num[5]=Y;
  37.                 num[6]=U;
  38.                 num[7]=I;
  39.                 num[8]=O;
  40.                 num[9]=P;
  41.                 if(c==' ') A++;
  42.                 if(c==9) S++;
  43.         
  44.                 sum=A+S;//10和11呢?

  45.                 if(c!='0'&&c!='1'&&c!='2'&&c!='3'&&c!='4'&&c!='5'&&c!='6'&&c!='7'&&c!='8'&&c!='9'&&c!=' '&&c!=9)
  46.                         m++;
  47.         
  48.         }

  49.   
  50.         for(i=0;i<=9;i++)                                                        
  51.         {
  52.                 printf("%d的个数为%d\n",i,num[i]);
  53.         }
  54.         printf("空白符的个数为%d\n",sum);
  55.         printf("其他字符的个数为%d\n",m);
  56. }
复制代码


怎么现在都流行甩代码。。。那我也甩一个。。。
把你的稍微改了一下

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 21:16:56 | 显示全部楼层
ba21 发表于 2017-8-5 12:36
给你个参考代码:

不好意思大神。。我有点看不懂你这个。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-6 21:26:46 | 显示全部楼层
xjy99 发表于 2017-8-5 12:23
1,getchar()!='\n'的值应该是0或1,所以c被赋值为1
2,按照你的这种算法,数字空格其他三项必须并联

额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻烦您再讲一下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-6 22:03:01 | 显示全部楼层
沧海雨季 发表于 2017-8-6 21:16
不好意思大神。。我有点看不懂你这个。。。

编写一个用来统计输入的各个数字,空白符(空格,制表符,换行符),以及所有其他字符出现的次数的程序,要求用函数编写

就这句话来讲,你的代码肯定是实现不了吧。 除了 空白符(空格,制表符,换行符) 一起统计,其它的各个字符都单独统计。
ascii码表中总共就126个字符。这样提示能看得懂我上的代码了不。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 01:32:55 | 显示全部楼层
14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 01:34:30 | 显示全部楼层
14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();
          while(c != '\n')
          {.........
            c = getchar();
          }
这样就能识别你输入的字符了,原因是getchar()从缓冲区读取数据;
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 01:49:27 | 显示全部楼层
起了很久的名字 发表于 2017-8-7 01:34
14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();

我又试了一下,其实只要你14行在c=getchar()外面再加上一个括号,就能正常运行了。
这属于一种比较好的编程习惯,计算输入空格和其他字符的函数也写在while循环里面就好了,你这样写是代表用户需要重新输入的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 02:25:22 | 显示全部楼层
起了很久的名字 发表于 2017-8-7 01:49
我又试了一下,其实只要你14行在c=getchar()外面再加上一个括号,就能正常运行了。
这属于一种比较好的 ...

while(c=getchar() != '\n')是先比较字符等不等于回车,然后把比较的结果赋值给c,在不等于回车的情况下,c会一直等于1,这个1对应的ASCII码表中的一个笑脸。
while((c = getchar()) != '\n')是先把读取到的字符赋值给c然后在比较是不是等于回车。
ascii码表自己查一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 12:50:12 From FishC Mobile | 显示全部楼层
沧海雨季 发表于 2017-8-6 21:26
额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻 ...

你那一点的哪一个词不清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 13:03:02 From FishC Mobile | 显示全部楼层
本帖最后由 xjy99 于 2017-8-7 13:57 编辑
沧海雨季 发表于 2017-8-6 21:26
额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻 ...


算了,
我刚刚看了下其他前辈的回复,

**首先**
实际上我已经在代码中标注"注意括号",关于这点,11楼说的很详细了,如果还不明白。你自己翻书:逻辑表达式的值以及赋值运算符和逻辑运算符的优先顺序

**其次**
7楼正解,但是应该算是另一种方法了,若你只想完成解答,参见7楼,把ta的代码改改就行了,若想找出你自己错误,参见11楼和我的代码

其实这里已经没有我什么事了~

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-7 13:53:53 From FishC Mobile | 显示全部楼层
ba21 发表于 2017-8-5 12:36
给你个参考代码:

最多能输入字符的个数是?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 06:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表