C++习题.doc_第1页
C++习题.doc_第2页
C++习题.doc_第3页
C++习题.doc_第4页
C++习题.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include struct Employeechar num5, name20;unsigned char gender : 1;/0 = 女, 1 = 男unsigned char isMarriaged : 1;/0 = false, 1 = trueunsigned char isManager : 1;/0 = false, 1 = trueunsigned char lay_out : 1;/1 = 休假, 0 = 在岗unsigned char salaryLevel : 4;/工资级别0-15;void printAnEmp(Employee emp)coutsetw(5)emp.numsetw(10);coutsetw(5)(emp.gender = 0 ? 女:男);coutsetw(5)(emp.isMarriaged = 1 ? 已婚:未婚);coutsetw(5)(emp.isManager = 1 ? 经理:员工);coutsetw(5)(emp.lay_out = 1 ? 休假:在岗);cout 工资级别:setw(2)(int)emp.salaryLevelendl;void printEmps(Employee emps, int n)for(int i = 0; i n ; i+)printAnEmp(empsi);void f1(Employee emps, int n)for(int i = 0; i n; i+)if (empsi.gender = 0 & empsi.lay_out = 0)empsi.salaryLevel+;void main()Employee emplist4 = 001,张三,1,0,0,0,7,002,李四,0,1,0,1,8,003,王五,1,1,1,1,12,004,赵六,0,0,0,0,3;cout调整工资之前endl;printEmps(emplist, 4);f1(emplist,4);cout调整工资之后endl;printEmps(emplist, 4);结构类型Employee中定义了5个位域。例子中描述了如何对位域进行初始化、条件判断、组成逻辑表达式、赋值等操作。其中f1函数是对所有在岗的女职员加一级工资。执行程序,输出如下:调整工资之前 001 张三 男 未婚 员工 在岗 工资级别: 7 002 李四 女 已婚 员工 休假 工资级别: 8 003 王五 男 已婚 经理 休假 工资级别:12 004 赵六 女 未婚 员工 在岗 工资级别: 3调整工资之后#include struct Mybitfields unsigned short a : 4; unsigned short b : 5; unsigned short c : 7;union BitBytesunsigned char c2;Mybitfields bitb;void main(void)BitBytes a;a.bitb.a = 2;a.bitb.b = 31;a.bitb.c = 6;coutbytes:hex(int)a.c0-(int)a.c1endl;含位域的结构类型Mybitfields在前面介绍过。我们要验证在物理内存中各位域的排列规律。执行程序,输出如下:bytes:f2-d例7-9 综合运用结构、枚举、共同体,管理某单位的职员信息。除了要管理职员的编号、姓名、性别,职员还分为3种类别:教师、工人和干部。每种类别都有不同的级别。如教师按职称分为教授、副教授、讲师和助教4种。工人级别分为8级(1,2,8)。干部级别分为厅局级、县处级、科级和科员4种。对每个人能确定其级别,而且能按类别统计各类职员的人数。每个职员要按类别分级别,而且一个人只能有一个级别,而且与类别相关。这是设计的难点。可以用一个枚举来表示类别,再用3个枚举来分别表示3种类别的级别,用一个共同体来表示一个人的级别,再用一个结构来表示职员类型。这是一种方案,编程如下:#include #include #include enum Genderfemale, male;/性别enum Sortteacher, worker, cadre;/类别enum TeacherGradeprof, assoprof, instructor, tutor;/教师级别enum WorkerGradeg1=1, g2, g3, g4, g5, g6, g7, g8;/工人级别enum CadreGradedirector, prefect, faculty, stuff;/干部级别union Grade/级别TeacherGrade tg;/教师职称WorkerGrade wg;/干部级别CadreGrade cg;/工人级别;struct Employee/职员结构char num5, name10;/编号与姓名Gender sex;/性别Sort sort;/类别Grade level;/职员级别;struct SortEmp/按类别统计结构int teachernum;/教师人数int workernum;/工人人数int cadrenum;/干部人数;SortEmp getSortEmp(Employee emps, int n)SortEmp se = 0;for(int i = 0; i n; i+)switch (empsi.sort)case teacher: se.teachernum+; break;case worker: se.workernum+; break;case cadre: se.cadrenum+; break;return se;void printSortEmps(SortEmp se)cout职员按类别统计人数endl;cout教师: se.teachernumendl;cout工人: se.workernumendl;cout干部: se.cadrenumendl;void printSort(Sort s)switch (s)case teacher:cout教师; break;case worker:cout工人; break;case cadre:cout干部; break;void printLevel(Sort s, Grade g)if (s = teacher)coutsetw(8);switch(g.tg)case prof:cout教授; break;case assoprof:cout副教授; break; case instructor:cout讲师; break; case tutor:cout助教; break; ;else if (s = worker)coutsetw(4)g.wg级工;else if (s = cadre)coutsetw(8);switch(g.cg)case director:cout厅局级; break;case prefect:cout县处级; break;case faculty:cout科级; break;case stuff:cout科员; break;void printEmps(Employee emps, int n)Sort s;cout 编号 姓名 性别 类别 职称/级别endl; for(int i = 0; i n; i+)coutsetw(5)empsi.numsetw(10);coutsetw(5)(empsi.sex = female ? 女 : 男);coutsetw(8); printSort(s = empsi.sort);printLevel(s, empsi.level);coutendl;void main(void) Employee emps = 001,Wangping,female,teacher,002,Zhaomin,male,worker,003,Wanghong,female,teacher,004,Lilei,male,cadre,005,Liumin,male,cadre,006,Meilin,male,worker,007,Yetong,female,teacher,008,Maomao,male,teacher;/下面确定每个人的级别emps0.level.tg = prof;emps1.level.wg = g4;emps2.level.tg = assoprof;emps3.level.cg = faculty;emps4.level.cg = prefect;emps5.level.wg = g7;emps6.level.tg = instructor;emps7.level.tg = assoprof;printEmps(emps, 8);/打印职员信息printSortEmps(getSortEmp(emps, 8);/统计并打印上面例子定义了5个枚举、1个共同体、2个结构,目的是演示这些类型的用法。除了main函数之外,还定义了5个函数来处理信息。这种设计方案存在一些问题。例如在main函数中,当设置或改变一个人的级别level时,其类别sort没有起到约束作用。其根本原因是C语言的结构是没有封装保护的数据聚合体。执行程序,输出如下: 编号 姓名 性别 类别 职称/级别 001 Wangping 女 教师 教授 002 Zhaomin 男 工人 4级工 003 Wanghong 女 教师 副教授 004 Lilei 男 干部 科级 005 Liumin 男 干部 县处级 006 Meilin 男 工人 7级工 007 Yetong 女 教师 讲师 008 Maomao 男 教师 副教授职员按类别统计人数教师: 4工人: 2在定义之后就可以用同义词来说明变量或函数形参。例如:typedef float REAL;/将float定义为REALtypedef unsigned int size_t;/将unsigned int定义为size_tREAL x,y;/等同:float x,y;typedef struct Bchar name20;char author10;float price;BOOK;/定义结构类型B,定义了一个别名BOOKBOOK book10;/等同:B book10;typedef char AUTHOR10;/给char10起别名AUTHORAUTHOR author;(1)输入一个班的若干同学的通讯录。该通讯录包括:学号、姓名、住址、电话、E-mail等。从键盘输入某人的姓名,然后从已有通讯录中查找该人是否存在,并给出相应信息。打印通信录。(2)输入n个人的编号、姓名、身高,然后按身高从小到大的顺序排列输出。(3)建立一个结构类型Course表示课程,包括课程编号、课程名称、考核方式。建立一个枚举类型表示两种考核方式:一种是百分制,一种是等级制,即A、B、C、D、E。一门课程只能选其一种考核方式。建立一个结构类型,表示学生成绩,包括学号、姓名、课程编号、考核成绩。注意,考核成绩的类型应该是一个共同体,它的一个值要么是一个百分制成绩,要么是一个等级成绩,要根据该课程的考核方式来定。编写程序并测试。/等同:char author10;干部: 2 001 张三 男 未婚 员工 在岗 工资级别: 7 002 李四 女 已婚 员工 休假 工资级别: 8 003 王五 男 已婚 经理 休假 工资级别:12 004 赵六 女 未婚 员工 在岗 工资级别: 4例8-6 用指针对一维数组进行排序。#include void swap(int *p, int *q)/用指针来交换两个值int t = *p;*p = *q;*q = t;void bubbleSort(int *a, int n)/冒泡降序for(int i = 0; i n-1; i+)for(int j = 0; j n-i-1; j+)int *p = a + j;if(*p *(p+1)swap(p, p+1);void print(int *a, int n)/打印各元素for(int i = 0; i n; i+)cout*a+ ;coutn;void main(void)int b10 = 94,-35,56,48,80,-12,38,0,-9,58;bubbleSort(b, 10);print(b, 10);执行程序,输出如下:94 80 58 56 48 38 0 -9 -12 -35例8-8 用函数处理任意行列的矩阵#include void print2D(int *a, int row, int col)/打印row行col列的int矩阵for(int i = 0; i row; i+)for(int j = 0; j col; j+)coutai * col + jt;/Acoutendl;void main(void)int a4=1,2,3,4,3,4,5,6,5,6,7,8;int b43,i,j; print2D(int *)a, 3, 4);/B 打印3行4列的矩阵for(i = 0; i 4; i+)/实现矩阵转置for(j = 0; j 3; j+)bij = aji;print2D(int *)b, 4, 3);/C 打印4行3列的矩阵上面定义了一个函数print2D来打印row行col列的int矩阵,第一个形参是一个int指针,也可等价改变为int a形式。函数体中A行将i行j列的二维下标aij映射到一维下标ai * col + j,这是将一维数组转换为二维数组的关键,它利用了二维数组元素按行按列连续存储的特点。在main函数中两次调用了该函数,调用前要将二维数组强制转换为(int *),即一维数组。字符串处理用指针来处理字符串,比数组下标处理方式更灵活。例8-9 用指针处理字符串#includeint strLength(const char * s)if (s = NULL) return -1;const char *s1 = s;while(*s != 0)s+;return s - s1;int strcopy(char *to, const char *from, int n)if (to = NULL | from = NULL | n = 0) return -1;int i = 0;while (i n - 1 & *from != 0)*to+ = *from+;i+;*to = 0;return i;void main()char *s1 = Java Programming;char s2 = C+ Programming;s1 = s2;s1 = C/C+ Programming;coutstrLength(s1):s1endl;s1 += 6;coutstrLength(s1):s1endl;coutstrLength(s2+4):s2+4endl;coutstrLength()endl;char *s3= NULL;coutstrLength(s3)endl;char s48 = No Use;coutstrcopy(s4, s1, 8)endl;couts4endl;设计了一个函数strLength来计算一个字符串的长度,相当于库函数strlen。函数形参s是一个常量字符指针,返回一个int表示长度。如果调用实参是一个空指针,就返回-1。函数体中第一条语句检查形参是否为空指针,即指针值是否为0,这是指针作为形参的一般处理方式。然后移动s指针直到尾0处,然后返回相对移动位置作为串的长度。注意const修饰符确保实参字符串不会在函数中改变其内容,但形参s仍然可以改变。第二个函数是一个字符串拷贝,相当于库函数strncpy,不同在于返回实际拷贝的字符个数。在6.4.4节用字符数组实现了该函数,现在提供一个字符指针的实现。差别在于要检查字符指针是否为空,以及移动形参指针来读写字符。在main函数中验证了字符指针定义字符串的特点,可以看到字符指针可改变。测试了前面定义的两个函数。执行程序,输出如下:17:C/C+ Programming11:Programming11:Programming0-17Program#include void print2D(int *a, int row, int col)for(int i = 0; i row; i+)for(int j = 0; j col; j+)coutaijt;coutendl;#include #include void bubbleSort(char * strs, int n)char *temp;for(int i = 0; i n-1; i+)for(int j = 0; j 0)temp = strsi;/交换指针strsi = strsj;strsj = temp;void main(void)char * week = Monday,Tuesday,Wednesday,Thursday,Friday, Saturday,Sunday;const int num = sizeof(week)/4;/计算串的个数bubbleSort(week, num);/调用函数完成排序for(int i = 0; i num; i+)/输出排序后的结果coutweekiendl;执行程序,输出如下:FridayMondayThursdayTuesdayWednesdaySaturdaySunday例8-15 对结构数组进行排序,然后输出结果。#include #include struct Studentchar num12, name20;char sex;float mathscore;void printTitle()coutsetw(6)学号setw(10)姓名;coutsetw(5)性别setw(6)成绩endl;void printAStud(Student *s)/指针作为形参coutsetw(6)numsetw(10)name;coutsetw(5)sexsetw(6)mathscoreendl;void bubbleSort(Student *s, int n)/冒泡降序算法Student *temp;for(int i = 0; i n-1; i+)for(int j = 0; j mathscore mathscore)temp = sj; /交换结构的指针sj = sj+1; sj+1 = temp;void printStuds(Student *s, int n)/打印一组学生printTitle();for(int i = 0; i n ; i+)printAStud(si);void main(void)Student st = 001,Wangping,f,84,002,Zhaomin,m,64,003,Wanghong,f,54,004,Lilei,m,92,005,Liumin,m,75, 006,Meilin,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论