/*
============================================================================
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;
}