輸入10個學生5門課的成績,分別用函式實現下列功能:

STM32__Robo發表於2020-11-25

在這裡插入圖片描述
在這裡插入圖片描述
這個題目本身不難,但對於我們學C的人說,在熟悉各類語法及結構方面有非常好的作用。這個題目既可以用簡單的方法例如定義幾個函式分別處理上述問題,由於題目要用的重複資料較多,故建議定義一個全域性陣列以便編碼。本人剛學完結構體和指標,在閱讀完譚教授的教材後,覺得這個題目非常適合練習使用指標,而結構體對於這個題目也具有一定的方便性但不是很明顯,相信如果是用編譯器列印學生的成績,涉及資料更多時,若使用結構體將會使問題更加簡單。

下面是用結構體和指標解決這個題目的程式碼:

#include <stdio.h>
#include <stdlib.h>

struct Student
{
    float score[5];
    float average;//學生成績變數
    float aver[5];//學科成績變數

}student[10];//定義結構體變數student

int main()
{
    void input();
    void average();
    void compare();
    void print();

    input();
    average();
    compare();
    print();
}

void input()//定義輸入函式
{
    int i;
    printf("請分別輸入10個同學5門課的成績:");
    for(i=0;i<10;i++)
        scanf("%f%f%f%f%f",&student[i].score[0],&student[i].score[1],
              &student[i].score[2],&student[i].score[3],&student[i].score[4]);
}

void average()
{
    struct Student *p;
    float sum=0;int i;
    for(p=student;p<student+10;p++)
    {
        for(i=0;i<5;i++)
        sum=sum+p->score[i];
        p->average = sum/5.0;sum=0;
    }//學生平均成績
    sum=0;//sum置0
    for(i=0;i<5;i++)
    {
        for(p=student;p<student+10;p++)
        sum+=p->score[i];
        p->aver[i] = sum/10.0;sum=0;//學科成績都放入結構體陣列最後一個的aver中  省去定義一個新陣列的麻煩,但好像沒有可移植性
    }//有點缺陷但可以用 ps:浪費了結構體中的9個aver陣列因為只用了一個而且後邊列印要繞一下
}

void print()//順帶求方差
{
    struct Student *p;
    int i=1;
    printf("學生平均分是:\n");
    for(p=student;p<student+10;p++,i++)
    printf("No.%d : %.1f\n",i,p->average);
    printf("學科平均分是:\n");
    for(i=0;i<5;i++)//此時p已經執行結構體陣列最後一個
    printf("學科%d: %.1f\n",i+1,p->aver[i]);
    float sum1=0,sum2=0,s;
    for(p=student;p<student+10;p++)
        sum1+=(p->average)*(p->average);sum2+=p->average;
    printf("\t方差是: %.4f",s=sum1/10+sum2/10*sum2/10);
}

void compare()
{
    struct Student *p;
    int i,j,max;
    for(i=0;i<10;i++)
     for(j=0;j<5;j++)
        if(student[i].score[j]>=max){max=student[i].score[j];}//找出最大值
    for(i=0;i<10;i++)
     for(j=0;j<5;j++)
        if(student[i].score[j]>=max)printf("No.%d的學科%d分數最高\n",i+1,j+1);
        //遍歷陣列,找出對應最大值的學生序號季學科
}

希望上述內容能在各位的學習過程中起到一點小幫助。

相關文章