第三 篇 综合课程设计 课程设计目的如下: (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·