11.12C語言實驗

編寫學生成績管理系統V1.0。
某班有最多不超過30人(具體人數由鍵盤輸入)參加某門課程的考試,參考例題8.5 , 8.9 , 8.10 ,用一維數組作函數參數編程實現如下學生成績管理:
(1) 錄入每個學生的學號和考試成績,學號用long int[]類型的數組存放。考試成績用double[]類型的數組存放
(2) 計算課程的總分和平均分
(3) 按成績由高到低排出名次表
(4) 按學號由小到大排出成績表
(5) 按學號查詢學生排名及考試成績
(6) 按優秀(90~100)、良好、中等、及格、不及格5個類別,統計每個類別的人數以及所佔的百分比。
(7) 輸出每個學生的學號、考試成績,輸出課程總分和平均分。
要求:
程序運行後先顯示如下菜單,並提示用於輸入選項:
1.Input record
2.Caculate total and average score of course
3.Sort in descending order by score
4.Sort in ascending order by number
5.Search by number
6.Statistic analysis
7.List record
0.Exit
Please enter your choice:
分析:
成績排序和學號排序時,只要和學生相關的信息都要跟着一起排序。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 35

void dSwap(double *a, double *b)
{
    double c;
    c = *a;*a = *b;*b = c;
    return ;
}
void iSwap(int *a, int *b)
{
    int c;
    c = *a;*a = *b;*b = c;
    return ;
}
double Average(double score[], int n);//求平均數
void Read(double score[], int num[], int n);//輸入
void SortScore(double score[], int num[], int n);//按成績排序
void SortNum(double score[], int num[], int n);//按學號排序
void Find(double score[], int num[], int n, int id);//id爲檢索學號
void Account(double score[], int n);//統計分析

int main(void)
{
    int choice, n=0, i;//選擇,數據數量,循環
    int num[N], id;//學號
    double score[N], sum=0, aver;//成績,平均成績,總成績
    do
    {
        puts("");
        puts("1.Input record");
        puts("2.Caculate total and average score of course");
        puts("3.Sort in descending order by score");
        puts("4.Sort in ascending order by number");
        puts("5.Search by number");
        puts("6.Statistic analysis");
        puts("7.List record");
        puts("0.Exit");
        printf("Please enter your choice:");

        scanf("%d", &choice);
        switch(choice)
        {
            case 1:
                scanf("%d", &n);
                Read(score, num, n);
                break;
            case 2:
                sum = Average(score, n);
                aver = sum / n;
                printf("sum=%lf, aver=%lf\n", sum, aver);
                break;
            case 3:
                SortScore(score, num, n);
                for(i=1; i<=n; ++i)
                    printf("%d %lf\n", num[i], score[i]);
                break;
            case 4:
                SortNum(score, num, n);
                for(i=1; i<=n; ++i)
                    printf("%d %lf\n", num[i], score[i]);
                break;
            case 5:
                scanf("%d", &id);
                SortScore(score, num, n);
                Find(score, num , n , id);
                break;
            case 6:
                Account(score, n);
                break;
            case 7:
                for(i=1; i<=n; ++i)
                    printf("%d %lf\n", num[i], score[i]);
                sum = Average(score, n);
                aver = sum / n;
                printf("sum=%lf, aver=%lf\n", sum, aver);
                break;
            case 0:break;
            default:puts("Input Error!Please enter your choice again:");
        }
    }while(choice);
    return 0;
}
void Read(double score[], int num[], int n)
{
    int i;
    for(i=1; i<=n; ++i)
        scanf("%d %lf", &num[i], &score[i]);
    return ;
}
double Average(double score[], int n)
{
    int i;
    double sum=0;
    for(i=1; i<=n; ++i)
        sum += score[i];
    return sum;
}
void SortScore(double score[], int num[], int n)
{//冒泡排序
    int i,j;
    for(i=1; i<n; ++i)
        for(j=1; j<=n-i; ++j)
            if(score[j] < score[j+1])
            {
                dSwap(score+j, score+j+1);
                iSwap(num+j, num+j+1);
            }
    return ;
}
void SortNum(double score[], int num[], int n)
{//冒泡排序
    int i,j;
    for(i=1; i<n; ++i)
        for(j=1; j<=n-i; ++j)
            if(num[j] > num[j+1])
            {
                dSwap(score+j, score+j+1);
                iSwap(num+j, num+j+1);
            }
    return ;
}
void Find(double score[], int num[], int n, int id)
{
    int i, rank;
    double grade;
    for(i=1; i<=n; ++i)
        if(num[i] == id)
        {
            rank = i;
            grade = score[i];
            break;
        }
    printf("rand=%d, score=%lf\n", rank, grade);
    return ;
}
void Account(double score[], int n)
{
    char grade[5]={'E','D','C','B','A'};
    int i,peo[5]={0};//每個類別的人數。0不及格,1及格,
    for(i=1; i<=n; ++i)
    {
        if(score[i] == 100)++peo[4];
        if(score[i] >= 60)
            ++peo[(int)(score[i]/10)-5];
        else    ++peo[0];
    }
    for(i=4; i>=0; --i)
        printf("grade %c:%d %lf%%\n", grade[i], peo[i], 100.0*peo[i]/n);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章