三道同学的oj遇到的问题,C语言

发布时间 2023-11-01 12:45:07作者: WCMS_XDU

1.

请写一段程序来判断表达式是否相等。
输入格式:
只有一行,为三个用空格分隔的浮点数a,b,c(0<a,b,c<100)。
输出格式:
也只有一行,如果 a - b 等于c ,则输出yes,否则输出no。

 1 //原答案,未满分
 2 int main(void) {
 3     double a, b, c;
 4 
 5     scanf("%f %f %f", &a, &b, &c);
 6 
 7     if(fabs(a - b-c) <= 1.0E-100) {
 8         printf("yes");
 9     } else {
10         printf("no");
11     }
12     return 0;
13 }
//修正,参考了https://fishc.com.cn/thread-234152-1-1.html
#include <stdio.h>

int main() {
    float a, b, c;
    scanf("%f %f %f", &a, &b, &c);
    int x = a * 100 + 0.5;
    int y = b * 100 + 0.5;
    int z = c * 100 + 0.5;
    if (x - y == z) {
        printf("yes");
    } else {
        printf("no");
    }
    return 0;
}

 

2. 

 

写一程序,按要求输出。
输入格式:
为三行,第一行为整数a、第二行为字符c、第三行为整数b。(0<a,b<100000)。
输出格式:
共四行。

第一行依次输出a,b,c,三个值之间用一个空格分隔;

第二依次输出a+b,a-b,a*b,a/b,a%b的值,每个值之间用一个空格分隔;

第三行输出a和b的比率(浮点数,精确到小数点后两位);

第四行输出a和b的百分比率(浮点数,精确到小数点后两位)。具体格式见输出样例。

 1 //原答案
 2 #include <stdio.h>
 3 
 4 int main() {
 5     int a, b;
 6     char c;
 7     scanf("%d\n%c\n%d", &a, &c, &b);
 8     printf("%d %d %c\n", a, b, c);
 9     printf("%d %d %d %d %d\n", a + b, a - b, a * b, a / b, a % b);
10     printf("The ratio of %d versus %d is %.2f.\n", a, b, (float)a / (float)b);
11     printf("The ratio of %d / %d is %.2f%%.", a, b, (float)a * 100 / (float)b);
12     return 0;
13 }
 1 //修正后
 2 #include <stdio.h>
 3 int main()
 4 {
 5     long int a,b;
 6     char c;
 7     float ans;
 8     scanf("%ld %c %ld",&a,&c,&b);
 9     ans=(float)a/b; 
10     printf("%ld %ld %c\n",a,b,c);
11     printf("%ld %ld %ld %d %d\n",a+b,a-b,a*b,a/b,a%b);
12     printf("The ratio of %ld versus %ld is %.2f.\n",a,b,ans);    
13 
14     printf("The ratio of %ld / %ld is %.2f%%.\n",a,b,ans*100);
15     return 0;
16 }

gpt:原始代码中使用了int类型来存储输入的整数,并且使用了%d来格式化输出。修正后的代码中,将int改为了long int以增加数据范围,同时也修复了输入的格式问题(移除了多余的换行符)。在输出方面,修正后的代码使用了%ld来格式化长整数,并且计算并保存了浮点数结果,用于精确计算比例和百分比。

总之,修正后的代码更准确地处理输入和输出,并提供了更大范围的整数支持和精确的浮点数计算。

 

3.

某门课规定总成绩由两部分组成,即平时成绩和期末考试成绩,这两部分成绩的比例为a:b,假设a为3,b为7,则意味着在总成绩中平时成绩占30%,期末考试成绩占70%。

现在请你写一段程序来计算一下,某位同学是否及格。
输入格式:
为4个用空格分隔的整数,依次代表两种成绩所占比例a,b 以及平时成绩,期末考试成绩。注意:测试用例不保证a+b一定等于10。
输出格式:
为两行,第一行为该同学的总成绩(保留1位小数),

第二行,如果该同学总成绩及格(大于等于60),则输出pass,否则输出fail。

测试用例保证合法,且整数可以用int存储,小数可以用float存储。

 1 //原答案
 2 #include <stdio.h>
 3 
 4 int main(void) {
 5     int a, b, regular_score, final_score;
 6     float total_score;
 7 
 8     scanf("%d %d %d %d", &a, &b, &regular_score, &final_score);
 9 
10     total_score = (a * regular_score + b * final_score) / 10.0;
11 
12     printf("%.1f\n", total_score);
13 
14     if (total_score >= 60) {
15         printf("pass");
16     } else {
17         printf("fail");
18     }
19 
20     return 0;
21 }
 1 //修正后
 2 #include <stdio.h>
 3 
 4 int main() {
 5     int a, b, score1, score2;
 6     float totalScore;
 7 
 8     // 输入两种成绩所占比例a和b,以及平时成绩和期末考试成绩
 9     scanf("%d %d %d %d", &a, &b, &score1, &score2);
10 
11     // 计算总成绩
12     totalScore = (float)(a * score1 + b * score2) / (a + b);
13 
14     // 输出总成绩
15     printf("%.1f\n", totalScore);
16 
17     // 判断是否及格并输出结果
18     if(totalScore >= 60) {
19         printf("pass\n");
20     } else {
21         printf("fail\n");
22     }
23 
24     return 0;
25 }