c语言程序设计第十一讲第五章下实用教案_第1页
c语言程序设计第十一讲第五章下实用教案_第2页
c语言程序设计第十一讲第五章下实用教案_第3页
c语言程序设计第十一讲第五章下实用教案_第4页
c语言程序设计第十一讲第五章下实用教案_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

1、1第五章C程序结构第1页/共71页第一页,共72页。2主要(zhyo)内容 数值类型 函数(hnsh)和标准库函数(hnsh) 函数(hnsh)定义和程序的函数(hnsh)分解 C程序结构与变量 预处理命令 定义常量 字位运算符 编程实例第2页/共71页第二页,共72页。3知识回顾(hug)及提升 最重要的思想 模块化程序设计思想 函数(hnsh)分解及其思想 C程序的组成 对象(变量、函数(hnsh))的存在、声明与使用 变量的生命周期和作用域第3页/共71页第三页,共72页。4复杂(fz)问题简单问题简单问题1简单问题简单问题2简单问题简单问题n解解1解解2解解n分解(fnji)整合整合(

2、zhn h)整个问题的解解解解解复杂问题分解与问题解决第4页/共71页第四页,共72页。5解决问题的办法:化整为零,把复杂程序分解成不同的小模块,分别(fnbi)实现。长程序(chngx)划分(hu fn)第5页/共71页第五页,共72页。6模块化程序设计(chn x sh j)思想总体总体(zngt)功能功能子功能子功能子功能子功能子功能子功能子功能子功能自顶向下自顶向下逐步逐步(zhb)细化细化重要的软件开发手段软件工程管理理念问题:高级语言提供了什么机制来支持模块化问题:高级语言提供了什么机制来支持模块化程序设计程序设计?第6页/共71页第六页,共72页。7高级(goj)语言常见的抽象机

3、制 子程序,sub-program, sub-routine 过程,procedure 函数,function 类,class 包,package 模块,module 组件(z jin),component 程序,programC语言提供的语言提供的最基本的代码最基本的代码抽象抽象(chuxing)机制机制第7页/共71页第七页,共72页。8小模块小模块(m kui)2小模块小模块(m kui)1函数(hnsh)一般可以传递数据,通过参数传模块间调用返回结果小模块小模块n共处共处应用环境应用环境1应用环境应用环境m大模块大模块1大模块大模块2大模块大模块K打包打包应用于应用于工具箱工具箱xx.

4、caa.c组件,包,模块,程序第8页/共71页第八页,共72页。9main() AvgMultiply(., 1000, ); AvgMultiply(, 100, ); AvgMultiply(, 10000, ); double AvgMultiply(double array, int n, double y) 计算计算n个数的平均值个数的平均值Y ; 返回返回(fnhu)结果;结果;名字名字(mng zi)从外部从外部(wib)获取获取数据数据返回结果返回结果C语言把功能独语言把功能独立或相同、相似立或相同、相似的片段抽象成一的片段抽象成一个函数个函数重复的片段用函重复的片段用函数调用

5、代替数调用代替合称为:合称为:Interface接口,接口,A common boundary between two distinct entities.独立定义独立定义独立实现独立实现独立使用独立使用效效率率/ 2;一改一改全改全改第9页/共71页第九页,共72页。10函数说明规范(gufn):接口说明/*函数名称:写出函数的名称功能描述:描述出函数具有的功能函数参数:输入输出参数说明(shumng),对每个参数都需要作出仔细说明(shumng)返回值:返回值说明(shumng),或者标明无返回值模块历史: 谁于某年某月某日创建本模块,创建人email 谁于某年某月某日修改本模块,修改人e

6、mail 修改原因:可有可无,根据需要添加*/用处用处(yng chu)?第10页/共71页第十页,共72页。11C的模块(m kui)和C程序结构 一组函数构成一个函数模块(m kui); 在C程序里,一个*.c或*.cpp文件就是由多个函数构成的一个功能模块(m kui); 每个功能模块(m kui)编译后构成一个独立的目标模块(m kui)*.obj 多个目标模块(m kui)绑定在一起构成一个*.exe文件第11页/共71页第十一页,共72页。12a.cb.c*.c一个(y )C程序的组成函数函数函数a.objb.obj*.obj编译(biny)MyProg.exe编译(biny)编译

7、链接组织成一个组织成一个项目项目项目的中间项目的中间结果结果项目的最项目的最终结果终结果模块模块第12页/共71页第十二页,共72页。13模块(m kui)文件第13页/共71页第十三页,共72页。14*.exe文件(wnjin)*.obj文件(wnjin)第14页/共71页第十四页,共72页。15变量(binling)的作用域与存在期 变量定义 确定了变量何处、何时能使用 何处能使用作用域 能够使用变量的范围代码段 何时能使用存在期 确定变量建立和销毁时间(shjin)时间(shjin)段。 各种变量的存在期可能不同。 变量实现的基础是内存单元,存在期就是变量被分配内存空间到撤消的期间第15

8、页/共71页第十五页,共72页。16存储(cn ch)区示意图内存内存(ni cn)静态静态(jngti)存储区存储区动态存储区动态存储区程序代码程序代码程序占用的存储区程序占用的存储区第16页/共71页第十六页,共72页。17存储(cn ch)区用途 静态存储区主要用途 保存(bocn)采用静态分配方式的变量的内容 外部变量(全局变量) 静态内部变量 保存(bocn)程序中的字符串常量 动态存储主要用途 供自动型内部变量的空间分配使用 供显式动态分配的存储空间分配(见后续内容)第17页/共71页第十七页,共72页。18变量类别(libi)及其存在期 内部变量的类别 auto默认的内部变量类别

9、,可以不用写,存储单元在运行(ynxng)过程中动态分配和释放 static静态内部变量,保存在静态存储区,存储单元在程序启动时分配,程序结束时释放。 外部变量 在函数之外定义的变量称为外部变量、全局变量。External variable 全部保存静态存储区,程序启动时分配,程序结束时释放。 在外部变量前加static只影响对应变量的可见范围,但不影响变量的生命周期。第18页/共71页第十八页,共72页。19函数(hnsh)中的参数 形式参数和实际参数 formal argument形式参数 定义函数时给出的参数,称为形式参数 Arguments occurred in function l

10、ist when defining a function actual argument实际参数 调用函数时给出的参数,称为实际参数 Arguments occurred in function list when calling a function C函数的参数是值参数。 函数调用时先计算实参表达式的值 把值复制给对应形参 而后(r hu)执行函数体。 函数内对形参的操作与实参无关。第19页/共71页第十九页,共72页。20C语言的函数原型函数存在(cnzi)信息 函数原型function prototype 声明某一个函数的存在 在使用某个函数以前,用函数原型来声明某个函数已经是一个合法

11、的、有定义的函数,请声明之后的代码放心使用该函数。 Use function prototype to declare the existence of a function 原型说明的形式 与函数头部类似,加分号; 参数名可省略,可与函数定义用的名字不同; 原型的参数名最好用有意义的名字,有利于写注释。 提倡把原型说明都放在程序文件(wnjin)最前面第20页/共71页第二十页,共72页。21另外(ln wi)一种组织写函数原型办法 将自己写的所有的函数的函数原型都写在一起,组织成一个扩展名为.h的header file,即头文件,如abc.h 然后(rnhu)在.c或.cpp程序模块的首部

12、用文件包含命令包含该头文件,如 #include “abc.h” 思考:有什么好处?第21页/共71页第二十一页,共72页。22主要(zhyo)内容 数值类型 函数和标准库函数 函数定义和程序的函数分解 C程序结构与变量 预处理命令 定义常量(chngling) 字位运算符 编程实例第22页/共71页第二十二页,共72页。23C语言源程序编译(biny)目标(mbio)模块连接(linji)可执行程序函数库C程序加工过程编译之前还有一个源代码预加工的过程5.5 预处理第23页/共71页第二十三页,共72页。24有预处理命令(mng lng)的C源程序编译(biny)目标(mbio)模块连接可执

13、行程序函数库C程序加工过程包含有编译前的预处理的功能预处理没有预处理命令的C源程序最先做的步骤,预处理程序负责处理源程序里的所有预处理命令,生成不含预处理命令的源程序。预处理命令加在程序中指示预处理程序进行代码处理工作的指令。预处理命令作用:简化编程工作第24页/共71页第二十四页,共72页。25预处理命令(mng lng) C源程序中以字符#开始(kish)的命令即为预处理命令 常见的预处理命令包括 #include #define #undef #if #else #elif #endif第25页/共71页第二十五页,共72页。26把指定文件内容包含到当前(dngqin)源文件#inclu

14、de 形式1#include 文件名形式2形式1:用于包含系统头文件,预处理程序到指定(zhdng)目录找文件(通常指定(zhdng)几个系统文件目录)。形式2:用于包含自己的文件。预处理程序先在源文件所在的目录里找,找不到时再到系统指定(zhdng)目录中去找。文件(wnjin)包含命令处理过程:在文件系统中查找指定的文件,如果找到,就用找到的文件的内容取代该命令行。被包含文件里如有预处理行也会处理。第26页/共71页第二十六页,共72页。27stdio.h或math.h 为标准头文件(.h 扩展名),它们在系统子目录里(目录名为 include或h),内容包括(boku)标准函数原型、系统

15、使用的符号常量定义等。预处理时,文件内容插入到预处理命令行处。相当于在源文件中写这些函数原型,使编译程序能正确完成对标准库函数调用的处理。#include#include注意:写程序(chngx)时一定要包含必要的系统头文件。第27页/共71页第二十七页,共72页。28#include “abc.h”double area(double r) return PI * r * r;abc.cpp系统目录中的头文件如果(rgu)找到,用相应的头文件里的内容替代包含命令。double area(double r);int func2();void func3();enum YES, NO;#defi

16、ne PI 3.14159继续(jx)处理abc.h文件(wnjin)包含处理过程及示例double area(double r);int func2();void func3();enum YES, NO;#define PI 3.14159double area(double r) return PI * r * r;处理后的abc.cpp第28页/共71页第二十八页,共72页。291 1、一个#include#include命令只能指定一个被包含的文件,若要包含n n个文件,应使用n n个#include#include命令;2 2、若文件1 1包含文件2 2,而文件2 2中要用到文件3

17、 3的内容,则可在文件1 1中用2 2个#include#include命令分别包含文件2 2和文件3 3,而且文件3 3应出现在文件2 2之前,如下表示:file1.cfile1.c#include “file3.h”#include “file3.h”#include “file2.h”#include “file2.h”.3 3、文件包含可以嵌套。4 4、预编译(biny)(biny)后的包含文件和源程序文件成为一个文件,所有的externextern变量将成为源程序文件中的全局静态变量。说明(shumng):第29页/共71页第二十九页,共72页。30#include “flie2.h

18、”file1.cfile2.h#include “flie3.h”不包含(bohn)#include命令file3.h#include “flie3.h”#include “flie2.h”file1.c不包含(bohn)#include命令不包含(bohn)#include命令file2.hfile3.h等价第30页/共71页第三十页,共72页。31#define开始,两种形式:简单宏定义,形式:#define 宏名字 替代正文替代正文可以是任意正文序列,到换行为止。如最后是“”,下一行还作为宏定义的继续。作用:为宏名字定义替代,由整个(zhngg)替代正文构成。预处理程序记录宏名字及其替代

19、。在源程序中遇到宏名字标识符时,就用替代正文替换,这种操作称为(chn wi)宏展开或宏替换。宏定义(dngy)与宏替换第31页/共71页第三十一页,共72页。32#define NUM 30#define SLD static long double#define NOSTOP while(1)程序(chngx)中的:SLD x=2.4, y=9.16;替换后变成:static long double x=2.4, y=9.16;预处理程序做正文替换,替代正文可以是任何(rnh)内容。后无 ;第32页/共71页第三十二页,共72页。33带参数宏定义,形式:#define 宏名字(参数列表)

20、替代正文宏名字与括号间不能有空格(kn ),逗号分隔的标识符看作参数。替换正文为任意正文序列。宏调用的替换分两步展开:先用各实参替代宏定义替代正文里的参数;再将代换的结果(ji gu)代入宏调用位置。预处理中将(zhngjing)被展开为:z = (x+y)(x*y) ? (x+y) : (x*y);使用形式与函数调用类似,以类似参数的形式给出宏参数的替代段,用逗号分隔,称为宏调用。#define min(A,B) (A)(B)?(A):(B)z = min(x+y,x*y);第33页/共71页第三十三页,共72页。34注意:宏展开可能(knng)引起参数多次计算。如:z = min(n+,

21、m+); 展开后的形式是:z = (n+) (m+)?(n+):(m+)替代正文各参数和整段应括起,避免出错(ch cu)。例:#define square(x) x*x在特定环境下可能出问题,例如:z = square(x+y);展开后的形式: z = x+y*x+y 使用带参宏与调用函数的意义不同。程序加工中在“当地”展开。程序执行中并没有调用动作,宏定义/调用中没有类型问题。一个宏能否使用/使用中发生(fshng)什么/能否得到预期效果,完全看展开后的情况。第34页/共71页第三十四页,共72页。35n人们有时用宏定义简化程序书写。n带参宏的展开可避免函数调用开销,但使程序变长。n复杂宏

22、定义展开后出错很难定位。n应谨慎使用(尽量少使用)宏。n写宏定义的常见错误(cuw)是在定义行最后写分号。该分号将被代入程序,有可能引起语法错误(cuw)。宏定义从定义处起作用直到文件结束。一个文件里不允许对同一(tngy)宏名字重复定义。#undef取消已有定义:#undef 宏名字第35页/共71页第三十五页,共72页。361.1.宏名一般都用大写字母表示,以区别(qbi)(qbi)于变量; ;2.2.宏定义只是替代, ,减少了在程序中书写的工作量, ,只是一个简单的代替, ,不作语法检查; ;3.3.宏定义不是语句, ,不必再其后加上“;”;“;”;4.4.在宏定义中可以进行多层的替代.

23、 .#definre R#definre R3.03.0#define PI#define PI3.14153.1415#define L#define L2 2* *PIPI* *R R#define S#define SPIPI* *R R* *R Rmain()main()printf(“L=%fnS=%fn”, L, S);printf(“L=%fnS=%fn”, L, S); 说明(shumng)第36页/共71页第三十六页,共72页。37例#include#define PI 3.1415#define S(r) PI*r*rint main() double a, area; a

24、 = 3.6; area = S(a); printf(“r=%fnarea=%fn”, a, area); return 0;或enum PI=3.1415;第37页/共71页第三十七页,共72页。38例#include #define M3#define NM+2#define S(N) N*N*Nint main() printf(%dn,S(N);return 0;运行(ynxng)结果为:17第38页/共71页第三十八页,共72页。39条件(tiojin)编译一、引入条件编译的原因:只对源程序中满足条件的部分(b fen)内容进行编译。可以减少被编译的语句,从而减少目标程序的长度。二

25、、定义形式:第39页/共71页第三十九页,共72页。40程序段可以是语句串,也可以是命令行方式(fngsh)3(fngsh)3为嵌套定义方式(fngsh)2(fngsh)2:#if #if 整型表达式程序段1 1#else#else程序段2 2#endif#endif方式(fngsh)1(fngsh)1:#if #if 整型表达式程序段1 1#endif#endif方式3 3:#if 整型表达式程序段1#elif 整型表达式 程序段2#elif 整型表达式 程序段3 #else程序段n#endif第40页/共71页第四十页,共72页。41谓词defined。使用形式:defined 标识符或

26、defined(标识符)标识符是有宏定义时,defined(标识符) 得到(d do)1,否则得0 #ifdef 标识符标识符相当于 #if defined(标识符标识符)#ifndef 标识符标识符 相当于 #if !defined(标识符标识符)方式(fngsh)4(fngsh)4:#ifdef #ifdef 标识符程序段1 1#else#else程序段2 2#endif#endif方式(fngsh)5(fngsh)5:#ifndef #ifndef 标识符程序段1 1#else#else程序段2 2#endif#endif第41页/共71页第四十一页,共72页。42#define COM

27、PUTER_A 1#ifdef COMPUTER_A #define INTEGER_SIZE 16#else #define INTEGER_SIZE 20#endif #define DEBUG 1#ifdef DEBUG printf(“x=%d,y=%d,z=%dn”, x, y, z); #endif 预处理后只剩下#define INTEGER_SIZE 16参与(cny)编译预处理后printf参与(cny)编译,若不在希望编译printf得到输出,则删除#define DEBUG 1命令行。第42页/共71页第四十二页,共72页。43例#define LETTER 1int m

28、ain() char c; int i = 0; while(c = getchar( ) != n) i+; #ifdef LETTER if(c = a & c = A & c = Z) c=c+32; #endif printf(“%c”, c); return; 第43页/共71页第四十三页,共72页。44主要(zhyo)内容 数值类型 函数(hnsh)和标准库函数(hnsh) 函数(hnsh)定义和程序的函数(hnsh)分解 C程序结构与变量 预处理命令 定义常量 字位运算符 编程实例第44页/共71页第四十四页,共72页。45定义定义“常量常量”有三种方式:有三种方

29、式:用用enumenum定义枚举常量,定义枚举常量,用预处理命令用预处理命令(mng lng) “(mng lng) “定义常量定义常量”用用constconst定义常值变量,定义常值变量,C C程序设计界的一般看法:程序设计界的一般看法: 宏定义是简单正文代换(di hun)(di hun),无语法和语义限制。可将标识符代换(di hun)(di hun)为任何东西,容易使源程序意义难以理解。原则是:能用其他方式的地方绝不应该用宏。 因为宏定义没有类型的概念。5.6 定义(dngy)常量 第45页/共71页第四十五页,共72页。46const是变量,但不能赋值。const可为任何类型的。co

30、nst不能用于常量表达式。如不能用作case标号,不能用于初始化外部(wib)变量或枚举常量。许多书籍用宏定义(dngy)(dngy)的方式定义(dngy)(dngy)常量。如写#define len 20#define len 20#define Pi 3.14159265 #define Pi 3.14159265 建议尽可能用枚举常量和 const const。枚举常量(chngling)(chngling)值为intint,只能用于定义intint常量(chngling)(chngling)。可用在需要“常量(chngling)(chngling)表达式”的地方,如作为casecase

31、标号,初始化其他枚举常量(chngling)(chngling)和外部变量等。第46页/共71页第四十六页,共72页。47n枚举是枚举是intint值,如果需要整数类型的常量,应该用枚举定义值,如果需要整数类型的常量,应该用枚举定义n需要其他类型的需要其他类型的“常量常量” ” 可考虑可考虑const:const:nconst double Pi = 3.14159265;const double Pi = 3.14159265;nconst double E = 2.71828; const double E = 2.71828; n只有在这两种方式都不合适只有在这两种方式都不合适(hsh)

32、(hsh),而用宏定义又能带来特,而用宏定义又能带来特别的方便时,才应考虑它。别的方便时,才应考虑它。 第47页/共71页第四十七页,共72页。48主要(zhyo)内容 数值类型 函数(hnsh)和标准库函数(hnsh) 函数(hnsh)定义和程序的函数(hnsh)分解 C程序结构与变量 预处理命令 定义常量 字位运算符 编程实例第48页/共71页第四十八页,共72页。49简单程序很少用位是最小数据单位。有些数据用几个位就能表示。如单词统计(tngj)程序中state可用一位表示。可考虑把多个这类数据存入一个变量里。系统程序常需直接操作位数据。硬设备的状态常用二进制串表示,操作它们常需用二进制

33、位串发命令。C提供了位操作和字位(按位)运算符,可用于各种( zhn)整型数据,把整数看成二进制序列实现位运算。5.7 字位运算符第49页/共71页第四十九页,共72页。50位运算(yn sun):从一两个 0/1值计算出一个0/1结果。常见:1)位否定:参数值1时得0,0时得1;2)位与:两参数都是1时得1,否则0;3)位或:两参数都是0时得0,否则1;4)位异或:恰有一参数为1时得1,否则0。字位运算符基于上面位运算,用于整型得到(d do)整型结果。字位否定字位与&字位或|字位异或对各位求否定;二元从两数的各位算出结果的各位。第50页/共71页第五十页,共72页。51例:设x和y

34、都是16位的整变量,值分别是:x:0010,1001,0101,0111y:1001,1100,1111,1010对x和y的各种( zhn)字位运算:x1101,0110,1010,1000 x & y 0000,1000,0101,0010 x | y 1011,1101,1111,1111x y 1011,0101,1010,1101第51页/共71页第五十一页,共72页。52掩码的概念(ginin) 掩码(mask) 为做位运算(yn sun)而构造的二进制串。 例如 通过将掩码与运算(yn sun)对象进行位运算(yn sun),获取运算(yn sun)对象的某位的状态,而将其

35、它不关心的位屏蔽掉。 若想在设置运算(yn sun)对象部分位的值同时不影响其它位的值,也需要用掩码。(类似于交警在道路上画标志的时候用的模子) 掩码常用十六进制、八进制形式书写。为什么要叫掩码?为什么要叫掩码?mask第52页/共71页第五十二页,共72页。53例,设x是16位整型,写表达式判断x的第5位和第8位是否都为0。整数从低位向高位顺序为第0到第15位: 15 0位x1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1掩码0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0用掩码与x做字位与,第5位和第8位的信息留下来,结果(ji gu)中其他位总是0。上述条件可

36、写为:x & 0 x0120 = 0int isok (int x) return (x & 0 x0120) = 0 ? 1 : 0;可简化:int isok (int x) return (x & 0 x0120) = 0; 第53页/共71页第五十三页,共72页。54常用操作使用的掩码和运算(解释,举例) :1)取出被处理二进制串的某些位:用 & 运算; 掩码:这些(zhxi)位为1其他位为0。2)把某些位置设为0其他位不变(“复位”/“清0”):用&运算; 掩码:要改变位为0,其他位为1。3)把某些位置设为1其他位不变(“置位”/“置1”): 用

37、|运算; 掩码:要设置的位为1,其他位为0。4)翻转某些位而其他位不变(翻转): 用 运算; 掩码:要翻转位为1/其他位为0。这些(zhxi)运算总从两个整数(二进制串)求出结果,不改变原有计算对象。第54页/共71页第五十四页,共72页。55另外两个位运算:左移和右移。把数看作位序列,求这个序列左移或右移若干位得到(d do)的序列:左移:二元运算符,其左运算对象的是被左/右移的数据,右运算对象指明移位数,移空出位置补0。与二元字位运算(yn sun)对应赋值运算(yn sun)符:&=|=修改左边运算(yn sun)对象(掩码放在右边)。例:n &= 0 xfffe n的最

38、低位置0.对应(duyng)运算符是 =。左移可用于将整数值乘2的幂,右移可实现除以2的幂。例: x (p+1-n) & (0 (p+1-n)将x右移(yu y),把所需n位移到右端。掩码:0的字位否定得到全1,左移n位使最低n位变0其余位是1。求否定得到低n位为1,高位都是0的掩码。掩码与x右移(yu y)结果做字位与就取出了所需的n位。 p位 p-n位 0位x1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1第56页/共71页第五十六页,共72页。57 p位 p-n位 0位x1 0 1 1 0 1 1 0 1 0 1 0 1 1 0 1(x (p+1-n) &

39、(0 (p+1-n)01 1 1 1 1 1 1 1 1 1 1 1 1 1 1 10n1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1(0 (p+1-n) & (0 (p+1-n)0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1(0 (p+1-n) & (0n)x0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0第58页/共71页第五十八页,共72页。59主要(zhyo)内容 数值(shz)类型 函数和标准库函数 函数定义和程序的函数分解 C程序结构与变量 预处理命令 定义常

40、量 字位运算符 编程实例第59页/共71页第五十九页,共72页。605.8 程序设计(chn x sh j)实例简单猜数游戏(yux):随机生成某范围的数要求用户猜。用户输入猜测后应答:too big,too small,you win。 设计:用随机数生成器产生(chnshng)随机数。在程序开始要求范围(0到32767的整数),后进入游戏循环。用户猜后询问是否继续。程序主要部分交互输和输出。 从用户得到数的生成范围do 生成一个数m 交互式地要求用户猜数,直至用户猜对 while(用户希望继续);结束处理 基本设计:第60页/共71页第六十页,共72页。61把取范围和取下一猜数定义为函数:

41、int getrange(void);int getnumber(int limit);getrange要求2到32767的值,超范围就要求重输入。getnumber的猜测值也应在范围内,否则提示重输。给用户几次重输入机会,超过次数仍不对时返回负值,交给(jio i)调用程序段处理。设计(shj)思路随机数用标准函数(hnsh)rand生成。若范围为0到m1,可用如下语句得到所需的随机数: unknown = rand() % m;将用户继续判断定义为0/1值函数,控制大循环:int next(void);第61页/共71页第六十一页,共72页。62int main() int m, unkn

42、own, guess; if (m = getrange() 0) return 1; +m; /* 取模的数应比最大的数大一 */ do unknown = rand()%m; while (1) if (guess = getnumber(m) unknown) printf(Too big!n); else if (guess unknown) printf(Too small!n); else printf(You win!); break; while (next(); printf(Game over.n); return 0;第62页/共71页第六十二页,共72页。63读入猜数上

43、界的函数用常量限定用户出错次数,以免无穷循环。检查输入的合法性,合适时返回;有问题时要求(yoqi)用户重输。重复次数超过ERRORNUM时返回负值。 enum ERRORNUM = 5 ;int getrange(void) int i, n; for (i = 0; i ERRORNUM; +i) printf(Choose a range 0, n. Input n: ); if (scanf(%d, &n)!=1 | n32767) printf(Wrong. A number in 232767.n); while (getchar() != n) ; else return n; return -1;第63页/共71页第六十三页,共72页。64读入猜测数的函数与前一个类似。需要数值范围(fnwi)参数,检查有所不同,函数结构一样: int getnumber(int m) int i, n; for (i = 0; i ERRORNUM; +i) printf(Your guess: ); if (scanf(%d, &n)!=1 | n=m) printf(Wrong! A number in 0%d.n, m-1); while (getchar() != n) ; else return n; return -1;第64页/共71

温馨提示

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

评论

0/150

提交评论