faaaaaaaa 发表于 2023-12-13 21:09:54

为什么最后结果没有输出小数部分

依次输入一个学生的学号,以及3科(C语言,数学,英语)成绩,在屏幕上输出该学生的学号,3科成绩(注:输出成绩时需进行四舍五入且保留2位小数)。

数据范围:学号满足 1≤n≤20000000,各科成绩使用百分制,且不可能出现负数
输入描述:
学号以及3科成绩,学号和成绩之间用英文分号隔开,成绩之间用英文逗号隔开。
#include <stdint.h>
#include <stdio.h>

void Student(int n,float a,float b,float c){
    while(1<=n&&n<=20000000){
      if(a>=0&&b>=0&&c>=0){
      a=(int)(a*100+0.5);
      a=a/100;
      b=(int)(b*100+0.5);
      b=b/100;
      c=(int)(c*100+0.5);
      c=c/100;
      }
    }
}
int main() {
    int n;
    float x,y,z;
    scanf("%d;%.5f,%.5f,%.5f",&n,&x,&y,&z);
    Student(n,x,y,z);
    printf("The each subject score of No. %d is %.2f,%.2f,%.2f.",n,x,y,z);
}

FishC 发表于 2023-12-13 21:10:16

代码中的问题在于,函数`Student()`内部的while循环条件是`1=0&&c>=0`,这是一个永远为假的条件,因此循环永远不会执行,导致小数部分没有被保留。同时,函数`Student()`的作用是将输入的成绩四舍五入并保留两位小数,但是该函数没有实际的返回值,因此无法改变`main()`函数中的变量。

下面是修正后的代码:
#include <stdio.h>

void Student(int *n, float *a, float *b, float *c){
    *a = (int)(*a * 100 + 0.5) / 100.0;
    *b = (int)(*b * 100 + 0.5) / 100.0;
    *c = (int)(*c * 100 + 0.5) / 100.0;
}

int main() {
    int n;
    float x, y, z;
    scanf("%d;%f,%f,%f", &n, &x, &y, &z);
    Student(&n, &x, &y, &z);
    printf("The each subject score of No. %d is %.2f,%.2f,%.2f.", n, x, y, z);
    return 0;
}

修正后的代码将学号和成绩传递给`Student()`函数时使用指针,以确保在函数内部对其进行修改时能够影响到`main()`函数中的变量。同时,在`Student()`函数内部,直接对成绩进行四舍五入并保留两位小数。最后,在`printf()`函数中输出结果时,使用`%.2f`格式保留两位小数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

faaaaaaaa 发表于 2023-12-13 21:29:19

FishC 发表于 2023-12-13 21:10
代码中的问题在于,函数`Student()`内部的while循环条件是`1=0&&c>=0`,这是一个永远为假的条件,因此循环 ...

输入:
17140216;80.845,90.55,100.00
复制
输出:
The each subject score of No. 17140216 is 80.85, 90.55, 100.00.
如何达到预期结果

FishC 发表于 2023-12-13 21:30:02

faaaaaaaa 发表于 2023-12-13 21:29
输入:
17140216;80.845,90.55,100.00
复制
输出: ...

根据您的需求,需要修正一下`scanf()`函数中的格式控制符以及在`printf()`函数中的输出格式。下面是修正后的代码:

#include <stdio.h>

void Student(int *n, float *a, float *b, float *c){
    *a = (int)(*a * 100 + 0.5) / 100.0;
    *b = (int)(*b * 100 + 0.5) / 100.0;
    *c = (int)(*c * 100 + 0.5) / 100.0;
}

int main() {
    int n;
    float x, y, z;

    scanf("%d;%f,%f,%f", &n, &x, &y, &z);
    Student(&n, &x, &y, &z);
    printf("The each subject score of No. %d is %.2f, %.2f, %.2f.", n, x, y, z);

    return 0;
}

修正后的代码将 `scanf()` 函数中的格式控制符修改为 `%f`,因为输入的成绩是浮点数。同时,在 `printf()` 函数中的输出格式通过添加空格来达到预期结果。现在,输入 `17140216;80.845,90.55,100.00`,输出应为 `The each subject score of No. 17140216 is 80.85, 90.55, 100.00.`

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

-kasha 发表于 2023-12-13 21:47:07

#include <stdio.h>

void Student(int n,float a,float b,float c){
      float A,B,C;
      A=a/100;
      B=b/100;
      C=c/100;
      printf("The each subject score of No. %d is %0.2lf,%0.2lf,%0.2lf.",n,A,B,C);
}
int main() {
        int n;
    int x,y,z;
    scanf("%d %d %d %d",&n,&x,&y,&z);
    Student(n,x,y,z);
    return 0;
}
你好,这个输入成绩输出成绩 ,不需要循环while语句的,可以在开始的时候加一个判断if(1<=n&&n<=20000000)
    scanf("%d;%.5f,%.5f,%.5f",&n,&x,&y,&z);
你这个语句我运行的时候出错了,引号里面的逗号和分号不应该加的
程序输入40 50 60 70输出是40 0.50 0.60 0.70
我也是刚学c语言 有问题可以交流下 谢谢

faaaaaaaa 发表于 2023-12-13 23:14:25

-kasha 发表于 2023-12-13 21:47
#include

void Student(int n,float a,float b,float c){


很感谢你的回复 我这里确实不能用while,你是对的。
有些关于你的代码细节想跟你讨论一下:Student函数中abc直接除100,如果是100以内的成绩得到的结果只能是0.00。在main函数中要获取的xyz应该是浮点数,用%f。引号内的分号与逗号是题目内要求的,应该是要存在的
希望能给你一些帮助
一起进步{:5_106:}

-kasha 发表于 2023-12-14 13:01:30

faaaaaaaa 发表于 2023-12-13 23:14
很感谢你的回复 我这里确实不能用while,你是对的。
有些关于你的代码细节想跟你讨论一下:Student函数 ...

#include <stdint.h>
#include <stdio.h>

void Student(int n,float a,float b,float c){
      a=a*100+0.5;
      a=a/100;
      b=b*100+0.5;
      b=b/100;
      c=c*100+0.5;
      c=c/100;
}
int main() {
    int n;
    float x,y,z;
    scanf("%d;%f,%f,%f",&n,&x,&y,&z);
    Student(n,x,y,z);
    printf("The each subject score of No. %d is %.2f,%.2f,%.2f.",n,x,y,z);
}
这应该就是你想要的代码了,问题应该是输入的时候scanf里面的%.5f
运行输入 40;50,60.3,70.687
输出结果是 The each subject score of No. 40 is 50.00,60.30,70.69.
页: [1]
查看完整版本: 为什么最后结果没有输出小数部分