须弥芥子 发表于 2022-9-13 13:32:42

S1E24第二题

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

int main(){

    double pm = {
            {-1,-1, -1, -1, -1, -1, -1, 31.3, 35.5 , 58.7, 49.6, 55.5},//2014
            {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
            {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}//2016
    }; //-1表示未收入
    int year,month,maxYear,maxMonth,minYear,minMonth;
    double max = 0,min = 100000;
    double (*ptr) = pm;

//    找出PM最值和对应月份
    for (int i = 0; i <= 2; i++) {
      for (int j = 0; j <= 12; j++) {
            if(ptr != -1){
                max = ptr > max ? ptr : max;
                min = ptr < min ? ptr : min;
            }
      }
    }
    //2015-1 max
    //2015-6 min

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

    return 0;
}

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

找出PM最值和对应月份那一块代码出问题了,但我找不出问题所在,拜托鱼油们了!

人造人 发表于 2022-9-13 13:54:54

#include <stdio.h>

const int YEAR_PLUS = 2014;

int main() {
    double pm = {
      {-1, -1, -1, -1, -1, -1, -1, 31.3, 35.5, 58.7, 49.6, 55.5},               // 2014
      {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
      {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}            // 2016
    };// -1 表示未收入
    int year, month, maxYear, maxMonth, minYear, minMonth;
    double max = 0, min = 100000;
    double(*ptr) = pm;

    // 找出PM最值和对应月份
    //for(int i = 0; i <= 2; i++) {   // 不能说错,但是不推荐这样写
    for(int i = 0; i < 3; i++) {
      //for(int j = 0; j <= 12; j++) {      // 这是什么?
      for(int j = 0; j < 12; j++) {
            if(ptr != -1) {
                max = ptr > max ? ptr : max;
                min = ptr < min ? ptr : min;
            }
      }
    }
    // 2015-1 max
    // 2015-6 min

    printf("请输入年份和月份:");
    scanf("%d-%d", &year, &month);
    if(ptr != -1)
      printf("该月的PM值为%2.1f\n", ptr);
    else
      printf("未收入!\n");
    printf("PM2.5最大的月份是:%d年%d月,PM:%2.1f\nPM2.5最小的月份是:%d年%d月,PM:%2.1f",
            maxYear + YEAR_PLUS, maxMonth + 1, max, minYear + YEAR_PLUS, minMonth + 1, min);
    puts("");
    return 0;
}

须弥芥子 发表于 2022-9-13 14:11:43

人造人 发表于 2022-9-13 13:54


{:10_277:}{:10_277:}{:10_277:}再也不<=了

人造人 发表于 2022-9-13 14:23:19

我感觉这样写更好一点

#include <stdio.h>

const int YEAR_PLUS = 2014;

int main() {
    // 2015-1 max
    // 2015-6 min
    double pm = {
      {-1, -1, -1, -1, -1, -1, -1, 31.3, 35.5, 58.7, 49.6, 55.5},               // 2014
      {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
      {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1}            // 2016
    };// -1 表示未收入
    size_t year, month;
    size_t maxYear = 0, maxMonth = 0, minYear = 0, minMonth = 0;

    // 找出PM最值和对应月份
    for(size_t i = 0; i < 3; i++) {
      for(size_t j = 0; j < 12; j++) {
            if(pm == -1) continue;
            if(pm == -1) maxYear = i, maxMonth = j;
            if(pm == -1) minYear = i, minMonth = j;
            if(pm > pm) maxYear = i, maxMonth = j;
            if(pm < pm) minYear = i, minMonth = j;
      }
    }

    printf("请输入年份和月份:");
    scanf("%lu-%lu", &year, &month);
    if(pm != -1)
      printf("该月的PM值为%2.1f\n", pm);
    else
      printf("未收入!\n");
    printf("PM2.5最大的月份是:%lu年%lu月,PM:%2.1f\nPM2.5最小的月份是:%lu年%lu月,PM:%2.1f",
            maxYear + YEAR_PLUS, maxMonth + 1, pm,
            minYear + YEAR_PLUS, minMonth + 1, pm);
    puts("");
    return 0;
}

jackz007 发表于 2022-9-13 14:32:16

#include <stdio.h>

const int YEAR_PLUS = 2014 ;

int main(void)
{
      double pm = {
            {-1,-1, -1, -1, -1, -1, -1, 31.3, 35.5 , 58.7, 49.6, 55.5} , //2014
            {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
            {34.9, 36.4, 47.5, 37.9, 30.6, 23.4, 26.6, 34.3, -1, -1, -1, -1} //2016
      } , * p ;
      int i , max , min , year , month , maxYear , maxMonth , minYear , minMonth;

//找出 PM 最值和对应月份
      for(i = 0 ,p = pm , max = min = 7 ; i < 36 ; i ++) {
                if(p > -1) {
                        if(p > p) max = i                                                                           ;
                        if(p < p) min = i                                                                           ;
                }
      }
      maxYear = max / 12                                                                                                ;
      maxMonth = max % 12                                                                                                 ;
      minYear = min / 12                                                                                                ;
      minMonth = min % 12                                                                                                 ;
      printf("请输入年份和月份:")                                                                                        ;
      scanf("%d-%d" , & year , & month)                                                                                 ;
      if(pm > -1) printf("该月的 PM 值为 % 2.1f\n", pm)         ;
      else printf("抱歉,该月的 PM 值无数据\n")                                                                           ;
      printf("PM 2.5 最大的月份是:%d年%d月, PM : %2.1lf\n" , maxYear + YEAR_PLUS , maxMonth + 1 , pm) ;
      printf("PM 2.5 最小的月份是:%d年%d月, PM : %2.1lf\n" , minYear + YEAR_PLUS , minMonth + 1 , pm) ;
}
      编译、运行实况:
D:\\C>g++ -o x x.c

D:\\C>x
请输入年份和月份:2015-8
该月的 PM 值为38.5
PM 2.5 最大的月份是:2015年1月, PM : 59.8
PM 2.5 最小的月份是:2015年6月, PM : 20.5

D:\\C>

须弥芥子 发表于 2022-9-13 14:36:42

人造人 发表于 2022-9-13 14:23
我感觉这样写更好一点

谢谢,学习了。顺便再问一下
scanf的警告,'scanf' 用于将字符串转换为整数值。 这是啥意思?
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("");有什么作用?

人造人 发表于 2022-9-13 14:43:30

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



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

那个警告对应的是哪个代码?

须弥芥子 发表于 2022-9-13 14:45:57

人造人 发表于 2022-9-13 14:43
puts("");
输出一个 '\n'
就是换一行,和 printf("\n"); 一个意思


对应这段
scanf("%d-%d", &year, &month);

人造人 发表于 2022-9-13 15:00:57

须弥芥子 发表于 2022-9-13 14:45
对应这段

返回值
成功时,该函数返回参数列表中成功填充的项目数。由于匹配失败、读取错误或到达文件结尾,此计数可以与预期的项目数匹配或更少(甚至为零)。

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

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

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

int main(void) {
    int a, b, c;
    int ret = scanf("%d-%d-%d", &a, &b, &c);
    if(ret >= 1) printf("a读取成功,a的值是: %d\n", a);
    if(ret >= 2) printf("b读取成功,b的值是: %d\n", b);
    if(ret >= 3) printf("c读取成功,c的值是: %d\n", c);
    return 0;
}
sh-5.1$ gcc -g -Wall -o main main.c
sh-5.1$ ./main
1
a读取成功,a的值是: 1
sh-5.1$ ./main
1-
a读取成功,a的值是: 1
sh-5.1$ ./main
1-23
a读取成功,a的值是: 1
b读取成功,b的值是: 23
sh-5.1$ ./main
1-23-
a读取成功,a的值是: 1
b读取成功,b的值是: 23
sh-5.1$ ./main
1-23-4
a读取成功,a的值是: 1
b读取成功,b的值是: 23
c读取成功,c的值是: 4
sh-5.1$

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

我不知道这个警告意味着什么,scanf函数在转换失败的时候是报告错误的
但是这个警告说函数失败了不会报告错误
难道说Clang-Tidy的scanf函数不报告错误?
没用过Clang-Tidy,不清楚

人造人 发表于 2022-9-13 15:04:34

等一等,你的year和month这两个变量是什么类型的

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

报错说是 无符号整数 ?
无符号整数 用 %d 吗?

须弥芥子 发表于 2022-9-13 15:09:02

人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的




int类型

须弥芥子 发表于 2022-9-13 15:10:15

人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的




%d 是输出输入格式 为整型,用于 int , short int

人造人 发表于 2022-9-13 15:14:20

须弥芥子 发表于 2022-9-13 15:09
int类型

那这样的话,就完全不知道那个警告在说什么
因为我们并没有使用无符号整数
页: [1]
查看完整版本: S1E24第二题