鱼C论坛

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

[已解决]S1E24第二题

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

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

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

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

int main(){

    double pm[3][12] = {
            {-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)[12] = pm;

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

    printf("请输入年份和月份:");
    scanf("%d-%d",&year,&month);
    if(ptr[year - YEAR_PLUS][month - 1] != -1)
        printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
    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[3][12] = {
        {-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)[12] = 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[i][j] != -1) {
                max = ptr[i][j] > max ? ptr[maxYear = i][maxMonth = j] : max;
                min = ptr[i][j] < min ? ptr[minYear = i][minMonth = j] : min;
            }
        }
    }
    // 2015-1 max
    // 2015-6 min

    printf("请输入年份和月份:");
    scanf("%d-%d", &year, &month);
    if(ptr[year - YEAR_PLUS][month - 1] != -1)
        printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
    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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

const int YEAR_PLUS = 2014;

int main() {
    double pm[3][12] = {
        {-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)[12] = 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[i][j] != -1) {
                max = ptr[i][j] > max ? ptr[maxYear = i][maxMonth = j] : max;
                min = ptr[i][j] < min ? ptr[minYear = i][minMonth = j] : min;
            }
        }
    }
    // 2015-1 max
    // 2015-6 min

    printf("请输入年份和月份:");
    scanf("%d-%d", &year, &month);
    if(ptr[year - YEAR_PLUS][month - 1] != -1)
        printf("该月的PM值为%2.1f\n", ptr[year - YEAR_PLUS][month - 1]);
    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;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-13 14:11:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

const int YEAR_PLUS = 2014;

int main() {
    // 2015-1 max
    // 2015-6 min
    double pm[3][12] = {
        {-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[i][j] == -1) continue;
            if(pm[maxYear][maxMonth] == -1) maxYear = i, maxMonth = j;
            if(pm[minYear][minMonth] == -1) minYear = i, minMonth = j;
            if(pm[i][j] > pm[maxYear][maxMonth]) maxYear = i, maxMonth = j;
            if(pm[i][j] < pm[minYear][minMonth]) minYear = i, minMonth = j;
        }
    }

    printf("请输入年份和月份:");
    scanf("%lu-%lu", &year, &month);
    if(pm[year - YEAR_PLUS][month - 1] != -1)
        printf("该月的PM值为%2.1f\n", pm[year - YEAR_PLUS][month - 1]);
    else
        printf("未收入!\n");
    printf("PM2.5最大的月份是:%lu年%lu月,PM:%2.1f\nPM2.5最小的月份是:%lu年%lu月,PM:%2.1f",
            maxYear + YEAR_PLUS, maxMonth + 1, pm[maxYear][maxMonth],
            minYear + YEAR_PLUS, minMonth + 1, pm[minYear][minMonth]);
    puts("");
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

const int YEAR_PLUS = 2014 ;

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

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

D:\[00.Exerciese.2022]\C>

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 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("");有什么作用?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

那个警告对应的是哪个代码?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对应这段
 scanf("%d-%d", &year, &month);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果发生读取错误或读取时到达文件结尾,则设置正确的指示符(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,不清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-13 15:04:34 | 显示全部楼层
等一等,你的year和month这两个变量是什么类型的
Clang-Tidy:'scanf' 用于将字符串转换为无符号整数值,但函数不会报告转换错误;考虑改用“strtoul”

报错说是 无符号整数 ?
无符号整数 用 %d 吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

int类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

%d 是输出输入格式 为整型,用于 int , short int
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那这样的话,就完全不知道那个警告在说什么
因为我们并没有使用无符号整数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 18:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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