第十一章
结构体和
共用体类型
2
教学目标
? 介绍C语言的
– 结构体
– 共用体
– 枚举
– 其它数据类型
3
学习要求
? 结构体类型和共用体类型是C语言
的重要概念。
? 要求掌握结构体类型、共用体类型
以及相应类型变量的定义方法和引
用方法。
4
本单元授课内容
? 结构体类型
– 结构体变量的定义
– 结构体变量的使用
? 其他结构体类型
– 日期类型、时间类型、枚举类型
– typedef语句
? 实用编程
– 用户界面程序设计
– 菜单程序构造
– 中文操作系统编程
5
一、结构体类型
? C语言程序中少量变化的数据用变量
来处理。数量不宜多。
? 批量同类型数据的处理用数组。
? 不同类型的数据的集合用什么数据结
构来存放呢?这就是本单元要介绍的
内容,用结构体类型处理不同类型数
据的集合 。
6
[例 6-1]职工工资单的层次结构
? 说明,
– 结构体类型适用于说明具有层次结构的
复杂数据 。 例如, 可以用来表示, 某处
理对象的数据由,..组成,其中的某项又
由,..组成,...”的数据间联系方式 。
– 层次结构主要用于描述数据的内部组织,
即表征一个数据对象的各数据项之间的
从属关系 。
– 层次模型的表示方法很多,我们采用缩
排方式表示上述工资单数据的层次结构 。
7
工资单数据的层次结构
01 工资单
02 工作部门, 字符串,最大长度为 10个字符
02 姓名, 字符串,最大长度为 8个字符
02 职务 (含职称, 工种 ),代码,0-99
02 参加工作时间
03 年份, 1900-2050
03 月份, 1-12
03 日, 1-31
02 家庭情况
03 婚否, 0-否,1-是
03 是否双职工, 0-否,1-是
03 独生子女出生日期,如无独生子女则填
1900.01.01
…………
8
工资单数据的层次结构(续)
02 基本工资, 0-10000,保留两位小数
02 岗位津贴, 0-10000,保留两位小数
02 劳保福利, 0-1000,保留两位小数
02 独生子女费, 0-10,保留两位小数
02 房租, 0-10000,保留两位小数
02 电费, 0-10000,保留两位小数
02 水费, 0-10000,保留两位小数
02 取暖费, 0-1000,保留两位小数
02 保育费, 0-1000,保留两位小数
02 实发工资, 0-10000,保留两位小数
9
1、结构体类型变量的定义
? 与简单变量和数组变量一样, 结构体变量也必
须先定义, 后使用 。
? 定义 ( 说明 ) 语句的一般格式是:
struct 结构体类型名 {
结构体类型成员变量说明语句表;
} ;
? 例如, 说明日期类型为:
struct date{
int da_year;
int da_month;
int da_day;
} ;
10
[例 6-2]定义工资表类型
/* 程序模块 SALARY.H,定义工资单 */
#include <dos.h>
/*---- 定义工资表数组 ---*/
#define MAX_EMPLOYEE 1000
/*---- 定义家庭情况类型 -----*/
struct family_type
{
int in_double_harness; /* 婚姻状况 */
int is_colleague; /* 是否双职工
*/
struct date birthdate_of_singleton; /* 子女生
日 */
int children_in_school; /* 上学子女数
*/
int housing_area; /* 住房面积 */
};
11
定义工资单类型
struct salary_type {
char department[11]; /* 工作部门 */
char name[9]; /* 姓名 */
int position; /* 职务 */
struct date date_of_work; /* 参加工作时间 */
struct family_type family; /* 家庭情况 */
float salary; /* 基本工资 */
float subsidy; /* 岗位津贴 */
float insurance; /* 劳保福利 */
float child_allowance; /* 独生子女费 */
float rent; /* 房租 */
float cost_of_elec; /* 电费 */
float cost_of_water; /* 水费 */
float cost_of_heating; /* 取暖费 */
float cost_of_education;/* 保育费 */
float realsum; /* 实发工资 */ };
12
定义工资表数组
int emp_count;
struct salary_type
salary_list[MAX_EMPLOYEE];
13
2、结构体类型变量的使用
? 定义了结构体变量后, 就可以引用了 。
引用时只能引用结构体变量的成员, 而
不能整体引用结构体变量 。
? 引用方法:
结构体类型变量名, 成员变量名
? 以职工工资表为例:
salary_list[i].name,第 i个职工的姓
名 ;
salary_list[i].position,第 i个职工
的职务 ;
salary_list[i].salary:第 i个职工的基
本工资 ;
salary_list[i].date_of_work.da_year,第 i个
14
[例 6-3]打印某职工的工资单
/* 程序模块 SALARY.H,定义工资单 */
#include <stdlib.h>
#include <dos.h>
#define MAX_EMPLOYEE 100
/*---- 定义工作岗位类型 -----*/
#define MANAGER 1 /* 经
理 */
#define ENGINEER 2 /* 工
程师 */
#define EMPLOYEE 3 /* 职
员 */
#define WORKER 4 /* 工
人 */
#define OTHER 5 /* 其
他 */
15
/* 定义家庭情况类型 */
struct family_type
{
int in_double_harness; /* 婚姻状况 */
int is_colleague; /* 是否双职工 */
struct date birthdate_of_singleton; /* 子女出生日期 */
int children_in_school; /* 上学子女数 */
int housing_area; /* 住房面积 */
};
16
/* 定义工资单类型 */?#define SALARY_TYPE struct salary_type
SALARY_TYPE {
char depart[11]; /* 工作部门 */
char name[9]; /* 姓名 */
int position; /* 职务 */
struct date date_of_work; /* 参加工作时间 */
struct family_type family; /* 家庭情况 */
float salary; /* 基本工资 */
float subsidy; /* 岗位津贴 */
float insurance; /* 劳保福利 */
float child_allowance; /* 独生子女费 */
float rent; /* 房租 */
float cost_of_elec; /* 电费 */
float cost_of_water; /* 水费 */
float cost_of_heating; /* 取暖费 */
float cost_of_education;/* 保育费 */
float realsum; /* 实发工资 */
};
17
函数 print_salary(),
打印某职工的工资单void print_salary(SALARY_TYPE salary)
{ char position[11];
switch(salary.position)
{ case MANAGER:
strcpy(position,"经理 "); break;
case ENGINEER:
strcpy(position,"工程师 "); break;
case EMPLOYEE:
strcpy(position,“职员, ); break;
case WORKER:
strcpy(position,“工人, ); break;
case OTHER:
strcpy(position,"其他 "); break;
}
18
/* 打印职工工资单 */
printf("-------------------------------------\n");
printf("部 门, %10s 姓 名, %8s\n",salary.depart,
salary.name);
printf(“职 务, %10s 参加工作时间,%d.%02d.%02d\n",position,
salary.date_of_work.da_year,salary.date_of_work.da_mon,
salary.date_of_work.da_day);
printf("基本工资, %10.2f 岗位津贴, %10.2f\n",
salary.salary,salary.subsidy);
printf("劳保福利, %10.2f 独生子女费, %10.2f\n",
salary.insurance,salary.child_allowance);
printf("\n房 租, %10.2f 电 费, %10.2f\n",
salary.rent,salary.cost_of_elec);
printf("水 费, %10.2f 取 暖 费, %10.2f\n",
salary.cost_of_water,salary.cost_of_heating);
printf("保 育 费, %10.2f\n",salary.cost_of_education);
printf("\n实发工资, %10.2f\n",salary.realsum);
printf("------------------------------------------\n");
}
19
/*---- 测试用主函数 ----*/
main()
{ SALARY_TYPE salary_list[MAX_EMPLOYEE];
int i,salary_count = 0;
/*---- 输入经理张三的工资表 ------------*/
strcpy(salary_list[salary_count].name,"张三 ");
strcpy(salary_list[salary_count].depart,"办公室 ");
salary_list[salary_count].position = MANAGER;
salary_list[salary_count].date_of_work.da_year = 1974;
salary_list[salary_count].date_of_work.da_mon = 10;
salary_list[salary_count].date_of_work.da_day = 1;
salary_list[salary_count].salary = 3500.0;
salary_list[salary_count].subsidy = 2000.0;
salary_list[salary_count].insurance = 200.0;
salary_list[salary_count].child_allowance = 300.0;
salary_list[salary_count].rent = 450.0;
salary_list[salary_count].cost_of_elec = 200.0;
salary_list[salary_count].cost_of_water = 100.0;
salary_list[salary_count].cost_of_heating = 454.0;
salary_list[salary_count].cost_of_education = 78.0;
salary_list[salary_count].realsum = 3458.0;
salary_count++;
}
20
/* 输入工人李四的工资表 */strcpy(salary_list[salary_count].name,"李四 ");
strcpy(salary_list[salary_count].depart,"车间 ");
salary_list[salary_count].position = WORKER;
salary_list[salary_count].date_of_work.da_year = 1990;
salary_list[salary_count].date_of_work.da_mon = 7;
salary_list[salary_count].date_of_work.da_day = 16;
salary_list[salary_count].salary = 500.0;
salary_list[salary_count].subsidy = 100.0;
salary_list[salary_count].insurance = 100.0;
salary_list[salary_count].child_allowance = 0.0;
salary_list[salary_count].rent = 100.0;
salary_list[salary_count].cost_of_elec = 100.0;
salary_list[salary_count].cost_of_water = 100.0;
salary_list[salary_count].cost_of_heating = 100.0;
salary_list[salary_count].cost_of_education = 0.0;
salary_list[salary_count].realsum = 300.0;
salary_count++;
21
/* 打印工资表 */
for(i=0; i<salary_count; i++)
{
print_salary(salary_list[i]);
getch();
}
22
二、其他结构体类型
? 日期类型
? 时间类型
? 枚举类型
? typedef语句
23
1、日期类型
? TC中在,dos.h”定义了日期和时间结构
类型 ;
? 日期类型定义为:
struct date
{
int da_year;
char da_mon;
char da_day;
};
24
2、时间类型
struct time
{
unsigned char ti_min; /* 分 */
unsigned char ti_hour; /* 时 */
unsigned char ti_hund; /* 百分之一
秒 */
unsigned char ti_sec; /* 秒 */
};
25
引用日期、时间变量
? 在,dos, h”中还提供了一组库函数,它
们是:
– 读系统日期
void getdate( struct date *dateptr);
– 设置系统日期
void setdate( struct date *dateptr);
– 读系统时间
void gettime( struct time *timeptr);
– 设置系统时间
void settime( struct time *timeptr);
26
使用日期、时间函数举例
? 打印系统日期和时间:( C0601, C)
#include,dos, h”
main()
{ struct date d;
struct time t;
getdate(&d);
gettime(&t);
printf("Today is %4d.%2d.%2d\n",
d.da_year,d.da_mon,d.da_day);
printf("The time is %2d:%2d:%2d\n",
t.ti_hour,t.ti_min,t.ti_sec);
}
27
3、共用体变量
? 定义变量时,要分配单位长度的存储单
元。
? 数组的总长度是 N*L( N是数组元素个
数,L是单元的类型长度)。
? 结构体类型的长度是结构体各分量长度
之和。
? 有时并不是所有的分量同时都在使用,
那么,不用的单元将被闲置。
? 共用体变量就考虑到节省结构体类型的
存储单元这个问题。它的长度是各分量
中最长的分量所占用的存储单元。
28
共用体变量存储单元示意图





d1
d2
d3
d4
共用体存储单元的长度是 d3
d1
d2
d3
d4





结构体存储单元的长度是 d1+d2+d3+d4
29
定义共用体变量
? 说明(定义)语句一般格式:
union 共用体类型名
{
成员变量说明语句表;
}
? 例如 union u_type
{ int i;
long l;
char c[4];
} ;
union u_type x ;
30
[例 6-6]人事档案记录打印
? 算法分析:
? 在人事档案中,对不同类型人员档案登
记项是不同的 。 将不同部分用共用体实
现, 相同部分用结构体实现 。
? 在档案中设置一个职工类型数据项,将
职工分为 3类, 干部, 技术人员和工人 。
然后设置一个共用体类型的成员变量用
来存放不同类型职工的相关数据 。
31
头文件 EMPLOYEE.H,
职工档案管理的数据类型定义
#include <dos.h>
/* 职工类型符号常数 */
#define MANAGER 0 /* 管理
人员 */
#define TECHNICIAN 1 /* 技术
人员 */
#define WORKER 2 /* 工人
*/
/* 性别符号常数 -*/
#define MALE 0 /* 男 */
#define FEMALE 1 /* 女 */
/* 简化结构体类型名的宏定义 */
#define EMPLOYEE_TYPE struct
32
数据结构定义(一)
/* 定义管理人员的数据结构 -*/
struct manager_type
{
char position[11]; /* 职务 */
char rank[21]; /* 级别 */
};
/* 定义技术人员的数据结构 -*/
struct technician_type
{
char tech_post[11]; /* 职称
*/
char degree[11]; /* 学位
*/
char major[11]; /* 专业
*/
33
数据结构定义(二)
/* 定义工人数据结构 */
struct worker_type
{
char speciality[11]; /* 工种 */
int rank; /* 级别 */
char education[11]; /* 文化程度 */
};
/* 定义分类档案数据结构 */
union sort_type
{
struct manager_type m; /* 管理人员的数
据 */
struct technician_type t; /* 技术人员的数
据 */
struct worker_type w; /* 工人的数据
*/
};
34
数据结构定义(三)
/* 职工档案数据结构 */
struct employee_type
{ char name[9]; /* 姓名 */
int sex; /* 性别 */
struct date birthdate; /* 出生日
期 */
int type; /* 职工类
型 */
union sort_type d; /* 职工分类
数据 */
};
/* 说明职工档案数组 */
#define MAX_EMPLOYEE 1000
int emp_count;
35
函数 print_file():
打印某职工档案
void print_file(EMPLOYEE_TYPE emp)
{ printf("\n------ ------------------------
----\n");
printf("姓 名, %s\n",emp.name);
printf("性 别, %s\n",(emp.sex==0?"男 ":"
女 "));
printf("出生日期, %4d.%02d.%02d\n",
emp.birthdate.da_year,
emp.birthdate.da_mon,
emp.birthdate.da_day);
36
不同类型人员选择打印switch(emp.type){ case MANAGER:
printf("职 务, %s\n",emp.d.m.position);
printf("级 别, %s\n",emp.d.m.rank); break;
case TECHNICIAN:
printf("职 称, %s\n",emp.d.t.tech_post);
printf("学 位, %s\n",emp.d.t.degree);
printf("专 业, %s\n",emp.d.t.major); break;
case WORKER:
printf("工 种, %s\n",emp.d.w.speciality);
printf("级 别, %d\n",emp.d.w.rank);
printf("文化程度, %s\n",emp.d.w.education); break;
default:
printf("职工类型不明确,无法显示分类数据 !\n");
}
printf("-----------------------------------------\n");
}
37
主函数( C0606.h)
main()
{ EMPLOYEE_TYPE emp_file[MAX_EMPLOYEE];
int emp_count = 0,i;
/* 将一个工人的档案存放在
emp_file[emp_count]中 */
strcpy(emp_file[emp_count].name,"张三
");
emp_file[emp_count].sex = MALE;
emp_file[emp_count].birthdate.da_year
= 1970;
emp_file[emp_count].birthdate.da_mon
= 5;
emp_file[emp_count].birthdate.da_day
= 1;
38
主函数(续)
/* 以下存放分类档案数据 -*/
emp_file[emp_count].type = WORKER;
strcpy(emp_file[emp_count].d.w.speciality,
"钳工 ");
emp_file[emp_count].d.w.rank = 4;
strcpy(emp_file[emp_count].d.w.education,"
高中 ");
emp_count++;
/*- 打印档案 */
for(i=0; i<emp_count; i++)
{
print_file(emp_file[i]);
}
}
39
举例:将十进制数转换为二进制?算法说明:
?C语言可以处理字节中的位。定义一个共用体变量 num
如下。整形变量 i和结构体变量 bits共享 8个字节。
union { int i;
struct {
unsigned a,1 ;
unsigned b,1 ;
unsigned c,1 ;
unsigned d,1 ;
unsigned e,1 ;
unsigned f,1 ;
unsigned h,1 ;
unsigned i,1 ;
} bits;
} num ;
40
程序( C0604.C)#include "stdio.h"main()
{ union {
int i;
struct {
unsigned a,1 ;
unsigned b,1 ;
unsigned c,1 ;
unsigned d,1 ;
unsigned e,1 ;
unsigned f,1 ;
unsigned h,1 ;
unsigned i,1 ;
} bits;
} num ;
printf("Enter a number:");
scanf("%d",&num.i);
printf("i=%2d,bits=%3d%3d%3d%3d%3d%3d%3d%3d\n",
num.i,num.bits.i,num.bits.h,num.bits.f,num.bits.e,
num.bits.d,num.bits.c,num.bits.b,num.bits.a);
}
41
4、枚举变量
? 变量取值数可以无限。对于取值有限
的变化的数据集合如何处理呢?
? C语言中用枚举变量来处理这样一类
变量。
? 枚举变量的说明(定义)语句格式为:
enum 枚举类型名
{ 枚举符号表 } ;
42
枚举变量引用
? 枚举变量对应的值是整型自然数序列值;如不
说明,则从 0开始取值;若用等号赋初值,则
从指定值开始取值。
? 例如,weekday_type中,从 SUNDAY到
SATURDAY分别取值 0~6。若从 MONDAY到
SUNDAY,MONDAY=1,则分别取值 1~7。
43
枚举变量定义举例#include "stdio.h"
main()
{ int i;
enum weekday_type
{ SUNDAY,/* 星期日 */
MONDAY,/* 星期一 */
TUESDAY,/* 星期二 */
WEDNESDAY,/* 星期三 */
THURSDAY,/* 星期四 */
FRIDAY,/* 星期五 */
SATURDAY /* 星期六 */
};
enum weekday_type workday;
44
程序(续)
for(workday=0;workday<7;i=workday++)
{
switch(i)
{
case 0,printf(" Sunday\n");
case 1,printf(" Monday\n");
case 2,printf(" Tuesday\n");
case 3,printf(" Wednesday\n");
case 4,printf(" Thursday\n");
case 5,printf(" Friday\n");
case 6,printf(" Saturday\n");
}
}
}
45
5,typedef语句
? typedef语句 (类型说明语句 ) 的功能是利用某个
已有的数据类型定义一个新的数据类型。其格式
为,
typedef 数据类型或数据类型名 新数据类型名
? 举例 typedef struct
{ char department[11]; /* 工作部门 */
char name[9]; /* 姓名 */
int position; /* 职务 */
...,..
}SALARY_TYPE;
其后的变量说明语句中可以省略结构体类型说明
符 struct:
SALARY_TYPE salary_list[MAX_EMPLOYEE];
46
单元上机练习题目
1.编写一个小型职工档案管理程序。提示, 利用
例 6-8的菜单结构,将, 新职工档案入库, (其
程序模块见例 6-9),,退休、调离职工销档,,
,按姓名查询职工档案,,, 打印某职工档案,
以及, 打印职工情况统计分析表, 等功能分别
编成函数,嵌入上述菜单程序中 。
2.设计一个小型图书馆的管理系统。提示 (伪代
码 ):
定义图书卡类型、借书证类型以及书卡数组
和借书证数组 ;
设计书卡录入函数和借书证录入函数 ;
设计借书记录类型及借书记录数组 ;
分别设计借书登记函数和还书处理函数 ;
最后编写主函数用一菜单程序将以上各部分连
接起来。
47
三、实用编程
? 用户界面程序设计
? 菜单程序构造
? 中文操作系统编程
48
1、面向显示屏的输出
? 现代显示器既能显示文字信息,也能显
示图形 。 目前常用的显示器通常都有若
干种显示模式,其中最常用的字符文本
显 示 模 式 是 03 号 模 式 。 在 头 文 件
conio.h中,定义了一个枚举类型,用于
说明各种文本显示模式 。
49
字符文本显示模式的枚举符号常数定

enum text_modes
{
LASTMODE = -1,/* 上一个文本模式 */
BW40 = 0,/* 黑白模式,25× 40字符 */
C40,/* 彩色模式,25× 40字符 */
BW80,/* 黑白模式,25× 80字符 */
C80,/* 彩色模式,25× 80字符 */
MONO = 7 /* 黑白模式,25× 80字符 */
};
50
C80模式下屏幕的坐标系统
(1,1) (1,80)
(25,1) (25,80)
51
C80模式下颜色常数定义enum COLORS
{
BLACK,/* 黑 */
BLUE,/* 蓝 */
GREEN,/* 绿 */
CYAN,/* 青 */
RED,/* 红 */
MAGENTA,/* 洋红 */
BROWN,/* 棕 */
LIGHTGRAY,/* 浅灰 */
DARKGRAY,/* 深灰 */
LIGHTBLUE,/* 亮兰 */
LIGHTGREEN,/* 亮绿 */
LIGHTCYAN,/* 亮青 */
LIGHTRED,/* 亮红 */
LIGHTMAGENTA,/* 亮洋红 */
YELLOW,/* 黄 */
WHITE /* 白 */
};
52
与屏幕操作有关函数 (一 )
? 设置输出字符的颜色,函数的原型为,
void textcolor(int newcolor);
? 设置文本背景色,原型为,
void textbackground(int newcolor);
? 定义文本窗口 定义文本窗口库函数的原
型为,
void window(int left,int top,int
right,
int bottom);
? 清文本窗口 其原型为,
void clrscr(void);
? 将光标移到指定位置,该函数的原型为,
void gotoxy(int x,int y);
53
与屏幕操作有关函数 (二 )
? 向文本窗口写字符串 c.该函数的原型为,
int cputs(char *str);
? 输入字符串,原型为,
char *cgets(char *str);
? 在文本窗口中进行格式输出
int cprintf(char *format,...);
? 在文本窗口中进行格式输入
int cscanf(char *format,...);
54
与屏幕操作有关函数 (三 )
?求当前光标位置
int wherex(void);
int wherey(void);
?查询屏幕状态设置情况
void gettextinfo(struct text_info *r);
?将文本块复制到内存
int gettext(int left,int top,int right,int bottom,
char *destin);
?由内存向屏幕复制文本块
int puttext(int left,int top,int right,
int bottom,char *source);
55
文本模式屏幕参数类型定义
struct text_info
{
unsigned char winleft; /* 文本窗口左上角列坐标 */
unsigned char wintop; /* 文本窗口左上角行坐标 */
unsigned char winright; /* 文本窗口右下角列坐标 */
unsigned char winbottom; /* 文本窗口右下角行坐标 */
unsigned char attribute;/* 显示属性 (文字和背景颜色 )*/
unsigned char normattr;
unsigned char currmode; /* 当前显示模式 */
unsigned char screenheight; /* 屏幕高 (行数 ) */
unsigned char screenwidth; /* 屏幕宽 (列数 ) */
unsigned char curx; /* 当前光标列坐标 */
unsigned char cury; /* 当前光标行坐标 */
};
56
[例 6-7]弹出式提示信息窗口
? C0607, C
57
2、菜单程序构造
? 菜单是应用程序界面的重要组成部分 。
菜单的种类很多, 从最简单的数码选择
菜单到弹出式菜单, 光条式菜单, 下拉
式菜单,以及用鼠标驱动的按键式菜单
和图标式菜单等 。
? 各种菜单的基本原理都差不多,下面以
光条式菜单为例,介绍菜单编程的基本
思想 。
58
[例 6-8]通用光条菜单函数
? 算法,
光条菜单是流行的菜单形式之一 。 在使用
光条菜单时,用户可以通过使用光标移
动键 (如上, 下方向键等 )移动菜单上的
光条来选择菜单条目,然后使用回车键
执行相应的处理功能 。
59
其实现原理为,保存原来的屏幕显示内容 ;显示菜单 ;
在菜单的第一项条目位置上显示光条 ;
while(接收的键盘输入键不是 ESC键 )
{
取消原来位置上的光条 ;
如果输入键是上移键
光条位置上移 ;
如果输入键是下移键
光条位置下移 ;
如果输入键是回车键
执行相应的菜单功能 ;
在新位置上显示光条 ;
}
恢复原来的屏幕显示内容。
60
C0608,C程序
? 详见 [例 6-8]源程序。
61
3、中文操作系统编程
? 中文应用软件一般都要在中文操作系统
下运行才能显示和输入汉字 。 Turbo C允
许在注解和字符串中使用汉字代码,对于
一般的应用程序来说这已足够 。
? 但要注意的是某些中文操作系统可能对
Turbo C集成环境的工作状态有影响,尤其
是在调试程序时 。 遇到这种情况,最好是
先在西文操作系统环境中将程序初步调试
通过,再进入中文操作系统观看其中的汉
字信息的显示效果 。
? 另外,用 Turbo C编译的程序不能在某些较
老版本的中文操作系统下正常显示汉字 。
62
[例 6-9]职工档案输入函数
? 源程序详见 C0609,C
63
单元上机练习题目
1.编写一个小型职工档案管理程序 。 提示, 利
用例 6-8的菜单结构,将, 新职工档案入库,
(其程序模块见例 6-9),,退休, 调离职工销
档,,, 按姓名查询职工档案,,, 打印某职
工档案, 以及, 打印职工情况统计分析表, 等
功能分别编成函数,嵌入上述菜单程序中 。
2.设计一个小型图书馆的管理系统 。 提示 (伪代
码 ):
定义图书卡类型, 借书证类型以及书卡数组
和借书证数组 ;
设计书卡录入函数和借书证录入函数 ;
设计借书记录类型及借书记录数组 ;
分别设计借书登记函数和还书处理函数 ;
最后编写主函数用一菜单程序将以上各部分
连接起来 。
64
结束语
?,纸上谈兵”学不出程序设计本领;
只有大量上机、编程、调试,才能
掌握。
? 学好程序设计语言的唯一途径是上
机。
? 你的编程能力和你在机器上投入的
时间成正比。