第一个问题 输出的第一组数据的第一个学期不输出
//#include
#include<string.h>
#include<stdlib.h>
//#include
using namespace std;
#define MAX 200 //宏定义,修改数值可以改变程序所包含的最大文件个数
#define LEN sizeof(struct student)
int n;
int count=0;
struct student
{
char xueqi[20]; //学期
int no; //学号
int clas; //班级
char name[50]; //姓名
int chi; //语文成绩
int math; //数学成绩
int eng; //英语成绩
int com; //计算机成绩
int PE; //体育成绩
int sum;
int aver;
struct student *next;
};
struct student *head=NULL;
void menu();
void menu2();
struct student * Insert (struct student *st);
void add();
void to_menu();
void to_menu2();
struct student * Delete(int no);
//void save_data();
//void read_data();
void view_data();
void delete_data();
//void edit_data();
//void query_data_no();
//void tongji1();
//void tongji2();
//void tongji3();
//void tongji4();
//void query_data_tongji();
int main() //主函数
{
int fun;
// read_data();
menu();
while(1)
{
system("color fc"); //编辑菜单及字体颜色
printf("请输入功能号[0-6]:",&fun);
scanf("%d",&fun);
switch(fun)
{
case 0: // 退 出
break;
case 1: //按班级输出学生成绩
view_data();
break;
case 2: //输入学生记录
add();
break;
case 3: //删除学生记录
delete_data();
// break;
// case 4: //编辑学生记录
// edit_data();
// break;
// case 5: //查询学生记录
// query_data_no();
// break;
// case 6: //统计系统
// query_data_tongji();
// break;
}
if(fun==0) break;
to_menu();
}
}
void add() //添加学生信息
{
int b,k;
while(1)
{
struct student *st;
st= (struct student *)malloc(sizeof(struct student));
k=count;
printf("\n请输入学生信息:");
printf("\n学期");
printf("\n-------------------------------------------------------------\n");
getchar();
gets(st->xueqi);
printf("\n学号");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->no);
printf("\n班级");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->clas);
printf("\n姓名");
printf("\n-------------------------------------------------------------\n");
getchar();
gets(st->name);
printf("\n语文");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->chi);
printf("\n数学");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->math);
printf("\n英语");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->eng);
printf("\n计算机");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->com);
printf("\n体育");
printf("\n-------------------------------------------------------------\n");
scanf("%d",&st->PE);
st->sum=st->chi+st->math+st->eng+st->com+st->PE;
st->aver=st->sum/5;
count++;
head=Insert(st);
free(st);
printf("\n\n继续添加学生信息[1-yes 0-no]:");
scanf("%d",&b);
if(b==0)
break;
}
// save_data();
}
struct student * Insert (struct student *stud) {
//原链表按num从小到大排列,参数stud是要插入结点
struct student *p0; // 待插入结点
struct student *p1; // p0插入p1之前、p2之后
struct student *p2;
p1 = head;
p0 = stud;
if ( head == NULL ){//第一种情况,链表为空
head = p0;//p0成为链表中第一结点
p0->next = NULL;
}else {
while ((p0->no > p1->no) && (p1->next != NULL)) {//查找待插入位置
p2 = p1;
p1 = p1->next;
}
if(p0->no <= p1->no) {//表示是从(p0->num > p1->num) 条件跳出循环
if (p1 == head) { //如果p1是表头结点,向第一结点之前插入
head = p0;
p0->next = p1;
} else{//向p1之前、p2之后插入
p2->next = p0;
p0->next = p1;
}
} else { //表示从 (p1->next != NULL)条件跳出循环,p0插入表尾结点之后
p1->next = p0;
p0->next = NULL;
}
}
return (head);
}
void menu() //输出主菜单函数
{
system("cls"); //清空屏幕函数
printf("\n");
printf("\t\t\t*******************************\n");
printf("\t\t\t* \n");
printf("\t\t\t 学生成绩管理系统 \n");
printf("\t\t\t \n");
printf("\t\t\t [0] 退出 \n");
printf("\t\t\t [1] 按学号输出学生成绩 \n");
printf("\t\t\t [2] 输入学生记录 \n");
printf("\t\t\t [3] 删除学生记录 \n");
printf("\t\t\t [4] 编辑学生记录 \n");
printf("\t\t\t [5] 查询学生记录 \n");
printf("\t\t\t [6] 统计学生记录 \n");
printf("\t\t\t \n");
printf("\t\t\t*******************************\n");
}
void menu2() //输出统计系统菜单
{
system("cls"); //清空屏幕函数
printf("\n");
printf("\t\t\t********************************\n");
printf("\t\t\t* \n");
printf("\t\t\t 统计系统 \n");
printf("\t\t\t \n");
printf("\t\t\t [0] 退出 \n");
printf("\t\t\t [1] 输出班级学生成绩 \n");
printf("\t\t\t [2] 班级各科成绩平均数 \n");
printf("\t\t\t [3] 班级各科成绩总分 \n");
printf("\t\t\t [4] 不及格名单 \n");
printf("\t\t\t \n");
printf("\t\t\t*******************************\n");
}
void to_menu() //to_menu函数
{
char c1,c2;
printf("\n\n\n按回车键返回主菜单...");
scanf("%c%c",&c1,&c2);
menu(); //调用menu函数
}
void to_menu2() //to_menu函数
{
char c1,c2;
printf("\n\n\n按回车键返回上一菜单...");
scanf("%c%c",&c1,&c2);
menu2(); //调用menu函数
}
void view_data()
{
if(head==NULL)
return;
struct student *p=head;
printf("学期\t学号\t\t班级\t\t姓名\t\t语文\t数学\t英语\t计算机\t体育\t总分\t平均分");
printf("\n-----------------------------------------------------------------------------------------------------------------\n");
do{printf("%s\t\t%d\t%-15d%s\t\t%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",p->xueqi,p->no,p->clas,p->name,p->chi,p->math,p->eng,p->com,p->PE,p->sum,p->aver);
p=p -> next;
}while(p!=NULL);
}
struct student * Delete(int no)
{//删除值为num的结点
int sb=0;
struct student *p1; // 指向要删除的结点
struct student *p2; //指向p1的前一个结点
if (head == NULL) { //空表
return (head);
}
p1 = head;
while(no!= p1->no && p1->next != NULL)
{ //查找要删除的结点
p2 = p1;
p1 = p1->next;
}
if (no == p1->no)
{
printf("\n\n删除(学号-%d)成功!",no);
sb=1;// 找到了
if (p1 == head) //要删除的是头结点
head = p1->next;
else// 要删除的不是头结点
p2->next = p1->next;
// free(p1); //释放被删除结点所占的内存空间
}
if(sb==0)
printf("\n\n删除(学号-%d)成功!",no);
return (head); //返回新的表头
}
void delete_data() //删除学生记录
{
int j;
int no;
j=count;
view_data();
printf("\n请输入要删除学生的学号:");
scanf("%d",&no);
head=Delete(no);
// save_data();
}