//实训4.cpp : 定义控制台应用程序的入口点。实训1.cpp : 定义控制台应用程序的入口点。实训2.cpp : 定义控制台应用程序的入口点。//
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
struct STU
{
int xuehao;
char name[30];
float daolun;
float cyuyan;
float english;
float math;
float sum;
float avg;
struct STU *next;
};
struct STU * input (void);
void list (struct STU * p);
struct STU * save(struct STU *p);
struct STU * load(struct STU *p);
void clear_list();
void find(struct STU *p);
void total(struct STU *p);
struct STU *head,*tail=NULL;
int n=0;
struct STU *p=NULL;//p是头节点struct STU *q=NULL;//保存文件地址struct STU *a=NULL;//加载后文件地址int _tmain(int argc, _TCHAR* argv[])
{
while(1)
{
printf("Hello Worlf!\n");
printf("\n1:载入成绩");
printf("\n2:列出成绩");
printf("\n3:录入成绩");
printf("\n4:查询成绩");
printf("\n5:成绩统计");
printf("\n6:修改成绩");
printf("\n7:另存为成绩");
printf("\n8:加密成绩");
printf("\n9:排名次");
printf("\n0:退出");
int v;
printf("请选择");
scanf("%d",&v);
fflush(stdin);
switch(v){
case 1:
p=input();
break;
case 2:list(p);break;
case 3:q=save(p);break;
case 4:a=load(q);break;
case 5:find(p);break;
case 6:total(p);break;
}
}
return 0;
}
struct STU * input (void)
{
while(true)
{
printf("\n第%d位同学:",n+1);
struct STU *p=(struct STU *)malloc(sizeof(struct STU ));//临时节点,每个同学就新建一个节点 p->next=NULL;
printf("\n输入学号");
scanf("%f",&p->xuehao);//当输%d再输出%s,必须getchar();,不然直接跳过getchar();
printf("\n输入姓名");
gets(p->name);
printf("\n输入导论");
scanf("%f",&p->daolun);
printf("\n输入c语言");
scanf("%f",&p->cyuyan);
printf("\n输入英语");
scanf("%f",&p->english);
printf("\n输入数学");
scanf("%f",&p->math);
//加入链表中 if (head==NULL)//链表还是空的 {
tail=head=p;
}
else//链表中已有信息 {
tail->next=p;
tail = p;
}
n++;
getchar();//去掉缓存中的内容
char c;
printf("\n\n还要输入吗(Y/N)");
scanf("%c", &c);
if (c!='y' && c!='Y')
break;
getchar();//去掉缓存中的内容
}
return p;
}
void list (struct STU * p)
{
p = head;//p指向链表头//遍历链表中的每一个元素,并打印其信息 while (p!=NULL)
{
printf("\n输入学号%.0f",p->xuehao);
printf("\t输入姓名%s\t",p->name);
printf("\n输入导论%.1f",p->daolun);
printf("\t输入c语言%.1f",p->cyuyan);
printf("\t输入英语%.1f",p->english);
printf("\t输入数学%.1f",p->math);
p=p->next;
}
}
struct STU * save(struct STU *p)
{//保存 FILE* fs;
fs=fopen("d:\\score.dat","wb");
fprintf(fs,"%d",n);//先保存人数到文件
p = head;//p指向链表头//遍历链表中的每一个元素,分别把它们写入到文件中 while (p!=NULL)
{
//把p所指的结构体写入文件中 int len = sizeof(struct STU);
fwrite(p, len ,1 , fs); //把p所指向的内存块(长为len)的1块存入fs指定的文件 p=p->next;
}
fclose(fs);
return q;
}
struct STU *load(struct STU *q)
{//载入 clear_list();//清除原有的链表中数据
FILE* fs;
fs=fopen("c:\\score.dat","rb");
fscanf(fs,"%d",&n);//读入人数//要逐个读入n个块的结构内容 for(int i=0; i
{
//分配一个结构空间,用来接收从文件读入的一个结构数据 struct STU*q = (struct STU*) malloc( sizeof(struct STU));
int len = sizeof(struct STU);
fread(q,len,1,fs);
fclose(fs);
return a;
}
}
void clear_list()
{
//清除所有的成绩 (从头开始清除) struct STU *p = head;//p指向链表头 while (p!=NULL)
{
head = head->next;
free(p);
p=head;
}
n=0;
}
void find(struct STU *p)
{//删除一个同学的信息 char st_name[20];
printf("\n输入要查询同学的姓名:");
gets(st_name);
p = head;//p指向链表头 struct STU *q=NULL;//指向上一个无素//遍历链表中的元素,找到这同学的信息结构体(指针p指向它) while (p!=NULL)
{
//是不是要找的学生 if (strcmp(st_name, p->name)==0)
{
printf("\n输入学号%.0f",p->xuehao);
printf("\t输入姓名%s\t",p->name);
printf("\n输入导论%.1f",p->daolun);
printf("\t输入c语言%.1f",p->cyuyan);
printf("\t输入英语%.1f",p->english);
printf("\t输入数学%.1f",p->math);
//把找到的这个同学的结构体从链表中删除,并回收其内存//if (q==NULL)//说明:p指向的结构体是头结构体//{//head=head->next;//把头指针指向新的头结构//free(p);//}//else//{//q->next=p->next;//free(p);//} break;
}
q=p;
p=p->next;
}
}
void total(struct STU *p)
{
p = head;//p指向链表头//遍历链表中的每一个元素,并打印其信息 p->sum=0;
while (p!=NULL)
{
p->sum+=p->math;
p=p->next;
}
printf("%.1f",p->sum);
}