#include"stdio.h" #include"string.h" #include"conio.h" #include"math.h" #define SIZE 300 typedef struct student { int number; int score[3]; } STUDENT; ...
#include"stdio.h"
#include"string.h"
#include"conio.h"
#include"math.h"
#define SIZE 300
typedef struct student
{
int number;
int score[3];
} STUDENT;
typedef enum boolen
{False,True
}FLAG;
int accept_data(STUDENT stu[],int grade[]);
void show_data(STUDENT stu[],int sum,int grade[]);
void draw(int grade[]);
void count(int *max,int *min,double *pass,double ave[],double f[],STUDENT stu[],int sum);
void show_data2(int max,int min,double pass,double ave[],double f[]);
int main()
{int sum,max,min;
double pass=0;
int grade[11]={0};
STUDENT stu[SIZE];
double ave[SIZE],f[SIZE];
sum=accept_data(stu,grade);
show_data(stu,sum,grade);
draw(grade);
count(&max,&min,&pass,ave,f,stu,sum);
show_data2(max,min,pass,ave,f);
return 0;
}
int accept_data(STUDENT stu[],int grade[])
{int i=0,sum=0,temp,a1,a2;
FLAG flag;
printf("\n請輸入計算總評成績時使用平時成績與期末成績的比例,用整數表示");
scanf("%d%d",&a1,&a2);
while(i<SIZE)
{printf("\n請輸入學號:");
scanf("%d",&stu[i].number);
if(stu[i].number==-1)
{sum=i;
break;
}
printf("\n請輸入學生的平時成績和期末成績:");
flag=True;
while(flag==True)
{scanf("%d%d",&stu[i].score[0],&stu[i].score[1]);
if(stu[i].score[0]<=100&&stu[i].score[0]>=0&&stu[i].score[1]<=100&&stu[i].score[1]>=0)
flag=False;
else
printf("\n\007 錯誤數據!請再次輸入學生的平時成績和期末成績:");
}
temp=(int)(1.0*a1/100*stu[i].score[0]+1.0*a2/100*stu[i].score[1]);
stu[i].score[2]=temp;
temp=(stu[i].score[1])/10;
if(temp==10)
grade[10]++;
else grade[temp+1]++;
i++;
}
return sum;
}
void show_data(STUDENT stu[],int sum,int grade[])
{
int i,j;
for(i=0;i<sum;i++)
{printf("%4d",stu[i].number);
for(j=0;j<3;j++)
printf("%4d",stu[i].score[j]);
printf("\n");
}
for(i=1;i<=10;i++)
printf("%d",grade[i]);
}
void count(int *max,int *min,double *pass,double ave[],double f[],STUDENT stu[],int sum)
{int i,j,p_sum=0;
int total[3];
double temp;
*max=*min=stu[0].score[1];
if(stu[0].score[1]>=60)
p_sum++;
for(i=1;i<sum;i++)
{if((stu[i].score[1])>*max)
*max=stu[i].score[1];
if((stu[i].score[1])<*min)
*min=stu[i].score[1];
if(stu[i].score[1]>=60)
p_sum++;
}
*pass=(1.0*p_sum/sum)*100;
for(i=0;i<=2;i++)
total[i]=0;
for(j=0;j<3;j++)
for(i=0;i<sum;i++)
{
total[j]=total[j]+stu[i].score[j];
}
for(j=0;i<3;j++)
{ave[j]=total[j]/sum;
}
for(j=0;j<3;j++)
{
f[j]=0;
for(i=0;i<sum;i++)
{
temp=stu[i].score[j]-ave[j];
f[j]=f[j]+temp*temp;
}
f[j]=sqrt(fabs(f[j])/sum);
}
}
void show_data2(int max,int min,double pass,double ave[],double f[])
{
int j;
char str1[3][20]={"平時成績平均分","期末成績平均分","總評成績平均分"};
char str2[3][20]={"平時成績標準差","期末成績標準差","總評成績平標準差"};
printf("\n 及格率=%6.2f%%最高分=%d最低分=%d\n",pass,max,min);
for(j=0;j<3;j++)
printf("\n %s=%6.2f%s=%6.2f\n",str1[j],ave[j],str2[j],f[j]);
}
void draw(int grade[])
{
int i,j,max,k,temp,x;
char screen[22][44];
printf("\n 模擬直方圖\n");
max=0;
for(i=1;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=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 10 20 30 40 50 60 70 80 90 100\n");
getch();
}
本程式主要通過定義含有學號和3個成績的student結構體,來實現對錄入數據的操作,主要實現功能有求最高分數和最低分數,已經求不及格人數,通過對平時成績加期末成績來判斷,期末成績和平時成績所占比例用戶自己輸入,最後調用draw函數來顯示各個分數段的比例,通過*個數顯示。
這是本人第一次發帖,不足之處,還望見諒指正。