仅提供代码段供交流,无注释
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
int menu(void);
typedef struct student
{
int Usualscore,Finalgrade,Number;
int totalscore;
} student;
void Readdata(int n,student *students);
void Count(int n,student *students);
void ShowData1(int n,student *students);
//student students[10000];
void Showdata2(int n,student *students);
void DrawHistogram(int n,student *students);
void Top10Studnets(int n,student *students);
int menu(void){
int itemSelected;
printf("\n=========Student Score Analysis=========\n");
printf(" 1. Read Data\n");
printf(" 2. Count\n");
printf(" 3. Show Data Ⅰ\n");
printf(" 4. Draw Histogram\n");
printf(" 5. Show Data Ⅱ\n");
printf(" 6. Top 10 Students\n");
printf(" 0. Exit\n");
printf("========================================\n");
printf("Your choice: ");
scanf("%d", &itemSelected);
return itemSelected;
}
int main()
{
int n;
printf("Please enter the number of students:");
scanf("%d",&n);
student students[n];
students[0].Number=0;
students[0].totalscore=0;
while(1)
{
switch(menu())
{
case 1:
Readdata(n,students);
break;
case 2:
if(students[0].Number==0)
{
printf("Please read in the data first");
break;
}
Count(n,students);
break;
case 3:
if(students[0].Number==0)
{
printf("Please read in the data first");
break;
}
if(students[0].totalscore==0)
{
printf("Please calculate the data first");
break;
}
ShowData1(n,students);
break;
case 4:
if(students[0].Number==0)
{
printf("Please read in the data first");
break;
}
if(students[0].totalscore==0)
{
printf("Please calculate the data first");
break;
}
DrawHistogram(n,students);
break;
case 5:
if(students[0].Number==0)
{
printf("Please read in the data first");
break;
}
if(students[0].totalscore==0)
{
printf("Please calculate the data first");
break;
}
Showdata2(n,students);
break;
case 6:
if(students[0].Number==0)
{
printf("Please read in the data first");
break;
}
if(students[0].totalscore==0)
{
printf("Please calculate the data first");
break;
}
Top10Studnets(n,students);
break;
case 0:
printf("Let`s Exit\n");
exit(0);
break;
default:
break;
}
}
return 0;
}
void Readdata(int n,student *students)
{
int k,i;
char a[100];
FILE * pf;
// student students[n];
printf("\n=========Way To Choose=========\n");
printf(" 1. Manually enter\n");
printf(" 2. Automatic enter\n");
printf("===============================\n");
scanf("%d",&k);
switch(k)
{
case 1:
printf("Please enter your student number first and then enter their usual and final grades\n");
for(i=0;i<n;i++)
{
scanf("%d",&students[i].Number);
scanf("%d%d",&students[i].Usualscore,&students[i].Finalgrade);
}
printf("Read successfully");
break;
case 2:
// printf("Please enter the file to read (TXT suffix):");
// scanf("%c",&a[100]);
pf= fopen("b.txt", "r");
i = 0;
for(; i<n && !feof(pf);i++)
{
fscanf(pf, "%d", &students[i].Number);
fscanf(pf, "%d%d", &students[i].Usualscore, &students[i].Finalgrade);
}
fclose(pf);
printf("Read Successfully\n");
break;
}
}
void Count(int n,student *students)
{
// student students[n];
int i;
for(i=0;i<n;i++)
{
students[i].totalscore=0.50*(students[i].Usualscore)+0.50*(students[i].Finalgrade);
}
printf("Count successfully");
}
void ShowData1(int n,student *students)
{
int i;
// student students[n];
for(i=0;i<n;i++)
{
printf("%d\t%d\t%d\t%d\n",students[i].Number,students[i].Usualscore,students[i].Finalgrade,students[i].totalscore);
}
}
void Showdata2(int n,student *students)
{
int max=0,min=100,k=0,i,j,t,sum1=0,sum2=0,sum3=0;
int time[101],mod;
float sum4=0,sum5=0,sum6=0;
int a[n],median,max2;
float passrate,average1,average2,average3,standarddeviation1,standarddeviation2,standarddeviation3;
for(i=0;i<n;i++)
{
sum1=sum1+students[i].Usualscore;
sum2=sum2+students[i].Finalgrade;
sum3=sum3+students[i].totalscore;
if(students[i].Finalgrade>60)
{
k=k+1;
}
}
passrate=((float)k/(float)n)*100;
average1=sum1/n;
average2=sum2/n;
average3=sum3/n;
for(i=0;i<n;i++)
{
if(students[i].Finalgrade>max)
{
max=students[i].Finalgrade;
}
if(students[i].Finalgrade<min)
{
min=students[i].Finalgrade;
}
}
for(i=0;i<n;i++)
{
sum4=sum4+(students[i].Usualscore-average1)*(students[i].Usualscore-average1);
sum5=sum5+(students[i].Finalgrade-average2)*(students[i].Finalgrade-average2);
sum6=sum6+(students[i].totalscore-average3)*(students[i].totalscore-average3);
}
standarddeviation1=sqrt(sum4/n);
standarddeviation2=sqrt(sum5/n);
standarddeviation3=sqrt(sum6/n);
for(i=0;i<=100;i++)
{
time[i]=0;
}
for(i=0;i<n;i++)
{
time[students[i].totalscore]=time[students[i].totalscore]+1;
}
mod=0;
for(i=0;i<=100;i++)
{
if(time[i]>time[mod])
{
mod=i;
}
}
for(i=0;i<n;i++)
{
a[i]=students[i].totalscore;
}
for(i=0;i<n;i++)
{
max2=i;
for(j=i;j<n;j++)
{
if(a[max2]<a[j])
{
max2=j;
}
}
t=a[i];
a[i]=a[max2];
a[max2]=t;
}
printf("及格率 = %.2f 最高分 = %d 最低分 = %d\n",passrate,max,min);
printf("平时成绩平均分 = %.2f 平时成绩标准差 = %.2f\n",average1,standarddeviation1);
printf("期末成绩平均分 = %.2f 期末成绩标准差 = %.2f\n",average2,standarddeviation2);
printf("总评成绩平均分 = %.2f 总评成绩标准差 = %.2f\n",average3,standarddeviation3);
printf("总评成绩中位数 = %d 总评成绩众数 = %d",a[(int)((float)n/2.0-0.5)],mod);
}
void DrawHistogram(int n,student *students)
{
int i, j,grade[11];
int max, k,temp, x;
char screen[22][44];
for(i=0;i<11;i++)
{
grade[i]=0;
}
for(i=0;i<n;i++)
{
grade[(int)((float)students[i].Finalgrade/10)]=grade[(int)((float)students[i].Finalgrade/10)]+1;
}
printf("=================直方图=================\n");
max = 0;
for(i = 0; i<=10; i++){
if(grade[i]>max){
max = grade[i];
}
}
for(i = 1; i<=10; i++){
grade[i]=(int)(20.0 * grade[i]/max+0.5);
}
for(i =0; i<=21; i++){
for(j =0; j<=41; j++){
screen[i][j]=0;
}
}
for(i = 0; i<= 41; i++){
screen[21][i]= '-';
}
screen[21][41]='X';
screen[0][0] = 'Y';
for(i = 1; i<=21; i++){
screen[i][0]= '|';
}
k = 1;
for(x = 1; x<=10; x++, k+=4){
temp= grade[x];
if(temp != 0){
for(i = 1; i<=temp; i++){
for(j = 1; j<=4; j++){
screen[20-i+1][j+k] = '*';
}
}
}
}
for(i =0; i<=21; i++){
for(j = 0; j<=41; j++){
if(screen[i][j] != 0){
printf("%c", screen[i][j]);
}else {
printf(" ");
}
}
printf("\n");
}
printf("0");
for(i = 1; i<=10; i++)
printf("%4d", i*10);
printf("\n");
// getch();
}
void Top10Studnets(int n,student *students)
{
int a[n],b[n],max2,i,j,t,number,k;
for(i=0;i<n;i++)
{
a[i]=students[i].totalscore;
b[i]=students[i].Number;
}
for(i=0;i<n;i++)
{
max2=i;
for(j=i;j<n;j++)
{
if(a[max2]<a[j])
{
max2=j;
}
}
t=a[i];
number=b[i];
a[i]=a[max2];
a[max2]=t;
b[i]=b[max2];
b[max2]=number;
}
k=n>10?10:n;
for(i=0;i<k;i++)
{
printf("第%d名是%d号,分数是%d\n",1+i,b[i],a[i]);
}
}
这是大一初学C语言时候的课程设计,简易的控制台打印进行数据的读入和输出