第三
篇


综合课程设计

课程设计目的如下: 

(1)掌握变量、数组、指针、函数、结构体、文件的使用方法。
(2)掌握顺序、条件和循环等基本控制结构的使用方法。
(3)掌握使用模块化程序设计方法解决复杂问题的方法。

课程设计案例Ⅰ:大学生实习信息管理程序

1. 
需求分析
大学生实习是提升大学生专业实践能力的一种方式,是大学教育极为重要的实践性教
学环节。有效地管理大学生实习信息能够让高校及时掌握学生的实习情况,为高校今后的
教学实践和就业指导提供建议,因此设计并开发一套大学生实习信息管理程序十分重要。
通过对大学生实习信息管理程序的使用人群调查得知,实习信息管理程序必须具有以下
功能: 

(1)增加实习信息。当有新的实习信息时能够录入实习信息。
(2)删除实习信息。当实习信息无效时能够根据不同的要求完成删除信息,例如按学
号删除。
(3)修改实习信息。当实习信息变化时能够根据不同的要求完成修改信息,例如按姓
名修改。
(4)查询实习信息。当需要查看实习信息时能够根据不同的要求完成查询信息,例如
按实习岗位查询。
(5)统计实习信息。当需要统计实习信息时能够根据不同的统计条件完成统计信息, 
例如统计平均实习工资。
(6)排序实习信息。当需要对实习信息进行排序时能够根据不同的排序条件完成排序
信息,例如按实习工资排序。
2. 
功能模块设计
根据需求描述大学生实习信息管理程序的功能结构,该程序包括6个功能模块,每个功
能模块的描述如图Ⅰ-1所示。


图Ⅰ-
1 
大学生实习信息管理程序功能结构图

(1)增加实习记录模块。该模块的功能是将新的实习记录数据写入原有的实习记录数
据中。新增加的实习记录添加在原有实习记录数据的末尾。
·109· 


(2)删除实习记录模块。该模块的功能是删除无效的实习记录。可以根据输入的学号
或姓名删除指定学生的实习记录。
(3)修改实习记录模块。该模块的功能是对实习记录进行修改。可以根据输入的学号
或姓名修改指定学生的实习记录。
(4)查询实习记录模块。该模块的功能是查询实习记录。可以根据输入的学号、姓名、
实习岗位或实习工资的范围查询学生的实习记录,也可以查询所有学生的实习记录。
(5)统计实习记录模块。该模块的功能是统计实习记录。可以统计实习平均工资、最
高工资和最低工资,也可以统计实习岗位的所有种类。
(6)排序实习记录模块。该模块的功能是对实习记录进行排序。可以按学号或实习工
资排序。
3.数据结构设计
大学生实习信息管理程序的主要信息是学生的实习信息记录。其中,每条记录都包含
多种不同类型的数据。程序选择并使用结构类型来处理实习记录,定义了学生结构体,结构
体成员包含学号、姓名、实习公司、实习岗位和实习工资等信息。 
struct 学生{ 
成员1 学号 
成员2 姓名 
成员3 实习公司 
成员4 实习岗位 
成员5 实习工资
}; 
4.详细设计
采用模块化程序设计思想对程序进行详细设计。根据功能结构图将程序的功能函数设
计分为6部分,每部分实现其中的一个模块功能。此外,还设计头文件、菜单文件、公共文件
和主文件来支持程序的功能实现。具体函数设计如下。
(1)头文件student.h。负责定义学生结构体、对函数进行声明。
(2)菜单文件menu.c。负责显示菜单,menu.c包含的函数及函数说明如表Ⅰ-1所示。
表Ⅰ-1 menu.c包含的函数及函数说明
函 数 名函数说明
mainMemu() 显示主菜单,菜单内容如下:1.增加记录;2.删除记录;3.修改记录;4.查询记录; 
5.统计记录;6.排序记录;0.退出
delMenu() 显示删除记录子菜单,菜单内容如下:1.按学号删除;2.按姓名删除;0.返回
modMemu() 显示修改记录子菜单,菜单内容如下:1.按学号修改;2.按姓名修改;0.返回
qyMenu() 显示查询记录子菜单,菜单内容如下:1.按学号查询;2.按姓名查询;3.按实习岗位
查询;4.按实习工资查询;5.显示所有实习记录;0.返回
statMenu() 显示统计记录子菜单,菜单内容如下:1.统计实习平均工资;2.统计实习最高工
资;3.统计实习最低工资;4.统计工作岗位种类;0.返回
sortMenu() 显示排序实习记录子菜单,菜单内容如下:1.按学号排序;2.按实习工资排序;0. 返回
·110·

(3)公共文件pc。负责将学生的实习记录从文件读入程序中,以及当学生的实习
ublic.
记录在程序中变化时将变化后的实习记录重新写入文件中。此外,该文件还负责判断学号
是否存在和判断姓名是否存在。该文件共包含readInfor()、saveInfor()、snoexist()和
snamexist()这4个函数。函数说明如表Ⅰ-2所示。

表Ⅰ2pc包含的函数及函数说明

-ublic.

函数名

readInfor() 
saveInfor() 
snoexist() 
snamexist() 

函数说明

将从文件读记录

保存记录到文件

判断学号是否存在

判断姓名是否存在

(4)增加实习记录文件ac。负责控制增加实习记录的流程和完成增加操作。
ddInfor.
该文件包含addManage()和addRecord()这两个函数。函数说明如表Ⅰ-3所示。

表Ⅰc包含的函数及函数说明

-
3 
addInfor.

函数名

函数说明

控制增加流程

addManage() 

增加实习记录

addRecord() 

(5)删除实习记录文件dc。负责控制删除实习记录的流程和按不同的方式完
elInfor.
成实习记录的删除。该文件包含delManage()、delBasedSno()和delBasedSname()这3个
函数。函数说明如表Ⅰ-4所示。

表Ⅰc包含的函数及函数说明

-
4 
delInfor.

函数名

delManage() 
delBasedSno() 
delBasedSname() 

函数说明

控制删除流程

按学号删除

按姓名删除

(6)修改实习记录文件moc。负责控制修改流程和按不同的方式完成实习记录
dInfor.
的修改。该文件包含modManage()、modBasedSno()和modBasedSname()这3个函数。
函数说明如表Ⅰ-5所示。

表Ⅰc包含的函数及函数说明

-
5 
modInfor.

函数名

modManage() 
modBasedSno() 
modBasedSname() 

函数说明

控制修改流程
按学号修改
按姓名修改

·111· 


(7)查询实习记录文件qyc。负责控制查询流程和按不同的方式完成实习记录的查
Infor.
询。该文件包含qyManage()、qyBasedSno()、qyBasedSname()、qyBasedPost()、qyBasedSalary()和
qyAl()这6个函数。函数说明如表Ⅰ-6所示。

表Ⅰc包含的函数及函数说明

-
6 
qyInfor.

函数名

函数说明

qyManage() 
qyBasedSno() 
qyBasedSname() 
qyBasedPost() 
qyBasedSalary() 
qyAl() 

控制查询流程

按学号查询

按姓名查询

按实习岗位查询

按实习工资查询

显示全部实习记录信息

(8)统计实习记录文件sc。负责控制统计流程和按不同的方式完成实习记录
tatInfor.
的统计。该文件包含statManage()、statAvgSalary()、statMaxSalary()、statMinSalary()和
statPostl()这5个函数。函数说明如表Ⅰ-7所示。

表Ⅰc包含的函数及函数说明

-
7 
statInfor.

函数名

函数说明

statManage() 
statAvgSalary() 
statMaxSalary() 
statMinSalary() 
statPost() 

控制统计流程

统计实习平均工资

统计实习最高工资

统计实习最低工资

统计工作岗位种类

(9)排序实习记录文件sc。负责控制排序流程和按不同的方式完成实习记录
ortInfor.
信息的排序。该文件包含sortManage()、sortBasedSno()和sortBasedSalary()这3个函数。
函数说明如表Ⅰ-8所示。

表Ⅰc包含的函数及函数说明

-
8 
sortInfor.

函数名

sortManage() 
sortBasedSno() 
sortBasedSalary() 

函数说明

控制排序流程

按学号排序

按实习工资排序

(10)主文件mc。主文件调用mc中的mu()函数加载主菜单,之后,根据用
户选择的主菜单编号调用对应的处理函数。选择不同的主菜单编号和对应的处理过程如下。
选择主菜单编号“”。这时将调用ac中的ae()函数控制增加流

ain.enu.ainMen

① 1ddInfor.ddManag
程。addManage()函数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入
·112· 


到结构体数组中,然后调用addInfor()函数完成实习记录的添加。由于增加了新记录
, 
addInfor()函数需要调用saveInfor()函数将学生实习记录保存到文件中。

② 
选择主菜单编号“2。这时将调用dlno.eng函数控制删除流程。
” 
eIfrc中的dlMaae()
delManage()函数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入到结
构体数组中,然后,调用delMenu()函数显示删除子菜单,之后,根据选择的子菜单编号调用
对应的删除函数完成删除操作。由于有新记录被删除,完成删除操作后还需要调用
saveInfor()函数将学生实习记录保存到文件中。

选择不同的子菜单编号将调用不同的删除函数,具体的删除步骤如下:选择子菜单编
号“1时,(”) 调用delBasedSno()函数完成按学号删除的操作;选择子菜单编号“2”时,调用
delBasedSname()函数完成按姓名删除的操作;选择子菜单编号“0”时,退出删除子菜单并
返回到主菜单。

③ 
选择主菜单编号“3”。这时将调用modManage()函数控制修改流程。modManage()函
数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入到结构体数组中,然
后,调用modMemu()函数显示修改子菜单,之后,根据选择的子菜单编号调用对应的修改
函数完成修改操作。由于有新记录被修改,完成修改操作后还需要调用saveInfor()函数将
学生实习记录保存到文件中。
选择不同的子菜单编号将调用不同的修改函数,具体的修改步骤如下:选择子菜单编
号“1”时,调用modBasedSno()函数完成按学号修改;选择子菜单编号“2”时,调用
modBasedSname()函数完成按姓名删除;选择子菜单编号“0时,(”) 退出修改子菜单并返回到
主菜单。

④ 
选择主菜单编号“4”。这时将调用qyManage()函数控制查询流程。qyManage()函
数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入到结构体数组中;然
后,调用qyMenu()函数显示查询子菜单,再根据选择的子菜单编号调用对应的查询函数完
成查询操作。
选择不同的子菜单编号将调用不同的查询函数,具体的修改步骤如下:选择子菜单编号“1时,(”) 调用qyBasedSno()函数完成按学号查询;选择子菜单编号“2时,(”) 调用qyBasedSname()
函数完成按姓名查询;选择子菜单编号“3”时,调用qyBasedPost()函数完成按实习岗位查
询;选择子菜单编号“4时,(”) 调用qyBasedSalary()函数完成按实习工资查询;选择子菜单编
号“5时,(”) 调用qyAl()显示所有的实习记录;选择子菜单编号“0时,(”) 退出查询子菜单并返
回到主菜单。

⑤ 
选择主菜单编号“5”。这时将调用statManage()函数控制统计流程。statManage()
函数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入到结构体数组中,然
后,调用statMenu()函数显示查询子菜单,之后,根据选择的子菜单编号调用对应的统计函
数完成统计操作。
选择不同的子菜单编号将调用不同的统计函数,具体的统计步骤如下:选择子菜单编号“时,(”) 调用sy()函数计算平均工资;选择子菜单编号“时,(”) 调用sy()

1tatAvgSalar2tatMaxSalar
函数计算最高工资;选择子菜单编号“3”时,调用statMinSalary()函数计算最低工资;选择
子菜单编号“4时,(”) 调用statPost()函数统计所有的实习岗位种类;选择子菜单编号“0时,(”) 退出统计子菜单并返回到主菜单。

·113
· 


⑥ 选择主菜单编号“6”。这时将调用sortManage()函数控制排序流程。sortManage() 
函数的控制步骤如下:首先,调用readInfor()函数将学生实习记录读入到结构体数组中;然后
调用sortMemu()函数显示排序子菜单,再根据选择的子菜单编号调用对应的排序函数完成排
序操作。
选择不同的子菜单编号将调用不同的排序函数,具体的统计步骤如下:选择子菜单编
号“1”时,调用sortBasedSno()函数实现按学号排序;选择子菜单编号“2”时,调用
sortBasedSalary()函数实现按实习工资排序;选择子菜单编号“0”时,退出排序子菜单并返回到
主菜单。另外,完成排序操作后还将调用saveInfor()函数将学生实习记录保存到文件中。
5.程序参考代码
大学生实习信息管理程序的参考代码如下所示。
(1)头文件student.h。 
/********************* 
文件student.h 的代码
**********************/ 
struct student 
{ 
char sno[10]; /*学号*/ 
char sname[50]; /*姓名*/ 
char company[50]; /*实习公司*/ 
char position[50]; /*实习岗位*/ 
int salary; /*实习工资*/ 
}stu[100]; 
(2)主文件main.c。 
/********************* 
文件Main.c 的代码
**********************/ 
#include <stdio.h> 
#include <stdlib.h> 
#include "funstmt.h" 
int cnt=0; /*定义全局变量存放当前记录数*/ 
main () 
{ 
int s; 
while (1) 
{ 
s=mainMenu(); /*显示主菜单*/ 
switch(s) 
{ 
case 1: 
addManage(); /*调用控制增加流程函数*/ 
break; 
·114·

case 2: 
delManage(); /*调用控制删除流程函数*/ 
break; 
case 3: 
modManage(); /*调用控制修改流程函数*/ 
break; 
case 4: 
qyManage(); /*调用控制查询流程函数*/ 
break; 
case 5: 
statManage(); /*调用控制统计流程函数*/ 
break; 
case 6: 
sortManage(); /*调用控制排序流程函数*/ 
break; 
case 0: 
printf("结束!\n"); 
exit(0); 
} 
} 
}
(3)菜单文件menu.c。 
/********************* 
文件menu.c 的代码
**********************/ 
#include <stdio.h> 
/*主菜单函数*/ 
int mainMenu() 
{ 
int s; 
printf("\n [主菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.增加记录*"); 
printf("\n* 2.删除记录*"); 
printf("\n* 3.修改记录*"); 
printf("\n* 4.查询记录*"); 
printf("\n* 5.统计记录*"); 
printf("\n* 6.排序记录*"); 
printf("\n* 0.退出*"); 
printf("\n---------------------------------------------\n "); 
printf("请输入您的选择(0~6):"); 
scanf("%d",&s); 
return s; 
} 
·115·

/*删除菜单函数*/ 
int delMenu() 
{ 
int s; 
printf("\n [删除记录子菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.按学号删除*"); 
printf("\n* 2.按姓名删除*"); 
printf("\n* 0.返回*"); 
printf("\n----------------------------------------------\n"); 
printf("请输入您的选择(0~2):"); 
scanf("%d",&s); 
return s; 
} /*修改菜单函数*/ 
int modMenu() 
{ 
int s; 
printf("\n [修改记录子菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.按学号修改*"); 
printf("\n* 2.按姓名修改*"); 
printf("\n* 0.返回*"); 
printf("\n--------------------------------------------- \n"); 
printf("请输入您的选择(0~2):"); 
scanf("%d",&s); 
return s; 
} /*查询菜单函数*/ 
int qyMenu() 
{ 
int s; 
printf("\n [查询记录子菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.按学号查询*"); 
printf("\n* 2.按姓名查询*"); 
printf("\n* 3.按实习岗位查询*"); 
printf("\n* 4.按实习工资查询*"); 
printf("\n* 5.显示所有实习记录*"); 
printf("\n* 0.返回*"); 
printf("\n--------------------------------------------- \n"); 
printf("请输入您的选择(0~5):"); 
scanf("%d",&s); 
return s; 
} /*统计菜单函数*/ 
int statMenu() 
·116·

{ 
int s; 
printf("\n [统计记录子菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.统计实习平均工资*"); 
printf("\n* 2.统计实习最高工资*"); 
printf("\n* 3.统计实习最低工资*"); 
printf("\n* 4.统计工作岗位种类*"); 
printf("\n* 0.返回*"); 
printf("\n---------------------------------------------\n "); 
printf("请输入您的选择(0~4):"); 
scanf("%d",&s); 
return s; 
} /*排序菜单函数*/ 
int sortMenu() 
{ 
int s; 
printf("\n [排序记录子菜单] "); 
printf("\n----------------------------------------------- "); 
printf("\n* 1.按学号排序*"); 
printf("\n* 2.按实习工资排序*"); 
printf("\n* 0.返回*"); 
printf("\n--------------------------------------------- \n"); 
printf("请输入您的选择(0~2):"); 
scanf("%d",&s); 
return s; 
}
(4)公共文件public.c。 
/********************* 
文件public.c 的代码
**********************/ 
#include <stdio.h> 
#include <stdlib.h> 
#include "student.h" 
#include "string.h" 
extern int cnt; 
/*从文件读记录函数*/ 
void readInfor() 
{ 
FILE *fp; 
cnt=0; 
if ((fp=fopen("stuIInfor.txt","r"))==NULL) 
{ 
printf("打开文件失败!\n"); 
·117·

exit(1); 
} 
while (!feof(fp)) 
{ 
fscanf(fp, "%s %s %s %s %d\n",&stu[cnt].sno,&stu[cnt].sname,&stu[cnt]. 
company,&stu[cnt].position,&stu[cnt].salary); 
cnt++; 
} 
fclose(fp); 
} /*保存记录到文件函数*/ 
void saveInfor() 
{ 
FILE *fp; 
int i; 
if ((fp=fopen("stuIInfor.txt","w"))==NULL) 
{ 
printf("不能打开文件!\n"); 
exit(1); 
} 
else 
{ 
for (i=0;i<cnt-1;i++) 
{ 
fprintf(fp,"%s%s%s%s%d\n",stu[i].sno,stu[i].sname,stu[i].company, 
stu[i].position,stu[i].salary); 
} 
//最后一条记录的回车不写入文件 
fprintf(fp,"%s%s%s%s%d",stu[i].sno,stu[i].sname,stu[i].company,stu[i]. 
position,stu[i].salary); 
} 
fclose(fp); 
} /*判断学号是否存在函数*/ 
int snoexist(char sno[]) 
{ 
int i; 
int p=-1; 
for (i=0;i<cnt;i++) 
{ 
if (strcmp(sno,stu[i].sno)==0) 
{ 
p=i; 
break; 
·118·

} 
else 
continue; 
} 
return p; 
} /*判断姓名是否存在函数*/ 
int snameexist(char sname[]) 
{ 
int i; 
int p=-1; 
for (i=0;i<cnt;i++) 
{ 
if (strcmp(sname,stu[i].sname)==0) 
{ 
p=i; 
break; 
} 
else 
continue; 
} 
return p; 
}
(5)增加实习记录文件addInfor.c。 
/********************* 
文件addInfor.c 的代码
**********************/ 
#include <stdio.h> 
#include "funstmt.h" 
#include "student.h" 
extern int cnt; 
/*控制增加流程函数*/ 
void addManage() 
{ 
readInfor(); 
addInfor(); 
} /*增加实习记录函数*/ 
void addInfor() 
{ 
int select; 
while (1) 
{ 
printf("学号:"); 
·119·

scanf("%s",&stu[cnt].sno); 
if (snoexist(stu[cnt].sno)>=0) 
{ 
printf("学号已经存在!\n"); 
continue; 
} 
else 
{ 
printf("姓名:"); 
scanf("%s",&stu[cnt].sname); 
printf("公司:"); 
scanf("%s",&stu[cnt].company); 
printf("岗位:"); 
scanf("%s",&stu[cnt].position); 
printf("工资:"); 
scanf("%d",&stu[cnt].salary); 
cnt++; 
printf("增加记录成功!\n"); 
saveInfor(); 
} 
printf("是否继续输入记录?(1 Yes/0 No):"); 
scanf("%d",&select); 
if (select==0) 
break; 
} 
}
(6)删除实习记录文件delInfor.c。 
/********************* 
文件delInfor.c 的代码
**********************/ 
#include <stdio.h> 
#include "funstmt.h" 
#include "student.h" 
extern int cnt; 
/*控制删除流程函数*/ 
void delManage() 
{ 
int s; 
while (1) 
{ 
readInfor(); 
s=delMenu(); /*调用删除菜单函数*/ 
switch(s) 
{ 
·120·

case 1: 
delBasedSno(); /*调用按学号删除函数*/ 
break; 
case 2: 
delBasedSname(); /*调用按姓名删除函数*/ 
break; 
case 0: 
break; 
} 
if (s==0) 
break; 
} 
} /*按学号删除函数*/ 
void delBasedSno() 
{ 
char tsno[10]; 
int i; 
int p=-1; 
printf("请输入要删除的学号:"); 
scanf("%s",tsno); 
p=snoexist(tsno); 
if (p<0) 
{ 
printf("\n 要删除的学号不存在!\n"); 
} 
else 
{ 
printf("要删除的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[p].sno,stu[p].sname,stu[p].company,stu[p]. 
position,stu[p].salary); 
for (i=p;i<cnt;i++) 
{ 
stu[i]=stu[i+1]; 
} 
cnt--; 
printf("删除记录成功!\n"); 
saveInfor(); 
} 
} /*按姓名删除函数*/ 
void delBasedSname() 
{ 
char tsname[50]; 
int i; 
·121·

int p=-1; 
printf("请输入要删除的姓名:"); 
scanf("%s",tsname); 
p=snameexist(tsname); 
if (p<0) 
{ 
printf("要删除的姓名不存在!\n"); 
} 
else 
{ 
printf("要删除的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[p].sno,stu[p].sname,stu[p].company,stu[p]. 
position,stu[p].salary); 
for (i=p;i<cnt;i++) 
{ 
stu[i]=stu[i+1]; 
} 
cnt--; 
printf("删除记录成功!\n"); 
saveInfor(); 
} 
}
(7)修改实习记录文件modInfor.c。 
/********************* 
文件modInfor.c 的代码
**********************/ 
#include <stdio.h> 
#include "funstmt.h" 
#include "student.h" 
/*控制修改流程函数*/ 
void modManage() 
{ 
int s; 
while (1) 
{ 
readInfor(); 
s=modMenu(); /*调用修改菜单函数*/ 
switch(s) 
{ 
case 1: 
modBasedSno(); /*调用按学号修改函数*/ 
break; 
case 2: 
modBasedSname(); /*调用按姓名修改函数*/ 
·122·

break; 
case 0: 
break; 
} 
if (s==0) 
break; 
} 
} /*按学号修改函数*/ 
void modBasedSno() 
{ 
char tsno[10]; 
int p=-1; 
printf("请输入要修改的学号:"); 
scanf("%s",tsno); 
p=snoexist(tsno); 
if (p<0) 
{ 
printf("\n 要修改的学号不存在!\n"); 
} 
else 
{ 
printf("要修改的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[p].sno,stu[p].sname,stu[p].company,stu[p]. 
position,stu[p].salary); 
printf("请重新输入信息:\n"); 
printf("姓名:"); 
scanf("%s",&stu[p].sname); 
printf("公司:"); 
scanf("%s",&stu[p].company); 
printf("岗位:"); 
scanf("%s",&stu[p].position); 
printf("工资:"); 
scanf("%d",&stu[p].salary);; 
printf("修改信息成功!\n"); 
saveInfor(); 
} 
} /*按姓名修改函数*/ 
void modBasedSname() 
{ 
char tsname[50]; 
int p=-1; 
printf("请输入要修改的姓名:"); 
scanf("%s",tsname); 
·123·

p=snameexist(tsname); 
if (p<0) 
{ 
printf("\n 要修改的姓名不存在!\n"); 
} 
else 
{ 
printf("要修改的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[p].sno,stu[p].sname,stu[p].company,stu[p]. 
position,stu[p].salary); 
printf("请重新输入信息:\n"); 
printf("姓名:"); 
scanf("%s",&stu[p].sname); 
printf("公司:"); 
scanf("%s",&stu[p].company); 
printf("岗位:"); 
scanf("%s",&stu[p].position); 
printf("工资:"); 
scanf("%d",&stu[p].salary);; 
printf("修改信息成功!\n"); 
saveInfor(); 
} 
}
(8)查询实习记录文件qyInfor.c。 
/********************* 
文件qyInfor.c 的代码
**********************/ 
#include <stdio.h> 
#include "funstmt.h" 
#include "student.h" 
#include "string.h" 
extern int cnt; 
/*控制查询流程函数*/ 
void qyManage() 
{ 
int s; 
while (1) 
{ 
readInfor(); 
s=qyMenu(); /*调用查询菜单函数*/ 
switch(s) 
{ 
case 1: 
qyBasedSno(); /*调用按学号查询函数*/ 
·124·

break; 
case 2: 
qyBasedSname(); /*调用按姓名查询函数*/ 
break; 
case 3: 
qyBasedPost(); /*调用按实习岗位查询函数*/ 
break; 
case 4: 
qyBasedSalary(); /*调用按实习工资查询函数*/ 
break; 
case 5: 
qyAll(); /*调用查询所有记录函数*/ 
break; 
case 0: 
break; 
} 
if (s==0) 
break; 
} 
} /*按学号查询函数*/ 
void qyBasedSno() 
{ 
char tsno[10]; 
int i; 
int flag=0; 
printf("请输入要查询的学号:"); 
scanf("%s",tsno); 
for (i=0;i<cnt;i++) 
{ 
if (strcmp(stu[i].sno,tsno)==0) 
{ 
flag=1; 
printf("查询到的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[i].sno,stu[i].sname,stu[i].company, 
stu[i].position,stu[i].salary); 
} 
} 
if (flag==0) 
printf("无!\n"); 
else 
printf("查询成功!\n"); 
} /*按姓名查询函数*/ 
void qyBasedSname() 
·125·

{ 
char tsname[50]; 
int i; 
int flag=0; 
printf("请输入要查询的姓名:"); 
scanf("%s",tsname); 
for (i=0;i<cnt;i++) 
{ 
if (strcmp(stu[i].sname,tsname)==0) 
{ 
flag=1; 
printf("查询到的信息如下所示:\n"); 
printf("%s %s %s %s %d\n", stu[i].sno,stu[i].sname,stu[i].company, 
stu[i].position,stu[i].salary); 
} 
} 
if (flag==0) 
printf("无!\n"); 
else 
printf("查询成功!\n"); 
} /*按实习岗位查询函数*/ 
void qyBasedPost() 
{ 
char tsposition[50]; 
int i; 
int flag=0; 
printf("请输入要查询的实习岗位:"); 
scanf("%s",tsposition); 
printf("查询到的信息如下所示:\n"); 
for (i=0;i<cnt;i++) 
{ 
if (strcmp(stu[i].position,tsposition)==0) 
{ 
flag=1; 
printf("%s %s %s %s %d\n", stu[i].sno,stu[i].sname,stu[i].company, 
stu[i].position,stu[i].salary); 
} 
} 
if (flag==0) 
printf("无!\n"); 
else 
printf("查询成功!\n"); 
} 
·126·