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最值和对应月份那一块代码出问题了,但我找不出问题所在,拜托鱼油们了!
#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 13:54
{:10_277:}{:10_277:}{:10_277:}再也不<=了 我感觉这样写更好一点
#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;
}
#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: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:36
谢谢,学习了。顺便再问一下
scanf的警告,'scanf' 用于将字符串转换为整数值。 这是啥意思?
puts("");
输出一个 '\n'
就是换一行,和 printf("\n"); 一个意思
不换行的话,程序执行完了,shell的提示符就紧挨着这个程序的输出,这样不好看
那个警告对应的是哪个代码?
人造人 发表于 2022-9-13 14:43
puts("");
输出一个 '\n'
就是换一行,和 printf("\n"); 一个意思
对应这段
scanf("%d-%d", &year, &month); 须弥芥子 发表于 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,不清楚
等一等,你的year和month这两个变量是什么类型的
Clang-Tidy:'scanf' 用于将字符串转换为无符号整数值,但函数不会报告转换错误;考虑改用“strtoul”
报错说是 无符号整数 ?
无符号整数 用 %d 吗?
人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的
int类型 人造人 发表于 2022-9-13 15:04
等一等,你的year和month这两个变量是什么类型的
%d 是输出输入格式 为整型,用于 int , short int 须弥芥子 发表于 2022-9-13 15:09
int类型
那这样的话,就完全不知道那个警告在说什么
因为我们并没有使用无符号整数
页:
[1]