用c语言统计4科成绩及格率

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用c语言统计4科成绩及格率相关的知识,希望对你有一定的参考价值。

如题,要直接能运行的
忘了说 是N个人,四科成绩,每科成绩的及格率

从我的学生信息管理系统完整程序中摘录出题主需要的部分吧~

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define status int

#define NAME 30 /*各类名称字数上限*/
#define STU 100 /*学生人数上限*/
#define SUB 10 /*课程数上限*/

typedef struct record 
float score; /*成绩分数*/
 record;

typedef struct student 
int id; /*id*/
int no; /*学号*/
char name[NAME]; /*姓名*/
record scores[SUB]; /*各门课成绩分数*/
 student;

char subject[SUB][NAME]; /*课程名称*/

int main (void) 
int stuNum; /*学生人数*/
int subNum; /*课程数*/
student stu[STU+1]; /*学生结构体数组,最后留一位buffer*/

initProgram (stu, &stuNum, &subNum, 0); /*初始化*/
runMeun (stu, &stuNum, subNum); /*运行菜单*/ 

return 0;


/*初始化*/
/*mode==0:测试模式,灌入测试数据*/
/*mode==1:程序写定课程数、课程名称*/
status initProgram (student stu[], int *stuNum, int *subNum, int mode) 
/*测试模式*/
if (mode==0)
inputTestStuInfo (stu, stuNum, subNum);

/*程序写定课程数、课程名称*/
else if (mode==1) 
*stuNum = 0;
*subNum = 2;
memcpy (subject[0], "语文" ,4);
memcpy (subject[1], "数学" ,4);


return 1;


/*测试数据*/
status inputTestStuInfo (student stu[], int *stuNum, int *subNum) 
status testStatus; 
int i;

*subNum = 4;
memcpy (subject[0], "语文" ,4);
memcpy (subject[1], "数学" ,4);
memcpy (subject[2], "英语" ,4);
memcpy (subject[3], "理综" ,4);

*stuNum = 5;
stu[0].id=1;
stu[0].no=1001;
strcpy (stu[0].name,"Zhao");
stu[0].scores[0].score=65.5;
stu[0].scores[1].score=77;
stu[0].scores[2].score=61;
stu[0].scores[3].score=52;

stu[1].id=2;
stu[1].no=1002;
strcpy (stu[1].name,"Qian");
stu[1].scores[0].score=88;
stu[1].scores[1].score=76;
stu[1].scores[2].score=46;
stu[1].scores[3].score=52;

stu[2].id=3;
stu[2].no=1003;
strcpy (stu[2].name,"Sun");
stu[2].scores[0].score=72;
stu[2].scores[1].score=69;
stu[2].scores[2].score=90;
stu[2].scores[3].score=81;

stu[3].id=4;
stu[3].no=1004;
strcpy (stu[3].name,"Li");
stu[3].scores[0].score=98.5;
stu[3].scores[1].score=80;
stu[3].scores[2].score=76;
stu[3].scores[3].score=40;

stu[4].id=5;
stu[4].no=1005;
strcpy (stu[4].name,"Zhou");
stu[4].scores[0].score=56.5;
stu[4].scores[1].score=60.5;
stu[4].scores[2].score=54.5;
stu[4].scores[3].score=52;

return 1; 


/*学生信息判空*/
/*为空返回1;不空返回0*/
int stuInfoEmpty (student stu[], int stuNum) 
int i,stat=0;

if (stuNum == 0)
return 1;

for (i=0; i<stuNum; i++)
stat+=stu[i].id;
if (!stat)
return 1;

return 0;


/*学生为空时的处理*/
status stuInfoEmptyOp (student stu[], int stuNum) 
puts ("尚未录入学生信息!即将返回主菜单。");
pressAnykeyToContinue ();
return 1;


/*学号判重*/
/*重复返回1;不重复返回0*/
int noRepeated (student stu[], int stuNum, int no) 
int i;
for (i=0; i<stuNum; i++)
if (no == stu[i].no)
return 1;
return 0;


/*输出录入学生信息之表头*/
status printInputStuInfoheader (int subNum) 
int i;
puts ("--------------------------------------------------------------------------");
printf ("\\t\\t学号\\t姓名\\t");
for (i=0; i<subNum; i++)
printf ("%s\\t",subject[i]);
putchar ('\\n');
puts ("--------------------------------------------------------------------------");
return 1;


/*录入单个学生信息*/
/*参数说明:*/
/*int ismod:是否修改信息。是:1;否:0*/
/*返回值说明*/
/*0:本次未录入;-1:学号重复;-2成绩错误;1:录入成功*/
status inputStuInfo (student stu[], int *stuNum, int subNum, int stuIndex, int ismod) 
int i,temp;

fflush (stdin); /*清除缓冲区*/

scanf ("%d",&temp);
if (temp==-1) /*录入-1以结束*/
return 0; /*本次未录入*/

/*非修改,即新增学生信息*/
if (ismod == 0) 
if (noRepeated (stu, *stuNum, temp)==1) /*学号重复*/
return -1;

/*修改学生信息*/
if (ismod == 1) 
if (temp!=stu[stuIndex].no && noRepeated (stu, *stuNum, temp)==1) /*学号不等于原学号,且学号重复*/
return -1;


stu[stuIndex].id = (*stuNum)+1; /*分配id*/

stu[stuIndex].no = temp; /*学号*/

scanf ("%s",&stu[stuIndex].name);  /*姓名*/

for (i=0; i<subNum; i++) 
scanf ("%f",&stu[stuIndex].scores[i].score);
 /*各门课成绩分数*/

for (i=0; i<subNum; i++)
if (stu[stuIndex].scores[i].score>100 || stu[stuIndex].scores[i].score<0)
return -2; /*成绩错误*/

if (ismod!=1)
*stuNum+=1;

return 1; /*本次录入成功*/


/*录入全部学生信息*/
status inputAllStuInfo (student stu[], int *stuNum, int subNum) 
int i,inputStatus,count;

puts ("==========================================================================");
puts ("录入学生信息");
puts ("==========================================================================");
putchar ('\\n');

/*学生信息为空*/
if (stuInfoEmpty (stu,*stuNum)) 
puts ("请录入学生信息(学号录入-1以结束)↓↓");
putchar ('\\n');

/*已有学生信息*/
else 
printf ("已有%d名学生信息!\\n",*stuNum);
putchar ('\\n');
puts ("继续录入以新增(学号录入-1以结束)↓↓");
putchar ('\\n');


printInputStuInfoheader (subNum); /*录入信息之表头*/

/*录入信息*/
count = 0; /*本次录入学生计数*/ 
i = *stuNum;
while (1) 
printf ("第%d名学生\\t",i+1);
inputStatus = inputStuInfo (stu, stuNum, subNum, i, 0);
/*录入成功*/
if (inputStatus == 1) 
i++;
count ++;

/*录入错误*/
else if (inputStatus < 0) 
putchar ('\\n');
if (inputStatus == -1)
printf ("学号重复!");
if (inputStatus == -2)
printf ("成绩错误!");
puts ("请重新输入↓");
continue;

/*本次未录入*/
else if (inputStatus == 0)
break;

puts ("--------------------------------------------------------------------------");
putchar ('\\n');

if (count!=0)
printf ("本次%d名学生信息录入完毕!即将返回主菜单。\\n",count);
else
printf ("您本次未输入学生信息!即将返回主菜单。\\n");
putchar ('\\n');

pressAnykeyToContinue ();
return 1;


/*输出学生信息之表头*/
status printStuInfoheader (int subNum, int inclRanking) 
int i;

puts ("--------------------------------------------------------------------------");
printf ("%-4s%2c","id",32);
printf ("%-4s%2c","学号",32);
printf ("%-10s%2c","姓名",32);
for (i=0; i<subNum; i++)
printf ("%-6s%2c",subject[i],32);
putchar ('\\n');
puts ("--------------------------------------------------------------------------");


/*输出单个学生信息*/
status printStuInfo (student stu[], int stuIndex, int subNum, int inclRanking) 
int i;

printf ("%-4d%2c",stu[stuIndex].id,32); /*id*/
printf ("%-4d%2c",stu[stuIndex].no,32); /*学号*/
printf ("%-10s%2c",stu[stuIndex].name,32);  /*姓名*/
for (i=0; i<subNum; i++) /*各门课成绩分数*/
printf ("%-6.2f%2c",stu[stuIndex].scores[i].score,32);

putchar ('\\n');

return 1;


/*输出全部学生信息*/
status printAllStuInfo (student stu[], int stuNum, int subNum, int inclRanking) 
int i;

/*学生信息为空则提示并退出*/
if (stuInfoEmpty (stu,stuNum)) 
stuInfoEmptyOp(stu,stuNum);
return 0;


puts ("==========================================================================");
puts ("全部学生信息");
puts ("==========================================================================");
putchar ('\\n');

printf ("%d名学生信息如下 ↓↓\\n",stuNum);
putchar ('\\n');

/*输出信息之表头*/
printStuInfoheader (subNum, inclRanking);

/*输出信息*/
for (i=0; i<stuNum; i++)
printStuInfo (stu, i, subNum, inclRanking);
puts ("--------------------------------------------------------------------------");
putchar ('\\n');

puts ("学生信息输出完毕!即将返回主菜单。");
putchar ('\\n');

pressAnykeyToContinue ();
return 1;


/*输出统计数据*/
status printStatistics (student stu[], int stuNum, int subNum) 
int sub1PassCount,sub2PassCount,sub3PassCount,sub4PassCount; /*各科及格人数*/
float sub1PassRate,sub2PassRate,sub3PassRate,sub4PassRate; /*各科及格率*/
int i;

/*学生信息为空则提示并退出*/
if (stuInfoEmpty (stu,stuNum)) 
stuInfoEmptyOp(stu,stuNum);
return 0;


system ("cls");
puts ("==========================================================================");
puts ("输出统计数据");
puts ("==========================================================================");
putchar ('\\n');

printf ("全部%d名学生\\n",stuNum);
putchar ('\\n');

sub1PassCount = sub2PassCount = sub3PassCount = sub4PassCount = 0;

for (i=0; i<stuNum; i++) 
if (stu[i].scores[0].score>=PASS && stu[i].scores[0].score<=100)
sub1PassCount++;
if (stu[i].scores[1].score>=PASS && stu[i].scores[1].score<=100)
sub2PassCount++;
if (stu[i].scores[2].score>=PASS && stu[i].scores[2].score<=100)
sub3PassCount++;
if (stu[i].scores[3].score>=PASS && stu[i].scores[3].score<=100)
sub4PassCount++;


sub1PassRate = (float)sub1PassCount / (float)stuNum;
sub2PassRate = (float)sub2PassCount / (float)stuNum;
sub3PassRate = (float)sub3PassCount / (float)stuNum;
sub4PassRate = (float)sub4PassCount / (float)stuNum;

puts ("各门课及格率如下:");

puts ("--------------------------------------------------------------------------");
printf ("%-6s%2c%-8s%2c%-6s\\n",subject[0],32,"及格人数",32,"及格率");
puts ("--------------------------------------------------------------------------");
printf ("%-6s%2c%-8d%2c%-5.2f%c",subject[0],32,sub1PassCount,32,sub1PassRate*100,'%');
putchar ('\\n');

printf ("%-6s%2c%-8d%2c%-5.2f%c",subject[1],32,sub2PassCount,32,sub2PassRate*100,'%');
putchar ('\\n');

printf ("%-6s%2c%-8d%2c%-5.2f%c",subject[2],32,sub3PassCount,32,sub3PassRate*100,'%');
putchar ('\\n');

printf ("%-6s%2c%-8d%2c%-5.2f%c",subject[3],32,sub4PassCount,32,sub4PassRate*100,'%');
putchar ('\\n');

pressAnykeyToContinue ();
return 1;


/*输入命令编号*/
int getCommand (void) 
int key; /*命令编号*/

printf("请输入命令编号以开启操作:");
scanf ("%d",&key);

return key;


/*打印菜单文本*/
status printMenuText (void) 
puts ("==========================================================================");
puts ("学生信息管理");
puts ("--------------------------------------------------------------------------");
printf ("%4c\\t功能详情\\n",'#');
puts ("--------------------------------------------------------------------------");
printf ("%4d\\t输入学生信息\\n",1);
printf ("%4d\\t输出所有学生信息\\n",2);
printf ("%4d\\t输出统计数据\\n",3);
printf ("%4d\\t退出\\n",0);
puts ("==========================================================================");
putchar ('\\n');

return 1;


/*运行菜单*/ 
status runMeun (student stu[], int *stuNum, int subNum) 
int key;
do 
system ("cls"); /*清屏*/
printMenuText (); /*打印菜单文本*/
key = getCommand (); /*输入命令编号*/
putchar ('\\n');
system ("cls");
switch (key) 
case 1: inputAllStuInfo (stu, stuNum, subNum); break;
  case 2: printAllStuInfo (stu, *stuNum, subNum, 1); break;
  case 3: printStatistics (stu, *stuNum, subNum); break;
  case 0: 
printMenuText ();
puts ("程序结束!");
pressAnykeyToContinue ();
break;
  default:
  printMenuText ();
  puts ("命令编号错误,请重新输入!");
pressAnykeyToContinue ();
break;
    
 while (key!=0);

return 1;


/*按任意键继续*/
status pressAnykeyToContinue (void) 
putchar ('\\n');
puts ("按任意键继续...");
fflush (stdin);
getch ();
return 1;

运行结果

参考技术A

一、公式:

及格率=及格数/总数*100%

二、算法:

1、 输入四科成绩;

2、 统计及格数;

3、 计算及格率;

4、 输出结果。

三、参考代码:

#include <stdio.h>
int main()

    float score;
    int cnt=0;
    int i;
    for(i = 0; i < 4; i ++)//循环执行四次。
    
        scanf("%f", &score);//输入成绩。
        if(score >= 60)//及格
            cnt++;//统计及格科目数。
    
    printf("及格率=%.0f%%\\n", cnt/4.0*100);//计算并输出结果。
    return 0;

四、注意事项:

1、 在printf中输出%需要使用%%。

2、 对于本题,其实是可以优化一点的。由于只有四科,所以及格率必然是0,25%,50%,75%,100%其中之一。 计算的时候可以优化为:

printf("及格率=%d%%\\n", cnt*25);

参考技术B #include<stdio.h>

int main(void)
        float score[4]=;
        int i=0;
        float flag=0;
        for(i=0;i<4;i++)
                printf("请输入科目%d的成绩:",i+1);
                scanf("%f",&score[i]);
                if(score[i]>=60)
                        flag++;
           
        for(i=0;i<4;i++)
                printf("科目%d的成绩为:%.2f\\n",i+1,score[i]);
    
           
        printf("及格率为:%.2f\\%%\\n",flag/4*100);

 结果:

请输入科目1的成绩:78
请输入科目2的成绩:89
请输入科目3的成绩:56
请输入科目4的成绩:42
科目1的成绩为:78.00
科目2的成绩为:89.00
科目3的成绩为:56.00
科目4的成绩为:42.00
及格率为:50.00%

追问

error C2059: syntax error : ''
warning C4129: '%' : unrecognized character escape sequence
执行 cl.exe 时出错.

dssdds.obj - 1 error(s), 0 warning(s)

我用的是VC6.0 出错了 能帮忙看看是什么错吗

追答

最后一行printf("及格率为:%.2f\%%\n",flag/4*100);,改成printf("及格率为:%.2f\n",flag/4*100);试试

本回答被提问者采纳
参考技术C #include<stdio.h>
#include<windows.h>
#include<string.h>

#define N 100 //学生数量
typedef struct

//char subject[4][10]="科目1","科目2","科目3","科目4";
float score[4];
Student;

void main()

float sum[4];
Student stu[N];
for(int i=0;i<N;i++)

for(int j=0;j<4;j++)

printf("请输入学生%d的科目%d成绩:",i,j);
scanf("%f",&stu[i].score[j]);


for(i=0;i<4;i++)

for(int j=0;j<N;j++)

if(stu[i].score[j]>60)
sum[i]++;

sum[i]=(sum[i]/N)*100;
printf("的科目%d成绩的及格率是:%d\%",sum[i]);

成绩统计与分析

 成绩统计与分析

首先把需要用到的总人数和对应的数据查询出来,并且统计总条数后倒序排序排好这些数据

控制器的查询与条件排序代码:

       

该代码效果图:

 

然后用查询出来的考生总成绩除以总人数得出考生的平均成绩。

用Linq语句中的Sum方法查询出总成绩:

 

合格率则是查出合格总人数除以总人数后得出的合格率,不合格率则是查出不合格总人数除以总人数得出的不合格率。

计算公式:(合格人数、不合格人数)人数的比例=不合格人数/合格人数除以总人数=合格率/不合格率

则计算100分人数和其比例都是如此(注意后面除完人数后需要乘100以方便拼接百分号,例如

(合格人数)PassNumber (/=除以)/(总人数)totalCount(*=乘号)*100)

 

统计表格的最后效果图:

 

以上是关于用c语言统计4科成绩及格率的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程 一维数组和函数

C语言 函数 求全班成绩的等级?

c语言 输入一个学生成绩,判断优、良、及格?

跪求C语言程序代码“学生成绩管理”

关于c语言的一个问题

怎么样用“C语言”判断输入的学生成绩的等级?