c++第九章(清华版)

合集下载

VC++PPT第九章(清华版)

VC++PPT第九章(清华版)

• (7)全部设置完毕后,单击“完成”按钮。 • (8)在解决方案资源管理器中包含“头文件”、 “源文件”、“资源文件”等文件夹。 • 可以看到主框架窗口及其函数分别定义在 MainFrm.h和MaiFrm.cpp文件中;文档类及其成 员函数分别定义在mfc1Doc.h和mfc1Doc.cpp文件 中;类视图及其成员函数分别定义在mfc1View.h 和mfc1View.cpp文件中。视图对象主要负责显示 和更新文档数据,接收客户区的输入消息,它是 文档对象与用户之间的可视化接口。
图9.6 为菜单项添加事件处理程序的弹出式快捷菜单
图9.7 事件处理程序向导
注意在MainFrame.cpp文件的包含中最后的包含文件时 #include "MyDle::Ontanchu() • { • // TODO: 在此添加命令处理程序代码
• • • • CMyDlg kk; =_T("阿嚏"); kk.DoModal(); }
• (3) Disabled • 设置当对话框在打开时该控件是否是不可 用的,它的类型是布尔类型,默认为 FALSE。
• (4) Group • 标记一组控件中的第一个控件。 • (5) Tap stop • 设置 TAB 键是否可以在该控件上驻留, 它的类型是布尔型,默认值为 TURE。
• (6) Help ID • 分配一个帮助 ID 给一个控件。这一个帮 助 ID 是建立在资源 ID 基础上的。它的类型 是布尔型,默认为 FALSE。
• 在类视图中双击Cmfc1View类,然后选择 OnDraw(CDC* pDC)方法,编写该方法,代码如 下,编号后运行程序。 • void Cmfc1View::OnDraw(CDC* pDC) • { • Cmfc1Doc* pDoc = GetDocument(); • ASSERT_VALID(pDoc); • if (!pDoc) • return; • int a=10,b=3;; • const CString c=_T("Hello,Everyone"); • pDC->TextOutW(a,b,c);

C 面向对象程序设计(2010年清华大学出版社出版的图书)

C  面向对象程序设计(2010年清华大学出版社出版的图书)
除了发表过大量的学术论文,Savitch教授还编写了多部非常畅销的计算机教材。
第1章计算机和C++编程入门 概述 1.1计算机系统 1.2编程和问题求解 1.3 C++入门 1.4测试和调试 小结 自测题答案 编程项目 第2章 C++基础知识 概述
图书五
内容简介
图书目录
《C++面向对象程序设计》从实际应用出发,系统地介绍C++面向对象程序设计的原理、方法和技巧。重点突 出,叙述清楚,深入浅出,论述详尽,使读者既能深刻领会面向对象程序设计的思想,了解面向对象程序设计的 特征,又能掌握C++语言的编程与应用。全书共8章,主要包括:面向对象程序设计语言概述、C++语言基础知识、 类和对象、对象成员和友员、继承和派生、多态性和运算符重载、模板、C++的输入/输出流。在每一章的知识点 后面,都给出了相应的程序设计实例,这些实例不仅有助于读者巩固知识点的内容,而且更有助于读者创新能力 的培养。
图书一
内容提要
目录
C++面向对象程序设计本书介绍了C++面向对象程序设计的基本知识和编程方法,以及C++面向对象的基本特征。 针对初学者的特点,本书力求通过大量实例、习题和上机实验题,以通俗易懂的语言讲解复杂的概念和方法,使读 者能深刻理解和领会面向对象程序设计的特点和风格,掌握其方法和要领,以期帮助读者尽快地迈入面向对象程 序设计的大门。
Savitch教授的研究领域包括复杂性理论、形式语言理论、计算语言学和计算机教材的开发。他因为对复杂 性理论所做的贡献而声名远扬,其中包括他提出的第一个完整语言(complete1anguage)范例。这个奠基性的

C语言程序设计(江宝钏著)清华大学出版社第9章习题答案(1)

C语言程序设计(江宝钏著)清华大学出版社第9章习题答案(1)

C语言程序设计(江宝钏著)清华大学出版社第9章习题答案(1)习题9 答案第5 题:#includevoid infoinput(struct student* st,int num);void levelcount(struct student* st,int num);//定义一个结构student 表示学生基本情况struct student{char stuno[20];char stuname[20];double cgrade;char gradelevel;};int main(){struct student ss[100]; //根据题意,一个班学生人数不超过100 个int snum=0;while (snum<=0||snum>100){printf("请输入班级的学生数n<=100:");scanf("%d",&snum);}infoinput(ss,snum);levelcount(ss,snum);return 0;}//输入基本数据void infoinput(struct student* st,int num){int i=0;while(i<num){< bdsfid="89" p=""></num){<>printf("请输入学生%1d 的学号、姓名、计算机成绩:",i+1);scanf("%s%s%lf",st[i].stuno,st[i].stuname,&st[i].cgrade); while (st[i].cgrade<0||st[i].cgrade>100){printf("请输入学生%1d 的计算机成绩[0-100]:",i+1);scanf("%lf",&st[i].cgrade);}if (st[i].cgrade>=90) st[i].gradelevel='A';else if(st[i].cgrade>=70) st[i].gradelevel='B';else if(st[i].cgrade>=60) st[i].gradelevel='C';else st[i].gradelevel='D';i++;}}//统计等级人数void levelcount(struct student* st,int num){int levelA=0,levelB=0,levelC=0,levelD=0;int i;for(i=0;i<num;i++){< bdsfid="107" p=""></num;i++){<> switch (st[i].gradelevel){case 'A':levelA++;break;case 'B':levelB++;break;case 'C':levelC++;break;case 'D':levelD++;break;};}printf("统计结果:A:%d 人,B:%d 人,C:%d 人,D:%d 人\n",levelA,levelB,levelC,levelD);}第6 题:#include#includevoid finit();void fcreat();void fdelete();void fupdate();void ffind();//定义日期struct date{int year;int month;int day;};//定义一个结构student 表示学生基本情况struct llist{char name[20];struct date birthday;char homeno[10];char mobileno[20];};struct llist addlist[50];//如果不用链表做,假设://通讯录每个位置记录一个联系人信息//如果某位置联系人姓名信息为空,表示该位置无联系人int main(){int menuno=0;while (1){printf("\n 请选择操作功能:\n");printf("[1]新建:\n");printf("[2]删除:\n");printf("[3]修改:\n");printf("[4]查询:\n");printf("[5]退出:\n");scanf("%d",&menuno);switch(menuno){case 1:fcreat();break;case 2:fdelete();break;case 3:fupdate();break;case 4:ffind();break;case 5:return 0;default:printf("错误选项,请重新选择!\n");};}return 0;}void finit(){int i;for(i=0;i<50;i++) {strcpy(addlist[i].name,"");addlist[i].birthday.year=0;addlist[i].birthday.month=0;addlist[i].birthday.day=0;strcpy(addlist[i].homeno,"");strcpy(addlist[i].mobileno,"");}}void fcreat(){int i;char oname[20];int oyear;int omonth;int oday;char ohomeno[10];char omobileno[20];printf("请输入联系人信息姓名、出生年、月、日、家庭电话、手机号:\n"); scanf("%s%d%d%d%s%s",oname,&oyear,&omonth,&oday,oho meno,omobileno); for(i=0;i<50;i++) {if (strlen(addlist[i].name)==0) {strcpy(addlist[i].name,oname);addlist[i].birthday.year=oyear;addlist[i].birthday.month=omonth;addlist[i].birthday.day=oday;strcpy(addlist[i].homeno,ohomeno);strcpy(addlist[i].mobileno,omobileno);printf("已增加新联系人\n");break;}}if (i>=50) printf("通讯录满,无法增加新联系人\n");void fdelete(){int i;char oname[20];printf("请输入联系人姓名:\n");scanf("%s",oname);for(i=0;i<50;i++) {if (strcmp(addlist[i].name,oname)==0) {strcpy(addlist[i].name,"");addlist[i].birthday.year=0;addlist[i].birthday.month=0;addlist[i].birthday.day=0;strcpy(addlist[i].homeno,"");strcpy(addlist[i].mobileno,"");printf("已删除该联系人%s\n",oname);break;}if (i>=50) printf("无该联系人,无法删除\n");}void fupdate(){int i;char oname[20];char nname[20];int nyear;int nmonth;int nday;char nhomeno[10];char nmobileno[20];printf("请输入联系人姓名:\n");scanf("%s",oname);printf("请输入联系人信息姓名、出生年、月、日、家庭电话、手机号:\n"); scanf("%s%d%d%d%s%s",nname,&nyear,&nmonth,&nday,nho meno,nmobileno); for(i=0;i<50;i++) {if (strcmp(addlist[i].name,oname)==0) {strcpy(addlist[i].name,nname);addlist[i].birthday.year=nyear;addlist[i].birthday.month=nmonth;addlist[i].birthday.day=nday;strcpy(addlist[i].homeno,nhomeno);strcpy(addlist[i].mobileno,nmobileno);printf("已修改联系人%s\n",nname);break;}if (i>=50) printf("无该联系人,无法修改\n");void ffind(){int i;char oname[20];printf("请输入联系人姓名:\n");scanf("%s",oname);for(i=0;i<50;i++) {if (strcmp(addlist[i].name,oname)==0) {printf("姓名:%s",addlist[i].name);printf(" 出生日期:%1d 年%1d 月%1d 日",addlist[i].birthday.year,addlist[i].birthday.month,addlist[i].bi rthday.day); printf("家庭电话:%s",addlist[i].homeno);printf("手机:%s",addlist[i].mobileno);break;}}if (i>=50) printf("无该联系人\n");}第7 题:#includevoid salaryinput(struct salary* sl,int num);void salarylist(struct salary* sl,int num);struct salary{char id[20];char name[20];double base;double merit;double subsidiary;double insurance;double tax;double real;};int main(){struct salary ss[100]; //工资人数不超过100 个int snum=0;while (snum<=0||snum>100){printf("请输员工人数n<=100:");scanf("%d",&snum);}salaryinput(ss,snum);salarylist(ss,snum);return 0;void salaryinput(struct salary* sl,int num){int i=0;while(i<num){< bdsfid="279" p=""></num){<>printf("请输入员工%1d 的编号、姓名、基本工资、绩效工资、津贴工资、保险:\n",i+1); scanf("%s%s%lf%lf%lf%lf",sl[i].id,sl[i].name,&sl[i].base,&sl[i].meri t,&sl[i].su bsidiary,&sl[i].insurance);sl[i].tax=(sl[i].base+sl[i].merit+sl[i].subsidiary)*0.05;sl[i].real=(sl[i].base+sl[i].merit+sl[i].subsidiary-sl[i].insurance-sl[i].tax); i++;}}void salarylist(struct salary* sl,int num){int i;for(i=0;i<num;i++){< bdsfid="289" p=""></num;i++){<>printf("员工的编号、姓名、实发工资如下:",i+1);printf("%s %s %lf\n",sl[i].id,sl[i].name,sl[i].real);}}第8 题:#include#includevoid linkcreat();void linklist();struct Node{char data;struct Node *link;};Node *snode=NULL,*tmpnode,*lastnode;int main(){linkcreat();linklist();//最好增加一个释放链表的函数,为什么?return 0;}void linkcreat(){char c;lastnode=snode;printf("请输入一行字符:\n");while(scanf("%c",&c),c!='\n'){tmpnode=(Node*)malloc(sizeof(Node)); tmpnode->data=c;if (snode==NULL) snode=tmpnode;else lastnode->link=tmpnode; lastnode=tmpnode; }lastnode->link=NULL;}void linklist(){tmpnode=snode;while(tmpnode!=NULL){printf("%c",tmpnode->data); tmpnode=tmpnode->link; }printf("\n");}。

《C语言程序设计》教案(清华谭浩强)

《C语言程序设计》教案(清华谭浩强)

《C语言程序设计》教案(清华谭浩强)第一章:C语言概述1.1 课程介绍介绍C语言的历史和发展解释C语言的特点和应用范围强调学习C语言的重要性和目的1.2 C语言的基本概念解释编程语言和编译器的概念介绍C语言的基本数据类型和变量讲解C语言的语法结构和程序结构1.3 C语言的编译过程解释编译器的角色和功能介绍编译过程中的预处理、编译、汇编和步骤强调编译过程中产生的文件和它们的作用第二章:基本数据类型和运算符2.1 基本数据类型介绍整型、浮点型、字符型和布尔型的概念和用法解释不同数据类型的存储方式和大小强调数据类型的选择和使用场景2.2 变量和常量解释变量的概念和作用介绍变量的声明和初始化方法讲解常量的概念和用法2.3 运算符介绍算术运算符、关系运算符和逻辑运算符的概念和用法解释赋值运算符和条件运算符的作用强调不同运算符的优先级和使用规则第三章:控制语句3.1 条件语句介绍if语句的语法和用法讲解switch语句的概念和用法强调条件语句的选择和嵌套使用3.2 循环语句介绍for循环、while循环和do-while循环的概念和用法解释循环控制语句如break和continue的作用强调循环条件的设置和循环次数的控制3.3 跳转语句介绍goto语句的概念和用法讲解label标签的作用和跳转规则强调跳转语句的使用场景和可能导致的问题第四章:函数和指针4.1 函数的基本概念介绍函数的定义和声明讲解函数的参数传递和返回值强调函数的命名规则和命名规范4.2 指针的概念和用法解释指针的概念和作用介绍指针的声明和初始化方法讲解指针的赋值和指针运算4.3 指针和数组介绍数组的概念和用法解释指针和数组的关系强调指针在数组操作中的应用第五章:结构体和文件操作5.1 结构体的概念和用法介绍结构体的定义和声明讲解结构体的成员访问和内存布局强调结构体在数据组织中的应用5.2 文件操作的基本概念解释文件的概念和文件操作的重要性介绍文件打开、读写、关闭等操作的方法强调文件操作中的错误处理和文件指针的管理第六章:动态内存分配6.1 动态内存分配的概念介绍动态内存分配的原因和必要性解释malloc、calloc和realloc函数的作用和用法强调动态内存分配的注意事项和错误处理6.2 链表的概念和用法介绍链表的定义和结构讲解链表的创建、插入、删除和遍历操作强调链表的优势和应用场景6.3 动态内存分配的应用实例通过实例演示动态内存分配在实际编程中的应用讲解内存泄漏和内存溢出的概念强调编写高效和安全的程序的重要性第七章:字符串处理7.1 字符串的基本概念介绍字符串的定义和表示方法解释字符串的长度和字符串的结束标志强调字符串与数组的区别和联系7.2 字符串的常用函数介绍字符串的输入输出函数如printf和scanf 讲解字符串的拷贝、连接、比较等操作函数强调字符串处理函数的使用和注意事项7.3 字符串处理的应用实例通过实例演示字符串处理在实际编程中的应用讲解字符串排序、查找和替换等操作强调字符串处理在文本分析和数据处理中的应用第八章:标准库函数8.1 标准输入输出库函数介绍标准输入输出库stdio.h中的常用函数讲解文件读写、数据转换等函数的用法和功能强调标准库函数的使用场景和注意事项8.2 字符串处理库函数介绍字符串处理库string.h中的常用函数讲解字符串比较、查找和替换等函数的用法和功能强调字符串处理库函数的使用和与其他库函数的配合8.3 数学计算库函数介绍数学计算库math.h中的常用函数讲解数学运算、三角函数和指数函数等函数的用法和功能强调数学计算库函数在数学计算和科学计算中的应用第九章:并发编程和同步机制9.1 并发编程的基本概念介绍并发编程的定义和目的解释进程和线程的概念和关系强调并发编程的优势和挑战9.2 并发编程的同步机制介绍互斥锁、条件变量和信号量等同步机制的原理和用法讲解同步机制在多线程编程中的应用和注意事项强调同步机制在避免竞态条件和数据一致性中的重要性9.3 并发编程的应用实例通过实例演示并发编程在实际应用中的优势和挑战讲解多线程的创建、同步和通信等操作强调并发编程在多任务处理和性能优化中的应用第十章:C语言编程实践10.1 编程实践的重要性强调编程实践在学习和掌握C语言中的重要性解释编程实践对于提高编程能力和解决问题的作用强调编程实践中的代码质量和编程规范10.2 编程实践的项目和案例介绍常见的编程实践项目和案例讲解实际编程中的问题解决方法和技巧强调编程实践中的调试和测试的重要性10.3 编程实践的资源和工具介绍编程实践中的常用工具和环境讲解集成开发环境(IDE)的使用和代码管理强调编程实践中的团队合作和代码分享的重要性重点和难点解析重点环节1:C语言的基本概念和特点需要重点关注C语言的历史和发展,以及其特点和应用范围。

C语言程序设计_课件_第九章(适于清华谭浩强版)

C语言程序设计_课件_第九章(适于清华谭浩强版)

注意, 注意,对嵌套结构体的引用必须引用
到最末一级。 到最末一级。
struct OBJECT { struct TASK { long plan; long start; long finish; } ti,tj; int count; } ob;
可以使用scanf(“%d”,&ob.ti.plan) 输 可以使用 入数据。但是不能引用ob.ti 。 入数据。但是不能引用
9.2 结构体与数组 9.2.1结构体包含数组 结构体包含数组 由于结构体的成员可以是任何基 本数据类型和另外一个构造类型, 本数据类型和另外一个构造类型,所 以结构体的成员当然可以是数组。 以结构体的成员当然可以是数组。 下面我们说明一个可以描述一个股票 信息的结构体: 信息的结构体:
struct STOCK { char stockname[8]; /*股票名称 */ 股票名称 char stockcode[6]; /*股票代码 */ 股票代码 float price[3]; /*买 入价、卖出价、成交价 */ 买 入价、卖出价、 }; ;
不能混淆结构体名和结构体变量这两 个概念。 个概念。结构体名实际上标识了程序员定 义的一种新的数据类型, 义的一种新的数据类型,编译系统不可能 为结构体名分配内存空间。 为结构体名分配内存空间。只有当变量被 说明为这种由程序员自己定义的数据类型 的结构体时, 的结构体时,编译系统才会为结构体变量 分配存储空间。在不引起混淆的情况下, 分配存储空间。在不引起混淆的情况下, 结构体变量可以简称为结构体。 结构体变量可以简称为结构体。
*/
Struct STOCK sfz={"ShenFaZhan","000001",8.77,8.78,8.78 }; /*用深发展的数据初始化结构体变量 用深发展的数据初始化结构体变量sfz*/ 用深发展的数据初始化结构体变量 printf("\n %s %s ", sfz.stockname, sfz .stockcode); /*输出股票名称和股票代码 */ 输出股票名称和股票代码 for (i=0;i<3;i++) /*输出股票的买入价、卖出价和成交价 输出股票的买入价、 输出股票的买入价 卖出价和成交价*/ printf("%6.2f ", sfz.price[i]); }

数据结构(C语言版清华大学出版社)-章课后部分答案

数据结构(C语言版清华大学出版社)-章课后部分答案

第八章选择题1. C2.A3.B4.C5.D6.B7.B8.A9.D 10.D 11.C 12.C填空题1.n、n+12. 43.8.25( 折半查找所在块 )4.左子树、右子树5.266.顺序、(n+1)/2、O(log2n)7.m-1、[m/2]-18.直接定址应用题1.进行折半查找时,判定树是唯一的,折半查找过程是走了一条从根节点到末端节点的路径,所以其最大查找长度为判定树深度[log2n]+1.其平均查找长度约为[log2n+1]-1.在二叉排序树上查找时,其最大查找长度也是与二叉树的深度相关,但是含有n个节点的二叉排序树不是唯一的,当对n个元素的有序序列构造一棵二叉排序树时,得到的二叉排序树的深度也为n,在该二叉树上查找就演变成顺序查找,此时的最大查找长度为n;在随机情况下二叉排序树的平均查找长度为1+4log2n。

因此就查找效率而言,二分查找的效率优于二叉排序树查找,但是二叉排序树便于插入和删除,在该方面性能更优。

3. 评价哈希函数优劣的因素有:能否将关键字均匀的映射到哈希表中,有无好的处理冲突的方法,哈希函数的计算是否简单等。

冲突的概念:若两个不同的关键字Ki和Kj,其对应的哈希地址Hash(Ki) =Hash(Kj),则称为地址冲突,称Ki和K,j为同义词。

(1)开放定址法(2)重哈希法(3)链接地址法4.(1)构造的二叉排序树,如图(2)中序遍历结果如下:10 12 15 20 24 28 30 35 46 50 55 68(4)平均查找长度如下:ASLsucc = (1x1+2x2+3x3+4x3+5x3)/12 = 41/128.哈希地址如下:H(35) = 35%11 = 2H(67) = 67%11 = 1H(42) = 42%11 = 9H(21) = 21%11 = 10H(29) = 29%11 = 7H(86) = 86%11 = 9H(95) = 95%11 = 7H(47) = 47%11 = 3H(50) = 50%11 = 6H(36) = 36%11 = 3H(91) = 91%11 = 3第九章选择题1. D2.C3.B4.D5.C6.B7.A8.A9.D 10.D填空题1.插入排序、交换排序、选择排序、归并排序2.移动(或者交换)3.归并排序、快速排序、堆排序4.保存当前要插入的记录,可以省去在查找插入位置时的对是否出界的判断5.O(n)、O(log2n)6.直接插入排序或者改进了的冒泡排序、快速排序7.Log2n、n8.完全二叉树、n/29.1510.{12 38 25 35 50 74 63 90}应用题11.(1)Shell排序(步长为5 3 1)每趟的排序结果初始序列为100 87 52 61 27 170 37 45 61 118 14 88 32步长为5的排序14 37 32 61 27 100 87 45 61 118 170 88 52步长为3的排序结果14 27 32 52 37 61 61 45 88 87 170 100 118步长为1的排序结果14 27 32 37 45 52 61 61 87 88 100 118最后结果14 27 32 37 45 52 61 61 87 88 100 118 170(2)快速排序每趟的排序结果如图初始序列100 87 52 61 27 170 37 45 61 118 14 88 32第一趟排序[32 87 52 61 27 88 37 45 61 14]100[118 170]第二趟排序[14 27]32[61 52 88 37 45 61 87]100 118[170]第三趟排序14[27]32[45 52 37]61[88 61 87]100 118[170]第四趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]第五趟排序14[27]32[37]45[52]61[87 61]88 100 118[170]最后结果14[27]32[37]45[52]61[61]87 88 100 118[170](3)二路归并排序每趟的排序结果初始序列[100][87][52][61][27][170][37][45][61][118][14][88][32]第一趟归并[87 100][52 61][27 170][37 45][61 118][14 88][32]第二趟归并[52 61 87 100][27 37 45 170][14 61 88 118][32]第三趟归并排序[27 37 45 52 61 87 100 170][14 32 61 88 118]第四趟归并排序[14 27 32 37 45 52 61 61 87 88 100 118 170]最后结果14 27 32 37 45 52 61 61 87 88 100 118 17012.采用快速排序时,第一趟排序过程中的数据移动如图:算法设计题1.分析:为讨论方便,待排序记录的定义为(后面各算法都采用此定义):#define MAXSIZE 100 /* 顺序表的最大长度,假定顺序表的长度为100 */ typedef int KeyType; /* 假定关键字类型为整数类型 */typedef struct {KeyType key; /* 关键字项 */OtherType other; /* 其他项 */}DataType; /* 数据元素类型 */typedef struct {DataType R[MAXSIZE+1]; /* R[0]闲置或者充当哨站 */int length; /* 顺序表长度 */}sqList; /* 顺序表类型 */设n个整数存储在R[1..n]中,因为前n-2个元素有序,若采用直接插入算法,共要比较和移动n-2次,如果最后两个元素做一个批处理,那么比较次数和移动次数将大大减小。

C程序设计第九章

C程序设计第九章

包含文件的查找方法: 包含文件的查找方法: #include “文件名” 文件名” 文件名 先在当前工作目录中去查找, 先在当前工作目录中去查找,若找不 到再到指定的标准目录中去查找。 到再到指定的标准目录中去查找。 C编译系统 编译系统, 如:对Turbo C编译系统,先在用户目录下 查找,然后在TC include文件夹中查找 TC\ 文件夹中查找。 查找,然后在TC\include文件夹中查找。 #include <文件名 文件名> 文件名 直接到系统指定的标准目录中去查找。 直接到系统指定的标准目录中去查找。 C编译系统 直接在TC 编译系统, TC\ 如:对Turbo C编译系统,直接在TC\include 文件夹中查找。 文件夹中查找。
main() printf(“%d %d\ ,S(N));} { printf( %d\n”,S(N));} 运行结果为: 运行结果为:17 3+2*3+2*3+2
三、带参数的宏替换与函数的主要区别
⑴函数调用时,先求出实参表达式的值,然后代入 函数调用时,先求出实参表达式的值, 形参。而使用带参的宏只是进行简单的字符替换。 形参。而使用带参的宏只是进行简单的字符替换。 ⑵函数调用是在程序运行时处理的,分配临时的内 函数调用是在程序运行时处理的, 存单元。而宏替换则是在编译时进行的, 存单元。而宏替换则是在编译时进行的,在展开 时并不分配内存单元,不进行值的传递处理, 时并不分配内存单元,不进行值的传递处理,也 没有“返回值”的概念。 没有“返回值”的概念。 宏替换不占运行时间,只占编译时间, ⑶宏替换不占运行时间,只占编译时间,而函数调 用则占运行时间。 用则占运行时间。 函数中函数名及参数均有一定的数据类型, ⑷函数中函数名及参数均有一定的数据类型,而宏 不存在类型问题,宏名及其参数无类型。 不存在类型问题,宏名及其参数无类型。

清华大学c语言教案第九章

清华大学c语言教案第九章

宏定义是用宏名代替一个字符串, 3.宏定义是用宏名代替一个字符串, 也就是 作简单的置换,不作语法检查。 作简单的置换,不作语法检查。如果写成 #define PI 3.14159 即把数字1写字母1 预处理时也照样代入, 即把数字 1写字母1 ,预处理时也照样代入 , 不管含义是否正确。 不管含义是否正确。只有在编译已被宏展开后的 源程序时才报错。 源程序时才报错。 宏定义不是C 语句, 不必在行末加分号。 4 . 宏定义不是 C 语句 , 不必在行末加分号 。 如果加了分号则会连分号一起进行置换。 如果加了分号则会连分号一起进行置换。如: 1415926; #define PI 3.1415926; area=PI*r*r; area=PI*r*r; 经过宏展开后, 经过宏展开后,该语句为 area=3 1415926;*r*r; area=3.1415926;*r*r; 显然出现语法错误。 显然出现语法错误。
§9.1宏定义 9.1宏定义 §9.2 “文件包含”处理 文件包含”
§9.1宏定义 9.1宏定义 9.1.1不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字 符串,它的一般形式为 #define 标识符 字符串 这就是已经介绍过的定义符号常量。如 #define PI 3.1415926 它 的 作 用 是 指 定 用 标 识 符 PI 来 代 替 “3.1415926”这个字符串,在编译预处理时, 把 程 序 中 在 该 命 令 以 后 的 所 有 的 PI 都 用 “3.1415926”代替。这种方法使用户能以一个 简单的名字代替一个长的字符串,因此把这个 标识符(名字)称为“宏名”,在预编译时将宏 名替换成字符串的过程称为“宏展开”。 #define是宏定义命令。
[例9.1] #define PI 3.1415926 main() l,s,r,v; {float l,s,r,v; "); printf ("input radius : "); ("%f",&r); scanf ("%f",&r); l=2 *PI*r; l=2.0*PI*r; s=PI*r*r; s=PI*r*r; v=4 *PI*r*r*r; v=4.0/3*PI*r*r*r; ("I=%10.4f\ns=%10.4f\ printf ("I=%10.4f\ns=%10.4f\n",l,s,v); } 运行情况如下: 运行情况如下: radius: input radius:4 l=25 25. l=25.1328 s=50 50. s=50.2655 v=268 268. v=268.082

C语言程序设计教程_李含光_郑关胜_清华大学出版社习题答案习题答案[完美打印版]

C语言程序设计教程_李含光_郑关胜_清华大学出版社习题答案习题答案[完美打印版]
5
void f3(float,float,float,float);int main() { float a,b,c,d; scanf("%f %f %f",&a,&b,&c); if(a==0) { printf(" 不 是 一 元 二 次 方 程 \n"); exit(0); } d=b*b-4*a*c; if(d>0) f1(a,b,c,d); else if(d==0) f2(a,b,c,d); else f3(a,b,c,d); return 0; } void f1(float a,float b,float c,float d){ float x1,x2; { x1=(-b+sqrt(d))/(2*a); x2=(-b-sqrt(d))/(2*a); printf("%.2f ,%.2f\n",x1,x2); } } void f2(float a,float b,float c,float d){ float x1,x2; { x1=-b/(2*a); x2=-b/(2*a); printf("%.2f ,%.2f\n",x1,x2); } }
3
{ int i,j,k; for(i=1;i<=9;i++) for(j=0;j<=9;j++) for(k=0;k<=9;k++) printf("%5d",100*i+10*j+k); return 0; } (9) . #include<stdio.h> #include<math.h> int main() { float a=-10,b=10,x,f1,f2,f; f1=(((2*a-4)*a+3)*a)-6; f2=(((2*b-4)*b+3)*b)-6; do { x=(a+b)/2; f=(((2*x-4)*x+3)*x)-6; if(f*f1<0) { b=x; f2=f; } else { a=x; f1=f; } }while(fabs(f)>=1e-6); printf("%6.2f\n",x); return 0; } (10) . #include<stdio.h>

清华C++语言程序设计:第09章_链表

清华C++语言程序设计:第09章_链表

例子1:建立链表,读入n个整数,每 个整数作为一个新结点插入到链尾
node *createList(int n) { node *temp, *tail = NULL, *head = NULL ; int num; cin >> num; head = new node ; // 为新节点动态分配内存 if (head == NULL) { cout << "No memory available!"; return NULL; } else { head->data = num; head->next = NULL; tail = head; } 2017/4/17
9.2.2 单向链表的操作

建立单向链表



声明一个链首指针变量head,并赋初值 NULL(包含0个节点的链表) 动态分配一个新节点,将该节点链入链尾 重复上一步
2017/4/17
9
建立动态链表
head
99101
temp tail
待插入的结点temp 数据部分初始化,该 结点被头结点head、 尾结点tail同时指向.
24
例子4:编写一个函数,将输入的整数 从小到大插入链表
newNode->data = n; if (preNode == NULL) //插入到链表头 { newNode->next = curNode; return newNode; } else { preNode->next = newNode; newNode->next = curNode; return head; }
16
例子1:建立链表,读入n个整数,每 个整数作为一个新结点插入到链尾

C++程序设计课件第九章(清华第三版)

C++程序设计课件第九章(清华第三版)

CScrollBar类的主要成员函数 BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo, UINT nMask = SIF_ALL); 获取的滚动条的参数信息,该信息为 SCROLLINFO结构体的形式。参数 lpScrollInfo为指向SCROLLINFO结构体变 量的指针。 SCROLLINFO结构体的定义如下:

获取滚动块的当前位置。如果失败则返回0 。
int SetScrollPos(intnPos, BOOL bRedraw = TRUE); 将滚动块移动到指定位置。参数nPos指定了滚动块的新 位置,参数bRedraw表示是否需要重绘滚动条,如果为 TRUE,则重绘。函数返回滚动框原来的位置,若操作失 败则返回0。 void GetScrollRange(LPINT lpMinPos, LPINT lpMax Pos) const; 获取滚动条的滚动范围。参数lpMinPos指向滚动条滚动 范围的最小值,参数lpMaxPos指向滚动条滚动范围的最 大值。
滚动条控件的创建
MFC也为滚动条控件的操作提供了类, 即为CScrollBar类。 滚动条控件的创建依然有两种方式,一种 是直接在Toolbox中将滚动条控件拖入对话 框模板,然后添加控件变量使用,另一种 就是用CScrollBar类的Create成员函数动 态创建。这两种方式适用于不同的场合。
9.3 滚动条控件
滚动条控件简介 滚动条大家也很熟悉了,Windows窗口中很多都有滚动条。 列表框和组合框设置了相应属性后,如果列表项显示不下也 会出现滚动条。滚动条分为水平滚动条 (Horizontal Scroll Bar)和垂直滚动条 (Vertical Scroll Bar)两种。滚动条中有一个滚动块,用 于标识滚动条当前滚动的位置。我们可以拖动滚动块,也可 以用鼠标点击滚动条某一位置使滚动块移动。 从滚动条的创建形式来分,有标准滚动条和滚动条控件两种。 像列表框和组合框设置了WS_HSCROLL 或WS_VSCROLL风格以后 出现的滚动条,不是一个独立的窗口,而是这些窗口的一部 分,这就是标准滚动条。而滚动条控件是一个独立的窗口, 它可以获得焦点,响应某些操作。

C语言(清华大学出版社)ppt课件

C语言(清华大学出版社)ppt课件
结构。 (4)具有结构化的控制语句 ,是完全模块化
和结构化的语言。 (5)语法限制不太严格,程序设计自由度大。
C程序设计(第三版)
C语言的特点
(6)允许直接访问物理地址,能进行位操 作,能实现汇编语言的大部分功能,可直接 对硬件进行操作。兼有高级和低级语言 的特点 。
(7)目标代码质量高,程序执行效率高。 只比汇编程序成的目标代码效率低10 %-20%。
C程序设计(第三版)
算法如下 :
S1:输入n
S2:i=2
(i作为除数)
S3:n被i除,得余数r
S4:如果r=0,表示n能被i整除,则打印n“不 是素数”,算法结束。否则执行S5
S5:i+1→i
S6:如果i≤n-1,返回S3。否则打印 n “是素
实际上,n不必被2到(n-1)的整数除,只需 被2到n/2间整数除,甚至只需被2到 之n 间的 整数除即可。
C程序设计(第三版)
说明: 本程序的作用是输出一行信息:
1.3 简单的C语Th言is程i序s a介C绍program.
#include <stdio.h>
/*文件包含*/
main( )
/*主函数 */
{
/*函数体开始*/
printf ("This is a C program.\n"); /*输出语句*/
(8)程序可移植性好(与汇编语言比)。基 本上不做修改就能用于各种型号的计算 机和各种操作系统。
C程序设计(第三版)
1.2 C语言的特点
问题:既然有了面向对象的C++语言,为 什么还要学习C语言?
解释1:C++是由于开发大型应用软件的需 要而产生的,并不是所有的人都要去编 写大型软件。

清华大学原版C#学习资料 第九章 继承

清华大学原版C#学习资料 第九章 继承
第九章 继承
目标
继承的类型 继承的实现 修饰符 接口继承
体验
• 程序运行时实现老虎、鹰、鲨鱼三个对象, 分别调用它们的一个方法。
继承 3-1
Class Base
基类
派生类
{ // 成员变量
Class Derived : Base {
int basevar; // 成员函数
// 成员变量 int derivedvars; // 成员函数
void ApplyBeta();
static void Main(string[] args) {
MyImages objM = new MyImages();
}
//第二个接口
objM.DisplayImage();
public interface IPict
objM.DeleteImage();
}
}
总结
继承的类型 继承的实现 修饰符 接口继承
public Teacher(string name, uint age, uint id):base(name, age)
{
this._id = id;
Console.WriteLine(_id);
}
}
关键字 override
基类
派生类
Class Base {
// 成员变量 int basevar;继承-3基类派生类
// 成员变量
int eyes, nose;
Animal()
{
eyes = 2;
nose = 1;
}
Pet_Animal()
{
Class Dog : Animal {
// 成员变量 // 成员函数 private Barking() {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单击滚动块 与箭头之间 的区域。滚 动块上移或 下移三格, 编辑框中的 单击Reset 数字加3或 按钮,滑 减3 块移到中 间,编辑 单击Exit 框的数字 按钮,退 变为10 出应用程 序 按住滚动块 上下拖动。 编辑框中的 数字随着随 之变化
单击Down按钮 ,滚动块移到 最下边,编辑 框的数字变为 20
CScrollBar 类的方法 说明 使滚动条的一个或两个箭头有效或无效 获得滚动条的消息 获得滚动条的范围 获得滚动条当前的位置 获得制定滚动条的当前最大和最小滚动位置 设置滚动条的消息 设置滚动块当前的位置 设置制定滚动条的最大和最小滚动位置 显示或隐藏滚动条
常用滚动条动作标识及其说明 SB_TOP / SB_BOTTOM :滚动到滚动条最顶/底端 SB_LINEUP / SB_LINEDOWN:向上 / 下滚动一行 SB_LEFT / SB_RIGHT:滚动到左 / 右边 SB_LINELEFT / SB_LINERIGHT:向左 / 右滚动一 行 SB_PAGEUP / SB_PAGEDOWN :向上 / 下滚动一页 SB_PAGELEFT / SB_PAGERIGHT :向左 / 右滚动 一页 SB_THUMBPOSITION:滚动框移动到新位置 SB_THUMBTRACK:滚动框被拖动 SB_ENDSCROLL:滚动到最终位置
(3) 给滚动条消息添加代码 void CMy9_2Dlg::OnVScroll(……) { // TODO: Add your message handler code here char sPos[10]; int iNowPos; switch(nSBCode) { if(pScrollBar==&m_Scrollbar) { case SB_THUMBTRACK: //拖动滑块 m_Scrollbar.SetScrollPos(nPos); itoa(nPos,sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos);
(6) 给 Down按钮添加代码 void CMy9_2Dlg::OnDownButton() { m_Scrollbar.SetScrollPos(20); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("20"); }
(7) 给Reset按钮添加代码 void CMy9_2Dlg::OnResetButton() { m_Scrollbar.SetScrollPos(10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("10"); }
case SB_LINEUP: //单击滚动条向上的箭头 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos-1; if(iNowPos<0) iNowPos=0; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10 ); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break;
• 3) No prefix • 禁止文本中的“&”解释为它后面的字符有一个下划线, 直接将它作为文本的一部分进行显示。No • prefix 选项经常在显示包含“&”的文件名或字符串中 用到。 • 4) No wrap • 前提条件是文本必须是左对齐的,并且不进行文本的自 动回行。超出控件右边界的文本将被裁去。在这种选项 下 Tabs 是可扩展的,但是单词是不能被完整保护的。 在行的末尾扩展处的那一部分将被剪切掉。它的类型是 布尔型,默认值是 FALSE。 • 5) Simple • 此选项将禁用 No wrap 和 Align text 选项。在静态 文本控件中的文本如果有此属性,就不保护单词的完整 性,且不保证不被剪切。它的类型是布尔型,默认值是 FALSE。
case SB_LINEDOWN: //单击滚动条向下的箭头 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos+1; if(iNowPos>20) iNowPos=20; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break;
9.3 滚动条控件
滚动条是一个交互式的、高度可视化的控件 它包括一个滑块、滚动条的两端的按钮等。
滚动条控件与属于窗口的滚动条是不一样的
滚动条控件是由 用户创建、管理 和释放的
处于窗口的滚 动条是由系统 创建、管理和 释放的
9.3.1 滚动条类的结构及其方法
滚动条可以通过通知代 码来创建,也可以用对 话框资源模板来创建
通过SetScrollPos()设置滚动块当前位置 例如,滚动快的位置在-100到100的中间,即为0 的位置 pMyScroller->SetScrollPos(0);
9.3.3滚动条类编程实例
标题为Application of ScrollBar 滚动条的 滚动范围 设为0到20 单击Up按钮 ,滚动块移 到最上边, 编辑框的数 字变为0
(2) 初始化CScrollBar对象,将
一个Windows滚动条赋予它,并 用CScroll::Create()方法设置 参数和样式
调用CScrollBar::Create()方法初始化指针 BOOL Create(DWORD dwStyle,const RECT& rect,CWnd *pParentWnd,UINT nID);
在应用程序中, 编辑框只是显示 滚动块的位置, 不需要进行编辑, 因此必须将其属 性改为只读
9.4 静态控件
9.4.1 静态控件的特点 一般情况下静态控件不发送消息。 实际应用中,需要静态文本能够象超文本 那样响应用户的输入,向应用程序发送 控件消息。 该样式允许静态控件向其父 窗口发送WM_COMMAND消息, 该消息的字参数的低字节中 包含静态控件的ID,高字节 中包含通知码
1、Static Text 控件 用户能添加到对话框中的最简单控件是静态文 本控件。静态文本控件不要求与对话框进行交互, 需要显示的文本串只要在该控件Caption 属性中 直接输入。对静态文本,可以设置文本的显示风 格,设置属性解释如下: 1) Align text 控制静态文本控件中文本的对齐方式。可能的取 值有 Right(右对齐),Left(左对齐), Center(居中),当 No wrap 选项选中时,这个 选项设置为 Left,它的默认值为 Left。 2) Center vertically 在静态文本控件中将文本垂直方向上居中。它的 类型是布尔型,默认值是 FALSE。
case SB_PAGEUP: //单击箭头与滚块之间的区域 iNowPos=m_Scrollbar.GetScrollPos(); iNowPos=iNowPos-3; if(iNowPos<0) iNowPos=0; m_Scrollbar.SetScrollPos(iNowPos); itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); break; } } CDialog::OnVScroll(nSBCode,nPos, pScrollBar); }
方法 EnableScrollBar() GetScrollInfo() GetScrollLimit() GetScrollPos() GetScrollRange() SetScrollInfo() SetScrollPos() SetScrollRange() ShowScrollBar()
9.3.2 创建与初始化滚动条类
分配一个滚动条控件对象并返回指向该对象的指针 CScrollBar::pMyScroll=new CScrollBar
创建CScrollBar 对象的一般步骤
(1) 用C++关键字new和构造函数 CScrollBar::CScrollBar()为一 个ScrollBar对象分配一个实例
(4) 给Exit按钮连接代码 void CMy9_2Dlg::OnExitButton(ቤተ መጻሕፍቲ ባይዱ { OnOK(); }
(5) 给Up按钮添代码 void CMy9_2Dlg::OnUpButton() { m_Scrollbar.SetScrollPos(0); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel("0"); }
要在创建静态 控件时加入 SS_NOTIFY样式
在程序中出现的文本根据作用的不同,可 以分为两大类:静态文本和动态文本。 静态文本在程序的执行中保持不变,主要用来 表示控件的功能、下一步执行的操作等。 动态文本在程序执行过程中是可以改变的, 在 Windows 中通过可以通过编辑控件来实现。 MFC 中使用 CStatic 类来管理静态文本控 件,包括 StaticText 控件和 Group Box 控件, StaticText 控件通常用来标识一个控件, Group Box 通常用来分割不同组别的控件。
(2) 应用程序的代码编程部分
(a) 给滚动条连接变量
ID IDC_SCROLLBAR IDC_EDITl
变量名 m_Scrollbar m_Edit
类别 Control Control
类型 CScrollbar CEdit
(b) 初始化滚动条
BOOL CMy9_2Dlg::OnInitDialog() { CDialog::OnInitDialog(); …… // TODO: Add extra initialization here m_Scrollbar.SetScrollRange(0,20); m_Scrollbar.SetScrollPos(10); char sPos[10]; itoa(m_Scrollbar.GetScrollPos(),sPos,10); m_Edit.SetSel(0,-1); m_Edit.ReplaceSel(sPos); UpdateData(FALSE); 10进 return TRUE; 制数 }
相关文档
最新文档