@ -423,34 +423,60 @@ Step 2: 利用循环, 输入学生的学号, 成绩和各科成绩
Step 1:利用for循环给 sum 赋初值为 0
Step 1:利用for循环给 sum 赋初值为 0
Step 2:利用第二重循环重新计算每个学生的总分
Step 2:利用第二重循环重新计算每个学生的总分
Step 3:计算每个学生的平均分
Step 3:计算每个学生的平均分
Step 4:将结果按照舒徐 ,总分和平均分的顺序进行输出
Step 4:将结果按照顺序 ,总分和平均分的顺序进行输出
![计算每个学生各门课程的总分和平均分 ](AverSumofEveryStudent.svg )
![计算每个学生各门课程的总分和平均分 ](AverSumofEveryStudent.svg )
#### AverSumofEveryCourse
#### AverSumofEveryCourse
#### SortbyScore
Step 1:利用for循环给 sum 赋初值为 0
Step 2:利用第二重循环重新计算每门课程的总分
Step 3:计算每门课程的平均分
Step 4:将结果按照顺序,总分和平均分的顺序进行输出
![计算每门课程的总分和平均分 ](AverSumofEveryCourse.svg )
#### SortbyScore
#### SortbyScore
Step 1:利用循环将i赋值给k
Step 2:用循环从i+1到n-1比较,将较小的赋给k
Step 3:如果k与i不相等, 每一课的成绩交换
Step 4:总分,平均分,学号,姓名依次交换
![按选择法将数组 sum 的元素值排序 ](SortbyScore.svg )
#### AsSortbyNum
#### AsSortbyNum
Step 1:利用循环将i赋值给k
Step 2:用循环从i+1到n-1比较,将较小的学号赋给k
Step 3:如果k与i不相等, 每一课的成绩交换
Step 4:总分,平均分,学号,姓名依次交换
![按选择法将数组 num 的元素从低到高排序 ](AsSortbyNum.svg )
#### SortbyName
#### SortbyName
Step 1:利用for循环将相邻的两个姓名作比较
Step 2:如果前一个字符串大于后一个, 利用for循环交换m门课程的成绩
Step 3:依次交换
![交换法实现字符串按字典顺序排序 ](SortbyName.svg )
#### SearchbyNum
#### SearchbyNum
Step 1:利用for循环给 i 赋值为 0
Step 1:利用for循环给 i 赋值为 0
Step 2:利用 if 条件判断学号是否一致
Step 2:利用 if 条件判断学号是否一致
Step 3:利用二次循环找出所有符合条件的学生
Step 3:利用二次循环找出所有符合条件的学生
Step 4:利用if条件语句能否找到该学生
Step 4:利用if条件语句能否找到该学生
![按学号查找学生成绩并显示查找结果 ](SearchbyNum.svg )
![按学号查找学生成绩并显示查找结果 ](SearchbyNum.svg )
#### SearchbyName
#### SearchbyName
Step 1:利用for循环给 i 赋值为 0
Step 1:利用for循环给 i 赋值为 0
Step 2:利用 if 条件和循环判断是否有此学生并显示结果
Step 2:利用 if 条件和循环判断是否有此学生并显示结果
![按姓名查找学生成绩并显示查找结果 ](SearchbyName.svg )
![按姓名查找学生成绩并显示查找结果 ](SearchbyName.svg )
#### StatisticAnalysis
#### StatisticAnalysis
Step 1:将数组 t 的全部元素初始化为0
Step 1:将数组 t 的全部元素初始化为0
@ -458,12 +484,31 @@ Step 2:利用循环和if条件统计各分数段学生人数
Step 3:利用循环和if条件统计各分数段学生所占比结果
Step 3:利用循环和if条件统计各分数段学生所占比结果
![统计各分数段的学生人数及所占的百分比 ](StatisticAnalysis.svg )
![统计各分数段的学生人数及所占的百分比 ](StatisticAnalysis.svg )
#### PrintScore
#### PrintScore
Step 1:利用for循环输出学生的学号和姓名
Step 2:利用二次循环输出每位学生的成绩
Step 3:输出学生的总分数和平均分
![打印学生成绩 ](PrintScore.svg )
#### WritetoFile
#### WritetoFile
Step 1:读取文件输出学生人数和课程门数
Step 2:利用循环for依次输出学生学号和姓名
Step 3:利用二次循环输出学生成绩
Step 4:输出总成绩和平均分
![输出n个学生的学号, 姓名以及m门课程的成绩 ](-WritetoFile.svg )
#### ReadfromFile
#### ReadfromFile
Step 1:从文件中读取学生人数和课门数
Step 2:利用循环for输入学生学号和姓名
Step 3:利用二次循环输入学生成绩
Step 4:输入学生总成绩和平均分
![从文件中读取学生的学号,姓名及成绩等信息写入结构体 ](ReadfromFile.svg )
#### exit
#### exit
## 代码实现
## 代码实现
@ -527,7 +572,7 @@ int main(void)
int n = 0,m = 0;
int n = 0,m = 0;
STU stu[STU_NUM];
STU stu[STU_NUM];
printf("Input student number(n< %d):",STU_NUM);
printf("Input student number(n< %d):",STU_NUM);
scn af("%d",&n);
scan f("%d",&n);
printf("Input course number(m< =%d):",COURSE_NUM);
printf("Input course number(m< =%d):",COURSE_NUM);
scanf("%d",&m);
scanf("%d",&m);
while(1)
while(1)
@ -570,7 +615,7 @@ int main(void)
case 13:ReadfromFile(stu,&n,&m);
case 13:ReadfromFile(stu,&n,&m);
break;
break;
case 0: printf("Are you sure you want to exit?(Y/N):");
case 0: printf("Are you sure you want to exit?(Y/N):");
printf("End of program!);
printf("End of program!" );
exit(0);
exit(0);
default:printf("Input error!");
default:printf("Input error!");
}
}
@ -583,351 +628,305 @@ int main(void)
```
```
int Menu(void)
int Menu(void)
{
{
int itemSelected;
set itemSelected
printf("Management for Students' scores\n");
printf "Management for Students' scores\n"
printf("1 Input record\n");
printf "1 Input record\n"
printf( "2 Calculate total and average score of every course\n");
printf "2 Calculate total and average score of every course\n"
printf( "3 Calculate total and average score of every student\n");
printf "3 Calculate total and average score of every student\n"
printf("4 Sort in descending order by score\n");
printf "4 Sort in descending order by score\n"
printf("5 Sort in ascending order by score\n");
printf "5 Sort in ascending order by score\n"
printf("6 Sort in ascending order by number\n");
printf "6 Sort in ascending order by number\n"
printf("7 Sort in dictionary order by name\n");
printf "7 Sort in dictionary order by name\n"
printf("8 Search by number\n");
printf "8 Search by number\n"
printf("9 Search by name\n");
printf "9 Search by name\n"
printf("10 Statistic analysis\n");
printf "10 Statistic analysis\n"
printf("11 List record\n");
printf "11 List record\n"
printf("12 Write to a file\n");
printf "12 Write to a file\n"
printf("13 Read from a file\n");
printf "13 Read from a file\n"
printf("0 Exit\n");
printf "0 Exit\n"
printf("Please Input your choice:");
printf "Please Input your choice:"
scanf("%d",&itemSelected); //读入用户输入
input itemSelected //读入用户输入
return itemSelected;
return itemSelected
}
}
```
```
// 函数功能:输入 n 个学生的 m 门课成绩
// 函数功能:输入 n 个学生的 m 门课成绩
```
```
void ReadScore(STU stu[],int n,int m)
function ReadScore(STU stu[],int n,int m) do
{
int i,j;
int i,j;
printf("Input student's ID ,name and score:\n");
printf "Input student's ID ,name and score:\n"
for(i=0,i< n ; i + + ) / / 输 入 n 个 同 学
for from i=0 to n-1 do //输入n个同学
{
scanf("%ld%s",&stu[i].num,stu[i].name);
input stu[i].num,stu[i].name
for(j=0;j< m ; j + + ) / / 输 入 m 门 成 绩
for form j=0 to m-1 do //输入m门成绩
scanf("%f",&stu[i].score[j]);
input stu[i].score[j]
}
end
}
end
end
```
```
//函数功能:计算每个学生各门课程的总分和平均分
//函数功能:计算每个学生各门课程的总分和平均分
```
```
void AverSumofEveryStudent(STU stu[],int n,int m)
function AverSumofEveryStudent(STU stu[],int n,int m) do
{
int i,j;
int i,j;
for(i=0;i< n ; i + + )
for form i=0 to n-1 do
{
stu[i].sum = 0; //初始化每个学生总分为0
stu[i].sum = 0; //初始化每个学生总分为0
for(j=0;j< m ; j + + )
for from j=0 to m-1 do
{
stu[i].sum = stu[i].sum + stu[i].score[j]; //累加分数
stu[i].sum = stu[i].sum + stu[i].score[j]; //累加分数
}
end
stu[i].aver = m>0 ? stu[i].sum /m : -1;
stu[i].aver = m>0 ? stu[i].sum /m : -1;
printf("student %d: sum = %.0f,aver = %.0f\n",i+1,stu[i].sum,stu[i].aver);
printf "student %d: sum = %.0f,aver = %.0f\n"
}
end
}
end
```
```
//函数功能:计算每门课程的总分和平均分
//函数功能:计算每门课程的总分和平均分
```
```
void AverSumofEveryCourse(STU stu[],int n,int m)
function AverSumofEveryCourse(STU stu[],int n,int m) do
{
int i,j;
int i,j;
float sum[COURSE_NUM],aver[COURSE_NUM];
float sum[COURSE_NUM],aver[COURSE_NUM];
for(j=0;j< m ; j + + )
for from j=0 to m-1 do
{
sum[j] = 0;
sum[j] = 0;
for(i=0;i< n ; i + + )
for from i=0 to n-1 do
{
sum[j]+= stu[i].score[j]; //计算n个同学每门课程的总分
sum[j]+= stu[i].score[j]; //计算n个同学每门课程的总分
end
}
aver[j] = sum[j]/i;
aver[j] = sum[j]/i;
printf("course %d: sum = %.0f,aver = %.0f\n",j+1, sum[j], aver[j]);
printf "course %d: sum = %.0f,aver = %.0f\n"
}
end
}
end
```
```
//函数功能:按选择法将数组 sum 的元素值排序
//函数功能:按选择法将数组 sum 的元素值排序
```
```
voidSortbyScore(STU stu[],int n,int m,int(*compare)(float a,float b))
function SortbyScore(STU stu[],int n,int m,int(*compare)(float a,float b)) do
{
int i, j, k, t;
int i, j, k, t;
for (i=0; i< n-1 ; i + + )
for from i=0 to n-2 do
{
k = i;
k = i;
for (j=i+1; j< n ; j + + )
for from i+1 to n-1 do
{
if (*compare)(stu[j].sum, stu[k].sum) set k = j;
if ((*compare)(stu[j].sum, stu[k].sum)) k = j;
end
}
if k != i
if (k != i)
for from t=0 to m-1 do //交换m门课程的成绩
{
for (t=0; t< m ; t + + ) / / 交 换 m 门 课 程 的 成 绩
{
SwapFloat(& stu[k].score[t], &stu[i].score[t]);
SwapFloat(& stu[k].score[t], &stu[i].score[t]);
}
end
SwapFloat(& stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(& stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(& stu[k].aver, &stu[i].aver); //交换平均分
SwapFloat(& stu[k].aver, &stu[i].aver); //交换平均分
SwapLong(& stu[k].num, &stu[i].num); //交换学号
SwapLong(& stu[k].num, &stu[i].num); //交换学号
SwapChar(stu[k].name, stu[i].name); //交换姓名
SwapChar(stu[k].name, stu[i].name); //交换姓名
}
end
}
end
}
end
```
```
//使数据按升序排序
//使数据按升序排序
```
```
int Ascending(float a,float b)
function Ascending(float a,float b) do
{
return a < b ; / / 这 样 比 较 决 定 了 按 升 序 排 序 , 如 果 a < b , 则 交 换
return a < b ; / / 这 样 比 较 决 定 了 按 升 序 排 序 , 如 果 a < b , 则 交 换
}
end
```
```
//使数据按降序排序
//使数据按降序排序
```
```
int Descending(float a,float b)
function Descending(float a,float b) do
{
return a > b; // 这样比较决定了按降序排序,如果 a>b, 则交换
return a > b; // 这样比较决定了按降序排序,如果 a>b, 则交换
}
end
```
```
//交换两个单精度浮点型数据
//交换两个单精度浮点型数据
```
```
void SwapFloat(float *x,float *y)
function SwapFloat(float *x,float *y) do
{
float temp;
float temp;
temp = *x;
temp = *x;
*x = *y;
*x = *y;
*y = temp;
*y = temp;
}
end
```
```
//交换两个长整型数据
//交换两个长整型数据
```
```
void SwapLong(long *x,long *y)
function SwapLong(long *x,long *y) do
{
long temp;
long temp;
temp = *x;
temp = *x;
*x = *y;
*x = *y;
*y = temp;
*y = temp;
}
end
```
```
//交换两个字符串
//交换两个字符串
```
```
void SwapChar(char x[],chary[])
function SwapChar(char x[],char y[]) do
{
char temp[MAX_LEN];
char temp[MAX_LEN];
strcpy(temp, x);
strcpy(temp, x);
strcpy(x, y);
strcpy(x, y);
strcpy(y, temp);
strcpy(y, temp);
}
end
```
```
//函数功能:按选择法将数组 num 的元素从低到高排序
//函数功能:按选择法将数组 num 的元素从低到高排序
```
```
void AsSortbyNum(STU stu[],int n,int m)
function AsSortbyNum(STU stu[],int n,int m) do
{
int i, j, k, t;
int i, j, k, t;
for (i=0; i< n-1 ; i + + )
for from i=0 to n-2 do
{
int i, j, k, t;
int i, j, k, t;
k = i;
set k = i;
for (j=i+1; j< n ; j + + )
for from j=i+1 to n-1 do
{
if stu[j].num < stu [ k ] . num set k = j;
if (stu[j].num < stu [ k ] . num ) k = j;
end
}
if k != i do
if (k != i)
for from t=0 to m-1 do //交换m门课程的成绩
{
for (t=0; t< m ; t + + ) / / 交 换 m 门 课 程 的 成 绩
{
SwapFloat(& stu[k].score[t], &stu[i].score[t]);
SwapFloat(& stu[k].score[t], &stu[i].score[t]);
}
end
SwapFloat(& stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(& stu[k].sum, &stu[i].sum); //交换总分
SwapFloat(& stu[k].aver, &stu[i].aver); //交换平均分
SwapFloat(& stu[k].aver, &stu[i].aver); //交换平均分
SwapLong(& stu[k].num, &stu[i].num); //交换学号
SwapLong(& stu[k].num, &stu[i].num); //交换学号
SwapChar(stu[k].name, stu[i].name); //交换姓名
SwapChar(stu[k].name, stu[i].name); //交换姓名
}
end
}
end
}
end
```
```
//函数功能:交换法实现字符串按字典顺序排序
//函数功能:交换法实现字符串按字典顺序排序
```
```
void SortbyName(STU stu[],int n,int m)
function SortbyName(STU stu[],int n,int m) do
{
int i, j, t;
int i, j, t;
for (i=0; i< n-1 ; i + + )
for from i=0 to n-2 do
{
for from j = i+1 to n-1 do
for (j = i+1; j< n ; j + + )
if strcmp(stu[j].name, stu[i].name) < 0 do
{
for from t=0 to m-1 do //交换m门课程的成绩
if (strcmp(stu[j].name, stu[i].name) < 0 )
{
for (t=0; t< m ; t + + ) / / 交 换 m 门 课 程 的 成 绩
{
SwapFloat(& stu[i].score[t], &stu[j].score[t]);
SwapFloat(& stu[i].score[t], &stu[j].score[t]);
}
end
SwapFloat(& stu[i].sum, &stu[j].sum); //交换总分
SwapFloat(& stu[i].sum, &stu[j].sum); //交换总分
SwapFloat(& stu[i].aver, &stu[j].aver); //交换平均分
SwapFloat(& stu[i].aver, &stu[j].aver); //交换平均分
SwapLong(& stu[i].num, &stu[j].num); //交换学号
SwapLong(& stu[i].num, &stu[j].num); //交换学号
SwapChar(stu[i].name, stu[j].name); //交换姓名
SwapChar(stu[i].name, stu[j].name); //交换姓名
}
end
}
end
}
end
}
end
```
```
//函数功能:按学号查找学生成绩并显示查找结果
//函数功能:按学号查找学生成绩并显示查找结果
```
```
void SearchbyNum(STU stu[],int n,int m)
function SearchbyNum(STU stu[],int n,int m) do
{
long number;
long number;
int i,j;
int i,j;
printf("Input the number you want to search:");
printf"Input the number you want to search:"
scanf("%ld",&number);
input number
for(i=0;i< n ; i + + )
forfrom i=0 to n-1 do
if(stu[i].num==number)
if stu[i].num==number do
{
printf"\n"
printf("\n");
for from j=0 to m-1 do
for(j=0;j< m ; j + + )
printf "%d\t"
printf("%d\t",stu[i].score[j]);
printf "\n"
printf("\n");
break;
break;
}
end
if(i==n)
if i==n
printf("\nNot found!\n");
printf "\nNot found!\n"
}
end
```
```
//函数功能:按姓名查找学生成绩并显示查找结果
//函数功能:按姓名查找学生成绩并显示查找结果
```
```
void SearchbyName(STU stu[],int n,int m)
function SearchbyName(STU stu[],int n,int m) do
{
char x[MAX_LEN];
char x[MAX_LEN];
int i,j;
int i,j;
printf("Input the name you want to search:");
printf "Input the name you want to search:"
scanf("%s", x);
input x
for(i=0;i< n ; i + + )
for from i=0 to n-1 do
{
if strcmp(stu[i].name,x)==0 do
if(strcmp(stu[i].name,x)==0)
printf "%ld\t%s\t",stu[i].num,stu[i].name"
{
for from j=0 to m-1 do
printf("%ld\t%s\t",stu[i].num,stu[i].name);
printf "%.0f\t"
for(j=0;j< m ; j + + )
end
{
printf ".0f\t%.0f\n"
printf("%.0f\t",stu[i].score[j]);
}
printf(".0f\t%.0f\n",stu[i].sum,stu[i].aver);
return;
return;
}
end
}
end
printf("\nNot found!\n);
printf "\nNot found!\n"
}
end
```
```
//函数功能:统计各分数段的学生人数及所占的百分比
//函数功能:统计各分数段的学生人数及所占的百分比
```
```
void StatisticAnalysis(STU stu[],int n,int m)
funtion StatisticAnalysis(STU stu[],int n,int m) do
{
int i,j,t[6];
int i,j,t[6];
for(j=0;j< m ; j + + )
for from j=0 do m-1 do
{
printf "For course %d:\n"
printf("For course %d:\n",j+1);
memset(t,0,sizeof(t)); //将数组 t 的全部元素初始化为0
memset(t,0,sizeof(t)); //将数组 t 的全部元素初始化为0
for(i=0;i< n ; i + + )
for from i=0 to n-1 do
{
if stu[i].score[j]>=0& & stu[i].score[j]< 60 set t [ 0 ] + +
if(stu[i].score[j]>=0& & stu[i].score[j]< 60 ) t [ 0 ] + + ;
else if stu[i].score[j]< 70 set t [ 1 ] + + ;
else if(stu[i].score[j]< 70 ) t [ 1 ] + + ;
else if stu[i].score[j]< 80 set t [ 2 ] + + ;
else if(stu[i].score[j]< 80 ) t [ 2 ] + + ;
else if stu[i].score[j]< 90 set t [ 3 ] + + ;
else if(stu[i].score[j]< 90 ) t [ 3 ] + + ;
else if stu[i].score[j]< 100 set t [ 4 ] + + ;
else if(stu[i].score[j]< 100 ) t [ 4 ] + + ;
else if stu[i].score[j]==100 set t[5]++;
else if(stu[i].score[j]==100) t[5]++;
end
}
for from i=0 to 4 do
for(i=0;i< =5;i++)
if i==0 printf "< 60 \t% d \t%. 2f %% \n"
{
else if i==5 printf "%d\t%d\t%.2f%%\n"
if(i==0) printf("< 60 \t% d \t%. 2f %% \n", t [ i ],( float ) t [ i ]/ n * 100 );
else printf "%d-%d\t%d\t%.2f%%\n"
else if(i==5) printf("%d\t%d\t%.2f%%\n",(i+5)*10,t[i],(float)t[i]/n*100);
end
else printf("%d-%d\t%d\t%.2f%%\n",(i+5)*10,(i+5)*10+9,t[i],(float)t[i]/n*100);
end
}
end
}
}
```
```
//函数功能:打印学生成绩
//函数功能:打印学生成绩
```
```
void PrintScore(STU stu[],int n,int m)
function PrintScore(STU stu[],int n,int m) do
{
int i,j;
int i,j;
for (i=0; i< n ; i + + )
for from i=0 to n-1 do
{
printf "%ld\t%s\t"
printf("%ld\t%s\t", stu[i].num, stu[i].name);
for from j=0 to m-1 do
for (j=0; j< m ; j + + )
printf "%.0f\t"
{
end
printf("%.0f\t", stu[i].score[j]);
printf "%.0f\t%.0f\n"
}
end
printf("%.0f\t%.0f\n", stu[i].sum, stu[i].aver);
end
}
}
```
```
//输出 n 个学生的学号、姓名及 m 门课程的成绩到文件 student.txt 中
//输出 n 个学生的学号、姓名及 m 门课程的成绩到文件 student.txt 中
```
```
void WritetoFile(STU stu[],int n,int m)
function WritetoFile(STU stu[],int n,int m) do
{
FILE *fp;
FILE *fp;
int i, j;
int i, j;
if((fp = fopen("student.txt","w")) == NULL)
if fp = fopen("student.txt","w") == NULL do
{
printf "Failure to open score.txt!\n"
printf("Failure to open score.txt!\n");
exit(0);
exit(0);
}
end
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
fprintf(fp, "%d\t%d\n", n, m); //将学生人数和课程门数写入文件
for (i=0; i< n ; i + + )
for from i=0 to n-1 do
{
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
fprintf(fp, "%10ld%10s", stu[i].num, stu[i].name);
for (j=0; j< m ; j + + )
for from j=0 to m-1 do
{
fprintf(fp, "%10.0f", stu[i].score[j]);
fprintf(fp, "%10.0f", stu[i].score[j]);
}
end
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
fprintf(fp, "%10.0f%10.0f\n", stu[i].sum, stu[i].aver);
}
end
fclose(fp);
fclose(fp);
}
end
```
```
//从文件中读取学生的学号、姓名及成绩等信息写入到结构体 stu 中
//从文件中读取学生的学号、姓名及成绩等信息写入到结构体 stu 中
```
```
void ReadfromFile(STU stu[],int *n,int *m)
function ReadfromFile(STU stu[],int *n,int *m) do
{
FILE *fp;
FILE *fp;
int i, j;
int i, j;
if ((fp = fopen("student.txt","r")) == NULL)
if fp = fopen("student.txt","r") == NULL do
{
printf "Failure to open score.txt!\n"
printf("Failure to open score.txt!\n");
exit(0);
exit(0);
}
end
fscanf(fp, "%d\t%d", n, m); //从文件中读出学生人数,课程门数
fscanf(fp, "%d\t%d", n, m); //从文件中读出学生人数,课程门数
for (i=0; i< *n; i++) //学生人数保存在n指向的储存单元
for from i=0 to *n-1 do //学生人数保存在n指向的储存单元
{
fscanf(fp, "%10ld", &stu[i].num);
fscanf(fp, "%10ld", &stu[i].num);
fscanf(fp, "%10s", stu[i].name);
fscanf(fp, "%10s", stu[i].name);
for (j=0; j< *m; j++) //课程门数保存在m指向的储存单元
for form j=0 to *m-1 do //课程门数保存在m指向的储存单元
{
fscanf(fp, "%10f", &stu[i].score[j]); //不能用%10.0f
fscanf(fp, "%10f", &stu[i].score[j]); //不能用%10.0f
}
end
fscanf(fp, "%10f%10f", & stu[i].sum, &stu[i].aver); //不能用%10.0f
fscanf(fp, "%10f%10f", & stu[i].sum, &stu[i].aver); //不能用%10.0f
}
end
fclose(fp);
fclose(fp);
}
end
```
```