免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3099 | 回复: 14
打印 上一主题 下一主题

写个专家的题目,让大家批批 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-11 16:36 |只看该作者 |倒序浏览
本帖最后由 ZZZZZZ~ 于 2012-04-11 16:37 编辑

main的长度请不要批了。
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef struct
  4. {
  5.     size_t index;
  6.     size_t count;
  7.     float  aver_score;
  8. } CMP_INDEX_T;

  9. int cmp(const void *a, const void *b)
  10. {
  11.     const CMP_INDEX_T *ia = (const CMP_INDEX_T *)a;
  12.     const CMP_INDEX_T *ib = (const CMP_INDEX_T *)b;
  13.    
  14.     if(ia->aver_score < ib->aver_score)
  15.         return -1;
  16.     else if(ia->aver_score == ib->aver_score)
  17.         return 0;
  18.     else
  19.         return 1;
  20. }

  21. float get_aver(const unsigned char *st, size_t count)
  22. {
  23.     float  total = 0;
  24.     for(size_t i = 0; i < count; ++i)
  25.         total += *st++;   
  26.     return (count == 0 ? 0 : total/count);     
  27. }

  28. int main()
  29. {
  30.     const size_t CLASS_NUM = 3;
  31.     const size_t ST_NUM    = 100;

  32.     // 定义保存批量数据的二维数组,
  33.     unsigned char scores[CLASS_NUM][ST_NUM];
  34.     // 排序索引
  35.     CMP_INDEX_T   cmp_index[CLASS_NUM];

  36.     // 利用for语句完成数据的输入
  37.     for(size_t i = 0; i < CLASS_NUM; ++i)
  38.     {
  39.         printf("please input the  scores of class %d, with 0 terminated:\n", i+1);
  40.         size_t j;
  41.         for(j = 0; j < ST_NUM; ++j)
  42.         {
  43.             // 将输入的数据保存到scores[i][j]
  44.             int score;
  45.             while(1)
  46.             {
  47.                 // scanf真难用!
  48.                 int ret = scanf("%d", &score);
  49.                 if(ret < 0)
  50.                 {
  51.                     fprintf(stderr, "input failed\n");
  52.                     return 1;
  53.                 }
  54.                 else if(ret == 0)
  55.                 {
  56.                     scanf("%*s");
  57.                     fprintf(stderr, "Try to input again, (score >= 0 and <= 100)\n");
  58.                 }
  59.                 else if(score < 0 || score > 100)
  60.                 {                    
  61.                     printf("score = %d\n", score);
  62.                     fprintf(stderr, "Try to input again, (score >= 0 and <= 100)\n");
  63.                 }
  64.                 else break;    // 输入OK
  65.             }
  66.             
  67.             if(score == 0)
  68.                 break;    // 本组输入完成
  69.             else
  70.                 scores[i][j] = (unsigned char)score;
  71.         }
  72.    
  73.         //填入索引和平均值
  74.         cmp_index[i].count = j;
  75.         cmp_index[i].index = i;
  76.         cmp_index[i].aver_score = get_aver(scores[i], j);
  77.     }
  78.    
  79.     //排序
  80.     puts("sort");
  81.     qsort(cmp_index, CLASS_NUM, sizeof(cmp_index[0]), cmp);
  82.     puts("end");
  83.    
  84.     //输出
  85.     for(size_t i = 0; i < CLASS_NUM; ++i)
  86.     {
  87.         printf("average score is %.2f :\n", cmp_index[i].aver_score);
  88.         
  89.         unsigned char *st = scores[cmp_index[i].index];
  90.         for(size_t j = 0; j < cmp_index[i].count; ++j)
  91.             printf("%4d", *st++);
  92.         printf("\n");
  93.     }
  94.    
  95.     return 0;
  96. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2012-04-11 16:41 |只看该作者
本帖最后由 unistd 于 2012-04-11 16:41 编辑

float get_aver(const unsigned char *st, size_t count)
=================
一般来说,永远不要在程序中使用float类型,现在的CPU都是配置的双精度浮点处理单元,没有配置单精度浮点数计算器的。
就算你使用的是float,计算机在内部也是用double的存储单元计算的。

更重要的是,据说,使用double类型比使用float类型速度更快。

论坛徽章:
0
3 [报告]
发表于 2012-04-11 16:44 |只看该作者
回复 2# unistd


    现代CPU很多的,ARM就很多没有浮点单元。
这是弱点之一,
另一方面,放在数组里的内容,用double更不划算。

论坛徽章:
0
4 [报告]
发表于 2012-04-11 16:51 |只看该作者
是不是写的太好,专家们都不敢来批了?

论坛徽章:
0
5 [报告]
发表于 2012-04-11 17:01 |只看该作者
生意太清淡了

论坛徽章:
0
6 [报告]
发表于 2012-04-11 17:57 |只看该作者
你是谁的马甲?

论坛徽章:
0
7 [报告]
发表于 2012-04-11 19:02 |只看该作者
本帖最后由 0xC1988 于 2012-04-11 19:03 编辑

比那出书的好太多倍了

论坛徽章:
0
8 [报告]
发表于 2012-04-12 09:18 |只看该作者
谢谢楼上几位的抬爱

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2012-04-12 10:13 |只看该作者
如果非要说出点什么,就说标准吧。
楼主的代码有些地方不符合c标准:

int main(void)或者int main(int argc, const char *argv[])

局部变量定义不能在有效语句中间。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
10 [报告]
发表于 2012-04-12 10:15 |只看该作者
本帖最后由 koolcoy 于 2012-04-12 10:15 编辑

回复 2# unistd

a ?
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP