《C语言程序设计案例式教程》课件 第10章 预处理_第1页
《C语言程序设计案例式教程》课件 第10章 预处理_第2页
《C语言程序设计案例式教程》课件 第10章 预处理_第3页
《C语言程序设计案例式教程》课件 第10章 预处理_第4页
《C语言程序设计案例式教程》课件 第10章 预处理_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

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

文档简介

第10章预处理《C语言程序设计案例式教程(AI助学)》学习目标/Target掌握不带参数的宏的定义方法,能够使用不带参数的宏。

掌握宏的取消方法,能够取消程序中不需要的宏。掌握带参数的宏的定义方法,能够使用带参数的宏以实现复杂的功能。学习目标/Target掌握文件包含的方法,能够通过文件包含调用已经定义好的功能程序。

掌握条件编译指令的使用方法,能够使用常用的条件编译指令实现程序的编译简化。了解断言,能够说出断言的作用及如何取消断言。章节概述/Summary在C语言中,有一种特殊的指令,即预处理指令,这类指令的作用不是实现程序的功能,而是为C语言编译器提供信息,通知编译器在对源程序进行编译之前应该做哪些预处理工作。C语言提供的预处理指令主要包括宏、文件包含指令和条件编译指令等。本章将对预处理指令进行详细讲解。目录/Contents010203【案例10-1】环保购物袋【案例10-2】交换数组元素【案例10-3】包装输出04【案例10-4】32位平台还是64位平台?目录/Contents050607【案例10-5】劝学【案例10-6】拒绝除以0使用AIGC工具定义宏寻找水仙花数【案例10-1】环保购物袋01案例描述本案例要求编写一个程序,模拟选择环保购物袋购物的场景,具体要求如下。(1)定义数组,表示环保购物袋。数组的长度就是环保购物袋的大小。(2)从键盘输入要购买的商品的名称,并为其分配存储空间。完成之后,在控制台输出购买的商品。知识需求定义数组不知道数组大小定义变长数组宏定义需要掌握不带参数的宏的定义方法,能够使用不带参数的宏。学习目标知识讲解1.不带参数的宏知识讲解1.不带参数的宏宏定义格式如下。#define标识符字符串用于定义宏宏名宏体宏定义示例。#definePI3.1415926 //宏定义知识讲解1.不带参数的宏如果在程序中使用了宏,程序在编译时期会将宏替换为它定义的值,这个过程称为预处理,由预处理器完成。预处理示例。#definePI3.1415926 //宏定义printf("%f\n",PI); //使用宏//宏PI预处理之后printf("%f\n",3.1415926);如果需要更改PI的值,只更改宏定义即可。知识讲解定义宏的注意事项1宏定义末尾不能加分号,否则分号将被视为宏体的一部分,预处理时会发生错误。#defineMAX20;//......if(result==MAX)

printf("equal");错误示例。#defineMAX20;//......if(result==20;)

printf("equal");预处理知识讲解定义宏的注意事项2宏定义中如果出现运算符,需要在合适地方加上括号。否则预处理会出现错误。#defineS3+4;//......a=S*c;错误示例。#defineS3+4//......a=3+4*c; //需要加上括号预处理知识讲解定义宏的注意事项3宏定义允许嵌套,宏定义中的字符串中可以使用已经定义的宏名。#definePI3.141592 //定义宏PI#definePPI*5 //嵌套定义宏printf(“%f”,P); 宏定义嵌套示例。#definePI3.141592#definePPI*5printf(“%f”,3.141592*5);预处理知识讲解定义宏的注意事项4宏定义不支持递归。错误示例。#defineMAXMAX+5

掌握宏的取消方法,能够取消程序中不需要的宏。学习目标知识讲解2.取消宏知识讲解2.取消宏宏定义可以取消,取消宏定义的指令为#undef,预处理器在编译源代码时,发现#undef指令,那么#undef后面这个宏就会被取消,无法生效了。#undef宏名知识讲解预定义宏标准库文件stdio.h中定义了5个关于源程序编译信息的宏,利用这些宏可以轻松获得程序的运行信息,有助于编程人员进行程序调试。预定义宏说明_

_DATE_

_定义源文件编译日期的宏_

_FILE_

_定义源代码文件名的宏_

_LINE_

_定义源代码中行号的宏_

_TIME_

_定义源文件编译时间的宏_

_FUNCTION_

_定义当前所在函数名的宏【案例10-1】环保购物袋巩固前面所学知识,能够利用前面所学知识实现案例10-1。学习目标案例实现定义宏N表示要购买的商品数量,即要选择的环保购物袋的大小。定义字符型指针数组commodities,表示环保购物袋,数组长度为N。遍历数组commodities,从键盘输入要购买的商品的名称。在输入完成之后,输出这些商品的名称。010203案例实现2.完整代码本案例中可以实现的效果图如下。代码实现

【案例10-2】交换数组元素02案例描述数据交换在实际编程中很常见,除了简单的变量交换,有时还会交换数组中的元素。本案例要求编写一个程序,交换两个一维数组中的元素,要求使用宏定义实现。知识需求数组元素交换宏定义实现无参宏定义只能定义固定内容,但数组元素在不断改变有参宏定义掌握带参数的宏的定义方法,能够使用带参数的宏以实现复杂的功能。学习目标知识讲解带参数的宏带参数的宏除了不带参数的宏,C语言还提供了带参数的宏。#define标识符(参数1,参数2,…)字符串带参数的宏定义示例。#definePI3.14 //定义宏PI#defineCOMP_CIR(x)2*PI*x

//定义带参数的宏COMP_CIRintmain() {doubler=1.0;printf("2*pi*r=%f\n",COMP_CIR(r));//引用宏COMP_CIRreturn0;}知识讲解带参数的宏带参数的宏除了不带参数的宏,C语言还提供了带参数的宏。#define标识符(参数1,参数2,…)字符串宏定义预处理之后。#definePI3.14 //定义宏PI#defineCOMP_CIR(x)2*PI*x

//定义带参数的宏COMP_CIRintmain() {doubler=1.0;

printf("2*pi*r=%f\n",

2*3.14*r);return0;}知识讲解带参数的宏带参数的宏带参数的宏与带参数的函数的区别。VS带参数的宏预处理阶段。没有参数类型。不分配内存,无值传递。运行速度快。带参数的函数编译运行时执行。需要定义参数类型。分配内存,有值传递。运行速度慢。知识讲解带参数的宏带参数的宏使用带参数的宏时,要注意参数替换问题。#defineABS(x)((x)>=0?(x):-(x)) //定义宏计算x的绝对值doublex=12;printf("ABS(++x)=%f\n",ABS(++x));

//宏ABS计算++x的绝对值#defineABS(x)((x)>=0?(x):-(x)) //定义宏计算x的绝对值doublex=12;printf(“ABS(++x)=%f\n”,((++x)>=0?(++x):-(++x))));//结果14,错误

预处理知识讲解带参数的宏【案例10-2】交换数组元素巩固前面所学知识,能够利用前面所学知识实现案例10-2。学习目标案例实现123定义带两个参数的宏定义,功能为交换两个参数。定义两个数组,给它们的元素赋值。利用带参宏定义,交换数组元素的值并打印到屏幕上。带参数的宏1.案例设计案例实现本案例中可以实现的效果图如下。代码实现带参数的宏2.完整代码

【案例10-3】包装输出03案例描述在商品交易过程中,包装具有非常重要的作用。精美的包装能使商品看起来更精致、更值得购买,从而极大地促进商品的销售。包装在人们的生活和工作中无处不在,例如穿衣打扮就是一种包装。同样,程序设计中也有各种各样的包装。知识需求在输出数据的文件中需要包含该头文件。文件包含也是一种预处理指令,若要完成本案例,需要学习文件包含的相关知识。掌握文件包含的方法,能够通过文件包含调用已经定义好的功能程序。学习目标知识讲解文件包含文件包含的作用是将一个源程序文件包含到另外一个源程序文件中。#include<文件名>#include“文件名”

编译系统将在系统指定的路径下搜索尖括号(<>)中的文件系统首先会在用户当前工作目录中搜索双引号("")中的文件,如果找不到,再按系统指定的路径进行搜索。知识讲解文件包含文件包含文件包含应用示例。#defineNUM15foo.h文件#include<stdio.h>#include"foo.h"intmain(){intnum=NUM;printf("num=%d\n",num);return0;}project.c文件//插入stdio.h标准库文件内容#defineNUM15intnum=15;printf("num=%d\n",num);intmain(){intnum=NUM;printf("num=%d\n",num);return0;}预处理知识讲解文件包含【案例10-3】包装输出巩固前面所学知识,能够利用前面所学知识实现案例10-3。学习目标案例实现12定义头文件foo.h。在foo.h文件中将int、float/double、char类型数据和字符串的输出形式分别定义为宏INT(x)、DOUBLE(x)、CHAR(x)和STRING(x)。在其他文件中包含头文件foo.h,以输出不同类型的数据。文件包含1.案例设计案例实现本案例中可以实现的效果图如下。代码实现文件包含2.完整代码

【案例10-4】

32位平台还是64位平台?04案例描述本案例要求编写一个程序,模拟判断程序运行环境,如果是32位系统,就输出“程序运行环境为32位平台”;如果系统是64位系统,就输出“程序运行环境为64位平台”。知识需求判断程序运行环境if…else语句编译效率较低条件编译掌握条件编译指令的使用方法,能够使用#if、#else和#endif指令实现程序的编译简化。学习目标知识讲解#if、#else和#endif指令#if、#else、#endif指令根据常量表达式的值决定某段代码是否执行。通常情况下,#if指令、#else指令和#endif会一起使用。#if常数表达式

程序段1#else

程序段2#endif知识讲解#if、#else和#endif指令【案例10-4】

32位平台还是64位平台?巩固前面所学知识,能够利用前面所学知识实现案例10-4。学习目标案例实现010203定义两个宏分别表示Windows32位和64位平台。定义宏SYSTEM表示其中某个平台。使用条件编译指令判断SYSTEM值,若值为32位平台,就输出32位平台提示信息;若值为64位平台,就输出64位平台提示信息。文件包含1.案例设计案例实现本案例中可以实现的效果图如下。代码实现文件包含2.完整代码

【案例10-5】劝学?05案例描述本案例要求编写一个程序模拟劝学的过程,在程序中定义宏HARDWORKING表示勤奋努力,定义宏INEXERTION表示虚度光阴。如果程序中定义了宏HARDWORKING或者没有定义宏INEXERTION,就在控制台输出赞美之言;如果没有定义宏HARDWORKING或者定义了宏INEXERTION,就在控制台输出激励之言。本案例要求使用条件编译实现。知识需求宏HARDWORKING宏INEXERTION#ifdef和#ifndef指令判断两个宏是否定义掌握条件编译指令的使用方法,能够使用#ifdef指令实现程序的编译简化。学习目标知识讲解1.#ifdef1.#ifdef#ifdef指令用于判断某个宏是否被定义。#ifdef宏名

程序段1#else

程序段2#endif宏被定义,则执行程序段1,否则执行程序段2知识讲解1.#ifdef1.#ifdef#ifdef指令用于判断某个宏是否被定义。#definePI3.14#ifdefPI

printf("定义了宏PI\n");#elseprintf("未定义宏PI\n");#endif知识讲解1.#ifdef掌握条件编译指令的使用方法,能够使用#ifndef指令实现程序的编译简化。学习目标知识讲解2.#ifndef#ifndef指令用于确定某一个宏是否未定义,它的作用与#ifdef指令相反。如果宏没有定义,则编译#ifndef指令下的内容,否则就跳过。#ifndef宏名

程序段1#else

程序段2#endif知识讲解2.#ifndef2.#ifndef#ifndef指令用法示例。#defineDEBUG#ifndefDEBUG

printf("输出调试信息\n");#else printf("不输出调试信息\n");#endif知识讲解2.#ifndef2.#ifndef#ifndef指令可以解决头文件重复包含的问题。(1)定义foo.h文件structFoo{ inti;};(2)定义bar1.h和bar1.c文件//bar1.h#include"foo.h"voidbar1(structFoof);//bar1.c#include"bar1.h"voidbar1(structFoof){}知识讲解2.#ifndef2.#ifndef#ifndef指令可以解决头文件重复包含的问题。(3)定义bar2.h和bar2.c文件//bar2.h#include"foo.h"voidbar2(structFoof);//bar2.c#include"bar2.h"voidbar2(structFoof){}知识讲解2.#ifndef2.#ifndef#ifndef指令可以解决头文件重复包含的问题。(4)定义main.c文件#include"foo.h"#include"bar1.h"#include"bar2.h"intmain(){ structFoof={1}; bar1(f); bar2(f); return0;}知识讲解2.#ifndef2.#ifndef编译程序,程序报错。foo.h中定义的structfoo重复包含,即foo.h重复包含知识讲解2.#ifndef2.#ifndef经过预处理之后,main.c文件中的代码。知识讲解2.#ifndef

2.#ifndef解决问题的方法:对foo.h进行修改,使用#ifndef指令和#define指令组合判断foo.h中的内容是否已经定义。#ifndef_FOO_H_#define_FOO_H_structFoo{ inti;};#endif知识讲解2.#ifndef2.#ifndef利用#ifndef指令,经过预处理后的main.c文件中的代码。知识讲解2.#ifndef

案例实现在程序中定义宏HARDWORKING或宏INEXERTION,分别使用#ifdef指令和#ifndef指令判断是否定义了宏HARDWORKING或宏INEXERTION,根据判断结果输出相应的提示信息。2.#ifndef1.案例设计案例实现本案例中可以实现的效果图如下。代码实现2.#ifndef2.完整代码

【案例10-6】拒绝除以006案例描述在数学的除法运算中,0是不能作为除数参与运算的。在程序中编写实现除法运算的相关代码时,如果不小心设置除数为0,在没有提示信息的情况下,很难排查这类错误。本案例要求编写一个程序,实现除法运算,在程序中要对除数进行判断,保证除数不为0。知识需求除数不为0对条件进行检测断言检测条件了解断言,能够说出断言的作用。学习目标知识讲解1.断言C语言中的断言使用宏assert()实现,assert()包含在assert.h标准库中。voidassert(intexpression);assert()接受一个表达式expression作为参数,如果表达式值为真,继续往下执行程序,如果表达式值为假,assert()会调用abort()函数终止程序的执行,并提示失败信息。知识讲解1.断言1.断言(1)断言一次只能检测一个条件。(2)如果有多个条件需要检查,则需要多次使用断言,但频繁使用断言会增加程序开销,降低程序的运行效率。(3)断言失败会强制终止程序,不适合嵌入式程序和服务器程序。(4)断言只能作为程序调试的辅助工具,不能代替条件检测。知识讲解1.断言了解断言与debug,能够说出如何取消断言。学习目标知识讲解2.断言与debug2.断言与debug

取消断言使用#defineNDEBUG宏定义。将#defineNDEBUG宏定义语句插入到as

温馨提示

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

评论

0/150

提交评论