第 11章实例演示
11.1,极限俱乐部会员信息系统”程序(三)
11.2,极限俱乐部会员信息系统”程序(四)
11.3,教学成绩管理系统”程序
我们已经学习了 C语言的数组、函数、指针、结构、文件操作等知识。本章的主要目的就是将所有的知识点通过完善
“极限俱乐部会员信息系统”的方式串连起来,使读者真正体会到 C语言的作用以及领略到它的独特魅力。
11.1“极限俱乐部会员信息系统”程序 (三)
,极限俱乐部会员信息系统”作为一个完整的信息管理系统,
其程序(一)和程序(二)显然不够完善,特别是其不能存储数据,使得每一次操作后,数据全部丢失,无法应用到实际中。而且,当处理大量的数据时,又要一个个的逐次重新输入,大大降低效率。这种缺陷必须得以弥补,这个信息管理系统才能具有实用价值。
结合本例,我们再加深文件操作的印象。
(一)文件的打开和关闭
1,fopen()函数
fopen函数用于打开文件,其调用格式为:
FILE *fopen(char *filename,*type);
FILE为文件指针。实际上 FILE是一个新的数据类型即我们学习结构这种类型时遇到的结构指针。为便于理解,这里只要将 FILE看作一个包括了文件管理有关信息的数据结构,即在打开文件时必须先定义一个文件指针。
本例主函数中定义,FILE *fp;”,fp即 file pointer(文件指针)
之意。
用,fp=fopen("d:\\sta.dat","r")”表示,以只读方式打开 D盘根目录下的一个文件 sta.dat。
这里有一点要注意:如果将路径写为 d:\sta.dat是不正确的。
11.1“极限俱乐部会员信息系统”程序 (三)
2,fclose()函数
2,fclose()函数
fclose()函数用来关闭一个由 fopen()函数打开的文件,
其调用格式为:
int fclose(FILE *stream);
该函数返回一个整型数。当文件关闭成功时,返回 0,
否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
(二)文件的写入与输出
1,fscanf()函数
fscanf()为文件的顺序读操作函数,其调用格式如下:
int fscanf(FILE *stream,char *format,<address-
list>);
fscanf()函数的用法与 scanf()函数相似,只是它是从文件中读到信息。 fscanf()函数的返回值为 EOF(即 -1),表明读错误,否则读数据成功。
本例中的 fscanf()函数调用形式为:
fscanf(fp,"%s%s%s%d%d%d%d\n",sta[n].unit,sta[
n].name,sta[n].sex,&sta[n].age,&sta[n].height,&sta[n].
weight);
要特别注意的是,当 fscanf()函数读到空白符时便自动结束,在使用时要特别注意。
2,fprintf()函数
函数 fprintf()为文件的顺序写操作函数,其调用格式如下:
int fprintf(FILE *stream,char *format,<variable-
list>);
fprintf() 函数的返回值为实际写入文件中的字节数。如果写错误,则返回一个负数。 fscanf(),fprintf( ) 函数中格式化的规定与 scanf(),printf( ) 函数相同,所不同的只是 fscanf(),fprintf()函数是分别向文件中读取和写入数据,而 scanf(),printf()则是分别从键盘中输入和向屏幕输出数据。
3,feof()函数
feof()函数函数的调用格式为:
int feof(FILE *stream);
feof()函数检测文件位置指示器是否到达了文件结尾,若是则返回一个非 0值,否则返回 0。
(三)本程序较以前两个程序增加的功能:
系统的控制台包括如下十个选项:
1、添加 ――――――――――――― 添加职工信息;
2、显示 ―――――― 显示所有记录及操作结果显示;
3、按姓名排序 ――――――― 按字典顺序排序姓名;
4、按身高排序 ――――― 按职工的身高由高到矮排序;
5、按体重排序 ―――― 按职工的体重由重到轻排序;
6、检索 ―――――――― 按职工姓名检索全部信息;
7、修改 ―――――――― 按提示逐步修改职工信息;
8、删除 ―――――――― 删除所选职工的所有信息;
9、存盘 ――――――――― 将操作的最后结果存盘;
10、返回 ―――――――― 返回并退出信息管理系统。
(四)源程序代码如下:
#include "stdio.h" /*控制台 I/O的头文件 */
#include "string.h" /*字符串函数的头文件 */
#include "stdlib.h" /*exit()函数的头文件 */
#define Max 100 /*定义最多可以输入的职工数 */
int Interface(char (*x)[20],int n); /*操作界面 */
int Add(int start,struct staff *p); /*增加职工数 */
void Display(struct staff *p,int start,int end); /*显示已存在的数据 */
void SortName(struct staff *p,int n); /*按姓名排序 */
void SortHeight(struct staff *p,int n); /*按身高排序(由高到低) */
void SortWeight(struct staff *p,int n); /*按体重排序(由重到轻)
int Search (struct staff *p,char *t,int n); /*信息检索 */
int Find(struct staff *p,int n); /*信息查找
*/
void Modify(struct staff *p,int n); /*信息修改 */
int Delete(struct staff *p,int n); /*信息删除 */
void Swap(struct staff *p1,struct staff *p2); /*职工信息互换 */
void SaveFile(struct staff *p,int n); /*文件存盘 */
char password[8]="123321"; /*设置系统管理员密码 */
struct staff
{
char unit[60];
char name[20];
char sex[20];
int age;
int height;
int weight;
};
void main()
{
struct staff sta[Max]; /*定义结构数组 */
FILE *fp; /*结构数组,即可输入的最大职工数,
最大值为声明中预定义的 Max*/
int s; /*设置变量,以用于用户输入信息的接收,
并将其作为转向函数的参数 */
int n=0; /*整型变量 */
char choice;
char pass[8];
int flag=0;
int w=3;
char menu[][20]={"添加 ","显示 ","按姓名排序 ","按身高排序 ","按体重排序 ","检索 ","修改 ","删除 ","存盘 ","返回 "};
char openfile[10];
do{
printf("请输入管理员密码,\n");
scanf("%s",pass);
if(!strcmp(pass,password))
{
printf("PASS\n\n\n");
flag = 1;
break;
}
else
{
printf("密码错误,请重新输入,\n");
w--;
}
}
while(w>0);
if(!flag)
{
printf("你已连续三次输入错误,请确认后再使用本系统,
谢谢 !\n");
exit(0);
}
system("cls");/*用 system调用 dos命令,清屏 */
printf ("\n 打开已有的文件 \"staff_3.dat\"?(y/n)");
scanf("%s",openfile);
if((strcmp(openfile,"y")==NULL))
{
if((fp=fopen("d:\\staff_3.dat","r"))==NULL)
{
printf("不能打开文件! \n");
exit(0);
}
while (feof(fp)==0)
{
fscanf(fp,"%s%s%s%d%d%d%d\n",sta[n].unit,sta[n].nam
e,sta[n].sex,&sta[n].age,&sta[n].height,&sta[n].weight);
n++;
}
fclose(fp);
}
else
printf("请创建一个新文件 \"staff_3.dat\".\n");
system("cls"); /*用 system调用 dos命令,清屏 */
/**********************欢迎界面 ********************/
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("\t\t欢迎进入职工医疗保健信息系统 \n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%
%%%\t\t\t\t\t%%%%%%%%%%%%%%%%%%%%%
%%%%%%\n");
printf("\n\n\n\n");
printf("单位:西南化工研究院职工医院 \n");
printf("地址:四川省泸州市纳溪区 \n");
printf("急救电话,119,999");
printf("\n\n\n\n");
printf("==============\t\t==============\n");
printf("本系统由“登峰造极软件有限公司开发” \n");
printf("地址:北京市海淀区学院路 \n");
printf("作者,crest,huniuniu \n");
printf("==============\t\t==============\n");
printf("\n\n");
printf("\t\t请任意输入一个值并回车进入系统 \n");
scanf("%s",&choice);
if(choice=='n'||choice=='N')
exit(1);
system("cls"); /*用 system调用 dos命令,清屏 */
do
{
s=Interface(menu,10); /*调用 Interface()函数 */
switch (s) /*转向语句,选择以实现不同的功能 */
{
case 0,n=Add(n,sta);break;
case 1,Display(sta,0,n-1);break;
case 2,SortName(sta,n);break;
case 3,SortHeight(sta,n);break;
case 4,SortWeight(sta,n);break;
case 5,Find(sta,n);break;
case 6,Modify(sta,n);break;
case 7,n=Delete(sta,n);break;
case 8,SaveFile(sta,n);
}
}
while(s>=0&&s<=8);
}
操作界面
int Interface(char (*x)[20],int n)
{
int i;
int j;
printf("\n××××××× 城镇职工医疗保健信息系统
××××××× \n");
do
{
for (j=0;j<n;j++)
printf("%2d.%s\n",j+1,x[j]);
printf("请从上述选项中选择,\n");
scanf("%d",&i); /*输入选项 */
}
while (i<0||i>n+1);
return (i-1);
}
增添信息
int Add(int start,struct staff *p)
{
int n;
for (n=start;n<Max;n++)
{
printf("\n [%d]输入姓名 (按 e键退出 )\n",n+1); /*若要退出输入,则按 e*/
printf("单位,");
scanf("%s",(p+n)->unit);
if (strcmp((p+n)->unit,"e")==0)break;
printf("姓名,");
scanf("%s",(p+n)->name);
printf("性别 (Male/Female):");
scanf("%s",(p+n)->sex);
printf("年龄,");
scanf("%d",&((p+n)->age));
printf("身高 (cm):");
scanf("%d",&((p+n)->height));
printf("体重 (kg):");
scanf("%d",&((p+n)->weight));
}
return n;
}
显示输入或者修改后的内容
void Display(struct staff *p,int start,int end)
{
int i;
printf("\n%10s%10s%10s","单位 ","姓名 ","性别 "); /*显示标题 */
printf("%10s%10s%10s","年龄 ","身高 ","体重 "); /*显示数据信息 */
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~ \n");
for(i=start;i<=end;i++)
{
printf("%10s%10s%10s",(p+i)->unit,(p+i)->name,(p+i)->sex);
printf("%10d%10d%10d",(p+i)->age,(p+i)->height,(p+i)-
>weight);
printf("\n");
}
}
选择法按姓名排序 (依据字典顺序 )
void SortName(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if(strcmp((p+k)->name,(p+j)->name)>0)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工姓名 */
}
printf("\n 完成姓名排序 !\n");
}
选择法按身高排序
void SortHeight(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->height<(p+j)->height)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工身高 */
}
printf("\n 完成身高排序 !\n");
}
选择法按体重排序
void SortWeight(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->weight<(p+j)->weight)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工姓名体重 */
}
printf("\n 完成体重排序 !\n");
}
按姓名检索
int Find(struct staff *p,int n)
{
int i;
char str[20];
printf("\n 请输入职工姓名,");
scanf("%s",str);
i=Search(p,str,n); /*调用 Search()函数 */
if(i==-1)
printf("没有匹配信息,请重试 %s!\n",str);
else
Display(p,i,i);
getchar();
return i;
}
修改信息
void Modify(struct staff *p,int n)
{
int i;
i=Find(p,n); /*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则修改 */
{
printf("请输入新信息,\n");
printf("单位,");
scanf("%s",(p+i)->unit);
printf("姓名,");
scanf("%s",(p+i)->name);
printf("性别,");
scanf("%s",(p+i)->sex);
printf("年龄,");
scanf("%d",&((p+i)->age));
printf("身高 (cm):");
scanf("%d",&((p+i)->height));
printf("体重 (kg):");
scanf("%d",&((p+i)->weight));
printf("\n修改已完成 !\n");
}
}
删除信息
int Delete(struct staff *p,int n)
{
int i;
i=Find(p,n); /*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则删除 */
{
p[i]=p[n-1];
n=n-1;
printf("\n信息已删除 !\n");
}
return n;
}
删除信息
void Swap(struct staff *p1,struct staff *p2) /*两个职工信息互换 */
{
struct staff temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int Search(struct staff *p,char *t,int n)
{
int i;
for (i=0;i<n;i++)
if(!strcmp((p+i)->name,t)) /*按姓名检索 */
return i;
return -1;
}
保存文件
void SaveFile(struct staff *p,int n)
{
FILE *fp1;
char i;
if((fp1=fopen("d:\\staff_3_new.dat","w"))==NULL) /*以文本方式生成并“写打开”文件 */
{
printf("不能打开文件! \n"); /*检测打开文件中出现的错误,并决定是否写入文件 */
exit(1);
}
保存文件
for (i=0;i<n;i++)
{
if((fprintf(fp1,"%10s %10s %10s %10d %10d %10d
\n",(p+i)->unit,(p+i)->name,
(p+i)->sex,(p+i)->age,(p+i)->height,(p+i)-
>weight))==NULL)
printf("文件写入出错 !\n"); /*写入文件,如果为空,则提示出错 */
}
printf("\n 文件已保存 !\n");
fclose(fp1); /*关闭文件 */
}
(五)程序的运行演示与结果输出
1.请输入管理员密码:
2.打开已有的文件 \" d:\staff_3.dat\"?(y/n)
3.进入欢迎界面
4.进入操作界面,直接显示系统从文件读入的信息:
5.选择,3.按姓名排序”
6.选择,4.按身高排序”
7.选择,5.按体重排序”
8.选择,6.检索”
9.选择,7.修改”,在提示处输入待检索的人名:
10.选择,8.删除”,在提示处输入待删除的人名:
11.选择,9.存盘”,系统提示:“文件已保存!”
12.选择,10.返回”,退出系统,至此,所有操作已完成!
11,3,教学成绩管理系统”程序本系统可以实现如下功能:
数据的读取与存储;
数据的添加;
按总分排序;
按各单科成绩排序;
按姓名检索成绩;
修改成绩;
删除成绩;
返回并退出系统。
2.程序源代码
/*教学成绩管理系统 */
/*说明:,教学成绩管理系统,基本信息包括班级、
学号、姓名及语文、数学、外语、物理、化学五科成绩的信息,可以根据实际情况有所增减 */
#include <stdio.h>/*控制台 I/O的头文件 */
#include <string.h>/*字符串函数的头文件 */
#include <stdlib.h>/*exit()函数的头文件 */
#define Max 100/*定义最多可以输入的学生数 */
int Interface(char (*x)\[20\],int n);/*操作界面 */
int Add(int start,struct student *p);/*增加学生数 */
void Display(struct student *p,int start,int end);/*显示已存在的数据 */
void SortName(struct student *p,int n);/*按姓名排序 */
void SortTotal(struct student *p,int n);/*按总分排序 (由高到低 )*/
void SortChinese(struct student *p,int n);/*按语文排序 (由高到低 )*/
void SortMath(struct student *p,int n);/*按数学排序 (由高到低 )*/
void SortForeignLanguage(struct student *p,
int n);/*按外文排序 (由高到低 )*/
void SortPhysics(struct student *p,int n);/*按物理排序 (由高到低 )*/
void SortChemistry(struct student *p,int n);/*
按化学排序 (由高到低 )*/
int Search (struct student *p,char *t,int n);/*信息检索 */
int Find(struct student *p,int n);/*信息查找 */
void Modify(struct student *p,int n);/*信息修改 */
int Delete(struct student *p,int n);/*信息删除 */
void Swap(struct student *p1,struct student *p2);/*
学生信息互换 */
void SaveFile(struct student *p,int n);/*文件保存 */
char password\[8\]="7654321";/*设置系统管理员密码 */
struct student
{
char Class\[30\];
char StudentNumber\[20\];
char Name\[20\];
int Score\[5\];
int Total;
};
void main()
{
struct student stu\[Max\];/*定义结构数组 */
FILE *fp;/*结构数组,即可输入的最大学生数,最大值为声明中预定义的 Max*/
int s;/*设置变量,以用于用户输入信息的接收,并将其作为转向函数的参数 */
int n=0; /*整型变量 */
char choice;
char menu\[\]\[20\]={"添加 ","显示 ","按姓名排序 ","按总分排序 ","按语文成绩排序 ",
"按数学成绩排序 ","按外语成绩排序 ","按物理成绩排序 ","按化学成绩排序 ",
"检索 ","修改 ","删除 ","存盘 ","返回 "};
/**************系统密码管理 **************/
char pass\[8\];
int flag=0;
int w=3;
char openfile\[10\];
do{
printf("请输入管理员密码,\\n");
scanf("%s",pass);
if(!strcmp(pass,password))
{
printf("PASS\\n\\n\\n");
flag = 1;
break;
}
else
{
printf("密码错误,请重新输入,\\n");
w--;
}
}
while(w>0);
if(!flag)
{
printf("你已连续三次输入错误,请确认后再使用本系统,谢谢 !\\n");
exit(0);
}
system("cls");/*用 system调用 dos命令,清屏 */
/*************打开已有文件 *************/
printf ("\\n 打开已有的文件 \"d:\\student.txt\"?(y/n)");
scanf("%s",openfile);
if((strcmp(openfile,"y")==NULL))
{
if((fp=fopen("d:\\student.txt","r"))==NULL)
{
printf("不能打开文件! \\n");
exit(0);
}
while (feof(fp)==0)
{
fscanf(fp,"%s %s %s %d %d %d %d %d
%d\\n",stu\[n\].Class,stu\[n\].StudentNumber,stu\[n\].Name,
&stu\[n\].Total,&stu\[n\].Score\[0\],&stu\[n\].Score\[1\],&stu\[
n\].Score\[2\],
&stu\[n\].Score\[3\],&stu\[n\].Score\[4\]);
n++;
}
fclose(fp);
}
else
printf("请创建一个新文件 \"student.txt\".\\n");
system("cls");/*用 system调用 dos命令,清屏 */
printf("~~~~~~~~~~~~~\\t\\t\\t\\t\\t~~~~~~~~~~
~~~\\n");
printf("~~~~~~~~~~~~~\\t\\t\\t\\t\\t~~~~~~~~~~~~~
\\n");
printf("\\t\\t欢迎进入教学成绩管理系统 \\n");
printf("%%%%%%%%%%%%%%%%%%%%
%%%%%%%\\t\\t\\t\\t\\t%%%%%%%%%%%%%
%%%%%%%%%%%%%%\\n");
printf("-------------------------------");
printf("\\n\\n\\n\\n");
printf("单位:北京三零九中学 \\n");
printf("地址:北京市海淀区 \\n");
printf("电话,010-70000000");
printf("\\n\\n\\n\\n");
printf("==============\\t\\t=============
=\\n");
printf("本系统由“天地人和软件有限公司”开发
\\n");
printf("地址:北京市海淀区学院路 \\n");
printf("编制人:天天 \\n");
printf("==============\\t\\t=============
=\\n");
printf("\\n\\n");
printf("\\t\\t请任意输入一个值并回车进入系统 \\n");
scanf("%s",&choice);
if(choice==′n′||choice==′N′)
exit(1);
system("cls");/*用 system调用 dos命令,清屏 */
do
{
s=Interface(menu,14);/*调用 Interface()函数 */
switch (s) /*转向语句,选择以实现不同的功能 */
{
case 0,n=Add(n,stu);break;
case 1,Display(stu,0,n-1);break;
case 2,SortName(stu,n);break;
case 3,SortTotal(stu,n);break;
case 4,SortChinese(stu,n);break;
case 5,SortMath(stu,n);break;
case 6,SortForeignLanguage(stu,n);break;
case 7,SortPhysics(stu,n);break;
case 8,SortChemistry(stu,n);break;
case 9,Find(stu,n);break;
case 10,Modify(stu,n);break;
case 11,n=Delete(stu,n);break;
case 12,SaveFile(stu,n);
}
}
while(s>=0&&s<=12);
}
/**********************************\ 操作界面函数
\\**********************************/
int Interface(char (*x)\[20\],int n)
{
int i;
int j;
printf("\\n××××××× 教学成绩管理系统
××××××× \\n");
do
{
for (j=0;j<n;j++)
printf("%2d.%s\\n",j+1,x\[j\]);
printf("请从上述选项中选择,\\n");
scanf("%d",&i);/*接收键盘输入的字符 */
}
while (i<0||i>n+1);
return (int)i-1;
}
/**********************************\ 添加信息函数
\\**********************************/
int Add(int start,struct student *p)
{
int n;
for (n=start;n<Max;n++)
{
printf("\\n \[%d\]输入学生信息 (按 e键退出 )\\n",n+1);
/*若要退出输入,则按 e*/
printf("班级,");
scanf("%s",(p+n)->Class);
if (strcmp((p+n)->Class,"e")==0)break;
printf("学号,");
scanf("%s",(p+n)->StudentNumber);
printf("姓名,");
scanf("%s",(p+n)->Name);
printf("语文,");
scanf("%d",&((p+n)->Score\[0\]));
printf("数学,");
scanf("%d",&((p+n)->Score\[1\]));
printf("外语,");
scanf("%d",&((p+n)->Score\[2\]));
printf("物理,");
scanf("%d",&((p+n)->Score\[3\]));
printf("化学,");
scanf("%d",&((p+n)->Score\[4\]));
(p+n)->Total=0;
(p+n)->Total=((p+n)->Total+(p+n)-
>Score\[0\]+(p+n)->Score\[1\]+(p+n)-
>Score\[2\]+(p+n)->Score\[3\]+(p+n)->Score\[4\]);
}
return n;
}
/**********************************\ 显示信息函数
\\**********************************/
void Display(struct student *p,int start,int end)
{
int i;
printf("\\n%9s%10s%10s","班级 ","学号 ","姓名 "); /*显示标题 */
printf("%8s%8s%8s%8s%8s%8s","总分 ","语文 ","数学 ","外语 ","
物理 ","化学 ");
printf("\\n~~~~~~~~~~~~~~~~~~~~~~~~
\\n");
for(i=start;i<=end;i++)
{
printf("%9s%10s%10s",(p+i)->Class,(p+i)-
>StudentNumber,(p+i)->Name);
printf("%8d%8d%8d%8d%8d%8d",(p+i)->Total,(p+i)-
>Score\[0\],(p+i)->Score\[1\],(p+i)->Score\[2\],(p+i)-
>Score\[3\],(p+i)->Score\[4\]);
printf("\\n");
}
}
/**********************************\ 按姓名排序函数
\\**********************************/
void SortName(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if(strcmp((p+k)->Name,(p+j)->Name)>0)k=j;
/*交换学生姓名 */
if(i!=k)Swap(p+k,p+i);
}
printf("\\n 完成姓名排序 !\\n");
}
/**********************************\ 按总分排序函数
\\**********************************/
void SortTotal(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Total<(p+j)->Total)k=j;
if(i!=k)Swap(p+k,p+i);/*交换总分 */
}
printf("\\n 完成总分排序 (由高到低 )!\\n");
}
/**********************************\ 按语文成绩排序函数
\\**********************************/
void SortChinese(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[0\]<(p+j)->Score\[0\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换语文成绩 */
}
printf("\\n 完成语文成绩由高到低排序 !\\n");
}
/**********************************\ 按数学成绩排序函数
\\**********************************/
void SortMath(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[1\]<(p+j)->Score\[1\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换数学成绩 */
}
printf("\\n 完成数学成绩由高到低排序 !\\n");
}
/**********************************\ 按外语成绩排序函数
\\**********************************/
void SortForeignLanguage(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[2\]<(p+j)->Score\[2\])k=j;
if(i!=k)Swap(p+k,p+i); /*交换外语成绩 */
}
printf("\\n 完成外语成绩由高到低排序 !\\n");
}
/**********************************\ 按物理成绩排序函数
\\**********************************/
void SortPhysics(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[3\]<(p+j)->Score\[3\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换物理成绩 */
}
printf("\\n 完成物理成绩由高到低排序 !\\n");
}
/**********************************\ 按化学成绩排序函数
\\**********************************/
void SortChemistry(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[4\]<(p+j)->Score\[4\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换化学成绩 */
}
printf("\\n 完成化学成绩由高到低排序 !\\n");
}
/**********************************\ 按姓名检索函数
\\**********************************/
int Find(struct student *p,int n)
{
int i;
char str\[20\];
printf("\\n 请输入学生姓名,");
scanf("%s",str);
i=Search(p,str,n);/*调用 Search()函数 */
if(i==-1)
printf("没有匹配信息,请重试 %s!\\n",str);
else
Display(p,i,i);
getchar();
return i;
}
/**********************************\ 修改信息函数
\\**********************************/
void Modify(struct student *p,int n)
{
int i;
i=Find(p,n);/*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则修改 */
{
printf("请输入新信息,\\n");
printf("班级,");
scanf("%s",(p+i)->Class);
printf("学号,");
scanf("%s",(p+i)->StudentNumber);
printf("姓名,");
scanf("%s",(p+i)->Name);
printf("语文,");
scanf("%d",&((p+i)->Score\[0\]));
printf("数学,");
scanf("%d",&((p+i)->Score\[1\]));
printf("外语,");
scanf("%d",&((p+i)->Score\[2\]));
printf("物理,");
scanf("%d",&((p+i)->Score\[3\]));
printf("化学,");
scanf("%d",&((p+i)->Score\[4\]));
(p+i)->Total=0;
(p+i)->Total=((p+i)->Total+(p+i)->Score\[0\]+(p+i)-
>Score\[1\]+(p+i)->Score\[2\]+(p+i)->Score\[3\]+(p+i)-
>Score\[4\]);
printf("\\n修改已完成 !\\n");
}
}
/**********************************\ 删除信息函数
\\**********************************/
int Delete(struct student *p,int n)
{
int i;
i=Find(p,n);/*调用 Find()函数 */
if(i>=0)/*若找到匹配信息,则删除 */
{
p\[i\]=p\[n-1\];
n=n-1;
printf("\\n信息已删除 !\\n");
}
return n;
}
void Swap(struct student *p1,struct student *p2)
{
struct student temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int Search(struct student *p,char *t,int n)
{
int i;
for (i=0;i<n;i++)
if(!strcmp((p+i)->Name,t))
return i;
return -1;
}
/**********************************\ 保存文件函数
\\**********************************/
void SaveFile(struct student *p,int n)
{
FILE *fp1;
char i;
if((fp1=fopen("d:\\student_new.txt","w"))==NULL)
{
printf("不能打开文件! \\n");
/*检测打开文件中出现的错误,并决定是否写入文件 */
exit(1);
}
for (i=0;i<n;i++)
{
if((fprintf(fp1,"%10s %10s %10s %10d %10d %10d
%10d %10d %10d \\n",(p+i)->Class,
(p+i)->StudentNumber,(p+i)->Name,(p+i)-
>Total,(p+i)->Score\[0\],(p+i)->Score\[1\],
(p+i)->Score\[2\],(p+i)->Score\[3\],(p+i)-
>Score\[4\]))==NULL)
printf("文件写入出错 !\\n");/*写入文件,如果为空,则提示出错 */
}
printf("\\n 文件已保存 !\\n");
fclose(fp1);/*关闭文件 */
}
3.程序运行演示与结果输出
( 1)请输入管理员密码:
7654321↙
( 2)打开已有的文件 \" d:\\student.txt"?(y/n)
y↙
这需要预先创建一个文件,本例需要在 d盘根目录下创建一个 txt类型的文件,文件名为
student
(3)进入欢迎界面
k↙
说明:,k”可以由其他任意字符或数字代替。
(4)进入操作界面,直接显示系统从文件读入的信息:
2↙
(5)选择,3.按姓名排序”
3↙
操作完成后提示:“完成姓名排序!”,再按
,2↙,
(6)选择,4.按总分排序”
4↙
操作完成后提示:“完成总分排序(由高到低)!”,再按,2↙,
( 7)选择,5.按语文成绩排序”
5↙
操作完成后提示:“完成语文成绩由高到低排序!”
( 8)选择,6.按数学成绩排序”
6↙
操作完成后提示:“完成数学成绩由高到低排序!”,再按
,2↙,
( 9)选择,7.按外语成绩排序”
7↙
操作完成后提示:“完成外语成绩由高到低排序!”,再按
,2↙,
(10)选择,8.按物理成绩排序”
8↙
操作完成后提示:“完成物理成绩由高到低排序!”,再按
,2↙,
(11)选择,9.按化学成绩排序”
9↙ 操作完成后提示:“完成化学成绩由高到低排序!”,再按,2↙,
(12)选择,10.检索”
10↙
在光标提示处输入待检索的人名:
孟爽 ↙
屏幕显示检索到的信息
(13)选择,11.修改”,在提示处输入待检索的人名:
孟爽 ↙
并依次输入以下新信息:
班级,2006336
学号,200633648
姓名:孟爽
语文,77
数学,69
外语,45
物理,67
化学,94
输入完毕后屏幕提示:“修改已完成!”。再按,2↙,
(14)选择,12.删除”,在提示处输入待删除的人名:
韩非 ↙
操作完成后系统显示:“删除已完成!”。再按,2↙,
(15)选择,13.存盘”,系统提示:“文件已保存!”
然后可以找到 d:\\student_new.txt 文件。
打开文件,并与原文件 d:\\student.txt比较,则可以看到原文件经过修改和删除后的信息:
2006332200633246刘美 4699998908993
2006333200633247冯伟 4138865729989
2006336200633248孟爽 3527769456794
( 16)选择,14.返回”,退出系统,至此,所有操作已完成!
读者也可以先不创建文件,进入系统后再添加信息,最后系统自动生成
d:\\student_new.txt 文件。
11.1,极限俱乐部会员信息系统”程序(三)
11.2,极限俱乐部会员信息系统”程序(四)
11.3,教学成绩管理系统”程序
我们已经学习了 C语言的数组、函数、指针、结构、文件操作等知识。本章的主要目的就是将所有的知识点通过完善
“极限俱乐部会员信息系统”的方式串连起来,使读者真正体会到 C语言的作用以及领略到它的独特魅力。
11.1“极限俱乐部会员信息系统”程序 (三)
,极限俱乐部会员信息系统”作为一个完整的信息管理系统,
其程序(一)和程序(二)显然不够完善,特别是其不能存储数据,使得每一次操作后,数据全部丢失,无法应用到实际中。而且,当处理大量的数据时,又要一个个的逐次重新输入,大大降低效率。这种缺陷必须得以弥补,这个信息管理系统才能具有实用价值。
结合本例,我们再加深文件操作的印象。
(一)文件的打开和关闭
1,fopen()函数
fopen函数用于打开文件,其调用格式为:
FILE *fopen(char *filename,*type);
FILE为文件指针。实际上 FILE是一个新的数据类型即我们学习结构这种类型时遇到的结构指针。为便于理解,这里只要将 FILE看作一个包括了文件管理有关信息的数据结构,即在打开文件时必须先定义一个文件指针。
本例主函数中定义,FILE *fp;”,fp即 file pointer(文件指针)
之意。
用,fp=fopen("d:\\sta.dat","r")”表示,以只读方式打开 D盘根目录下的一个文件 sta.dat。
这里有一点要注意:如果将路径写为 d:\sta.dat是不正确的。
11.1“极限俱乐部会员信息系统”程序 (三)
2,fclose()函数
2,fclose()函数
fclose()函数用来关闭一个由 fopen()函数打开的文件,
其调用格式为:
int fclose(FILE *stream);
该函数返回一个整型数。当文件关闭成功时,返回 0,
否则返回一个非零值。可以根据函数的返回值判断文件是否关闭成功。
(二)文件的写入与输出
1,fscanf()函数
fscanf()为文件的顺序读操作函数,其调用格式如下:
int fscanf(FILE *stream,char *format,<address-
list>);
fscanf()函数的用法与 scanf()函数相似,只是它是从文件中读到信息。 fscanf()函数的返回值为 EOF(即 -1),表明读错误,否则读数据成功。
本例中的 fscanf()函数调用形式为:
fscanf(fp,"%s%s%s%d%d%d%d\n",sta[n].unit,sta[
n].name,sta[n].sex,&sta[n].age,&sta[n].height,&sta[n].
weight);
要特别注意的是,当 fscanf()函数读到空白符时便自动结束,在使用时要特别注意。
2,fprintf()函数
函数 fprintf()为文件的顺序写操作函数,其调用格式如下:
int fprintf(FILE *stream,char *format,<variable-
list>);
fprintf() 函数的返回值为实际写入文件中的字节数。如果写错误,则返回一个负数。 fscanf(),fprintf( ) 函数中格式化的规定与 scanf(),printf( ) 函数相同,所不同的只是 fscanf(),fprintf()函数是分别向文件中读取和写入数据,而 scanf(),printf()则是分别从键盘中输入和向屏幕输出数据。
3,feof()函数
feof()函数函数的调用格式为:
int feof(FILE *stream);
feof()函数检测文件位置指示器是否到达了文件结尾,若是则返回一个非 0值,否则返回 0。
(三)本程序较以前两个程序增加的功能:
系统的控制台包括如下十个选项:
1、添加 ――――――――――――― 添加职工信息;
2、显示 ―――――― 显示所有记录及操作结果显示;
3、按姓名排序 ――――――― 按字典顺序排序姓名;
4、按身高排序 ――――― 按职工的身高由高到矮排序;
5、按体重排序 ―――― 按职工的体重由重到轻排序;
6、检索 ―――――――― 按职工姓名检索全部信息;
7、修改 ―――――――― 按提示逐步修改职工信息;
8、删除 ―――――――― 删除所选职工的所有信息;
9、存盘 ――――――――― 将操作的最后结果存盘;
10、返回 ―――――――― 返回并退出信息管理系统。
(四)源程序代码如下:
#include "stdio.h" /*控制台 I/O的头文件 */
#include "string.h" /*字符串函数的头文件 */
#include "stdlib.h" /*exit()函数的头文件 */
#define Max 100 /*定义最多可以输入的职工数 */
int Interface(char (*x)[20],int n); /*操作界面 */
int Add(int start,struct staff *p); /*增加职工数 */
void Display(struct staff *p,int start,int end); /*显示已存在的数据 */
void SortName(struct staff *p,int n); /*按姓名排序 */
void SortHeight(struct staff *p,int n); /*按身高排序(由高到低) */
void SortWeight(struct staff *p,int n); /*按体重排序(由重到轻)
int Search (struct staff *p,char *t,int n); /*信息检索 */
int Find(struct staff *p,int n); /*信息查找
*/
void Modify(struct staff *p,int n); /*信息修改 */
int Delete(struct staff *p,int n); /*信息删除 */
void Swap(struct staff *p1,struct staff *p2); /*职工信息互换 */
void SaveFile(struct staff *p,int n); /*文件存盘 */
char password[8]="123321"; /*设置系统管理员密码 */
struct staff
{
char unit[60];
char name[20];
char sex[20];
int age;
int height;
int weight;
};
void main()
{
struct staff sta[Max]; /*定义结构数组 */
FILE *fp; /*结构数组,即可输入的最大职工数,
最大值为声明中预定义的 Max*/
int s; /*设置变量,以用于用户输入信息的接收,
并将其作为转向函数的参数 */
int n=0; /*整型变量 */
char choice;
char pass[8];
int flag=0;
int w=3;
char menu[][20]={"添加 ","显示 ","按姓名排序 ","按身高排序 ","按体重排序 ","检索 ","修改 ","删除 ","存盘 ","返回 "};
char openfile[10];
do{
printf("请输入管理员密码,\n");
scanf("%s",pass);
if(!strcmp(pass,password))
{
printf("PASS\n\n\n");
flag = 1;
break;
}
else
{
printf("密码错误,请重新输入,\n");
w--;
}
}
while(w>0);
if(!flag)
{
printf("你已连续三次输入错误,请确认后再使用本系统,
谢谢 !\n");
exit(0);
}
system("cls");/*用 system调用 dos命令,清屏 */
printf ("\n 打开已有的文件 \"staff_3.dat\"?(y/n)");
scanf("%s",openfile);
if((strcmp(openfile,"y")==NULL))
{
if((fp=fopen("d:\\staff_3.dat","r"))==NULL)
{
printf("不能打开文件! \n");
exit(0);
}
while (feof(fp)==0)
{
fscanf(fp,"%s%s%s%d%d%d%d\n",sta[n].unit,sta[n].nam
e,sta[n].sex,&sta[n].age,&sta[n].height,&sta[n].weight);
n++;
}
fclose(fp);
}
else
printf("请创建一个新文件 \"staff_3.dat\".\n");
system("cls"); /*用 system调用 dos命令,清屏 */
/**********************欢迎界面 ********************/
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("~~~~~~~~~~~~~\t\t\t\t\t~~~~~~~~~~~~~\n");
printf("\t\t欢迎进入职工医疗保健信息系统 \n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%
%%%\t\t\t\t\t%%%%%%%%%%%%%%%%%%%%%
%%%%%%\n");
printf("\n\n\n\n");
printf("单位:西南化工研究院职工医院 \n");
printf("地址:四川省泸州市纳溪区 \n");
printf("急救电话,119,999");
printf("\n\n\n\n");
printf("==============\t\t==============\n");
printf("本系统由“登峰造极软件有限公司开发” \n");
printf("地址:北京市海淀区学院路 \n");
printf("作者,crest,huniuniu \n");
printf("==============\t\t==============\n");
printf("\n\n");
printf("\t\t请任意输入一个值并回车进入系统 \n");
scanf("%s",&choice);
if(choice=='n'||choice=='N')
exit(1);
system("cls"); /*用 system调用 dos命令,清屏 */
do
{
s=Interface(menu,10); /*调用 Interface()函数 */
switch (s) /*转向语句,选择以实现不同的功能 */
{
case 0,n=Add(n,sta);break;
case 1,Display(sta,0,n-1);break;
case 2,SortName(sta,n);break;
case 3,SortHeight(sta,n);break;
case 4,SortWeight(sta,n);break;
case 5,Find(sta,n);break;
case 6,Modify(sta,n);break;
case 7,n=Delete(sta,n);break;
case 8,SaveFile(sta,n);
}
}
while(s>=0&&s<=8);
}
操作界面
int Interface(char (*x)[20],int n)
{
int i;
int j;
printf("\n××××××× 城镇职工医疗保健信息系统
××××××× \n");
do
{
for (j=0;j<n;j++)
printf("%2d.%s\n",j+1,x[j]);
printf("请从上述选项中选择,\n");
scanf("%d",&i); /*输入选项 */
}
while (i<0||i>n+1);
return (i-1);
}
增添信息
int Add(int start,struct staff *p)
{
int n;
for (n=start;n<Max;n++)
{
printf("\n [%d]输入姓名 (按 e键退出 )\n",n+1); /*若要退出输入,则按 e*/
printf("单位,");
scanf("%s",(p+n)->unit);
if (strcmp((p+n)->unit,"e")==0)break;
printf("姓名,");
scanf("%s",(p+n)->name);
printf("性别 (Male/Female):");
scanf("%s",(p+n)->sex);
printf("年龄,");
scanf("%d",&((p+n)->age));
printf("身高 (cm):");
scanf("%d",&((p+n)->height));
printf("体重 (kg):");
scanf("%d",&((p+n)->weight));
}
return n;
}
显示输入或者修改后的内容
void Display(struct staff *p,int start,int end)
{
int i;
printf("\n%10s%10s%10s","单位 ","姓名 ","性别 "); /*显示标题 */
printf("%10s%10s%10s","年龄 ","身高 ","体重 "); /*显示数据信息 */
printf("\n~~~~~~~~~~~~~~~~~~~~~~~~ \n");
for(i=start;i<=end;i++)
{
printf("%10s%10s%10s",(p+i)->unit,(p+i)->name,(p+i)->sex);
printf("%10d%10d%10d",(p+i)->age,(p+i)->height,(p+i)-
>weight);
printf("\n");
}
}
选择法按姓名排序 (依据字典顺序 )
void SortName(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if(strcmp((p+k)->name,(p+j)->name)>0)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工姓名 */
}
printf("\n 完成姓名排序 !\n");
}
选择法按身高排序
void SortHeight(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->height<(p+j)->height)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工身高 */
}
printf("\n 完成身高排序 !\n");
}
选择法按体重排序
void SortWeight(struct staff *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->weight<(p+j)->weight)k=j;
if(i!=k)Swap(p+k,p+i); /*交换职工姓名体重 */
}
printf("\n 完成体重排序 !\n");
}
按姓名检索
int Find(struct staff *p,int n)
{
int i;
char str[20];
printf("\n 请输入职工姓名,");
scanf("%s",str);
i=Search(p,str,n); /*调用 Search()函数 */
if(i==-1)
printf("没有匹配信息,请重试 %s!\n",str);
else
Display(p,i,i);
getchar();
return i;
}
修改信息
void Modify(struct staff *p,int n)
{
int i;
i=Find(p,n); /*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则修改 */
{
printf("请输入新信息,\n");
printf("单位,");
scanf("%s",(p+i)->unit);
printf("姓名,");
scanf("%s",(p+i)->name);
printf("性别,");
scanf("%s",(p+i)->sex);
printf("年龄,");
scanf("%d",&((p+i)->age));
printf("身高 (cm):");
scanf("%d",&((p+i)->height));
printf("体重 (kg):");
scanf("%d",&((p+i)->weight));
printf("\n修改已完成 !\n");
}
}
删除信息
int Delete(struct staff *p,int n)
{
int i;
i=Find(p,n); /*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则删除 */
{
p[i]=p[n-1];
n=n-1;
printf("\n信息已删除 !\n");
}
return n;
}
删除信息
void Swap(struct staff *p1,struct staff *p2) /*两个职工信息互换 */
{
struct staff temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int Search(struct staff *p,char *t,int n)
{
int i;
for (i=0;i<n;i++)
if(!strcmp((p+i)->name,t)) /*按姓名检索 */
return i;
return -1;
}
保存文件
void SaveFile(struct staff *p,int n)
{
FILE *fp1;
char i;
if((fp1=fopen("d:\\staff_3_new.dat","w"))==NULL) /*以文本方式生成并“写打开”文件 */
{
printf("不能打开文件! \n"); /*检测打开文件中出现的错误,并决定是否写入文件 */
exit(1);
}
保存文件
for (i=0;i<n;i++)
{
if((fprintf(fp1,"%10s %10s %10s %10d %10d %10d
\n",(p+i)->unit,(p+i)->name,
(p+i)->sex,(p+i)->age,(p+i)->height,(p+i)-
>weight))==NULL)
printf("文件写入出错 !\n"); /*写入文件,如果为空,则提示出错 */
}
printf("\n 文件已保存 !\n");
fclose(fp1); /*关闭文件 */
}
(五)程序的运行演示与结果输出
1.请输入管理员密码:
2.打开已有的文件 \" d:\staff_3.dat\"?(y/n)
3.进入欢迎界面
4.进入操作界面,直接显示系统从文件读入的信息:
5.选择,3.按姓名排序”
6.选择,4.按身高排序”
7.选择,5.按体重排序”
8.选择,6.检索”
9.选择,7.修改”,在提示处输入待检索的人名:
10.选择,8.删除”,在提示处输入待删除的人名:
11.选择,9.存盘”,系统提示:“文件已保存!”
12.选择,10.返回”,退出系统,至此,所有操作已完成!
11,3,教学成绩管理系统”程序本系统可以实现如下功能:
数据的读取与存储;
数据的添加;
按总分排序;
按各单科成绩排序;
按姓名检索成绩;
修改成绩;
删除成绩;
返回并退出系统。
2.程序源代码
/*教学成绩管理系统 */
/*说明:,教学成绩管理系统,基本信息包括班级、
学号、姓名及语文、数学、外语、物理、化学五科成绩的信息,可以根据实际情况有所增减 */
#include <stdio.h>/*控制台 I/O的头文件 */
#include <string.h>/*字符串函数的头文件 */
#include <stdlib.h>/*exit()函数的头文件 */
#define Max 100/*定义最多可以输入的学生数 */
int Interface(char (*x)\[20\],int n);/*操作界面 */
int Add(int start,struct student *p);/*增加学生数 */
void Display(struct student *p,int start,int end);/*显示已存在的数据 */
void SortName(struct student *p,int n);/*按姓名排序 */
void SortTotal(struct student *p,int n);/*按总分排序 (由高到低 )*/
void SortChinese(struct student *p,int n);/*按语文排序 (由高到低 )*/
void SortMath(struct student *p,int n);/*按数学排序 (由高到低 )*/
void SortForeignLanguage(struct student *p,
int n);/*按外文排序 (由高到低 )*/
void SortPhysics(struct student *p,int n);/*按物理排序 (由高到低 )*/
void SortChemistry(struct student *p,int n);/*
按化学排序 (由高到低 )*/
int Search (struct student *p,char *t,int n);/*信息检索 */
int Find(struct student *p,int n);/*信息查找 */
void Modify(struct student *p,int n);/*信息修改 */
int Delete(struct student *p,int n);/*信息删除 */
void Swap(struct student *p1,struct student *p2);/*
学生信息互换 */
void SaveFile(struct student *p,int n);/*文件保存 */
char password\[8\]="7654321";/*设置系统管理员密码 */
struct student
{
char Class\[30\];
char StudentNumber\[20\];
char Name\[20\];
int Score\[5\];
int Total;
};
void main()
{
struct student stu\[Max\];/*定义结构数组 */
FILE *fp;/*结构数组,即可输入的最大学生数,最大值为声明中预定义的 Max*/
int s;/*设置变量,以用于用户输入信息的接收,并将其作为转向函数的参数 */
int n=0; /*整型变量 */
char choice;
char menu\[\]\[20\]={"添加 ","显示 ","按姓名排序 ","按总分排序 ","按语文成绩排序 ",
"按数学成绩排序 ","按外语成绩排序 ","按物理成绩排序 ","按化学成绩排序 ",
"检索 ","修改 ","删除 ","存盘 ","返回 "};
/**************系统密码管理 **************/
char pass\[8\];
int flag=0;
int w=3;
char openfile\[10\];
do{
printf("请输入管理员密码,\\n");
scanf("%s",pass);
if(!strcmp(pass,password))
{
printf("PASS\\n\\n\\n");
flag = 1;
break;
}
else
{
printf("密码错误,请重新输入,\\n");
w--;
}
}
while(w>0);
if(!flag)
{
printf("你已连续三次输入错误,请确认后再使用本系统,谢谢 !\\n");
exit(0);
}
system("cls");/*用 system调用 dos命令,清屏 */
/*************打开已有文件 *************/
printf ("\\n 打开已有的文件 \"d:\\student.txt\"?(y/n)");
scanf("%s",openfile);
if((strcmp(openfile,"y")==NULL))
{
if((fp=fopen("d:\\student.txt","r"))==NULL)
{
printf("不能打开文件! \\n");
exit(0);
}
while (feof(fp)==0)
{
fscanf(fp,"%s %s %s %d %d %d %d %d
%d\\n",stu\[n\].Class,stu\[n\].StudentNumber,stu\[n\].Name,
&stu\[n\].Total,&stu\[n\].Score\[0\],&stu\[n\].Score\[1\],&stu\[
n\].Score\[2\],
&stu\[n\].Score\[3\],&stu\[n\].Score\[4\]);
n++;
}
fclose(fp);
}
else
printf("请创建一个新文件 \"student.txt\".\\n");
system("cls");/*用 system调用 dos命令,清屏 */
printf("~~~~~~~~~~~~~\\t\\t\\t\\t\\t~~~~~~~~~~
~~~\\n");
printf("~~~~~~~~~~~~~\\t\\t\\t\\t\\t~~~~~~~~~~~~~
\\n");
printf("\\t\\t欢迎进入教学成绩管理系统 \\n");
printf("%%%%%%%%%%%%%%%%%%%%
%%%%%%%\\t\\t\\t\\t\\t%%%%%%%%%%%%%
%%%%%%%%%%%%%%\\n");
printf("-------------------------------");
printf("\\n\\n\\n\\n");
printf("单位:北京三零九中学 \\n");
printf("地址:北京市海淀区 \\n");
printf("电话,010-70000000");
printf("\\n\\n\\n\\n");
printf("==============\\t\\t=============
=\\n");
printf("本系统由“天地人和软件有限公司”开发
\\n");
printf("地址:北京市海淀区学院路 \\n");
printf("编制人:天天 \\n");
printf("==============\\t\\t=============
=\\n");
printf("\\n\\n");
printf("\\t\\t请任意输入一个值并回车进入系统 \\n");
scanf("%s",&choice);
if(choice==′n′||choice==′N′)
exit(1);
system("cls");/*用 system调用 dos命令,清屏 */
do
{
s=Interface(menu,14);/*调用 Interface()函数 */
switch (s) /*转向语句,选择以实现不同的功能 */
{
case 0,n=Add(n,stu);break;
case 1,Display(stu,0,n-1);break;
case 2,SortName(stu,n);break;
case 3,SortTotal(stu,n);break;
case 4,SortChinese(stu,n);break;
case 5,SortMath(stu,n);break;
case 6,SortForeignLanguage(stu,n);break;
case 7,SortPhysics(stu,n);break;
case 8,SortChemistry(stu,n);break;
case 9,Find(stu,n);break;
case 10,Modify(stu,n);break;
case 11,n=Delete(stu,n);break;
case 12,SaveFile(stu,n);
}
}
while(s>=0&&s<=12);
}
/**********************************\ 操作界面函数
\\**********************************/
int Interface(char (*x)\[20\],int n)
{
int i;
int j;
printf("\\n××××××× 教学成绩管理系统
××××××× \\n");
do
{
for (j=0;j<n;j++)
printf("%2d.%s\\n",j+1,x\[j\]);
printf("请从上述选项中选择,\\n");
scanf("%d",&i);/*接收键盘输入的字符 */
}
while (i<0||i>n+1);
return (int)i-1;
}
/**********************************\ 添加信息函数
\\**********************************/
int Add(int start,struct student *p)
{
int n;
for (n=start;n<Max;n++)
{
printf("\\n \[%d\]输入学生信息 (按 e键退出 )\\n",n+1);
/*若要退出输入,则按 e*/
printf("班级,");
scanf("%s",(p+n)->Class);
if (strcmp((p+n)->Class,"e")==0)break;
printf("学号,");
scanf("%s",(p+n)->StudentNumber);
printf("姓名,");
scanf("%s",(p+n)->Name);
printf("语文,");
scanf("%d",&((p+n)->Score\[0\]));
printf("数学,");
scanf("%d",&((p+n)->Score\[1\]));
printf("外语,");
scanf("%d",&((p+n)->Score\[2\]));
printf("物理,");
scanf("%d",&((p+n)->Score\[3\]));
printf("化学,");
scanf("%d",&((p+n)->Score\[4\]));
(p+n)->Total=0;
(p+n)->Total=((p+n)->Total+(p+n)-
>Score\[0\]+(p+n)->Score\[1\]+(p+n)-
>Score\[2\]+(p+n)->Score\[3\]+(p+n)->Score\[4\]);
}
return n;
}
/**********************************\ 显示信息函数
\\**********************************/
void Display(struct student *p,int start,int end)
{
int i;
printf("\\n%9s%10s%10s","班级 ","学号 ","姓名 "); /*显示标题 */
printf("%8s%8s%8s%8s%8s%8s","总分 ","语文 ","数学 ","外语 ","
物理 ","化学 ");
printf("\\n~~~~~~~~~~~~~~~~~~~~~~~~
\\n");
for(i=start;i<=end;i++)
{
printf("%9s%10s%10s",(p+i)->Class,(p+i)-
>StudentNumber,(p+i)->Name);
printf("%8d%8d%8d%8d%8d%8d",(p+i)->Total,(p+i)-
>Score\[0\],(p+i)->Score\[1\],(p+i)->Score\[2\],(p+i)-
>Score\[3\],(p+i)->Score\[4\]);
printf("\\n");
}
}
/**********************************\ 按姓名排序函数
\\**********************************/
void SortName(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if(strcmp((p+k)->Name,(p+j)->Name)>0)k=j;
/*交换学生姓名 */
if(i!=k)Swap(p+k,p+i);
}
printf("\\n 完成姓名排序 !\\n");
}
/**********************************\ 按总分排序函数
\\**********************************/
void SortTotal(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Total<(p+j)->Total)k=j;
if(i!=k)Swap(p+k,p+i);/*交换总分 */
}
printf("\\n 完成总分排序 (由高到低 )!\\n");
}
/**********************************\ 按语文成绩排序函数
\\**********************************/
void SortChinese(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[0\]<(p+j)->Score\[0\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换语文成绩 */
}
printf("\\n 完成语文成绩由高到低排序 !\\n");
}
/**********************************\ 按数学成绩排序函数
\\**********************************/
void SortMath(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[1\]<(p+j)->Score\[1\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换数学成绩 */
}
printf("\\n 完成数学成绩由高到低排序 !\\n");
}
/**********************************\ 按外语成绩排序函数
\\**********************************/
void SortForeignLanguage(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[2\]<(p+j)->Score\[2\])k=j;
if(i!=k)Swap(p+k,p+i); /*交换外语成绩 */
}
printf("\\n 完成外语成绩由高到低排序 !\\n");
}
/**********************************\ 按物理成绩排序函数
\\**********************************/
void SortPhysics(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[3\]<(p+j)->Score\[3\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换物理成绩 */
}
printf("\\n 完成物理成绩由高到低排序 !\\n");
}
/**********************************\ 按化学成绩排序函数
\\**********************************/
void SortChemistry(struct student *p,int n)
{
int i,j,k;
for (i=0;i<n-1;i++)
{
k=i;
for (j=i+1;j<n;j++)
if((p+k)->Score\[4\]<(p+j)->Score\[4\])k=j;
if(i!=k)Swap(p+k,p+i);/*交换化学成绩 */
}
printf("\\n 完成化学成绩由高到低排序 !\\n");
}
/**********************************\ 按姓名检索函数
\\**********************************/
int Find(struct student *p,int n)
{
int i;
char str\[20\];
printf("\\n 请输入学生姓名,");
scanf("%s",str);
i=Search(p,str,n);/*调用 Search()函数 */
if(i==-1)
printf("没有匹配信息,请重试 %s!\\n",str);
else
Display(p,i,i);
getchar();
return i;
}
/**********************************\ 修改信息函数
\\**********************************/
void Modify(struct student *p,int n)
{
int i;
i=Find(p,n);/*调用 Find()函数 */
if(i>=0) /*若找到匹配信息,则修改 */
{
printf("请输入新信息,\\n");
printf("班级,");
scanf("%s",(p+i)->Class);
printf("学号,");
scanf("%s",(p+i)->StudentNumber);
printf("姓名,");
scanf("%s",(p+i)->Name);
printf("语文,");
scanf("%d",&((p+i)->Score\[0\]));
printf("数学,");
scanf("%d",&((p+i)->Score\[1\]));
printf("外语,");
scanf("%d",&((p+i)->Score\[2\]));
printf("物理,");
scanf("%d",&((p+i)->Score\[3\]));
printf("化学,");
scanf("%d",&((p+i)->Score\[4\]));
(p+i)->Total=0;
(p+i)->Total=((p+i)->Total+(p+i)->Score\[0\]+(p+i)-
>Score\[1\]+(p+i)->Score\[2\]+(p+i)->Score\[3\]+(p+i)-
>Score\[4\]);
printf("\\n修改已完成 !\\n");
}
}
/**********************************\ 删除信息函数
\\**********************************/
int Delete(struct student *p,int n)
{
int i;
i=Find(p,n);/*调用 Find()函数 */
if(i>=0)/*若找到匹配信息,则删除 */
{
p\[i\]=p\[n-1\];
n=n-1;
printf("\\n信息已删除 !\\n");
}
return n;
}
void Swap(struct student *p1,struct student *p2)
{
struct student temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
int Search(struct student *p,char *t,int n)
{
int i;
for (i=0;i<n;i++)
if(!strcmp((p+i)->Name,t))
return i;
return -1;
}
/**********************************\ 保存文件函数
\\**********************************/
void SaveFile(struct student *p,int n)
{
FILE *fp1;
char i;
if((fp1=fopen("d:\\student_new.txt","w"))==NULL)
{
printf("不能打开文件! \\n");
/*检测打开文件中出现的错误,并决定是否写入文件 */
exit(1);
}
for (i=0;i<n;i++)
{
if((fprintf(fp1,"%10s %10s %10s %10d %10d %10d
%10d %10d %10d \\n",(p+i)->Class,
(p+i)->StudentNumber,(p+i)->Name,(p+i)-
>Total,(p+i)->Score\[0\],(p+i)->Score\[1\],
(p+i)->Score\[2\],(p+i)->Score\[3\],(p+i)-
>Score\[4\]))==NULL)
printf("文件写入出错 !\\n");/*写入文件,如果为空,则提示出错 */
}
printf("\\n 文件已保存 !\\n");
fclose(fp1);/*关闭文件 */
}
3.程序运行演示与结果输出
( 1)请输入管理员密码:
7654321↙
( 2)打开已有的文件 \" d:\\student.txt"?(y/n)
y↙
这需要预先创建一个文件,本例需要在 d盘根目录下创建一个 txt类型的文件,文件名为
student
(3)进入欢迎界面
k↙
说明:,k”可以由其他任意字符或数字代替。
(4)进入操作界面,直接显示系统从文件读入的信息:
2↙
(5)选择,3.按姓名排序”
3↙
操作完成后提示:“完成姓名排序!”,再按
,2↙,
(6)选择,4.按总分排序”
4↙
操作完成后提示:“完成总分排序(由高到低)!”,再按,2↙,
( 7)选择,5.按语文成绩排序”
5↙
操作完成后提示:“完成语文成绩由高到低排序!”
( 8)选择,6.按数学成绩排序”
6↙
操作完成后提示:“完成数学成绩由高到低排序!”,再按
,2↙,
( 9)选择,7.按外语成绩排序”
7↙
操作完成后提示:“完成外语成绩由高到低排序!”,再按
,2↙,
(10)选择,8.按物理成绩排序”
8↙
操作完成后提示:“完成物理成绩由高到低排序!”,再按
,2↙,
(11)选择,9.按化学成绩排序”
9↙ 操作完成后提示:“完成化学成绩由高到低排序!”,再按,2↙,
(12)选择,10.检索”
10↙
在光标提示处输入待检索的人名:
孟爽 ↙
屏幕显示检索到的信息
(13)选择,11.修改”,在提示处输入待检索的人名:
孟爽 ↙
并依次输入以下新信息:
班级,2006336
学号,200633648
姓名:孟爽
语文,77
数学,69
外语,45
物理,67
化学,94
输入完毕后屏幕提示:“修改已完成!”。再按,2↙,
(14)选择,12.删除”,在提示处输入待删除的人名:
韩非 ↙
操作完成后系统显示:“删除已完成!”。再按,2↙,
(15)选择,13.存盘”,系统提示:“文件已保存!”
然后可以找到 d:\\student_new.txt 文件。
打开文件,并与原文件 d:\\student.txt比较,则可以看到原文件经过修改和删除后的信息:
2006332200633246刘美 4699998908993
2006333200633247冯伟 4138865729989
2006336200633248孟爽 3527769456794
( 16)选择,14.返回”,退出系统,至此,所有操作已完成!
读者也可以先不创建文件,进入系统后再添加信息,最后系统自动生成
d:\\student_new.txt 文件。