鱼C论坛

 找回密码
 立即注册
查看: 1969|回复: 12

[已解决]S1E24第二题

[复制链接]
发表于 2022-9-13 13:32:42 | 显示全部楼层 |阅读模式

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

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

x
  1. #include <stdio.h>
  2. const int YEAR_PLUS = 2014;

  3. int main(){

  4.     double pm[3][12] = {
  5.             {-1,-1, -1, -1, -1, -1, -1, 31.3, 35.5 , 58.7, 49.6, 55.5},//2014
  6.             {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},//2015
  7.             {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}//2016
  8.     }; //-1表示未收入
  9.     int year,month,maxYear,maxMonth,minYear,minMonth;
  10.     double max = 0,min = 100000;
  11.     double (*ptr)[12] = pm;

  12. //    找出PM最值和对应月份
  13.     for (int i = 0; i <= 2; i++) {
  14.         for (int j = 0; j <= 12; j++) {
  15.             if(ptr[i][j] != -1){
  16.                 max = ptr[i][j] > max ? ptr[maxYear = i][maxMonth = j] : max;
  17.                 min = ptr[i][j] < min ? ptr[minYear = i][minMonth = j] : min;
  18.             }
  19.         }
  20.     }
  21.     //2015-1 max
  22.     //2015-6 min

  23.     printf("请输入年份和月份:");
  24.     scanf("%d-%d",&year,&month);
  25.     if(ptr[year - YEAR_PLUS][month - 1] != -1)
  26.         printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
  27.     else
  28.         printf("未收入!\n");
  29.     printf("PM2.5最大的月份是:%d年%d月,PM:%2.1f\nPM2.5最小的月份是:%d年%d月,PM:%2.1f", \
  30.     maxYear + YEAR_PLUS, maxMonth + 1, max, minYear + YEAR_PLUS, minMonth + 1, min);

  31.     return 0;
  32. }
复制代码

  1. 请输入年份和月份:2015-8
  2. 该月的PM值为38.5
  3. PM2.5最大的月份是:2014年13月,PM:59.8
  4. PM2.5最小的月份是:2016年13月,PM:0.0
  5. Process finished with exit code 0
复制代码

找出PM最值和对应月份那一块代码出问题了,但我找不出问题所在,拜托鱼油们了!
最佳答案
2022-9-13 13:54:54
  1. #include <stdio.h>

  2. const int YEAR_PLUS = 2014;

  3. int main() {
  4.     double pm[3][12] = {
  5.         {-1, -1, -1, -1, -1, -1, -1, 31.3, 35.5, 58.7, 49.6, 55.5},                 // 2014
  6.         {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},   // 2015
  7.         {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}            // 2016
  8.     };  // -1 表示未收入
  9.     int year, month, maxYear, maxMonth, minYear, minMonth;
  10.     double max = 0, min = 100000;
  11.     double(*ptr)[12] = pm;

  12.     // 找出PM最值和对应月份
  13.     //for(int i = 0; i <= 2; i++) {     // 不能说错,但是不推荐这样写
  14.     for(int i = 0; i < 3; i++) {
  15.         //for(int j = 0; j <= 12; j++) {        // 这是什么?
  16.         for(int j = 0; j < 12; j++) {
  17.             if(ptr[i][j] != -1) {
  18.                 max = ptr[i][j] > max ? ptr[maxYear = i][maxMonth = j] : max;
  19.                 min = ptr[i][j] < min ? ptr[minYear = i][minMonth = j] : min;
  20.             }
  21.         }
  22.     }
  23.     // 2015-1 max
  24.     // 2015-6 min

  25.     printf("请输入年份和月份:");
  26.     scanf("%d-%d", &year, &month);
  27.     if(ptr[year - YEAR_PLUS][month - 1] != -1)
  28.         printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
  29.     else
  30.         printf("未收入!\n");
  31.     printf("PM2.5最大的月份是:%d年%d月,PM:%2.1f\nPM2.5最小的月份是:%d年%d月,PM:%2.1f",
  32.             maxYear + YEAR_PLUS, maxMonth + 1, max, minYear + YEAR_PLUS, minMonth + 1, min);
  33.     puts("");
  34.     return 0;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-9-13 13:54:54 | 显示全部楼层    本楼为最佳答案   
  1. #include <stdio.h>

  2. const int YEAR_PLUS = 2014;

  3. int main() {
  4.     double pm[3][12] = {
  5.         {-1, -1, -1, -1, -1, -1, -1, 31.3, 35.5, 58.7, 49.6, 55.5},                 // 2014
  6.         {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},   // 2015
  7.         {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}            // 2016
  8.     };  // -1 表示未收入
  9.     int year, month, maxYear, maxMonth, minYear, minMonth;
  10.     double max = 0, min = 100000;
  11.     double(*ptr)[12] = pm;

  12.     // 找出PM最值和对应月份
  13.     //for(int i = 0; i <= 2; i++) {     // 不能说错,但是不推荐这样写
  14.     for(int i = 0; i < 3; i++) {
  15.         //for(int j = 0; j <= 12; j++) {        // 这是什么?
  16.         for(int j = 0; j < 12; j++) {
  17.             if(ptr[i][j] != -1) {
  18.                 max = ptr[i][j] > max ? ptr[maxYear = i][maxMonth = j] : max;
  19.                 min = ptr[i][j] < min ? ptr[minYear = i][minMonth = j] : min;
  20.             }
  21.         }
  22.     }
  23.     // 2015-1 max
  24.     // 2015-6 min

  25.     printf("请输入年份和月份:");
  26.     scanf("%d-%d", &year, &month);
  27.     if(ptr[year - YEAR_PLUS][month - 1] != -1)
  28.         printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
  29.     else
  30.         printf("未收入!\n");
  31.     printf("PM2.5最大的月份是:%d年%d月,PM:%2.1f\nPM2.5最小的月份是:%d年%d月,PM:%2.1f",
  32.             maxYear + YEAR_PLUS, maxMonth + 1, max, minYear + YEAR_PLUS, minMonth + 1, min);
  33.     puts("");
  34.     return 0;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-13 14:11:43 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 14:23:19 | 显示全部楼层
我感觉这样写更好一点

  1. #include <stdio.h>

  2. const int YEAR_PLUS = 2014;

  3. int main() {
  4.     // 2015-1 max
  5.     // 2015-6 min
  6.     double pm[3][12] = {
  7.         {-1, -1, -1, -1, -1, -1, -1, 31.3, 35.5, 58.7, 49.6, 55.5},                 // 2014
  8.         {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5},   // 2015
  9.         {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}            // 2016
  10.     };  // -1 表示未收入
  11.     size_t year, month;
  12.     size_t maxYear = 0, maxMonth = 0, minYear = 0, minMonth = 0;

  13.     // 找出PM最值和对应月份
  14.     for(size_t i = 0; i < 3; i++) {
  15.         for(size_t j = 0; j < 12; j++) {
  16.             if(pm[i][j] == -1) continue;
  17.             if(pm[maxYear][maxMonth] == -1) maxYear = i, maxMonth = j;
  18.             if(pm[minYear][minMonth] == -1) minYear = i, minMonth = j;
  19.             if(pm[i][j] > pm[maxYear][maxMonth]) maxYear = i, maxMonth = j;
  20.             if(pm[i][j] < pm[minYear][minMonth]) minYear = i, minMonth = j;
  21.         }
  22.     }

  23.     printf("请输入年份和月份:");
  24.     scanf("%lu-%lu", &year, &month);
  25.     if(pm[year - YEAR_PLUS][month - 1] != -1)
  26.         printf("该月的PM值为%2.1f\n", pm[year - YEAR_PLUS][month - 1]);
  27.     else
  28.         printf("未收入!\n");
  29.     printf("PM2.5最大的月份是:%lu年%lu月,PM:%2.1f\nPM2.5最小的月份是:%lu年%lu月,PM:%2.1f",
  30.             maxYear + YEAR_PLUS, maxMonth + 1, pm[maxYear][maxMonth],
  31.             minYear + YEAR_PLUS, minMonth + 1, pm[minYear][minMonth]);
  32.     puts("");
  33.     return 0;
  34. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 14:32:16 | 显示全部楼层
  1. #include <stdio.h>

  2. const int YEAR_PLUS = 2014 ;

  3. int main(void)
  4. {
  5.         double pm[3][12] = {
  6.             {-1,-1, -1, -1, -1, -1, -1, 31.3, 35.5 , 58.7, 49.6, 55.5} , //2014
  7.             {59.8, 54.9, 33.1, 38.2, 26.6, 20.5, 27.8, 38.5, 41.5, 44.7, 38.1, 41.5} , //2015
  8.             {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1} //2016
  9.         } , * p ;
  10.         int i , max , min , year , month , maxYear , maxMonth , minYear , minMonth  ;

  11. //  找出 PM 最值和对应月份
  12.         for(i = 0 ,  p = pm[0] , max = min = 7 ; i < 36 ; i ++) {
  13.                 if(p[i] > -1) {
  14.                         if(p[i] > p[max]) max = i                                                                           ;
  15.                         if(p[i] < p[min]) min = i                                                                           ;
  16.                 }
  17.         }
  18.         maxYear = max / 12                                                                                                  ;
  19.         maxMonth = max % 12                                                                                                 ;
  20.         minYear = min / 12                                                                                                  ;
  21.         minMonth = min % 12                                                                                                 ;
  22.         printf("请输入年份和月份:")                                                                                        ;
  23.         scanf("%d-%d" , & year , & month)                                                                                   ;
  24.         if(pm[year - YEAR_PLUS][month - 1] > -1) printf("该月的 PM 值为 % 2.1f\n", pm[year - YEAR_PLUS][month - 1])         ;
  25.         else printf("抱歉,该月的 PM 值无数据\n")                                                                           ;
  26.         printf("PM 2.5 最大的月份是:%d年%d月, PM : %2.1lf\n" , maxYear + YEAR_PLUS , maxMonth + 1 , pm[maxYear][maxMonth]) ;
  27.         printf("PM 2.5 最小的月份是:%d年%d月, PM : %2.1lf\n" , minYear + YEAR_PLUS , minMonth + 1 , pm[minYear][minMonth]) ;
  28. }
复制代码

        编译、运行实况:
  1. D:\[00.Exerciese.2022]\C>g++ -o x x.c

  2. D:\[00.Exerciese.2022]\C>x
  3. 请输入年份和月份:2015-8
  4. 该月的 PM 值为  38.5
  5. PM 2.5 最大的月份是:2015年1月, PM : 59.8
  6. PM 2.5 最小的月份是:2015年6月, PM : 20.5

  7. D:\[00.Exerciese.2022]\C>
复制代码

评分

参与人数 1鱼币 +2 收起 理由
须弥芥子 + 2 这思路,挺不错的,学习了

查看全部评分

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

使用道具 举报

 楼主| 发表于 2022-9-13 14:36:42 | 显示全部楼层
人造人 发表于 2022-9-13 14:23
我感觉这样写更好一点

谢谢,学习了。顺便再问一下
scanf的警告,'scanf' 用于将字符串转换为整数值。 这是啥意思?
  1. Clang-Tidy: 'scanf' used to convert a string to an unsigned integer value, but function will not report conversion errors; consider using 'strtoul' instead
复制代码

最后面的puts("");有什么作用?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 14:43:30 | 显示全部楼层
须弥芥子 发表于 2022-9-13 14:36
谢谢,学习了。顺便再问一下
scanf的警告,'scanf' 用于将字符串转换为整数值。 这是啥意思?

puts("");
输出一个 '\n'
就是换一行,和 printf("\n"); 一个意思
不换行的话,程序执行完了,shell的提示符就紧挨着这个程序的输出,这样不好看

那个警告对应的是哪个代码?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-13 14:45:57 | 显示全部楼层
人造人 发表于 2022-9-13 14:43
puts("");
输出一个 '\n'
就是换一行,和 printf("\n"); 一个意思

对应这段
  1. scanf("%d-%d", &year, &month);
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 15:00:57 | 显示全部楼层
  1. 返回值
  2. 成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

  3. 如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(feof 或 ferror)。并且,如果在任何数据可以成功读取之前发生任何一种情况,则返回 EOF。

  4. 如果在解释宽字符时发生编码错误,该函数将 errno 设置为 EILSEQ。
复制代码

  1. sh-5.1$ cat main.c
  2. #include <stdio.h>

  3. int main(void) {
  4.     int a, b, c;
  5.     int ret = scanf("%d-%d-%d", &a, &b, &c);
  6.     if(ret >= 1) printf("a读取成功,a的值是: %d\n", a);
  7.     if(ret >= 2) printf("b读取成功,b的值是: %d\n", b);
  8.     if(ret >= 3) printf("c读取成功,c的值是: %d\n", c);
  9.     return 0;
  10. }
  11. sh-5.1$ gcc -g -Wall -o main main.c
  12. sh-5.1$ ./main
  13. 1
  14. a读取成功,a的值是: 1
  15. sh-5.1$ ./main
  16. 1-
  17. a读取成功,a的值是: 1
  18. sh-5.1$ ./main
  19. 1-23
  20. a读取成功,a的值是: 1
  21. b读取成功,b的值是: 23
  22. sh-5.1$ ./main
  23. 1-23-
  24. a读取成功,a的值是: 1
  25. b读取成功,b的值是: 23
  26. sh-5.1$ ./main
  27. 1-23-4
  28. a读取成功,a的值是: 1
  29. b读取成功,b的值是: 23
  30. c读取成功,c的值是: 4
  31. sh-5.1$
复制代码

  1. Clang-Tidy:'scanf' 用于将字符串转换为无符号整数值,但函数不会报告转换错误;考虑改用“strtoul”
复制代码


我不知道这个警告意味着什么,scanf函数在转换失败的时候是报告错误的
但是这个警告说函数失败了不会报告错误
难道说Clang-Tidy的scanf函数不报告错误?
没用过Clang-Tidy,不清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 15:04:34 | 显示全部楼层
等一等,你的year和month这两个变量是什么类型的

  1. Clang-Tidy:'scanf' 用于将字符串转换为无符号整数值,但函数不会报告转换错误;考虑改用“strtoul”
复制代码


报错说是 无符号整数 ?
无符号整数 用 %d 吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-13 15:09:02 | 显示全部楼层
人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的

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

使用道具 举报

 楼主| 发表于 2022-9-13 15:10:15 | 显示全部楼层
人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的

%d 是输出输入格式 为整型,用于 int , short int
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 15:14:20 | 显示全部楼层

那这样的话,就完全不知道那个警告在说什么
因为我们并没有使用无符号整数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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