この小さなプロジェクトは、実際には、蘇暁紅版の C 言語プログラミング (第 3 版) の裏にある一連の実験的な質問です。設計された生徒の成績管理システムには合計 6 つのバージョンがあり、層ごとに改良されています。すべての機能を実現するために純粋に C 言語の標準ライブラリに依存します。中途半端なお坊さんのプログラマとして、プログラミングの楽しさを味わい、小さなシステムを一から完成させたい、この行動はシンプルであり、意味があることだと思います。
github: https://github.com/Jackie0Feng/SAMS
#システム要件の説明
特定のコースの試験に参加できるクラスの人数は 30 人までです (特定の数字はキーボードで入力します)。関数パラメーター プログラミングとして 1 次元配列を使用して、次の生徒の成績管理を実現します。( 1) 各生徒の学籍番号とテストの得点を入力
、
(2) コースの合計点と平均点を計算、
(3) 成績の高い順にランキング表を並べる、
(4) 成績表を並べる
少人数から大人数までの生徒数に応じて(6)
優秀(90 ~ 100 人)、良好(80 ~ 89 人)、中程度(70 ~ 79 人)、合格(60 ~ 69 人)、不合格(0 人)の 5 段階に分類-59)、各カテゴリーの統計 人数と割合;
(7) 各生徒の生徒数、テストの得点、コースの合計得点、平均点を出力します。
実験の目的: 関数パラメーターとしての 1 次元配列、ソート、検索、統計分析、モジュール式プログラミング、およびインクリメンタル テスト方法などの一般的なアルゴリズムに精通していること。
【思考問題】 プログラムの実行後に以下のメニューを表示し、ユーザーに選択肢の入力を促す場合:
1. 記録を入力
2. コースの合計点と平均点を計算
3. 点数の降順に並べ替え
4. 並べ替え番号昇順
5 .番号検索 6.
統計分析
7.レコードリスト
0.
終了 選択肢を入力してください:
次に、ユーザーが入力したオプションに従って対応する操作を実行します。では、プログラムをどのように変更する必要がありますか?
#验头下设计
まず、要件に従ってメインプログラムを作成し、実行したい機能を理解するためのメニューを作成します。
その後、修正を加えながら、関数インターフェースを大まかに設計します。
int main()
{
int order = -1;//用户指令
/*int n;
long num[STU_NUM];
float score[STU_NUM];*/
//初始数据
int n = 5;
long num[STU_NUM] = { 10001,10002,10003,10004,10005 };
float score[STU_NUM] = { 20.0,80.0,50.0,66.0,95.0 };
Mean();//显示菜单
//使用系统
while (1)
{
scanf_s("%d", &order);
switch (order)
{
case 1://录入成绩
n = ReadScore(num, score, n);
break;
case 2://求平均分和总分
AverSumofScore(score, n);
break;
case 3://按成绩降序排名
DeSortbyScore(num, score, n);
printf("Scorted scores:\n");
PrintScore(num, score, n);
break;
case 4://按学号升序排名
AsSortbyNum(num, score, n);
printf("Scorted scores:\n");
PrintScore(num, score, n);
break;
case 5://按学号查询学生排名及其考试成绩
{//如果想在case标签初始化变量,必须加大括号{}
int rank = -1;//学生排名
int x;//被查询学号
printf("Please enter the student ID queried\n");
scanf_s("%d", &x);
DeSortbyScore(num, score, n);//先排序
rank = SearchbyNum(num, x, n);//即使排名也是所在数组的位置
printf("The student's rank is %d and his grade is %f\n", rank+1, score[rank]);//索引+1为排名
break;
}
case 6://按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,
//统计每个类别的人数以及所占的百分比;
StatistAnalysis( score, n);
break;
case 7://输出每个学生的学号、考试成绩,课程总分和平均分
PrintScore(num, score, n);
AverSumofScore(score, n);
break;
case 0://退出系统
printf("Good Bye!\n");
return 0;
break;
default:
break;
}
printf("Please enter your choice : \n");
}
return 0;
}
int Mean(void)
{
printf("1.Input record\n");
printf("2.Caculate total and average score of course\n");
printf("3.Sort in descending order by score\n");
printf("4.Sort in ascending order by number\n");
printf("5.Search by number\n");
printf("6.Statistic analysis\n");
printf("7.List record\n");
printf("0.Exit\n");
printf("Please enter your choice : \n");
return 0;
}
プロジェクトヘッダーファイル
/*程序功能: 学生成绩管理
编码者: JackieFeng
日期: 04/11/2021
版本号:1.1
备注:
某班有最多不超过30人(具体人数由键盘输入)国实现如下学生成绩管理:用一维数组作区函数参数编程实现如下学生成绩管理:
(1)录入每个学生的学号和考试成绩;
(2)计算课程的总分和平均分;
(3)按成绩由高到低排出名次表;
(4)按学号由小到大排出成绩表;
(5)按学号查询学生排名及其考试成绩;
(6)按优秀(90- 100)、良好(80- 89)、中等(70-79)、及格(60- 69)、不及格(0-59)5个类别,统计每个类别的人数以及所占的百分比;
(7)输出每个学生的学号、考试成绩,课程总分和平均分。*/
#pragma once
#define STU_NUM 30
/*
函数名称: ReadScore
功能描述: 录入每个学生的学号和成绩,并返回总人数
参数:
num[]:学号
score[]:分数
返回:总人数
备注:*/
int ReadScore(long num[], float score[], int n);
/*
函数名称: AverSumofScore
功能描述: 计算总分和平均值并输出
参数:
score[]:分数
n:总分
返回:
备注:*/
int AverSumofScore(float score[], int n);
/*
函数名称: DeSortbyScore
功能描述: 按照成绩降序排列名次表
参数:
num[]:学号
score[]:分数
n:总人数
返回:
备注:*/
void DeSortbyScore(long num[], float score[], int n);
/*
函数名称: AsSortbyNum
功能描述: 按照学号升序排列
参数:
num[]:学号
score[]:分数
n:总人数
返回:
备注:*/
void AsSortbyNum(long num[], float score[], int n);
/*
函数名称: SearchbyNum
功能描述: 按学号查询学生排名及其考试成绩
参数:
num[]:学号
x:查询学号
n:总人数
返回:索引号,-1为没找到
备注:*/
int SearchbyNum(long num[], long x, int n);
/*
函数名称: StatistAnalysis
功能描述: 按优秀(90 - 100)、良好(80 - 89)、中等(70 - 79)、及格(60 - 69)、不及格(0 - 59)5个类别,
统计每个类别的人数以及所占的百分比;
参数:
num[]:学号
score[]:分数
n:总人数
返回:
备注:*/
void StatistAnalysis( float score[], int n);
/*
函数名称: PrintScore
功能描述: 打印每位学生的成绩
参数:
num[]:学号
score[]:分数
n:总人数
返回:
备注:*/
void PrintScore(long num[], float score[],int n);
/*
函数名称: Mean
功能描述: 显示菜单页面,提示用户如何使用
参数:
返回:
备注:*/
int Mean(void);
#実装
int ReadScore(long num[], float score[],int n)
{
printf("正在录入学号和成绩...\n");
printf("同时输入两个-1结束录入\n");
int i = n-1;
do
{
i++;
printf("正在录入第%d个学生的学号和成绩\n", i + 1);
scanf_s("%ld%*c%f", &num[i], &score[i]);
} while (score[i] > 0 && i <= 30);
printf("录入完成总共录入%d人\n", i);
return i;
}
int AverSumofScore(float score[], int n)
{
float sum = 0;
for (int i = 0; i < n; i++)
{
sum += score[i];
}
printf("课程总分为%f,平均分为%f\n", sum, sum / n);
return sum;
}
void DeSortbyScore(long num[], float score[], int n)//选择排序
{
long nTemp;
float sTemp;
//选择排序,第一层循环整个数组,每次归一位
for (int i = 0; i < n-1; i++)
{
int max = i;//最大位索引值,每次初始化为乱序区第一位
//第二层循环乱序位,每次从乱序列中选择最大一位
for (int j = i+1; j < n; j++)
{
if (score[max] < score[j])
{
max = j;
}
}
//发生改变,交换
if (i != max)
{
nTemp = num[i];
num[i] = num[max];
num[max] = nTemp;
sTemp = score[i];
score[i] = score[max];
score[max] = sTemp;
}
}
}
void AsSortbyNum(long num[], float score[], int n)
{
long nTemp;
float sTemp;
//选择排序,第一层循环整个数组,每次归一位
for (int i = 0; i < n - 1; i++)
{
int min = i;//最小位索引值,每次初始化为乱序区第一位
//第二层循环乱序位,每次从乱序列中选择学号最小的一位
for (int j = i+1; j < n; j++)
{
if (num[min] > num[j])
{
min = j;
}
}
//发生改变,交换
if (i != min)
{
nTemp = num[i];
num[i] = num[min];
num[min] = nTemp;
sTemp = score[i];
score[i] = score[min];
score[min] = sTemp;
}
}
}
int SearchbyNum(long num[], long x, int n)
{
//顺序查找
for (int i = 0; i < n; i++)
{
if (x == num[i])
{
return i;
}
}
return -1;
}
void StatistAnalysis(float score[], int n)
{
int ranks[5] = {0};// 各种档次的人数,首位赋值为0,后续位补充为0
for (int i = 0; i < n; i++)//遍历整个成绩,统计数据
{
if (score[i] < 60)
{
ranks[0]++;
}
else if (score[i] < 70 && score[i] >= 60)
{
ranks[1]++;
}
else if (score[i] < 80 && score[i] >= 70)
{
ranks[2]++;
}
else if (score[i] < 90 && score[i] >= 80)
{
ranks[3]++;
}
else//90到100档
{
ranks[4]++;
}
}
//输出统计数据
printf("rank amount percent\n");
printf("0-59 %d %.0f%%\n", ranks[0], ranks[0] / (float)n * 100);
printf("60-69 %d %.0f%%\n", ranks[1], ranks[1] / (float)n * 100);
printf("70-79 %d %.0f%%\n", ranks[2], ranks[2] / (float)n * 100);
printf("80-89 %d %.0f%%\n", ranks[3], ranks[3] / (float)n * 100);
printf("90-100 %d %.0f%%\n", ranks[4], ranks[4] / (float)n * 100);
}
void PrintScore(long num[], float score[], int n)
{
printf("学号 成绩 \n");
for (int i = 0; i < n; i++)
{
printf("%d %f \n", num[i], score[i]);
}
}