| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 744 人关注过本帖
标题:成绩统计代码问题
只看楼主 加入收藏
sjzunter
Rank: 2
等 级:论坛游民
帖 子:15
专家分:26
注 册:2009-7-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
成绩统计代码问题
本人和寝室好友完成一个程序··但是有不完善的地方本人不能解决···希望高手们指点···问题是这样的!
    1:统计每个学生的总分和平均成绩
    2:按总分由大到小排名次
如果向执行“1”然后执行“2”完全正确!但是如果向执行“2”在执行“1”    “2”正确,但是“1”的学号
、班级、姓名就会混乱···不对号··高手们指点一下啊!
源代码如下:
#include <stdio.h>
#include <string.h>
#define N 3
struct students
{
 char number[15];
 char name[15];
 char stu_class[1];
 int math;
 int physics;
 int English;
 int Chinese;
 int total;
 int average;
}stu[N];
int choice_students(int choice);
void total_average_students(int total,int average);
void order_students(struct students stu[N]);
void printf_students(struct students stu[N]);
void search_students(struct students stu[N],char number[15],char name[15],int choice);
void main(void)
{
 int i,choice=0;
 printf("\n");
 printf("***************学生成绩管理与统计系统***************\n");
 printf("学生信息以及成绩录入中...\n");
 for (i=0;i<N;i++)
 {
  printf("请输入学生的学号:");
  scanf("%s",stu[i].number);
  printf("请输入学生的姓名:");
  scanf("%s",stu[i].name);
  printf("请输入学生的班级:");
  scanf("%s",stu[i].stu_class);
  printf("请输入学生的数学成绩:");
  scanf("%d",&stu[i].math);
  printf("请输入学生的物理成绩:");
  scanf("%d",&stu[i].physics);
  printf("请输入学生的英语成绩:");
     scanf("%d",&stu[i].English);
  printf("请输入学生的语文成绩:");
  scanf("%d",&stu[i].Chinese);
  printf("\n");
 }
 choice=choice_students(choice);
}
int choice_students(int choice)
{
 int total=0,average=0;
 char number[15],name[15];
 do
 {
 printf("学生成绩管理与统计系统功能选项: \n");
 printf("1:统计每个学生的总分和平均分\n");
 printf("2:按总分由大到小排名次\n");
 printf("3:打印各门课程的平均分以及平均分之上的学生名单\n");
 printf("4:根据学生学号或姓名查询学生相关信息\n");
 printf("0:退出\n");
 printf("请选择功能:");
 scanf("%d",&choice);
  switch(choice)
  {
  case 1:
      total_average_students(total,average);
   break;
     case 2:
      order_students(stu);
      break;
     case 3:
      printf_students(stu);
      break;
     case 4:
      search_students(stu,number,name,choice);
     case 0:
      break;
  }
 }while(choice!=0);
 printf("********************系统已退出********************\n");           
 printf("(*^__^*)谢谢使用学生成绩管理与统计系统功能(*^__^*)\n");
 return choice;
}
void total_average_students(int total,int average)
{
 int i;
 printf("\n");
 printf("学号  姓名  班级  数学  物理  英语  语文  总分  平均分\n");
 for (i=0;i<N;i++)
 {
  stu[i].total=stu[i].math+stu[i].physics+stu[i].English+stu[i].Chinese;
  stu[i].average=stu[i].total/4;
  printf("%s    %s    %s    %d    %d    %d    %d    %d    %d\n",stu[i].number,stu[i].name,stu[i].stu_class,stu[i].math,stu[i].physics,stu[i].English,stu[i].Chinese,stu[i].total,stu[i].average);
 }
 printf("\n");
}
 void order_students(struct students stu[N])
{
 int i,j,temp1;
    char temp2[15];
 for (i=0;i<N;i++)
 {stu[i].total=stu[i].math+stu[i].physics+stu[i].English+stu[i].Chinese;
  for (j=0;j<N-i;j++)
  {
   if (stu[j].total<stu[j+1].total)
   {
   temp1=stu[j].total;
   stu[j].total=stu[j+1].total;
            stu[j+1].total=temp1;
            strcpy(temp2,stu[j].number);
            strcpy(stu[j].number,stu[j+1].number);
            strcpy(stu[j+1].number,temp2);
          strcpy(temp2,stu[j].name);
          strcpy(stu[j].name,stu[j+1].name);
          strcpy(stu[j+1].name,temp2);
          strcpy(temp2,stu[j].stu_class);
          strcpy(stu[j].stu_class,stu[j+1].stu_class);
          strcpy(stu[j+1].stu_class,temp2);
   }
  }
 }
  printf("\n");
  printf("学号  姓名  班级  总分  名次\n");
 for (i=0;i<N;i++)
  printf("%s    %s    %s    %d    %d\n",stu[i].number,stu[i].name,stu[i].stu_class,stu[i].total,i+1);
 printf("\n");
}
void printf_students(struct students stu[N])
{
 int i,subject_sum;
 printf("\n");
 subject_sum=0;
 for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].math;
 printf("数学课程的平均分是:%d   ",subject_sum/N);
 printf("在该课程平均分之上的人有:");
 for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].math)
   printf("%s  ",stu[i].name);
  printf("\n");
 subject_sum=0;
 for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].physics;
 printf("物理课程的平均分是:%d   ",subject_sum/N);
 printf("在该课程平均分之上的人有:");
 for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].physics)
   printf("%s  ",stu[i].name);
  printf("\n");
 subject_sum=0;
 for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].English;
 printf("英语课程的平均分是:%d   ",subject_sum/N);
 printf("在该课程平均分之上的人有:");
 for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].English)
   printf("%s  ",stu[i].name);
  printf("\n");
 subject_sum=0;
 for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].Chinese;
 printf("语文课程的平均分是:%d   ",subject_sum/N);
 printf("在该课程平均分之上的人有:");
 for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].Chinese)
   printf("%s  ",stu[i].name);
  printf("\n");
  printf("\n");
}
void search_students(struct students stu[N],char number[15],char name[15],int choice)
{
 int i,flag;
 printf("\n");
 printf("*********欢迎使用学生成绩管理与统计系统查询功能*********\n");
 do
 {
  flag=0;
  printf("学生相关信息查询方式: 1:按学号查询 2:按姓名查询 0:退出\n");
  printf("请选择查询方式:");
  scanf("%d",&choice);
  switch(choice)
  {
  case 1:
   printf("请输入您要查询的学生的学号:");
   scanf("%s",number);
   for (i=0;i<N;i++)
   {
    if (strcmp(number,stu[i].number)==0)
    {
     flag=1;
     break;
    }
   }
   break;
  case 2:
   printf("请输入您要查询的学生的姓名:");
   scanf("%s",name);
   for (i=0;i<N;i++)
   {
    if (strcmp(name,stu[i].name)==0)
    {
     flag=1;
     break;
    }
   }
   break;
  case 0:
   flag=2;
   break;
  }
  printf("\n");
  if(flag==1)
  {
   printf("学号  姓名  班级  数学  物理  英语  语文  总分  平均分\n");
   printf("%s    %s    %s    %d    %d    %d    %d    %d    %d\n",stu[i].number,stu[i].name,stu[i].stu_class,stu[i].math,stu[i].physics,stu[i].English,stu[i].Chinese,stu[i].total,stu[i].average);
   printf("\n");
  }
  else if(flag==0)
  {
   printf("查无此人,请重新输入!\n");
   printf("\n");
  }
 }while(choice!=0);
 printf("(*^__^*)谢谢使用学生成绩管理与统计系统查询功能(*^__^*)\n");
 printf("\n");
}

[[it] 本帖最后由 sjzunter 于 2009-7-16 15:07 编辑 [/it]]
搜索更多相关主题的帖子: 代码 统计 
2009-07-16 14:59
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:5 
应该是排序部分的问题

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2009-07-16 16:11
sjzunter
Rank: 2
等 级:论坛游民
帖 子:15
专家分:26
注 册:2009-7-16
收藏
得分:0 
回复 楼主 sjzunter
能不能指出具体怎么改正?我改了很久实在是没有办法改正。
2009-07-16 17:02
uubird
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:74
专家分:133
注 册:2009-7-2
收藏
得分:15 
帮你弄好了,自己看看
#include <stdio.h>
#include <string.h>
#define N 3
struct students
{
char number[15];
char name[15];
char stu_class[10];//班级你定义的数组不对
int math;
int physics;
int English;
int Chinese;
int total;
int average;
}stu[N];
int choice_students(int choice);
void total_average_students(int total,int average);
void order_students(struct students stu[N]);
void printf_students(struct students stu[N]);
void search_students(struct students stu[N]);
void main(void)
{
int i,choice=0;
printf("\n");
printf("***************学生成绩管理与统计系统***************\n");
printf("学生信息以及成绩录入中...\n");
for (i=0;i<N;i++)
{
  printf("请输入学生的学号:");
  scanf("%s",stu[i].number);
  printf("请输入学生的姓名:");
  scanf("%s",stu[i].name);
  printf("请输入学生的班级:");
  scanf("%s",stu[i].stu_class);
  printf("请输入学生的数学成绩:");
  scanf("%d",&stu[i].math);
  printf("请输入学生的物理成绩:");
  scanf("%d",&stu[i].physics);
  printf("请输入学生的英语成绩:");
     scanf("%d",&stu[i].English);
  printf("请输入学生的语文成绩:");
  scanf("%d",&stu[i].Chinese);
  printf("\n");
}
choice=choice_students(choice);
}
int choice_students(int choice)
{
int total=0,average=0;
char number[15],name[15];
do
{
printf("学生成绩管理与统计系统功能选项: \n");
printf("1:统计每个学生的总分和平均分\n");
printf("2:按总分由大到小排名次\n");
printf("3:打印各门课程的平均分以及平均分之上的学生名单\n");
printf("4:根据学生学号或姓名查询学生相关信息\n");
printf("0:退出\n");
printf("请选择功能:");
scanf("%d",&choice);
  switch(choice)
  {
  case 1:
      total_average_students(total,average);
   break;
     case 2:
      order_students(stu);
      break;
     case 3:
      printf_students(stu);
      break;
     case 4:
      search_students(stu);
     case 0:
      break;
  }
}while(choice!=0);
printf("********************系统已退出********************\n");           
printf("(*^__^*)谢谢使用学生成绩管理与统计系统功能(*^__^*)\n");
return choice;
}
void total_average_students(int total,int average)
{
int i;
printf("\n");
printf("学号  姓名  班级  数学  物理  英语  语文  总分  平均分\n");
for (i=0;i<N;i++)
{
  stu[i].total=stu[i].math+stu[i].physics+stu[i].English+stu[i].Chinese;
  stu[i].average=stu[i].total/4;
  printf("%s    %s    %s    %d    %d    %d    %d    %d    %d\n",stu[i].number,stu[i].name,stu[i].stu_class,stu[i].math,stu[i].physics,stu[i].English,stu[i].Chinese,stu[i].total,stu[i].average);
}
printf("\n");
}
void order_students(struct students stu[N]) //根据总成绩排名
{
int i,j,m,temp1;
    char temp2[15];
for (i=0;i<N;i++)
 stu[i].total=stu[i].math+stu[i].physics+stu[i].English+stu[i].Chinese;//多了个{
for(i=0;i<N-1;i++)
  {
    m=i;
  for(j=i+1;j<N;j++)
    { if (stu[m].total<stu[j].total)
       {
       temp1=stu[m].total;
       stu[m].total=stu[j].total;
                stu[j].total=temp1;

            strcpy(temp2,stu[m].number);
            strcpy(stu[m].number,stu[j].number);
            strcpy(stu[j].number,temp2);
          strcpy(temp2,stu[m].name);
          strcpy(stu[m].name,stu[j].name);
          strcpy(stu[j].name,temp2);
          strcpy(temp2,stu[m].stu_class);
          strcpy(stu[m].stu_class,stu[j].stu_class);
          strcpy(stu[j].stu_class,temp2);
          }
   }
 }

  printf("\n");
  printf("学号  姓名  班级  总分  名次\n");
for (i=0;i<N;i++)
  printf("%s    %s    %s    %d    %d\n",stu[i].number,stu[i].name,stu[i].stu_class,stu[i].total,i+1);
printf("\n");
}

void printf_students(struct students stu[N])//打印各门课程的平均分以及平均分之上的学生名单
{
int i,subject_sum;
printf("\n");
subject_sum=0;
for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].math;
printf("数学课程的平均分是:%d   ",subject_sum/N);//感觉你平均分有问题,最好设计成double型!
printf("在该课程平均分之上的人有:");
for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].math)
   printf("%s  ",stu[i].name);
  printf("\n");
subject_sum=0;
for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].physics;
printf("物理课程的平均分是:%d   ",subject_sum/N);
printf("在该课程平均分之上的人有:");
for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].physics)
   printf("%s  ",stu[i].name);
  printf("\n");
subject_sum=0;
for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].English;
printf("英语课程的平均分是:%d   ",subject_sum/N);
printf("在该课程平均分之上的人有:");
for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].English)
   printf("%s  ",stu[i].name);
  printf("\n");
subject_sum=0;
for (i=0;i<N;i++)
  subject_sum=subject_sum+stu[i].Chinese;
printf("语文课程的平均分是:%d   ",subject_sum/N);
printf("在该课程平均分之上的人有:");
for (i=0;i<N;i++)
  if ((subject_sum/N)<stu[i].Chinese)
   printf("%s  ",stu[i].name);
  printf("\n");
  printf("\n");
}


void search_students(struct students stu[N])//根据学生学号或姓名查询学生相关信息,为何要char number[15],char name[15]
{
int i,t,flag,choice;
char number[15],name[15];//帮你改了下!
printf("\n");
printf("*********欢迎使用学生成绩管理与统计系统查询功能*********\n");
do
{
  flag=0;
  printf("学生相关信息查询方式: 1:按学号查询 2:按姓名查询 0:退出\n");
  printf("请选择查询方式:");
  scanf("%d",&choice);
  switch(choice)
  {
  case 1:
   printf("请输入您要查询的学生的学号:");
   scanf("%s",number);
   for (i=0;i<N;i++)
   {
    if (strcmp(number,stu[i].number)==0)
    { t=i;
     flag=1;
     break;
    }
   }
   break;
  case 2:
   printf("请输入您要查询的学生的姓名:");
   scanf("%s",name);
   for (i=0;i<N;i++)
   {
    if (strcmp(name,stu[i].name)==0)
    { t=i;
     flag=1;
     break;
    }
   }
   break;
 default:
     break;
  }
  printf("\n");
  if(flag==1)
  {
   printf("学号  姓名  班级  数学  物理  英语  语文  总分  平均分\n");
   printf("%s    %s    %s    %d    %d    %d    %d    %d    %d\n",stu[t].number,stu[t].name,stu[t].stu_class,stu[t].math,stu[t].physics,stu[t].English,stu[t].Chinese,stu[t].total,stu[t].average);
   printf("\n");
  }
  else if(flag==0)
  {
   printf("查无此人,请重新输入!\n");
   printf("\n");
  }
}while(choice!=0);
printf("(*^__^*)谢谢使用学生成绩管理与统计系统查询功能(*^__^*)\n");
printf("\n");
}
2009-07-16 20:54
uubird
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:74
专家分:133
注 册:2009-7-2
收藏
得分:0 
不过你设计的有点粗糙,最好在细节上再补足下。。。
虽然我也是个新手!!
2009-07-16 21:01
sjzunter
Rank: 2
等 级:论坛游民
帖 子:15
专家分:26
注 册:2009-7-16
收藏
得分:0 
回复 5楼 uubird
谢谢的的修改!我以后会注意的···但是我想要的问题还是没有解决,但是谢谢你给我提出宝贵的意见!
2009-07-17 13:51
uubird
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:74
专家分:133
注 册:2009-7-2
收藏
得分:0 
还有什么问题??!!
2009-07-17 22:47
sjzunter
Rank: 2
等 级:论坛游民
帖 子:15
专家分:26
注 册:2009-7-16
收藏
得分:0 
回复 7楼 uubird
就是 1:统计每个学生的总分和平均成绩
    2:按总分由大到小排名次
如果向执行“1”然后执行“2”完全正确!但是如果向执行“2”在执行“1”    “2”正确,但是“1”的学号
、班级、姓名就会混乱·
2009-07-18 06:58
快速回复:成绩统计代码问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014813 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved