33,311
社区成员
发帖
与我相关
我的任务
分享
STUDENT *init()
{
return NULL;
}
void inputs(char *prompt, char *s, int count)/*输入字符串,并进行长度验证*/
{
char p[255];
do
{
//printf(prompt); /*允鞠提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
}
while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
void creat(int n,STUDENT *h)
{
h=(STUDENT*)malloc(sizeof(STUDENT));
STUDENT *p,*q;
char m=' ';
h->next=NULL;
q=h;
while(m==' ')
{
p=(STUDENT*)malloc(sizeof(STUDENT));
scanf("%s%s%d%d%d%c",p->name,p->num,&p->score[0],&p->score[1],&p->score[2],&m);
p->average=(p->score[0]+p->score[1]+p->score[2])/3;
q->next=p;
q=p;
}
q->next=NULL;
}
void print(char fileName[])/*输出链表中结点信息*/
{
FILE *pFile;
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
system("cls"); /*清屏*/
//p=h; /*初值为头指针*/
printf("\n\n\n****************************STUDENT********************************\n");
printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
printf("|---|----------|---------------|----|----|----|--------|-------|-----|\n");
if((pFile=fopen(fileName,"rb"))==NULL)
{
printf("打开文件%s失败!""\n敲击任意键退出!\n",fileName);
system("PAUSE");
exit(1);
}
//printf("\n\n%8s显示学生信息\n","");
//printf("\n","编号","学号","数学","英语","物理");
for(i=0;i<N;i++)
{
fscanf(pFile,"%-10s%-10d%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]);
if(ferror(pFile)!=0)
{
clearerr(pFile);
printf("文件写操作出错!""\n敲击任意键退出!\n");
system("PAUSE");
exit(1);
}
printf("%-10s%-10s%-10d%-10d%-10d%",p->name,p->num,&p->score[0],&p->score[1],&p->score[2]);
}
fclose(pFile);
printf("**********************************end*********************************\n");
}
void Delete(STUDENT *h)/*删除记录*/
{
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[11]; /*存放学号*/
printf("请输入要删除学生的学号\n"); /*显示提示信息*/
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->num,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
printf("\nlist no %s student\n",s);
else /*p不为空,显示找到的记录信息*/
{
printf("*****************************have found***************************\n");
printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("%-10s%-10d%-10.1d%-10.1d%-10.1d\n",p->name,p->num,p->score[0],p->score[1],p->score[2]);
printf("********************************end*******************************\n");
getch(); /*压任一键后,开始删除*/
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\n 已经删除学号为%s的学生\n",s);
printf("不要忘记保存文件\n");/*提示删除后不要忘记保存文件*/
}
//return(h); /*返回头指针*/
}
void search(STUDENT*h)/*查找记录*/ /*当记录的姓名不是要找的,或指针不为空时*/
{
STUDENT *p;
char s[15]; /*存放姓名的字符数组*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\n没有叫%s的学生\n",s); /*显示没有该学生*/
else /*显示找到的记录信息*/
{
//printf (*h)
{
STUDENT *p; /* 移动指针*/
system("cls"); /*清屏幕*/
printf("请输入要查找学生的姓名\n");
scanf("%s",s); /*输入姓名*/
p=h; /*将头指针赋给p*/
while(strcmp(p->name,s)&&p!=NULL) printf("\n\n*****************************havefound***************************\n");
printf("%-10s%-10s%-10s%-10s%-10s%\n","姓名","学号","数学","英语","物理");
printf("|----------|---------------|----|----|----|--------|-------|-----|\n");
printf("%-10s%-10d%-10d%-10d%-10d\n",
p->name,p->num,p->score[0],p->score[1],p->score[2]);
printf("********************************end*******************************\n");
}
}
}
#include <stdio.h> /*I/O函数*/
#include <stdlib.h> /*其它说明*/
#include <string.h>/*字符串函数*/
#include <conio.h> /*屏幕操作函数*/
#include <mem.h> /*内存操作函数*/
#include<iostream>
#include <ctype.h> /*字符操作函数*/
#define N 3 /*定义常数*/
typedef struct z1 /*定义数据结构*/
{
char name[15];
char num[15];
int score[3];
float sum;
float average;
int order;
struct z1 *next;
} STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
void creat(int n,STUDENT *h); /*创建链表*/
void Delete(STUDENT *h); /*删除记录*/
void print(STUDENT *h); /* 显示所有记录*/
void search(STUDENT *h); /*查找*/
void save(char fileName[]); /*保存*/
void open();/*打开文件*/
STUDENT *load(); /*读入记录*/
void computer(STUDENT *h); /*计算总分和均分*/
void insert(STUDENT *h); /*插入记录*/
void append(); /*追加记录*/
void copy(); /*复制文件*/
STUDENT *sort(STUDENT *h); /*排序*/
STUDENT *index(STUDENT *h); /*索引*/
void total(STUDENT *h); /*分类合计*/
/******主函数开始*******/
int main()
{
int n;
char path[30];
STUDENT *head,*p,*z,*q1; //用于保存头结点的地址
printf("请输入文件的存储路径:\n");
scanf("%s",path);
printf("请输入学生的个数:\n");
scanf("%d",&n);//输入学生的个数
save(path,n);//将键盘输入的学生信息存入在文本文件
z=open();//从文件中得到相关的学生信息,并返回存放信息的数组的首地址
p=creat(n,z);
q1=copy(p);
head=init(); /*初始化链表*/
{
do
{
printf(" ***********************************************************\n");
printf(" ~~~~~~~~~~~~~~~~~~欢迎光临学生成绩管理系统~~~~~~~~~~~~~~~~~\n");
printf(" ***************************^_^*****************************\n");
printf(" * 0.退出该操作系统 1.删除记录 *\n");
printf(" * 2.显示全部记录 3.查找记录 *\n");
printf(" * 4.保存文件 5.读取文件内容 *\n");
printf(" * 6.计算总分和均分 7.插入记录 *\n");
printf(" * 8.复制文件 9.以学生总分进行降序排序 *\n");
printf(" * 10.追加记录 11.以学生姓名进行索引 *\n");
printf(" * 12.分类合计 *\n");
printf(" ***********************************************************\n");
printf(" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf(" ***********************************************************\n");
printf(" **请输入您需要进行的操作**:");
scanf("%d",&n);
system("cls");
switch(n)
{
case 0:
printf(" ************************************************************\n");
printf(" ~~~~~~~~~~~~~~退出学生成绩管理系统,感谢使用!~~~~~~~~~~~~~~\n");
printf(" ************************************************************\n");
exit(0);
case 1:
printf("您选择的操作是:删除记录");
Delete(head);
system("cls");
break;
case 2:
printf("您选择的操作是:显示全部记录");
print(head);
break;
case 3:
printf("您选择的操作是:查找记录");
search(head);
break;
case 4:
printf("您选择的操作是:保存文件");
save();
system("pause");
system("cls");
break;
case 5:
printf("您选择的操作是:读取文件内容");
head=load();
break;
case 6:
printf("您选择的操作是:计算总分和均分");
computer(head);
break;
case 7:
printf("您选择的操作是:插入记录");
insert(head);
system("cls");
break;
case 8:
printf("您选择的操作是:复制文件");
copy();
break;
case 9:
printf("您选择的操作是:以学生总分进行降序排序");
head=sort(head);
break;
case 10:
printf("您选择的操作是:追加记录");
append();
break;
case 11:
printf("您选择的操作是:以学生姓名进行索引");
head=index(head);
break;
case 12:
printf("您选择的操作是:分类合计");
total(head);
break;
}
}
while(1);
}
return 0;
}
STUDENT *p;
char s[15]; /*存放姓名的字符数组*/
p=p->next; /*移动指针,指向下一结点*/
if(p==NULL) /*如果指针为空*/
printf("\n没有叫%s的学生\n",s); /*显示没有该学生*/