黑马程序员技术交流社区

标题: c语言如何实现该问题呢? [打印本页]

作者: 黑马IT男    时间: 2014-3-24 10:28
标题: c语言如何实现该问题呢?
从键盘输入一大堆字符串,统计A、B、C、D的出现次数,最后出现次数由高到低输出字母和出现次数?
作者: 沙洲冷    时间: 2014-3-24 10:53
这是基础测试的一道题吧?我的基础测试题里面也有这道题。下面是我自己写的,仅供参考。#include <stdio.h> void main() {         int i,j;         int countA,countB,countC,countD=0;         char* s;         gets(s);         for(i=0;s[i]!='\0';i++)         {                 switch(s[i])                 {                         case 'A': countA++;break;                         case 'B': countB++;break;                         case 'C': countC++;break;                         case 'D': countD++;break;                         default: break;                 }         }         int a[4]={countA,countB,countC,countD};         for(i=0;i<4;i++)         {                 for(j=0;j<4-i;j++)                 {                         if(a[j]<a[i])                         {                                 int temp;                                 temp=a[j];                                 a[j]=a[j+1];                                 a[j+1]=temp;                         }                 }         }         for(i=0;i<4;i++)         {                 printf("%d",a[i]);         } }
作者: 沙洲冷    时间: 2014-3-24 10:54
怎么复制下来变成这个格式了,不好意思哈。
作者: FlyTrem    时间: 2014-3-24 11:01
本帖最后由 FlyTrem 于 2014-3-24 11:02 编辑
  1. #include<stdio.h>//调用printf函数需要声明的头文件
  2. #include<string.h>//调用strlen函数需要声明的头文件

  3. int main()
  4. {
  5.         int i=0, j = 0, m = 0, n = 0, k;//定义整型变量i,j,m,n,k,并将0赋给i,j,m,n。
  6.         char a[100];//定义字符串

  7.         //定义结构体,结构体的成员有整型number和字符型zifu
  8.         struct Tongji
  9.         {
  10.                 int number;
  11.                 char zifu;

  12.         };
  13.         printf("请输入字符串");
  14.         
  15.         gets(a);
  16.         
  17.         for (k = 0; k < strlen(a); k++)//遍历字符串a[]中所有的字符
  18.         {
  19.                 if (a[k] == 'A')//如果是字符A则i自加
  20.                         i++;
  21.                 if (a[k] == 'B')//如果是字符B则j自加
  22.                         j++;
  23.                 if (a[k] == 'C')//如果是字符C则m自加
  24.                         m++;
  25.                 if (a[k] == 'D')//如果是字符D则n自加
  26.                         n++;
  27.         }
  28.         //分别见各字母和出现的次数赋给结构体内的各变量
  29.         struct Tongji d1 = { i, 'A' };
  30.         struct Tongji d2 = { j, 'B' };
  31.         struct Tongji d3 = { m, 'C' };
  32.         struct Tongji d4 = { n, 'D' };
  33.         struct Tongji d5 = { 1, 'z' };
  34.         
  35.         //以下所有if语句是用来判断大小和进行排序
  36.         if (d1.number < d2.number)
  37.         {
  38.                 d5 = d1;
  39.                 d1 = d2;
  40.                 d2 = d5;
  41.         }
  42.         if (d1.number < d3.number)
  43.         {
  44.                 d5= d1;
  45.                 d1 = d3;
  46.                 d3 = d5;
  47.         }
  48.         if (d1.number < d4.number)
  49.         {
  50.                 d5 = d1;
  51.                 d1 = d4;
  52.                 d4 = d5;
  53.         }
  54.         if (d2.number < d3.number)
  55.         {
  56.                 d5 = d2;
  57.                 d2 = d3;
  58.                 d3 = d5;
  59.         }
  60.         if (d2.number < d4.number)
  61.         {
  62.                 d5 = d2;
  63.                 d2 = d4;
  64.                 d4 = d5;
  65.         }
  66.         if (d3.number < d4.number)
  67.         {
  68.                 d5 = d3;
  69.                 d3 = d4;
  70.                 d4 = d5;
  71.         }
  72.         //分别对结构体中的内容进行输出
  73.         printf("字母%c出现%d次\n", d1.zifu, d1.number);
  74.         printf("字母%c出现%d次\n", d2.zifu, d2.number);
  75.         printf("字母%c出现%d次\n", d3.zifu, d3.number);
  76.         printf("字母%c出现%d次\n", d4.zifu, d4.number);
  77.         
  78.         return 0;//结束函数
  79. }
复制代码

我自己写的一个代码很繁琐,希望有帮助!!也可以自己精简一下!相互学习!!
作者: 黑马IT男    时间: 2014-3-24 11:26
沙洲冷 发表于 2014-3-24 10:54
怎么复制下来变成这个格式了,不好意思哈。

哥们,这确实是测试基础题,呵呵:)我才接触不多久,问下,带着问题去看视频学习
作者: 黑马IT男    时间: 2014-3-24 11:27
FlyTrem 发表于 2014-3-24 11:01
我自己写的一个代码很繁琐,希望有帮助!!也可以自己精简一下!相互学习!! ...

谢谢啦,哥们你用心啦,非常感谢你,大家一起学习。
作者: 沙洲冷    时间: 2014-3-24 11:39
呵呵,我也是刚提交了基础测试,现在也正在看视频,刷技术分呢,加油哈!希望我们都能进入黑马!
作者: 程浩    时间: 2014-3-24 12:01
我暂时没用mac
先给个思路吧:
1.通过判断输入为\n时跳出while循环
2.创建一个二维字符数组char A[][]---A[0]存放输入的字符串,A[1]放对应字符次数
创建一个指针数组 char *B[]=A[1](可以更改字符次数)
3.每输入一个字符时,判断A[0]中是否存在,若存在则不存入A[0],并且找到存在的A[0][j],更改A[1][j]加1
4.上面是统计了每一个字符的输入次数。
5.排序的话,冒泡啊,快速排序啊,很快搞定
:lol
作者: 胡永城    时间: 2014-3-24 13:34
  1. //读取键盘输入的一串字符,统计每个字符输出的次数,按照一定格式输出
  2. #include <stdio.h>

  3. //借鉴Java的Map思想,存储键值对,char-int 对应 字符-次数
  4. struct Map
  5. {
  6.     char ch;
  7.     int num;
  8. };
  9. int main()
  10. {
  11.     //键值对集合,
  12.     struct Map mapchar[20];
  13.    
  14.     //i表示总共读取多少不同的字符
  15.     int i = 0;
  16.     char ch;
  17.    
  18.     //读取第一个字符
  19.     ch=getchar();
  20.     mapchar[i].ch = ch;
  21.     mapchar[i].num = 1;
  22.    
  23.     //控制是否进行次数+1操作的标号
  24.     int b = 1;
  25.    
  26.     //循环读取其后的字符
  27.     while((ch=getchar())!='\n')
  28.     {
  29.         for(int j=0; j<=i; j++)
  30.         {
  31.             //若键值对集合中有则次数+1,标号为假
  32.             if(ch==mapchar[j].ch)
  33.             {
  34.                 b = 0;
  35.                 mapchar[j].num++;
  36.                 break;
  37.             }
  38.             //若没有,设置标号为真
  39.              b = 1;
  40.         }
  41.         
  42.         if(!b)
  43.             continue;
  44.         
  45.         //标号为真,读取字符,次数为1
  46.         i++;
  47.         mapchar[i].ch = ch;
  48.         mapchar[i].num = 1;
  49.     }
  50.    
  51.     //先输出一次没有排序的
  52.     for(int m=0; m<=i; m++)
  53.     {
  54.         printf("%c(%d)", mapchar[m].ch, mapchar[m].num);
  55.     }
  56.    
  57.     printf("\n\n");
  58.    
  59.     //排序
  60.     for(int m=0; m<i; m++)
  61.     {
  62.         for(int n=0; n<i-m; n++)
  63.         {
  64.             if(mapchar[n].num < mapchar[n+1].num)
  65.             {
  66.                 struct Map temp;
  67.                 temp = mapchar[n+1];
  68.                 mapchar[n+1] = mapchar[n];
  69.                 mapchar[n] = temp;
  70.             }
  71.         }
  72.     }
  73.    
  74.     //输出排序后的
  75.     for(int m=0; m<=i; m++)
  76.     {
  77.         printf("%c(%d)", mapchar[m].ch, mapchar[m].num);
  78.     }
  79.    
  80.     printf("\n\n");
  81.    
  82.     return 0;
  83. }
复制代码



作者: 黑马IT男    时间: 2014-3-24 15:33
胡永城 发表于 2014-3-24 13:34

非常感谢用心的问答,大神谢谢!
作者: sabjiang    时间: 2014-4-26 16:38
还是比较习惯用C#里的字典,一直没找到C语言里对应的东东,原来是这么干的,受教了
作者: gaoxinglei123    时间: 2014-4-26 17:52
  1. /**
  2. * 测试题8:统计ABCD出现的次数 并按顺序从高到低输出字母和出现的次数
  3. */

  4. #include <stdio.h>

  5. int main()
  6. {
  7.     int a=0,b=0,c=0,d=0;//分别对应 A,B,C,D的出现次数
  8.     int i=0,j=0;
  9.     int arr[4];
  10.         char abcd[] = {'A','B','C','D'}; //为了防止 当出现次数相同时 无法区分
  11.     char s[1000]; //接收字符串存入数组

  12.         printf("请输入字符串:");
  13.     gets(s);

  14.     //首先计算字母出现的次数
  15.     while(s[i])
  16.     {
  17.         if(s[i]=='A')
  18.             {
  19.                 a++;
  20.             }
  21.         else if(s[i]=='B')
  22.             {
  23.                 b++;
  24.             }
  25.         else if(s[i]=='C')
  26.             {
  27.                 c++;
  28.             }
  29.         else if(s[i]=='D')
  30.             {
  31.                 d++;
  32.             }
  33.         i++;
  34.     }

  35.     //将次数存入数组
  36.     arr[0]=a;
  37.     arr[1]=b;
  38.     arr[2]=c;
  39.     arr[3]=d;
  40.     printf("字母和次数从高到低分别是:\n");

  41.     //对数组进行从大到小的排序,并根据次数来判断字母的顺序
  42.     //冒泡排序 每次循环把最大的依次放在0,1,2,3位置
  43.     for(i=0; i<4; i++)
  44.     {
  45.         for(j=i+1;j<4;j++)
  46.             {
  47.             if(arr[j]>arr[i])
  48.                     {
  49.                 int temp = arr[j];
  50.                 arr[j] = arr[i];
  51.                 arr[i] = temp;
  52.                     }
  53.             }

  54.         //通过次数来判别是哪个字母 并输出 a[i]顺序是从大到小
  55.                 //当数量==a,并且A未被排序
  56.         if((arr[i]==a)&&abcd[0])
  57.             {
  58.             printf("%c\t%d\n",'A',a);
  59.                         abcd[0]=0; //当A已经被排好序后 不能再出现A
  60.             }
  61.         else if((arr[i]==b)&&abcd[1])
  62.             {
  63.             printf("%c\t%d\n",'B',b);
  64.                         abcd[1]=0;
  65.             }
  66.         else if((arr[i]==c)&&abcd[2])
  67.             {
  68.             printf("%c\t%d\n",'C',c);
  69.                         abcd[2]=0;
  70.             }
  71.         else if((arr[i]==d)&&abcd[3])
  72.             {
  73.             printf("%c\t%d\n",'D',d);
  74.                         abcd[3]=0;
  75.             }
  76.     }

  77.         return 0;
  78. }
复制代码


哈哈。给你我的方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2