学员成绩管理的简单C实现

来源:互联网 发布:mac chrome 页面调试 编辑:程序博客网 时间:2024/04/27 00:11

/*
 ============================================================================
 Name        : sms.c
 Author      : liky
 Version     :
 Copyright   : 2.0
 Description :
 
 每个学员包括3门课的成绩,包括学号、姓名、语文、数学、英语成绩
 以及三门课程的平均成绩,成绩按照从大到小排序,增加一条记录时,
 新加入的记录必须保持成绩表原有的顺序,删除时也一样
 ============================================================================
*/

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

struct student {
 char no[10];
 char name[10];
 double score[3];
 double avg;
};

struct student stu[50];
int stuNum = 0;  // 当前的学生总人数

/*
* 录入一个新的学生信息
* 返回一个student结构
*/

struct student input(); 

/*
* 将一个学生插入到数组的末尾
* 如果插入成功,返回1,否则返回0
*/

int add(struct student);


/*
* 插入一个学员的信息,要求插入后的学员信息依然有序
* 如果插入成功,返回1,否则返回0
*/

int insert();

/*
* 显示学员信息
*/

void show();

/*
* 对学员信息进行排序
*/

void sort();

/*
* 删除学员信息
*/

int del();


void main() {
 char select;
 char resume;

 printf("==================================================================/n");
 printf("*                                                                */n");
 printf("*                          学生成绩管理系统                      */n");
 printf("*                                                                */n");
 printf("*                    作者:liky  版本1.0  版权2008                */n");
 printf("*                                                                */n");
 printf("==================================================================/n");
 printf("                                                                  /n");

MENU:
 do {
  fflush(stdin);
  printf("/n/n请选择: 1添加  2插入  3删除  4打印  5退出/n");
  scanf("%c", &select);

  switch (select)
  {
  
  case '1':// 循环添加学生成绩
   do {
    add(input());
    fflush(stdin);
    printf("是否继续录入学生信息: (Y继续,其他则退出)");
    scanf("%c", &resume);
   } while (resume == 'y' || resume == 'Y');   
   goto MENU;
  case '2':
   insert();
   goto MENU;   
  case '3':
   del();   
   goto MENU;
  case '4':
   show();
   goto MENU;
  case '5':
   exit(1);  
  }

 } while (select<49 || select>52);
}


struct student input() {
 struct student stu;
 char *subject[3] = {"语文","数学","英语"};
 int i;
 double tmp;
 double sum = 0;

 fflush(stdin);
 printf("/n/n请输入学号:"); 
 gets(stu.no);
 fflush(stdin);

 printf("请输入姓名:");
 gets(stu.name);
 fflush(stdin);

 for (i=0; i<3;) {
  printf("请输入%s成绩:", subject[i]);
  scanf("%lf", &tmp);
  if (tmp > 0 && tmp <=100) {
   stu.score[i] = tmp;
   sum += tmp;
   i++;
  }
 }

 stu.avg = sum/3; 
 
 return stu;
}


int add(struct student s) {

 if (stuNum >= 50) {
  printf("学生人数已满,无法再添加了!/n");
  return 0;
 }
 else {  // 要判断结构是否为空
  stuNum ++;
  stu[stuNum-1] = s; 
  return 1;
 }
}

int insert() //插入函数

 int isOk = 0;
 int i, j;
 struct student tmp;

 printf("/n请输入要插入的学员信息");

 tmp=input();

 for (i=0; i<stuNum; i++) {
  if (stu[i].avg < tmp.avg) {
   isOk = 1;
   stuNum++;
   break;
  }
 }

 for (j=stuNum; j>=i; j--) {
  stu[j+1]=stu[j];
 }
 stu[i]=tmp;
 return isOk;
}

void show() {
 int i;
 
 // 在输出之前,先排序
 sort();

 for (i=0; i<stuNum; i++) {
  printf("学生%d的信息如下:/n", i+1);
  printf("学号: %s/t", stu[i].no);
  printf("姓名: %s/t", stu[i].name);
  printf("语文: %.1f/t", stu[i].score[0]);
  printf("数学: %.1f/t", stu[i].score[1]);
  printf("英语: %.1f/n", stu[i].score[2]);
  printf("平均: %.1f/n", stu[i].avg);
 }
}

void sort() {
 struct student tmp;
 int i;
 int j;

 for (i=0; i<stuNum; i++) {
  for (j=0; j<stuNum- 1 -i; j++) {
   if (stu[j].avg < stu[j+1].avg) {
    tmp=stu[j];
    stu[j]=stu[j+1];
    stu[j+1]=tmp;
   }
  }
 }
}

int del () {
 
 char stuNo[10];
 int i,j;
 int isOk = 0;
 
 fflush(stdin);
 printf("请输入要删除的学生学号: ");
 gets(stuNo);

 for (i=0; i<stuNum; i++) {  
  if (!strcmp(stu[i].no, stuNo)) {   
   stuNum--;
   isOk = 1;   
   break;
  }
 }

 for (j=i; j<stuNum; j++) {
  stu[j]=stu[j+1];
 }

 if (isOk) {
  printf("删除学号为%s的学生成绩成功!/n", stuNo);
 }
 else {
  printf("学号为%s的学生成绩不存在!/n", stuNo);
 }
 
 return isOk;
}

原创粉丝点击