沧海雨季 发表于 2017-8-5 10:54:42

一道C语言的编程题

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

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

        //计算0~9出现的频率,并将其分别赋值给数组num;
        while(c=getchar()!='\n')                                               
        {
                if(c=='0') Q++;
                if(c=='1') W++;
                if(c=='2') E++;
                if(c=='3') R++;
                if(c=='4') T++;
                if(c=='5') Y++;
                if(c=='6') U++;
                if(c=='7') I++;
                if(c=='8') O++;
                if(c=='9') P++;
                num=Q;
          num=W;
                num=E;
                num=R;
                num=T;
                num=Y;
                num=U;
                num=I;
                num=O;
                num=P;
        }

        //输出各类字符的个数;
        for(i=0;i<=9;i++)                                                       
        {
                printf("%d的个数为%d\n",i,num);
        }
        printf("空白符的个数为%d\n",blank(a));
        printf("其他字符的个数为%d\n",others(b));
   
        return 0;
}

//输出空白符的个数的函数;
int blank(int x)                                                               
{
        int c,A=0,S=0,sum=0;
        while(c=getchar()!='\n')
        {
                if(c==' ') A++;
                if(c==9) S++;
        }
        sum=A+S;

        return sum;
}

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

        return m;
}


以下是我运行的结果:

xjy99 发表于 2017-8-5 12:23:26

本帖最后由 xjy99 于 2017-8-5 19:20 编辑

1,getchar()!='\n'的值应该是0或1,所以c被赋值为1
2,按照你的这种算法,数字空格其他三项必须并联

ba21 发表于 2017-8-5 12:36:49

给你个参考代码:
#include <stdio.h>

#define ASCIILEN 126

void countNum(char str[], int count);

int main(void)
{
        char str = {'\0'};
        int count = {0};
        int i;
       
        for(i=0; i < ASCIILEN; i++)
        {
                count = i;
        }

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

        i = 0;
        while((str=getchar())!='\n')                                                
    {
                i++;
        }

        countNum(str, count);

        for(i=0; i<126; i++)
        {
                if (count != 0)
                {
                        printf("%c -> %d\n", count, count);
                }
        }

        return 0;
}

void countNum(char str[], int count)
{
        int i, j;

        for (i = 0; i <= ASCIILEN ;i++)
        {
                for (j = 0; j <= 200; j++)
                {
                        if(str=='\0')
                                break;
               
                        if (count == str)
                        {
                                count++;
                        }
                }
        }
}

xjy99 发表于 2017-8-5 17:33:33

本帖最后由 xjy99 于 2017-8-7 21:03 编辑

#include <stdio.h>
int main()
{
    void count();
    count();
   
      return 0;
}
void count()
{
      int num={0};
      int i,c,a=0,b=0;
      int Q=0,W=0,E=0,R=0,T=0,Y=0,U=0,I=0,O=0,P=0;
                int sum=0,A=0,S=0;
                int m=0;
      

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

      
      while((c=getchar())!='\n')   //注意()                                          
      {
                if(c=='0') Q++;
                if(c=='1') W++;
                if(c=='2') E++;
                if(c=='3') R++;
                if(c=='4') T++;
                if(c=='5') Y++;
                if(c=='6') U++;
                if(c=='7') I++;
                if(c=='8') O++;
                if(c=='9') P++;
                num=Q;
            num=W;
                num=E;
                num=R;
                num=T;
                num=Y;
                num=U;
                num=I;
                num=O;
                num=P;
                if(c==' ') A++;
                if(c==9) S++;
      
                sum=A+S;//10和11呢?

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


      for(i=0;i<=9;i++)                                                      
      {
                printf("%d的个数为%d\n",i,num);
      }
      printf("空白符的个数为%d\n",sum);
      printf("其他字符的个数为%d\n",m);
}


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

沧海雨季 发表于 2017-8-6 21:16:56

ba21 发表于 2017-8-5 12:36
给你个参考代码:

不好意思大神。。我有点看不懂你这个。。。{:10_266:}

沧海雨季 发表于 2017-8-6 21:26:46

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

额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻烦您再讲一下吗

ba21 发表于 2017-8-6 22:03:01

沧海雨季 发表于 2017-8-6 21:16
不好意思大神。。我有点看不懂你这个。。。

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

就这句话来讲,你的代码肯定是实现不了吧。 除了 空白符(空格,制表符,换行符) 一起统计,其它的各个字符都单独统计。
ascii码表中总共就126个字符。这样提示能看得懂我上的代码了不。

起了很久的名字 发表于 2017-8-7 01:32:55

14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();

起了很久的名字 发表于 2017-8-7 01:34:30

14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();
          while(c != '\n')
          {.........
            c = getchar();
          }
这样就能识别你输入的字符了,原因是getchar()从缓冲区读取数据;

起了很久的名字 发表于 2017-8-7 01:49:27

起了很久的名字 发表于 2017-8-7 01:34
14行:c = getchar() 这个语句要分开写;
写成:
          c = getchar();


我又试了一下,其实只要你14行在c=getchar()外面再加上一个括号,就能正常运行了。
这属于一种比较好的编程习惯,计算输入空格和其他字符的函数也写在while循环里面就好了,你这样写是代表用户需要重新输入的

起了很久的名字 发表于 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码表自己查一下。

xjy99 发表于 2017-8-7 12:50:12

沧海雨季 发表于 2017-8-6 21:26
额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻 ...

你那一点的哪一个词不清楚

xjy99 发表于 2017-8-7 13:03:02

本帖最后由 xjy99 于 2017-8-7 13:57 编辑

沧海雨季 发表于 2017-8-6 21:26
额。。抱歉,这两句话都不大懂。。然后我将您下面的那个代码和我自己的比较了一下,我还是不大懂。。能麻 ...

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

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

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

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

xjy99 发表于 2017-8-7 13:53:53

ba21 发表于 2017-8-5 12:36
给你个参考代码:

最多能输入字符的个数是?
页: [1]
查看完整版本: 一道C语言的编程题