c语言学生成绩管理

Python07

c语言学生成绩管理,第1张

测试过了

/*头文件*/

#include <stdio.h>

#include<dos.h>

#include<stdlib.h>/*其它说明*/

#include<string.h>/*字符串函数*/

#include<memory.h>/*内存操作函数*/

#include<ctype.h>/*字符操作函数*/

#include "conio.h"

#define LEN sizeof(STUDENT)

typedef struct stu /*定义结构体数组用于缓存数据*/

{char num[6]

char name[5]

int score[3]

int sum

float average

int order

struct stu *next

}STUDENT

/*函数原型*/

STUDENT *init()/*初始化函数*/

int menu_select()/*菜单函数*/

STUDENT *create()/*创建链表*/

void print(STUDENT *head)/* 显示全部记录*/

void search(STUDENT *head)/*查找记录*/

STUDENT *mydelete(STUDENT *head)/*删除记录*/

STUDENT *sort(STUDENT *head)/*排序*/

STUDENT *insert(STUDENT *head,STUDENT *mynew)/*插入记录*/

void save(STUDENT *head)/*保存文件*/

STUDENT *load()/*读文件*/

/*主函数界面*/

void main()

{STUDENT *head,mynew

head=init()/*链表初始化,使head的值为NULL*/

for() /*循环无限次*/

{switch(menu_select())

{

case 1:head=create()break

case 2:print(head)break

case 3:search(head)break

case 4:head=mydelete(head)break

case 5:head=sort(head)break

case 6:head=insert(head,&mynew)break/*&mynew表示返回地址*/

case 7:save(head)break

case 8:head=load()break

case 9:exit(0)/*如菜单返回值为9则程序结束*/

}

}

}

/*初始化函数*/

STUDENT *init()

{

return NULL/*返回空指针*/

}

/*菜单选择函数*/

menu_select()

{int n

printf("\n按任一键进入主菜单...... \npress any key to enter the menu......")/*按任一键进入主菜单*/

getch()/*从键盘读取一个字符,但不显示于屏幕*/

system("cls")

printf("********************************************************************************\n")

printf("\t\t 欢迎 Welcome to\n")

printf("\n\t\t\t 使用学生管理系统1.0\n\n\t\t\t\t\t\n")

printf("*************************************MENU***************************************\n")

printf("\t\t\t1. 输入学生成绩记录 Enter the record\n")/*输入学生成绩记录*/

printf("\t\t\t2. 显示 Print the record\n")/*显示*/

printf("\t\t\t3. 寻找 Search record on name\n")/*寻找*/

printf("\t\t\t4. 删除 mydelete a record\n")/*删除*/

printf("\t\t\t5. 排序 Sort to make mynew a file\n")/*排序*/

printf("\t\t\t6. 插入 Insert record to list\n")/*插入*/

printf("\t\t\t7. 保存 Save the file\n")/*保存*/

printf("\t\t\t8. 读取 Load the file\n")/*读取*/

printf("\t\t\t9. 退出 Quit\n")/*退出*/

printf("********************************************************************************\n")

do{

printf("\n\t\t\t输入你的选择Enter your choice(1~9):")

scanf("%d",&n)

}while(n<1||n>9)/*如果选择项不在1~9之间则重输*/

return(n)/*返回选择项,主函数根据该数调用相应的函数*/

}

/*输入函数*/

STUDENT *create()

{int i,s

STUDENT *head=NULL,*p/* 定义函数.此函数带回一个指向链表头的指针*/

system("cls")

for()

{p=(STUDENT *)malloc(LEN)/*开辟一个新的单元*/

if(!p) /*如果指针p为空*/

{printf("\n输出内存溢出. Out of memory.")/*输出内存溢出*/

return (head)/*返回头指针,下同*/

}

printf("输入学号Enter the num(0:list end):")

scanf("%s",p->num)

if(p->num[0]=='0') break/*如果学号首字符为0则结束输入*/

printf("输入名字Enter the name:")

scanf("%s",p->name)

printf("请输入3门成绩Please enter the %d scores\n",3)/*提示开始输入成绩*/

s=0/*计算每个学生的总分,初值为0*/

for(i=0i<3i++) /*3门课程循环3次*/

{

do{

printf("成绩score%d:",i+1)

scanf("%d",&p->score[i])

if(p->score[i]<0 || p->score[i]>100) /*确保成绩在0~100之间*/

printf("数据错误,请重新输入 Data error,please enter again.\n")

}while(p->score[i]<0 || p->score[i]>100)

s=s+p->score[i]/*累加各门成绩*/

}

p->sum=s/*将总分保存*/

p->average=(float)s/3/*先用强制类型转换将s转换成float型,再求平均值*/

p->order=0/*未排序前此值为0*/

p->next=head/*将头结点做为新输入结点的后继结点*/

head=p/*新输入结点为新的头结点*/

}

return(head)

}

/* 显示全部记录函数*/

void print(STUDENT *head)

{int i=0/* 统计记录条数*/

STUDENT *p/*移动指针*/

system("cls")

p=head/*初值为头指针*/

printf("\n************************************STUDENT************************************\n")

printf("-------------------------------------------------------------------------------\n")

printf("| Rec | Num | Name | Sc1 | Sc2 | Sc3 | Sum | Ave | Order |\n")

printf("-------------------------------------------------------------------------------\n")

while(p!=NULL)

{

i++

printf("| %3d | %4s | %-4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

i, p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order)

p=p->next

}

printf("-------------------------------------------------------------------------------\n")

printf("**************************************END**************************************\n")

}

/*查找记录函数*/

void search(STUDENT *head)

{STUDENT *p/* 移动指针*/

char s[5]/*存放姓名用的字符数组*/

system("cls")

printf("请输入个姓名来查找. Please enter name for searching.\n")

scanf("%s",s)

p=head/*将头指针赋给p*/

while(strcmp(p->name,s) &&p != NULL) /*当记录的姓名不是要找的,或指针不为空时*/

p=p->next/*移动指针,指向下一结点*/

if(p!=NULL) /*如果指针不为空*/

{printf("\n*************************************FOUND************************************\n")

printf("-------------------------------------------------------------------------------\n")

printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n")

printf("-------------------------------------------------------------------------------\n")

printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

p->num,p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order)

printf("-------------------------------------------------------------------------------\n")

printf("***************************************END**************************************\n")

}

else

printf("\n没有该学生 There is no num %s student on the list.\n",s)/*显示没有该学生*/

}

/*删除记录函数*/

STUDENT *mydelete(STUDENT *head)

{int n

STUDENT *p1,*p2/*p1为查找到要删除的结点指针,p2为其前驱指针*/

char c,s[6]/*s[6]用来存放学号,c用来输入字母*/

system("cls")

printf("请输入要删除的学号 Please enter the mydeleted num: ")

scanf("%s",s)

p1=p2=head/*给p1和p2赋初值头指针*/

while(strcmp(p1->num,s) &&p1 != NULL) /*当记录的学号不是要找的,或指针不为空时*/

{p2=p1/*将p1指针值赋给p2作为p1的前驱指针*/

p1=p1->next/*将p1指针指向下一条记录*/

}

if(strcmp(p1->num,s)==0) /*学号找到了*/

{printf("**************************************FOUND************************************\n")

printf("-------------------------------------------------------------------------------\n")

printf("| Num | Name | sc1 | sc2 | sc3 | Sum | Ave | Order |\n")

printf("-------------------------------------------------------------------------------\n")

printf("| %4s | %4s | %3d | %3d | %3d | %3d | %4.2f | %-5d|\n",

p1->num,p1->name,p1->score[0],p1->score[1],p1->score[2],p1->sum,p1->average,p1->order)

printf("-------------------------------------------------------------------------------\n")

printf("***************************************END**************************************\n")

printf("\n是否要删除,输入Y删除,N则退出\nAre you sure to mydelete the student Y/N ?")/*提示是否要删除,输入Y删除,N则退出*/

for()

{scanf("%c",&c)

if(c=='n'||c=='N') break/*如果不删除,则跳出本循环*/

if(c=='y'||c=='Y')

{

if(p1==head) /*若p1==head,说明被删结点是首结点*/

head=p1->next/*把第二个结点地址赋予head*/

else

p2->next=p1->next/*否则将一下结点地址赋给前一结点地址*/

n=n-1

printf("\n学号为(Num): %s 学生以被删除(student have been mydeleted.)\n",s)

printf("别忘了保存. Don't forget to save.\n")break/*删除后就跳出循环*/

}

}

}

else

printf("\n没有这个学生在表上\nThere is no num %s student on the list.\n",s)/*找不到该结点*/

return(head)

}

/*排序函数*/

STUDENT *sort(STUDENT *head)

{int i=0/*保存名次*/

STUDENT *p1,*p2,*t,*temp/*定义临时指针*/

temp=head->next/*将原表的头指针所指的下一个结点作头指针*/

head->next=NULL/*第一个结点为新表的头结点*/

while(temp!=NULL) /*当原表不为空时,进行排序*/

{

t=temp/*取原表的头结点*/

temp=temp->next/*原表头结点指针后移*/

p1=head/*设定移动指针p1,从头指针开始*/

p2=head/*设定移动指针p2做为p1的前驱,初值为头指针*/

while(t->average<p1->average&&p1!=NULL) /*作成绩平均分比较*/

{

p2=p1/*待排序点值小,则新表指针后移*/

p1=p1->next

}

if(p1==p2) /*p1==p2,说明待排序点值大,应排在首位*/

{

t->next=p1/*待排序点的后继为p*/

head=t/*新头结点为待排序点*/

}

else /*待排序点应插入在中间某个位置p2和p1之间,如p为空则是尾部*/

{

t->next=p1/*t的后继是p1*/

p2->next=t/*p2的后继是t*/

}

}

p1=head/*已排好序的头指针赋给p1,准备填写名次*/

while(p1!=NULL) /*当p1不为空时,进行下列操作*/

{

i++/*结点序号*/

p1->order=i/*将结点序号赋值给名次*/

p1=p1->next/*指针后移*/

}

printf("排序成功 Sorting is sucessful.\n")/*排序成功*/

return (head)

}

/*插入记录函数*/

STUDENT *insert(STUDENT *head,STUDENT *mynew)

{STUDENT *p0,*p1,*p2

int n,sum1,i

p1=head/*使p1指向第一个结点*/

p0=mynew/*p0指向要插入的结点*/

printf("\nPlease enter a mynew record.\n")/*提示输入记录信息*/

printf("输入学号Enter the num:")

scanf("%s",mynew->num)

printf("输入名字Enter the name:")

scanf("%s",mynew->name)

printf("Please enter the %d scores.\n",3)

sum1=0/*保存新记录的总分,初值为0*/

for(i=0i<3i++)

{

do{

printf("成绩score%d:",i+1)

scanf("%d",&mynew->score[i])

if(mynew->score[i]>100||mynew->score[i]<0)

printf("数据错误Data error,please enter again.\n")

}while(mynew->score[i]>100||mynew->score[i]<0)

sum1=sum1+mynew->score[i]/*累加各门成绩*/

}

mynew->sum=sum1/*将总分存入新记录中*/

mynew->average=(float)sum1/3

mynew->order=0

if(head==NULL) /*原来的链表是空表*/

{head=p0p0->next=NULL} /*使p0指向的结点作为头结点*/

else

{while((p0->average<p1->average)&&(p1->next!=NULL))

{p2=p1/*使p2指向刚才p1指向的结点*/

p1=p1->next/*p1后移一个结点*/

}

if(p0->average>=p1->average)

{if(head==p1)head=p0/*插到原来第一个结点之前*/

else p2->next=p0/*插到p2指向的结点之后*/

p0->next=p1}

else

{p1->next=p0p0->next=NULL} /*插到最后的结点之后*/

}

n=n+1/*结点数加1*/

head=sort(head)/*调用排序的函数,将学生成绩重新排序*/

printf("\n学生Student %s 已被更新have been inserted.\n",mynew->name)

printf("不要忘了保存Don't forget to save the mynew file.\n")

return(head)

}

/*保存数据到文件函数*/

void save(STUDENT *head)

{FILE *fp/*定义指向文件的指针*/

STUDENT *p/* 定义移动指针*/

char outfile[10]

printf("输出文件例如:c:\\score Enter outfile name,for example c:\\score\n")

scanf("%s",outfile)

if((fp=fopen(outfile,"w"))==NULL) /*为输出打开一个二进制文件,为只写方式*/

{

printf("打不开文件Cannot open the file\n")

return/*若打不开则返回菜单*/

}

printf("\n保存中...Saving the file......\n")

p=head/*移动指针从头指针开始*/

while(p!=NULL) /*如p不为空*/

{

fwrite(p,LEN,1,fp)/*写入一条记录*/

p=p->next/*指针后移*/

}

fclose(fp)/*关闭文件*/

printf("保存成功....Save the file successfully!\n")

}

/* 从文件读数据函数*/

STUDENT *load()

{STUDENT *p1,*p2,*head=NULL/*定义记录指针变量*/

FILE *fp/* 定义指向文件的指针*/

char infile[10]

printf("倒入文件例如:c:\\score Enter infile name,for example c:\\score\n")

scanf("%s",infile)

if((fp=fopen(infile,"r"))==NULL) /*打开一个二进制文件,为只读方式*/

{

printf("打不开文件Can not open the file.\n")

return(head)

}

printf("\n寻找文件...Loading the file!\n")

p1=(STUDENT *)malloc(LEN)/*开辟一个新单元*/

if(!p1)

{

printf("内存溢出!Out of memory!\n")

return(head)

}

head=p1/*申请到空间,将其作为头指针*/

while(!feof(fp)) /*循环读数据直到文件尾结束*/

{

if(fread(p1,LEN,1,fp)!=1) break/*如果没读到数据,跳出循环*/

p1->next=(STUDENT *)malloc(LEN)/*为下一个结点开辟空间*/

if(!p1->next)

{

printf("Out of memory!\n")

return (head)

}

p2=p1/*使p2指向刚才p1指向的结点*/

p1=p1->next/*指针后移,新读入数据链到当前表尾*/

}

p2->next=NULL/*最后一个结点的后继指针为空*/

fclose(fp)

printf("\n你成功的从文件中读取了数据!\nYou have success to read data from the file!\n")

return (head)

}

/*10.3.2源程序*/

/******头文件(.h)***********/

#include "stdio.h" /*I/O函数*/

#include "stdlib.h" /*标准库函数*/

#include "string.h"/*字符串函数*/

#include "ctype.h" /*字符操作函数*/

#define M 50 /*定义常数表示记录数*/

typedef struct /*定义数据结构*/

{

char name[20]/*姓名*/

char units[30]/*单位*/

char tele[10]/*电话*/

}ADDRESS

/******以下是函数原型*******/

int enter(ADDRESS t[])/*输入记录*/

void list(ADDRESS t[],int n)/*显示记录*/

void search(ADDRESS t[],int n)/*按姓名查找显示记录*/

int delete(ADDRESS t[],int n)/*删除记录*/

int add(ADDRESS t[],int n)/*插入记录*/

void save(ADDRESS t[],int n)/*记录保存为文件*/

int load(ADDRESS t[])/*从文件中读记录*/

void display(ADDRESS t[])/*按序号查找显示记录*/

void sort(ADDRESS t[],int n)/*按姓名排序*/

void qseek(ADDRESS t[],int n)/*快速查找记录*/

void copy()/*文件复制*/

void print(ADDRESS temp)/*显示单条记录*/

int find(ADDRESS t[],int n,char *s) /*查找函数*/

int menu_select()/*主菜单函数*/

/******主函数开始*******/

main()

{

int i

ADDRESS adr[M]/*定义结构体数组*/

int length/*保存记录长度*/

clrscr()/*清屏*/

for()/*无限循环*/

{

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/

{

case 0:length=enter(adr)break/*输入记录*/

case 1:list(adr,length)break/*显示全部记录*/

case 2:search(adr,length)break/*查找记录*/

case 3:length=delete(adr,length)break/*删除记录*/

case 4:length=add(adr,length)break/*插入记录*/

case 5:save(adr,length)break/*保存文件*/

case 6:length=load(adr)break/*读文件*/

case 7:display(adr)break/*按序号显示记录*/

case 8:sort(adr,length)break/*按姓名排序*/

case 9:qseek(adr,length)break/*快速查找记录*/

case 10:copy()break/*复制文件*/

case 11:exit(0)/*如返回值为11则程序结束*/

}

}

}

/*菜单函数,函数返回值为整数,代表所选的菜单项*/

menu_select()

{

char s[80]

int c

gotoxy(1,25)/*将光标定为在第25行,第1列*/

printf("press any key enter menu......\n")/*提示压任意键继续*/

getch()/*读入任意字符*/

clrscr()/*清屏*/

gotoxy(1,1)

printf("********************MENU*********************\n\n")

printf(" 0. Enter record\n")

printf(" 1. List the file\n")

printf(" 2. Search record on name\n")

printf(" 3. Delete a record\n")

printf(" 4. add record \n")

printf(" 5. Save the file\n")

printf(" 6. Load the file\n")

printf(" 7. display record on order\n")

printf(" 8. sort to make new file\n")

printf(" 9. Quick seek record\n")

printf(" 10. copy the file to new file\n")

printf(" 11. Quit\n")

printf("***********************************************\n")

do{

printf("\n Enter you choice(0~11):")/*提示输入选项*/

scanf("%s",s)/*输入选择项*/

c=atoi(s)/*将输入的字符串转化为整型数*/

}while(c<0||c>11)/*选择项不在0~11之间重输*/

return c/*返回选择项,主程序根据该数调用相应的函数*/

}

/***输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/

int enter(ADDRESS t[])

{

int i,n

char *s

clrscr()/*清屏*/

printf("\nplease input num \n")/*提示信息*/

scanf("%d",&n)/*输入记录数*/

printf("please input record \n")/*提示输入记录*/

printf("name unit telephone\n")

printf("------------------------------------------------\n")

for(i=0i<ni++)

{

scanf("%s%s%s",t[i].name,t[i].units,t[i].tele)/*输入记录*/

printf("----------------------------------------------\n")

}

return n/*返回记录条数*/

}

/*显示记录,参数为记录数组和记录条数*/

void list(ADDRESS t[],int n)

{

int i

clrscr()

printf("\n\n*******************ADDRESS******************\n")

printf("name unit telephone\n")

printf("------------------------------------------------\n")

for(i=0i<ni++)

printf("%-20s%-30s%-10s\n",t[i].name,t[i].units,t[i].tele)

if((i+1)%10==0) /*判断输出是否达到10条记录*/

{

printf("Press any key continue...\n")/*提示信息*/

getch()/*压任意键继续*/

}

printf("************************end*******************\n")

}

/*查找记录*/

void search(ADDRESS t[],int n)

{

char s[20]/*保存待查找姓名字符串*/

int i/*保存查找到结点的序号*/

clrscr()/*清屏*/

printf("please search name\n")

scanf("%s",s)/*输入待查找姓名*/

i=find(t,n,s)/*调用find函数,得到一个整数*/

if(i>n-1) /*如果整数i值大于n-1,说明没找到*/

printf("not found\n")

else

print(t[i])/*找到,调用显示函数显示记录*/

}

/*显示指定的一条记录*/

void print(ADDRESS temp)

{

clrscr()

printf("\n\n********************************************\n")

printf("name unit telephone\n")

printf("------------------------------------------------\n")

printf("%-20s%-30s%-10s\n",temp.name,temp.units,temp.tele)

printf("**********************end***********************\n")

}

/*查找函数,参数为记录数组和记录条数以及姓名s */

int find(ADDRESS t[],int n,char *s)

{

int i

for(i=0i<ni++)/*从第一条记录开始,直到最后一条*/

{

if(strcmp(s,t[i].name)==0) /*记录中的姓名和待比较的姓名是否相等*/

return i/*相等,则返回该记录的下标号,程序提前结结束*/

}

return i/*返回i值*/

}

/*删除函数,参数为记录数组和记录条数*/

int delete(ADDRESS t[],int n)

{

char s[20]/*要删除记录的姓名*/

int ch=0

int i,j

printf("please deleted name\n")/*提示信息*/

scanf("%s",s)/*输入姓名*/

i=find(t,n,s)/*调用find函数*/

if(i>n-1) /*如果i>n-1超过了数组的长度*/

printf("no found not deleted\n")/*显示没找到要删除的记录*/

else

{

print(t[i])/*调用输出函数显示该条记录信息*/

printf("Are you sure delete it(1/0)\n")/*确认是否要删除*/

scanf("%d",&ch)/*输入一个整数0或1*/

if(ch==1) /*如果确认删除整数为1*/

{

for(j=i+1j<nj++) /*删除该记录,实际后续记录前移*/

{

strcpy(t[j-1].name,t[j].name)/*将后一条记录的姓名拷贝到前一条*/

strcpy(t[j-1].units,t[j].units)/*将后一条记录的单位拷贝到前一条*/

strcpy(t[j-1].tele,t[j].tele)/*将后一条记录的电话拷贝到前一条*/

}

n--/*记录数减1*/

}

}

return n/*返回记录数*/

}

/*插入记录函数,参数为结构体数组和记录数*/

int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/

{

ADDRESS temp/*新插入记录信息*/

int i,j

char s[20]/*确定插入在哪个记录之前*/

printf("please input record\n")

printf("************************************************\n")

printf("name unit telephone\n")

printf("--------------------------------------------------\n")

scanf("%s%s%s",temp.name,temp.units,temp.tele)/*输入插入信息*/

printf("------------------------------------------------\n")

printf("please input locate name \n")

scanf("%s",s)/*输入插入位置的姓名*/

i=find(t,n,s)/*调用find,确定插入位置*/

for(j=n-1j>=ij--) /*从最后一个结点开始向后移动一条*/

{

strcpy(t[j+1].name,t[j].name)/*当前记录的姓名拷贝到后一条*/

strcpy(t[j+1].units,t[j].units)/*当前记录的单位拷贝到后一条*/

strcpy(t[j+1].tele,t[j].tele)/*当前记录的电话拷贝到后一条*/

}

strcpy(t[i].name,temp.name)/*将新插入记录的姓名拷贝到第i个位置*/

strcpy(t[i].units,temp.units)/*将新插入记录的单位拷贝到第i个位置*/

strcpy(t[i].tele,temp.tele)/*将新插入记录的电话拷贝到第i个位置*/

n++/*记录数加1*/

return n/*返回记录数*/

}

/*保存函数,参数为结构体数组和记录数*/

void save(ADDRESS t[],int n)

{

int i

FILE *fp/*指向文件的指针*/

if((fp=fopen("record.txt","wb"))==NULL) /*打开文件,并判断打开是否正常*/

{

printf("can not open file\n")/*没打开*/

exit(1)/*退出*/

}

printf("\nSaving file\n")/*输出提示信息*/

fprintf(fp,"%d",n)/*将记录数写入文件*/

fprintf(fp,"\r\n")/*将换行符号写入文件*/

for(i=0i<ni++)

{

fprintf(fp,"%-20s%-30s%-10s",t[i].name,t[i].units,t[i].tele)/*格式写入记录*/

fprintf(fp,"\r\n")/*将换行符号写入文件*/

}

fclose(fp)/*关闭文件*/

printf("****save success***\n")/*显示保存成功*/

}

/*读入函数,参数为结构体数组*/

int load(ADDRESS t[])

{

int i,n

FILE *fp/*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/

{

printf("can not open file\n")/*不能打开*/

exit(1)/*退出*/

}

fscanf(fp,"%d",&n)/*读入记录数*/

for(i=0i<ni++)

fscanf(fp,"%20s%30s%10s",t[i].name,t[i].units,t[i].tele)/*按格式读入记录*/

fclose(fp)/*关闭文件*/

printf("You have success read data from file!!!\n")/*显示保存成功*/

return n/*返回记录数*/

}

/*按序号显示记录函数*/

void display(ADDRESS t[])

{

int id,n

FILE *fp/*指向文件的指针*/

if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/

{

printf("can not open file\n")/*不能打开文件*/

exit(1)/*退出*/

}

printf("Enter order number...\n")/*显示信息*/

scanf("%d",&id)/*输入序号*/

fscanf(fp,"%d",&n)/*从文件读入记录数*/

if(id>=0&&id<n) /*判断序号是否在记录范围内*/

{

fseek(fp,(id-1)*sizeof(ADDRESS),1)/*移动文件指针到该记录位置*/

print(t[id])/*调用输出函数显示该记录*/

printf("\r\n")

}

else

printf("no %d number record!!!\n ",id)/*如果序号不合理显示信息*/

fclose(fp)/*关闭文件*/

}

/*排序函数,参数为结构体数组和记录数*/

void sort(ADDRESS t[],int n)

{

int i,j,flag

ADDRESS temp/*临时变量做交换数据用*/

for(i=0i<ni++)

{

flag=0/*设标志判断是否发生过交换*/

for(j=0j<n-1j++)

if((strcmp(t[j].name,t[j+1].name))>0) /*比较大小*/

{

flag=1

strcpy(temp.name,t[j].name)/*交换记录*/

strcpy(temp.units,t[j].units)

strcpy(temp.tele,t[j].tele)

strcpy(t[j].name,t[j+1].name)

strcpy(t[j].units,t[j+1].units)

strcpy(t[j].tele,t[j+1].tele)

strcpy(t[j+1].name,temp.name)

strcpy(t[j+1].units,temp.units)

strcpy(t[j+1].tele,temp.tele)

}

if(flag==0)break/*如果标志为0,说明没有发生过交换循环结束*/

}

printf("sort sucess!!!\n")/*显示排序成功*/

}

/*快速查找,参数为结构体数组和记录数*/

void qseek(ADDRESS t[],int n)

{

char s[20]

int l,r,m

printf("\nPlease sort before qseek!\n")/*提示确认在查找之前,记录是否已排序*/

printf("please enter name for qseek\n")/*提示输入*/

scanf("%s",s)/*输入待查找的姓名*/

l=0r=n-1/*设置左边界与右边界的初值*/

while(l<=r) /*当左边界<=右边界时*/

{

m=(l+r)/2/*计算中间位置*/

if(strcmp(t[m].name,s)==0) /*与中间结点姓名字段做比较判是否相等*/

{

print(t[m])/*如果相等,则调用print函数显示记录信息*/

return /*返回*/

}

if(strcmp(t[m].name,s)<0) /*如果中间结点小*/

l=m+1/*修改左边界*/

else

r=m-1/*否则,中间结点大,修改右边界*/

}

if(l>r) /*如果左边界大于右边界时*/

printf("not found\n")/*显示没找到*/

}

/*复制文件*/

void copy()

{

char outfile[20]/*目标文件名*/

int i,n

ADDRESS temp[M]/*定义临时变量*/

FILE *sfp,*tfp/*定义指向文件的指针*/

clrscr()/*清屏*/

if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/

{

printf("can not open file\n")/*显示不能打开文件信息*/

exit(1)/*退出*/

}

printf("Enter outfile name,for example c:\\f1\\te.txt:\n")/*提示信息*/

scanf("%s",outfile)/*输入目标文件名*/

if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/

{

printf("can not open file\n")/*显示不能打开文件信息*/

exit(1)/*退出*/

}

fscanf(sfp,"%d",&n)/*读出文件记录数*/

fprintf(tfp,"%d",n)/*写入目标文件数*/

fprintf(tfp,"\r\n")/*写入换行符*/

for(i=0i<ni++)

{

fscanf(sfp,"%20s%30s%10s\n",temp[i].name,temp[i].units,

temp[i].tele)/*读入记录*/

fprintf(tfp,"%-20s%-30s%-10s\n",temp[i].name,

temp[i].units,temp[i].tele)/*写入记录*/

fprintf(tfp,"\r\n")/*写入换行符*/

}

fclose(sfp)/*关闭源文件*/

fclose(tfp)/*关闭目标文件*/

printf("you have success copy file!!!\n")/*显示复制成功*/

}