学过C语言,现在学C++是不是在C的英语语法怎么学结构上改改就行了?

C,C++,C#三者区别_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C,C++,C#三者区别
&&对网上的资料收集整理
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢拒绝访问 | www.gg1994.com | 百度云加速
请打开cookies.
此网站 (www.gg1994.com) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(3eee9-ua98).
重新安装浏览器,或使用别的浏览器当前位置: >>
c语言课件改
第一章 程序设计的基本概念 目标? ? ? ? ? 了解C程序的一些基本概念 了解程序、算法和流程图的概念 了解C 程序的三大基本结构 掌握 C 程序的编译和运行过程 使用Visual C++ 6.0 创建 C程序 1.1程序和程序设计一、基本概念1.程序(program):为解决某一问题而设计 的一系列指令,能被计算机识别和执行。 2.程序设计语言:人与计算机打交道时交流信 息的一类媒介和工具,由语句(statement) 组成。 日常生活中的程序$ 银行3. 将存折和取款单递给银行职员 4.银行职员办理取款事宜 5. 拿到钱并离开银行2.填写取款单并到相应窗口排队 1. 带上存折去银行银行程序:为解决某一问题而设计的一系列指令,能被计算机识别和执行。 3、语句:组成程序的基本单位1. ______________ 1. 做口述笔记…… 2. ________________ 2. 键入信函的内容…… 3. __________ 3. 发送传真…… 4. _____________1.口述 2.信函 3.传真语句被逐条执行老板 程序员秘书 ? 4.机器语言:(machine language)计算机直接使 用的二进制形式的程序语言或机器代码。 ? 5.汇编语言:(assembler language)一种面向机 器的用符号表示的低级程序设计语言。相当于机器 指令的助记符号,与机器语言很接近。 ? 6.高级语言:(high-level language)是易为人们 所理解的完全符号化的程序设计语言。 ? 7.源程序:用户用高级语言编写的程序称为,C源程 序文件名字后缀一般必须为“.c“。 ? 8.目标程序:由二进制代码组成的程序 ? 9.编译程序:具有翻译功能的软件 ? 10.连接(linker):将目标模块和其它一些必要的功 能模块装配在一起,生成可执行文件,执行程序文 件后缀为&.exe&。 算问题:法计算长方形的面积1.接收用户输入的长方形长度和宽度两个值; 2.判断长度和宽度的值是否大于零; 3.如果大于零,将长度和宽度两个值相乘得到面积, 否则显示输入错误; 4.显示面积。算法算法:解决问题的具体方法和步骤 流程图? 流程图是算法的一种图形化表示方式。 ? 流程图直观、清晰,更有利于人们设计 与理解算法。 ? 它使用一组预定义的符号来说明如何执 行特定任务。开始/结束 处理 输入/输出 判断/分支连接符流程线 C 语言简介C 语言是贝尔实验室的 Dennis Ritchie 在1973 年设计的。 编程语言 结构化的程序设计语言:层次清晰,便于按模块化方式组 织程序,易于调试和维护 C 最初用于开发系统级程序。 语句简洁:学习时入门相对容易,C 语言很好地总结了其 高级 低级 他语言提出的程序库概念 在微 机 上, 有许多性能良好的商品 C 语言系统可用 。包括 功能强大:既可用于系统软件的开发,也适合于应用软件 Turbo的开发。 C、Borland C/C++;Microsoft Visual C/C++ 等。 移植性好:只要对这种语言稍加修改,便可以适应不同型 号机器或各类操作系统。 二、三大基本结构1.顺序结构:(第三章)语句1语句2 语句3 2.选择结构判断表达式不满足第四章内容满 足 语句1 语句23.循环结构判断表达式 满 足 循环替 不 满 足第五章内容 高级语言的编译和执行可以… 我现在可以 哎呀… 我理解不了 高级语言程序 理解了高级语言由编译/解释程序转换为机器代码 编译程序/解释程序 (编译器/解释器) 这种机器代码计算机可以理解 编译程序/解释程序 机器代码 高级编程语言中的指令 计算机硬件 编译和执行C程序源 程 序源程序:是用户创建的文件,以“.c‖为文件扩展名保 存 目标文件:是编译器的输出结 果。这类文件的常见扩展名为 .obj‖ 0 1 形式 可执行文件:是连接器 的输出结果。可执行文 件的扩展名为“.exe‖。 连接 可 执 行 程 序头文件:含有函数的声明和 预处理语句,用于帮助访问 外部定义的函数。头文件的 扩展名为“.h‖。C编译 目 标 文 件C语言函数库 演示下面例题main() { int a,b,c; a=4; b=10; c=a+b; printf(“%d\n”,c); } 演示:使用Visual C++ 6.0编辑和运行程序的过程 总结 2-1? 算法就是解决问题的具体方法与步骤 ? 流程图是算法的一种图形化表示方式 ? 程序是为让计算机完成某项任务而编写的 逐条执行的指令序列 ? C语言的特点包括:结构化的程序设计语言、 语句简洁、功能强大、移植性好 总结 2-2? C程序编写完成后,首先需要通过编译转换 成目标文件,然后通过连接创建可执行程 序,最后才可以执行该程序 ? 可以使用Visual C++ 6.0 IDE编辑和运行C 程序 ? 程序的三大结构是1、顺序结构 2、选择结 构 3、循环结构 第二章C程序设计的初步知识(一) 回顾 1、程序是为执行一项任务而编写的有序指令集 2、编译器将源程序转换成机器能理解的程序 3、连接器用于连接相关的目标文件以生成可执 行程序问:1、C的源程序是后缀是什么? 2、目标文件的后缀是什么? 3、程序的三大结构是什么? 目标? 理解C程序的基本结构 ? 理解变量和常量的含义 ? 熟悉基本数据类型 - int、char、float 和 double C语言的基本结构#include &stdio.h& void main() { 以.h为后缀的文件被称为头文件,可以是 C 程序中现成的标准 printf(&Hello World\n&); 库文件,也可以是自定义的库文件。 } 以 # 开始的语句称为预处理器指令 在函数定义的后面有一个左大括号,即 { main() 函数是 C 程序处理的起点。 在屏幕上产生一行输出“Hello world”,并换行(\n) 它表示函数的开始,后面是函数的主体 stdio.h文件中包含了有关输入输出语句的函数 #include语句不是必需的,但是,如果程序有该语句, main() 函数可以返回一个值,也可以不返回值。如果某 在函数定义的结尾处有一个右大括号,即 } 函数主体中的每个语句都以分号结束。 就必须将它放在程序的开始处 个函数没有返回值,那么在它的前面有一个关键字 void 大括号也可以用于将语句块括起来 C 程序中的一个语句可以跨越多行,并且用分号通 知编译器该语句已结束。 C 程序中的注释/* 此程序由××× 编写 /* ************************* 单行注释 多行注释 * 用来打印输出“Hello World 作者: // 此程序用来打印Hello World”*/ 创建日期: #include &stdio.h& 描述: void main()… { … printf(&Hello World\n&); ************************** */ C 程序可以包含注释,以便向读者作一般说明 } #include &头文件& void main() { 在程序中添加注释是一个好的编程习惯,可以增 编译器并不处理这些注释 … 强程序的可读性。 … } 上机写一个错误的例子,给大家演示一下。 ※说明:1.必须使用main作为主函数名 ,程序是从主函数开始执行,具有唯 一性 注意后面不能带“ ;” 2.函数体用左花括号“{”开始,用右花括号结束“}” 3.用分号“;”作为语句结束的标志 注意是语句的结束标志 4.注释部分: ⑴必须用/*和*/括起来 ⑵必须成对出现, ⑶”/“和”*“之间不能有空格 ⑷注释可以出现在程序的任何地方 ⑸注释部分对程序运行不起作用 ⑹在注释之间不可以再嵌套/* */ (演示一下)5,预处理器指理必须以”#“开头,但不能加分号 什么是标识符标识符:在C语言中,有许多符号的命 名,如变量名、函数名、数组名等,都必须 遵守一定的规则,按此规则命名的符号称为 标识符。 在 C 语言中,标识符命名需要遵循一定的规则有效名称principal无效名称123ratelastnamezip codecost_price city marks_3currency$ discount% ? 标识符的命名规则:C 标识符名可以由字母、数字和 _(下划线)组 合而成 C 标识符不能包含除 _ 以外的任何特殊字符,如: %、# 、逗号、空格等 C 标识符必须以字母或 _(下划线)开头 C 标识符不能包含空白字符(换行符、空格和制 表符称为空白字符) C C 语言中的某些词(例如 int 和 float 等)称为 保留字,具有特殊意义,不能用作标识符名 C C 语言区分大小写,因此标识符price 与标识 符PRICE 是两个不同的标识符 一、标识符1.分类:⑴关键字:c语言规定了一批标识符,他们在c语言中代表 着固定的含义,不能另做它用。 auto break case char const continue default do double else enum extern float or goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while ⑵预定义标识符:c语言语法允许用户把这类标识符另做它 用,但是这些标识 符将失去系统规定的原意。比如:printf define ⑶用户标识符:由用户根据需要定义的标识符称为用户标 识符 常量程序常量是在程序中保持不变的量 常量用于定义具有如下特点的数据: ?在程序中保持不变 ?在程序内部频繁使用 ?需要用比较简单的方式替代某些值指令标识符 关键字 常量 运算符 分隔符 等 二、常量1.分类:整型常量、实型常量、字符常量、字符串常量三、用定义一个符号名的方法来代表一个常量例2.2 计算圆的面积#include #define main() { r=5.0; s=PI*r*r; “stdio.h” PI 3.14159 /*定义符号名PI为3.14159*/printf(“s=%f\n”,s);}(演示一下) ※说明: 1、在整型常量的后面加一个字母L(大小写 均可)这个常量就成为长整型常量在内存中 占四个字节。 2、 无符号整数在数的未尾应该加上字母后 缀u(大小写均可),若是长整型无符号整型 常量,则可以加后缀lu或LU。 3、常量的名子一定要大写。 4、定义常量的语句后面不能加“;”。 2.3整 型 数 据一、整型常量(1)十进制表示:用一串连续的数字表示十进制数。 例:345 456 ※只有十进制可以是负数。 整数的表示 (2)八进制表示:以数字0开头的一个连续数字序列,序列中 只能有0-7这八个数字。 例:045 -078 06745l 而019、423是 非法的八进制数。(3)十六进制表示:以0X或0x开头的连续数字和字母序列,序 列中只能有0-9、A-F和 a-f这些数字和字母,字母a、b、c、d、 e、f分别对应数字10、11、12、13、14、15,大小写均可。 二、整型变量可以分为基本型、短整型、长整型和无符号型四种名称整型 无符号整型 短整型 无符号短整 型 长整型全称类型说明 缩写类型说明 字 范围 符 符 节int unsigned int short int unsigned short int long int int unsigned short unsigned short long 4 4 2 2 4-2,147,483,648 至 2,147,483,647 0 至 4,294,967,295 -32768 至 +327670 至 65,535 -2,147,483,648 至 2,147,483,647无符号长整 型unsigned long intunsigned long40 至 4,294,967,295 声明和使用变量? 声明变量:C D? 定义时初始化变量:C Datatype variablename =? 定义后初始化变量:C variablename =给变量赋值,除了给一个直接的值以外,还可以通过计算获得。 演示 二、变量1.定义:在程序的运行过程中,值可以改变的量※2.说明: (1)每个变量有一个名字作为标识,它是属于用户标识符(2)变量必须先定义后使用(定义后还得赋值才能用) 习题: 1.以下选项中不合法的用户标识符是 ( A._123 B.printf C.A$ ( C.For _abc case ) D.2c DO SIG ) D.Dim2.可在c程序中用作用户标识符的一组标识符是 A.void define WORD B.as_b3 _123 If (大写) 2.4实型数据一、实型常量1.小数形式:由数字和小数点组成,必须有小数点。 例:4.23、0.15、.56、78.、0.0 2.指数形式:以幂的形式表示,以字母e或E后跟一个以10为底的幂数。 字母e或E之前必须要有数字,且字母e或E后面的指数必须为整数,字母e或 E的前后及数字之间不得有空格(实型变量也遵守这个规则)。 例:2.3e5、500e-2、.5E3、4.5e0,而e4、.5e3.6、.e5、e都不合法二、实型变量1.单精度:关键字为 float 定义的一般形式 float a,b,c; float a=4.5,b=5.6;注: (1)占四个字节 32位 (2)7位有效数字 -2.双精度: 关键字为 double 定义的一般形式 double a,b,c; double a=5.9,b=45.36注: (1)占八个字节 64位 (2)15~16位有效数字 - ※说明:1.在内存中,实数一律以指数形式存放2.在内存中,整数可以精确存放,实型数据存在误差 3.实型常量不分float和double 一个实型常量可以赋给一个float型或者 double型变量 4.定义变量的同时可以赋初值三、课堂练习1.下面四个选项中,那一组全是不合法浮点数的选项是 A.160. B.123 C.-.18 D.-e30.12e32e4.2.e5123e40.0.2341e32.下面四个选项中,均是合法浮点数的选项是 A.+1e+1 5e-9.4 3e2 B.-.60 12e-4 -8e5 C.123e 1.2e-.4 +2e-1 D.-e3 .8e-4 5.e-0 总结: 1、 c语言是区分大小写的 2、常量的分类:整型常量、实型常量、字符 常量、字符串常量 3、变量的分类:1、整型变量:基本型、短 整型、长整型和无符号型四种 2、实型变量分类:单精度、双精度 4、指数形式:字母e或E之前必须要有数字, 且字母e或E后面的指数必须为整数,字母e 或E的前后及数字之间不得有空格(实型变 量也遵守这个规则) 第二章 数值转换、算术运算符(二) 回顾 1、c语言是区分大小写的 2、常量在程序中不能被更改,而变量在程序中 可以被更改(定义常量的关健字是什么?) 3、标识符只能由字母、数字和下划线组成,且 第一个字符不能为数字 4、整型分为短整型、整型、长整型,每种整型 又可分为有符号型和无符号型 5、实数分为单精度浮点型和双精度浮点型(表 现方式为两种,1、小数 2、指数) 6、八进制表示为076 十六进制表示为0X或0x 目标? 理解二进制、八进制、十进制、十六进制 之间的转换 ? 理解原码、补码及如何计算 ? 熟练使用算术运算符 ? 理解类型转换 改错: #include stdio h #define PI 3.14; Main { int a,b,c; a=1.2; b=3.4; c=a*b; printf(“c的值 是:%f”,c) }选择题: 1、以下选项中正确的变 量名是 a) a*123 b)_ yy c) Acd d)yy&2、以下那个是八进制的 表示方法? a) 0Xf b)80 c) 080 d)0763、以下那些是正确的实 型常量? a) 0.73e 2 b)0.72e0.2 c)-65.55 d)0 四、整数在内存中的存储形式(包括一下各种进制的转换)位(bite):计算机里最小的存储单元 字节(byte):8个二进制组成一个字节字(word):若干个字节组成一个字16个二进制位 2个字节最低位最高位0表示正数 1表示负数 一、正整数 以原码形式存储例 正整数5的二进制代码:0 0 00 0 0 0 0 0 0 0 0 0 1 0 1二、负整数1.以补码形式存储反码:1和 0 互换 补码:对原码取反加1(符号位不参加取反) 例 负整数-5的二进制代码:1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 2.补码形式存储的二进制转换成负整数-5的补码(1)对补码取反 (2)转换成十进制1011取反(3)根据最高位加负号(4)对所求数减110 0 0 0 0 00 0 0 0 0 0 1 0 0转换成十进制-4 减1-5三、无符号整数不在是符号位 参与数值的大小中 算术运算符算术 操作数 一元 运算符 操作数二元 算术运算符示例#include &stdio.h& void main() { int a = 5, b = 3, c = 25, d = 12; int re,in, /* 使用算术运算符 */ qu = a / // 除法 re = a % // 求模 in = ++c; de = --d; printf (&商为 %f\n&,qu); printf (&余数为 %d\n&,re); printf (D加 1 后为 %d\n&,in); printf (&减 1 后为 %d\n&,de); }输出:商为 1.000000余数为 2 加 1 后为 26减 1 后为 11 说明:% 取模或求余运算符 1.运算对象必须为整型 2.符号与被除数相同 例如:-5%3 值为-2 /两端为整数时,它取整,有一端为实数时,他就变成了除类型转换? 自动类型转换(双目运算符两边运算数的 类型必须一致,当不一致时自动转换 )C 原则:把表示范围小的类型的值转换到表示范 围大的类型的值(举例‘a‘+1) C short ? int ? long ? float ? double 二、强制类型转换1.一般形式: (类型名)(表达式) 2.作用:将一个表达式转换所需类型 (int)(x+y) (int)x+y 只对x 对x、y整体※说明: 1. (类型名)(表达式)括号不能省略2.强制类型转换运算得到一个中间变量,不改变原来变量的类型。四、课堂练习1. 已知 a=7, b=3, x=3.5, y=2.5 (1). x+a%3*(int)(x+y)%2/4 (2). (float)(a+b)/2+(int)x%(int)y 三、运算符的优先级、结合性和算术表达式1.算术运算符的优先级 同级 ( )、 +、 单目 高 -、 *、 同级 /、 %、 同级 +、 -双目 底2.算术运算符和圆括号的结合性 正负运算符: 右 其它算术运算符:左 左 右
操作数运算符操作数Z = ( X * 2 ) + ( 5 C Y )表达式 表达式表达式 赋值表达 式一、赋值运算符和赋值表达式1. 赋值运算符和赋值表达式 赋值运算符:= 赋值表达式:由赋值运算符组成的表达式 形式: 变量名=表达式 左 课堂练习: a=b=c=5 都为5 a=5+(c=6) a=11 a=(b=4)+(c=6) 10 a=(b=10)/(c=2) 5※说明:1.优先级倒数第二,结合方向 右2.是一种赋予的关系而不是等价的关系 x=5 y=8 怎么样交换x、y中的数值? 3.赋值运算符的左侧只能是变量不能是表达式4.赋值号右边的表达式也可以是一个赋值表达式 二、复合赋值表达式1. 复合赋值运算符: +=、 -=、 *=、 /=、 %=、 &&=、 &&=、 &=、 ^=、 |=(两个运算符之间不能有空格) 将形如: 变量名=变量名+表达式 的表达式 简化成: 变量名+=表达式 的形式 a=a+3 x=x*(y+8) x=x%3 理解: a+=b移到=右侧例:a+=3x*=y+8 x%=3=a+b=左侧补变量名a=a+b说明:凡是有赋值运算符参加的运算都是从右往左算例:已知变量a=6,计算表达式 a+=a-=a*a 结果为:-60 练习: 已知 a=12 求运算后a的值 (1)a+=a (2)a-=2 (3)a*=2+3 (4)a/=a+a (5)a%=(n%=2) n=5(6)a+=a-=a*=a 一、自加(++)和自减(--)运算符1.作用:使运算对象的值增加1或者减少1 例 i++ i-i++ i=i+1 i=i-1 表达式的值:先用后加 变量的值: 增加1 习题:int i=10,j=5,b; b=++i-j; printf(&b=%d\n&,b); int i=10,j=5,b; b=i++-j; printf(&b=%d\n&,b);※ 2.使用++i表达式的值:先加后用 变量的值: 增加1习题:int a,b;b=3;a=b++; a的值是多少,b的值是多少 a=++b; a的值是多少,b的值是多少 表达式num2 = ++num1;如何计算num1 = num1 + 1; num2 = num1; num2 = num1; num1 = num1 + 1;结果(num1=5) num2 = 6; num1 = 6; num2 = 5; num1 = 6;num2 = num1++;num2 = --num1;num1 = num1 - 1; num2 = num1;num2 = num1; num1 = num1 - 1;num2 = 4; num1 = 4;num2 = 5; num1 = 4;num2 = num1--; 二、逗号运算符和逗号表达式1.定义:用逗号将表达式连接起来的式子 一般形式:表达式1,表达式2,表达式3,??,表达式n2.求解过程: 从左到右一个一个求解 ,最后一个表达式的值就是整个逗号表达式的值3.说明: (1)结合方向 左 右(2)优先级最底例如:已知a=3 a=3,a+3 结果:表达式的值为6 b=a+3,a-3 结果:表达式的值为0 总结:1、正整数以原码形式存储 2、负整数以补码形式存储 3、% 取模或求余运算符:1.运算对象必须为整型 2. 符号与被除数相同 4、双目运算符自动转换原则:把表示范围小的类型 的值转换到表示范围大的类型的值 5、反是有赋值运算符参加的运算都是从右往左算 6、i++表达式的值:先用后加7、++i表达式的值:先加后用 习题:1、表达式13%5的值是多少() a.2 b.3 c.5 d.1 2、要存储一个双精度浮点型的值,需要()字节的内存空间 a.6 b.2 c.4 d.8 3、表达式a+=a-=a+a的值是多少?已知a=9 a.12 b.18 c.-18 d.0 4、计算机里最小的存储单元是() a. 位 b.字节 c. 单元 d.kb 1、写出程序运行结果 main() { int i,j,m,n; i=8;j=10; m=++i; n=j++; printf(“%d,%d,%d,%d”,i,j, m,n); } 2、写出下列表达式的结果 已知:A=3; 1、A=A-3,A+3 2、B=A+3,A-3 3、C=A+3,A+B(B的值接上一题)1、写出程序运行结果 main() { int i,j,m,n; i=8;j=10; float k=2.0; m=j/i; n=j/k; printf(“%d,%d”,m,n); } 2、写出下列表达式的结果 已知:A=3; 1、A-=3*6/5; 2、A*=6-3; 3、A%=7+2; 第三章顺序结构 回顾 1、算术运算符提供运算功能,包括+、-、*、 /、%、++、-2、位(bite):计算机里最小的存储单元 3、有符号的变量(以二进制形式表示时)最 高位为符号位,1为负数 0为正数。 4、正整数以原码形式存储 ,负整数以补码 形式存储。 5、反是有赋值运算符参加的运算都是从右往 左算 目标? 熟练使用 scanf() 和 printf() 函数 3.1赋值语句一、概念: 语 句:是C语言中描述计算过程的最基本单位。 由分号‘;’结束。顺序结构:按语句在程序中出现的顺序逐条执 行,没有分支、没有转移。二、赋值语句:在赋值表达式的尾部加上一个“;” 就构成了辅助赋值语句也称为表达式语句 表达式 例如: a=a+b i=i+1,j=9 i++ i--语句 a=a+b; i=i+1,j=9; i++; i--; 3.2 数据输出一、基本概念1.输出:把数据从计算机内部送到计算机外部设备上的操作称为“输出 ”2.输入:从计算机外部设备将数据送入计算机内部的操作称为“输入”注意:c语言本身不提供输入和输出语句,但是有输入和输出函数二、printf函数的一般调用形式1.作用;在终端设备上按指定格式输出2.形式: 表达式 : 语 句: printf(格式控制,输出项表) printf(格式控制,输出项表); 输入/输出函数#include &stdio.h&输入/输出函数 (printf/scanf) 用于接受和显示数据或信息void main() { printf(&请输入一个数:&); scanf(&%d&,&num); printf(& \n%d 的平方为 %d \n&,num,num*num); 转换字符串 }转义序列 int visitor_count = 150; & %d printf (& %d&& , visitor_count visitor_count);将一些信息按照指定的格式送到标准输出(显示器) 将按指定的格式显示该变量的值转换字符串 说明 将参数按整数形式转换输出,对应参数应是int 类 型 将参数按长整数形式转换输出,对应参数应是long 类型 输出一个字符,对应参数应该是一个字符 输出一个字符串,对应参数应该是一个字符串%d %ld %c %s%f将参数按带小数点数形式输出,对应参数应是 double 类型,默认情况下精确到 6 位小数 int visitor_count = 150; printf (& %d& , visitor_count);输出结果:150 printf 函数int salary = 5500; printf (& %10d&& , salary); & %10d输出结果:5500输出结果的左边显示了 6 个空格 printf 函数float circumference = 78.53; 9.4786789; printf (& %f& , circumference);9.478679 输出结果:78.530000默认情况下精确到六位小数 printf 函数double mercury_level = 168.2251074; printf (&%7.2f& , mercury_level); & &输出结果: 168.23宽度,表示所有的数字和小数点所占的位数。不够7位右对齐。精度(精确到小数点后多少位)如果后面的输出项表比%d多的话,那么系统不提示错误,但变量 并不输出,即多出的变量没有结果. 3.输出数据所占的宽度 正常输出时 以实际长度输出指数部分占5位(如e+002),其中e占1位, 指数符号占1位,指数占3位。 n&实际长度 右对齐 左补空格 例: %6d n&实际长度 不受n的限制 正常输出(1)% 插入整数n 格式符 (n为整数不能为变量)对float、double:m代表数据的总宽度 n代表精度(小数位数) 小数位数&n:舍掉多余小数 进行四舍五入 (2)m.n形式(M、n为整数不能为变量)e、f、E小数位数&n:在小数的右侧添“0” %8.3f 整数位数&m:右对齐 左补空格 整数位数&m:不受n的限制 正常输出g、G:用来指定输出的有效数字 整数位数&n在数字前面补“0” 整数位数&n实际长度输出d 用来指定输出的数字个数字符串:5.2s(代表最长度为5,取二个字符,其余左面三个字符就 空格代替,如没有小数那么就全部输出,从左至右的截取。) 转义序列\a名称警告描述产生一则警告。\b 退格 将光标回退一格。 \f Name: Audrey将光标移到下一页的第一格。 输出结果: 换页 Hepburn \n Movie: ‘Roman Holiday’ 换行 将光标移到下一行的第一格。 \r 回车 将光标移到当前行的第一格。 代码: \t 水平制表 将光标移到下一个水平制表位置。 printf(“Name: Audrey Hepburn \n Movie: \‘RomanHoliday\’”);\v 垂直制表 将光标移到下一个垂直制表位置。 转义序列允许在输出结果中包括特殊字符\' \& 单引号 双引号 产生一个单引号。 产生一个双引号。\? \\ \0问号 反斜线 空产生一个问号。 产生一条反斜线。 产生一个空字符。 S scanf 函数从标准输入(键盘)读取信息,按照格式描述 把读入的信息转换为指定数据类型的数据,并把这些数 c 据赋给指定的程序变量。 a n scanf(&%d&,&num); f 变量的名称 函 &符号(附在读取的每个变量上)用于指明变量 在内存中的位置 数转换字符串要求的实际输入 转换字符 参数变量的类 串 型 %d int 十进制数字序列 %ld long 十进制数字序列 %f float 十进制数,可以有小数点及指数 部分 %lf double 十进制数,可以有小数点及指数 部分 scanf内存tax_ratefloat tax_ scanf在内存中分配一块 32 位存储空间 (& %f& , &tax_rate); ?? 存储空间使用名称“tax_rate”标识 提示用户输入一个值 ? 输入的值存储在变量中(因为 scanf 提供此变量的 地址)12.234 scanf 函数使用示例内存 #include &stdio.h& void main() radius high { 5 10 double radius,high, vol printf(&请输入圆柱体底面积的半径和圆柱体的高: &); 785 scanf(&%lf%lf&,&radius,&high); vol=3.14*radius*radius* printf(&radius=%7.2f, high=%7.2f, vol=%7.2f\n&, radius,high,vol); } 请输入圆柱体底面积的半径和圆柱体的高: 5 10 radius= 5.00, high= 10.00, vol= 785.00 一、Scanf函数的一般调用形式1.作用:是在终端设备上输入数据 2.形式: 表达式: 语 句 : scanf(格式控制,输入项表)scanf(格式控制,输入项表);※注意:格式控制必须与你对应的变量的类型相等,否则会出现相不到的数据二、通过scanf函数从键盘输入数据当调用scanf函数从键盘输入数据时,最后一定要按下回车,scanf才能接受从键盘 输入的数据 “%d%d%d” :用空格、tab、回车做为数据之间的间隔,间隔数量不 限 10,20,30(回车) “%d,%d,%d” 1.输入数值数据 10, 10 20, ,20 30(回车) ,30(回车) 正确 正确 错误 正确 正确 正确10,20,30(回车) “%d , %d , 10, 20, %d” 10 ,20 30(回车) ,30(回车)2.指定数据输入的宽度 3.跳过输入数据的方法 :在%和格式符之间加* 4.输入的数据少于scanf函数要求输入的数据时,scanf将等待输入,直到满足要求或 遇到非法字符 5.输入的数据多于scanf函数要求的数据,多余的数据将留在缓冲区作为下一次 输入操作的输入数据3.4符合语句和空语句一、符合语句1.定义:用一对花括号把若干语句括起来构成一个语句组 2.注意: (1)花括号内语句的数目不限 (2)里面可以有定义语句 (3)在花括号外面不能加分号二、空语句main() { ; } 总结:1、输出:把数据从计算机内部送到计算机外部设备 上的操作称为“输出 ” 2、输入:从计算机外部设备将数据送入计算机内部 的操作称为“输入” 2、 printf() 和 scanf() 函数属于格式输入输出函数 3、语句以;结尾 表达式的后面不能有“;”分号(如果有;) 就成为语句。 4、{ ;}是空语句 第四章 选择结构 回顾:1、什么是输入? 2、什么是输出? 3、输入的命令是什么? 4、输出的命令是什么? 5、输出一个如下结果:例:已知 a=3.1415927;保留3位小数,前面带2空格 的。 目标? ? ? ? ? ? 熟练使用关系运算符 熟练使用逻辑运算符 熟练使用多重 if 结构 熟练使用嵌套 if 结构 熟练使用 switch 结构 理解条件运算符的用法 关系运算和逻辑运算一、C语言中的逻辑值 C语言中规定: (1)用0、1 表示逻辑假和真值;C语言没有专门的逻辑值,而是用1来表示“真”,用 0表示“假”。 (2)任何基本类型的值都可作为逻辑值使用。所有非0的值被当作“真”使用,而0值被 当作“假”使用 二、关系运算符和关系表达式 1.C语言的关系运算符共6种: ① & (大于) ② &= (大于等于) ③ & (小于) ④ &= (小于等于) ⑤ == (等于) ⑥ != (不等于) 优先级: 前四种优先级高于后两种 结合方法:从左向由结合注意:当x、y为实型数据 尽量避免使用 x==y 表达式 3-1 表达式 3-2操作数运算符操作数Z = ( X * 2 ) + ( 5 C Y )表达式 表达式表达式 表达式 3-3?表达式由操作数和运算符的组合而成 ?表达式中的操作数可以是变量、常量或者子表 达式 ?运算符的主要类型有:? 算术运算符 + - * / ? 赋值运算符 = += *= /= ? 关系运算符 & & &= &= ? 逻辑运算符 ! && || 赋值运算符变量 表达式;Height = 177.5; Weight = 78; Gender = ’m’; x = a+b; w = sin(a)+sin(b); y = i++ -j; 复合赋值运算符运算符 += -= *= /= %= 表达式 X += 5 X -= 5 X *= 5 X /= 5 计算 X=X+5 X=X-5 X=X*5 X=X/5 结果(假设 X=10) 15 5 50 2 0X %= 5 X = X % 5 关系运算符 3-1? 关系运算符用于测试两个操作数或两个表 达式之间的关系,其中操作数可以是变量 、常量或表达式。操作数 关系运算符 操作数关系表达式的 计算结果 = 逻辑值(真或假) 在C语言中,“0”表示“假”,“非0”表 示“真” 关系运算符 3-2操作数1关系运算符操作数2 关系运算符 3-3num1=10; num2=5;num3=20;num4=10; (num1 + num2)& (num3 C num4)真 假num=40;num/10 2 如果如果 gender ‘f’ gender = = ‘m’ gender ‘m’!= === 逻辑运算符? 逻辑运算符用于连接一个或多个条件,判 断这些条件是否成立 ? 逻辑运算符的类型为:运算逻辑“与”运算符表达式operand1 && operand2逻辑“或”逻辑“非”&& || !operand1 || operand2!operand1 逻辑“与”运算符 &&所有学科及格 No No Yes Yes留级 留级 留级 升级考勤率达到 75% No Yes No Yes 逻辑“与”运算符 &&所有学科及格 考勤率达到 75%No No Yes Yes留级 留级留级No Yes No Yes表达式 1表达式 2结果升级0 0 1 10 1 0 10 0 0 1 逻辑“或”运算符 ||信用卡No No Yes Yes无法支付可支付 可支付 可支付No Yes购物帐单No Yes 逻辑“或”运算符 ||现金信用卡No无法支付 可支付可支付No表达式 1表达式 2结果NoYes YesYesNo Yes00001 110 111 1可支付 逻辑“非”运算符 !天气 NOT 阴天Yes No不带伞 带伞 逻辑“非”运算符 !天气 NOT 阴天表达式结果不带伞 带伞真10假01操作 逻辑运算符总结所有学科 及格考勤率达到 75%天气 NOT 阴天&& 只有当两个条件 都为真时结果才 为真|| 只要任何一个条 件为真时结果就 为真! 对原条件取反, 即: 如果原条件为 假时结果就为 真优先次序:!(非) ―&&(与)―||(或) 逻辑运算符中的&&和||低于关系运算符,!高于算术运算符 短 路 运算※说明: (1)a&&b&&c 只有a为真 值时,才有必要去计算b的值, 只有a和 b都为 真值的情况下才有必要去计算c 的值,只要a 为假值 此时整个表达式 已经确定为假值b和c就不在进行计算 (2)a||b||c 只要a为真值,就没必要 去计算b和c的值,只有a为假时,才计 算b,a和b都为假时,才去计算c 课堂练习:写出下面逻辑表达式的值已知a=3,b=4,c=5; 1、a+b&c&&b==c 答案:1、0 2、1 3、1 2、a||b+c&&b-c 3、!(a&b)&&c||1解题思想:1、&&一面为假就为假,那么b==c(很容易判断出来) 2、3、 2题和3题中,只要知道||的级别比&& 低,那么最后算它,可||现 在一面的值已为真了,那么不管另一侧的结果是多少一定也为真。A=3,b=5,c=6 练习: a=1,b=2,c=3 (1)a+b&c&&b==c (2)a||b+c&&b-c (3)!(a&b)&&!c||1(1)a&b (2)b&c (3) a+b&c (4)a++&b (5)a&b&c (6)++a&b 条件结构 2-1? 条件结构就是需要根据不同条件进行判断, 然后执行不同的操作 ? 简单 if 语句的一般形式为:if (&条件&) &语句块&如果条件为真,if 语句执行一个语句或一组语句; 如果条件为假,则执行 if 语句后面的语句(如果有)。 条件结构 2-2? if-else 语句的一般形式为: if (&条件&) ? { ? &语句块& } ?else { &语句块& }如果条件为真,执行 if 后面的一个语句或一组语句; 如果条件为假,则执行 else 后面的语句。 简单if语句的示例内存 # include &stdio.h& void main() num1 num2 { 56 78 int num1, num2, sum printf(&\n请输入两个数:&); 134 scanf(&%d %d&, &num1,&num2); sum = num1+ num2 ; if(sum & 100) printf(&\n两数的和大于 100 \n &); } 请输入两个数:56 78 两数的和大于 100 if-else语句的示例#include &stdio.h& void main() { printf(&\n请输入一个整数:&); scanf (&%d&,&num); if((num % 2) == 0) printf(&%d 是一个偶数。\n&,num); else printf(&%d 是一个奇数。\n&,num); }请输入一个整数:57 57 是一个奇数。 内存num 57 #include &stdio.h& void main() { 问题描述: printf(&\n 请输入一个数:&); 确定用户输入的数字是否可以被5整除,并输出 scanf(&%d&,&num); 相应的消息。 if (!(num %5)) printf(&\n 该数能被 5 整除 \n &); else printf(&\n 该数不能被 5 整除 \n &); }请输入一个数:90 该数能被 5 整除综合示例1 #include &stdio.h& void main() { 问题描述: float rate1,rate2,rate3; double discount, 接受用户输入的三种商品的价格。如果购买的三 printf(&\n请输入第一种商品的价格:&); scanf(&%f&,&rate1); 种商品中至少有一种商品的价格大于 50 或者三 printf(&\n请输入第二种商品的价格:&); scanf(&%f&,&rate2); 种商品的总额大于 100,则折扣率为15%,否则 printf(&\n请输入第三种商品的价格:&); scanf(&%f&,&rate3); 折扣率为0,计算并显示用户应付的钱数。 total=rate1+rate2+rate3; if((rate1&50)||(rate2&50)||(rate3&50)||(total&100)) if((rate1&50)||(rate2&50)||(rate3&50)||(total&100)) { 输出: discount=0.15* total=total- 请输入第一种商品的价格:34 printf(&\n折后总价为:%6.2f\n&,total); 请输入第二种商品的价格:42 } else 请输入第三种商品的价格:38 printf(&\n总价为:%6.2f\n&,total); 折后总价为:96.90 }综合示例2 综合示例3#include &stdio.h& 问题描述: void main() { 判定给定的年份是否为闰年。 printf(&\n 请输入年份:&); scanf(&%d&,&year); 提示:闰年的判定规则为:能被 4 整除但不能被 if((year % 4 ==0 && year % 100 整除的年份。 100 整除的年份,或能被 400 != 0) || (year % 400 == 0)) printf(&\n %d 年是闰年 \n &, year); else printf(&\n %d 年不是闰年 \n &, year); }请输入年份: 年不是闰年 综合示例4#include &stdio.h& void main() 问题描述: { long ge,shi,qian,wan,x; 输入一个5位数,判断它是不是回文数。 printf(&\n 请输入一个五位整数:&); scanf(&%ld&,&x); 例如:12321是回文数,个位与万位相同, wan=x/10000; //分解出万位数 qian=x%; //分解出千位数 十位与千位相同。 shi=x%100/10; //分解出十位数 ge=x%10; //分解出个位数 if (ge==wan && shi==qian) /*个位等于万位并且十位等于千位*/ printf(&\n 这个数是回文数\n&); else 输出: printf(&\n 这个数不是回文数\n&); 请输入一个五位整数:45654 }这个数是回文数 多重条件判断有 制作胡萝卜沙拉 不能 上菜没有 有胡萝卜吗?制作黄瓜沙拉 没有没有有黄瓜吗? 是否有 胡萝卜做胡萝卜沙拉有没有 不能 上菜 可以 上菜结束开始是否有黄瓜?有可以 上菜有做黄瓜沙拉 制作黄瓜沙拉 多重条件结构? 要处理多重条件判断的情况,需要使用多 重条件结构 多重条件结构多重if嵌套 ifswitch结构 多重 if 结构if (表达式1) 真 假 ? 多重 if 结构是if-else 的另一种形式 ,这种 语句1;形式也称为阶梯式 if-else-ifelse if (表达式2) 语句2; else if (表达式3) 语句3; . . else 语句n;真 假真假 #include &stdio.h& 问题描述: void main() 内存 { 编写一个程序,根据用户输入的期末考试成绩, 输出相应的成绩评定信息。成绩大于等于90分输 59 printf(&\n 请输入期末考试成绩: &); scanf(&%f&, &grade); 出“优”;成绩大于等于80分小于90分输出 if(grade&=90) “良”;成绩大于等于60分小于80分输出“中”; printf(&\n 优&); 成绩小于60分输出“差”。 else if ((grade&=80) && (grade&90)) printf(&\n 良&); else if ((grade&=60) && (grade&80)) printf(&\n 中&); else printf(&\n 差&); 请输入期末考试成绩:59 printf(&\n&); 差 }多重 if 结构示例 嵌套 if 结构 2-1? 嵌套 if 结构就是将整个 if 块插入另一个 if 块 中 假if (表达式1) { if (表达式2)真 真 真if (表达式3)} else? 语句;?语句; 嵌套 if 结构 2-2if (x & 0) if (y & 1) z = 1; else /*这个 else 部分属于哪个 if?*/ z = 2; C语言规定,每个 else 部分总属于前面最近的那 个缺少对应的 else 部分的 if 语句。 提倡使用大括号括起来以避免看起来有二义性。 嵌套 if 结构的示例#include&stdio.h& void main() { int a,b; printf(&\n 请输入 A 和 B 的值: &); scanf(&%d%d&,&a,&b); if(a!=b) if(a&b) printf(&\n A&B\n&); else printf(&\n A&B\n&); else printf(&\n A=B\n&); }内存a 68b 93输出: A&B switch 结构 3-1嫌疑犯照片printf(D这是迈克尔,身高 180cm,加利福 这是吉姆,身高 175cm, 尼亚第 12 大街”); 停止搜索 墨西哥州海鸥路弗罗拉公寓, 于 2003 年 11 月 1 日在新泽西因抢银行被捕 printf(D这是丹尼尔,身高 193cm,现居住 地不明,1998 年 12 月 12 日在佛罗里达 被捕”); 停止搜索 printf(D这是吉姆,身高 175cm, 墨西哥州海鸥路弗罗拉公寓,于 2003 年 11 月 1 日在新泽西因抢银行被捕”);停止搜索不是 不是警 察 记 是录printf(D未发现匹配项。对不起!‖);停止搜索 switch 结构 3-2?switch (表达式) 语句是多路判断语句 switch-case 计算表达式的值 { ? switch 语句计算条件表达式并对照多个常数 case 常量 1: 如果等于常量1 语句; 值进行检查 case 常量 2: 语句; default: 语句; } 如果等于常量2如果没有找到匹配的值 switch 结构 3-3? 在使用switch结构时应注意以下几点:C 在case后的各常量表达式的值不能相同,否则 会出现错误; C 在case后,允许有多个语句,可以不用{}括起 来; C 每个case语句后都必须有一个break语句,否 则会出现错误; C 各case和default子句的先后顺序可以变动,而 不会影响程序执行结果; C default子句可以省略; char in_ printf(&\n 请输入一个小写字母: &); 内存 scanf(&%c&, &in_char); in_char 问题描述: switch(in_char) { e 要求用户输入一个字符值并检查它是否为元音字 case 'a': printf(&\n 您输入的是元音字母 a\n&); 母。 case 'e': printf(&\n 您输入的是元音字母 e\n&); case 'i': printf(&\n 您输入的是元音字母 i\n&); case 'o': printf(&\n 您输入的是元音字母 o\n&); case 'u': printf(&\n 您输入的是元音字母 u\n&); 请输入一个小写字母:e default: printf(&\n 您输入的不是元音字母 \n&); 您输入的是元音字母 e }switch 结构示例 比较多重 if 和 switch 结构? 多重if结构和switch结构都可以用来实现多路分支? 多重if结构用来实现两路、三路分支比较方便,而 switch结构实现三路以上分支比较方便? 在使用switch结构时,应注意分支条件要求是整 型表达式,而且case语句后面必须是常量表达式 ? 有些问题只能使用多重if结构来实现,例如要判断 一个值是否处在某个区间的情况 条件运算符 2-1是 考试是 否及格? 不是真条件表达式 表达式 1表达式 2假 条件运算符 2-2(1) value = num & 100 ? 50 : 100;条件表达式(0)if (num&100) { value=50; } else { value=100; }假设 num = 20050 value = num & 100 ? 50 : 100 ; 200使用“if-else”的等同代码 算术运算符示例问题描述: #include &stdio.h&void main() 个人所得税收取规定:工资大于1000元的部分将 { 扣除5%的个人所得税。小于1000元的部分不扣 除个人所得税。要求用户输入基本工资,计算税 printf(&\n 请输入基本工资:&); 后工资。 scanf(&%lf&,&sal); rate= (sal&=1000) ? 0 : 0.05; sal=sal-(sal-1000)* printf(&\n 税后工资为:%7.2f \n&,sal); } 请输入基本工资:1500税后工资为:1475.00 ※说明:1.结合方向为 自右向左 2.如果表达式2和表达式3的类型不同,整个条件表达式的值为二者较高的类型 总结? 多重if结构就是在主if块的else部分中还包含其他if 块 ? 嵌套if结构是在主if块中还包含另一个if 语句 ? C语言规定,嵌套if结构中每个else部分总是属于 前面最近的那个缺少对应的else部分的if语句 ? switch结构也可以用于多分支选择。用于分支条 件是整型表达式,而且判断该整型表达式的值是 否等于某些值(可以罗列的),然后根据不同的 情况,执行不同的操作 ? 条件运算符是 ifCelse 语句的另一种表现形式 例4.2 main() { int a,b,c,t; printf(“input a,b,c”): scanf(“%d%d%d”,&a,&b,&c);例 输入两个值给变量a、b,然后输出比较大的数 main() { int a,b, scanf(“%d%d”,&a,&b);printf(“a=%d,b=%d,c=%d\n”,a,b,c); max=a&b?a:b; printf(“max=%d’,max); if(a&b){t=a;a=b;b=t;}}if(a&c){ t=a; a=c; c=t;} if(b&c) { t=b; b=c; c=t;} printf(“%d,%d,%d\n”,a,b,c); } 第五章 循环结构(一) 回顾? 多重if结构就是在主if块的else部分中还包含其他if 块 ? 嵌套if结构是在主if块中还包含另一个if 语句 ? C语言规定,嵌套if结构中每个else部分总是属于 前面最近的那个缺少对应的else部分的if语句 ? switch结构也可以用于多分支选择。用于分支条 件是整型表达式,而且判断该整型表达式的值是 否等于某些值(可以罗列的),然后根据不同的 情况,执行不同的操作 ? 条件运算符是 ifCelse 语句的另一种表现形式 目标? ? ? ? ? 理解为什么使用循环结构 理解循环的两大规则 熟练掌握while循环的使用 熟练掌握do-while循环的使用 理解while 和 do-while 循环的区别 循环的必要性? ? ? ? ? ? ? ? ? ? ? ? Int result1,result2,result3; int result4,result5; result1 = 1 * 10; printf(&1 × 10 = %d \n&,result1); result2 = 2 * 10; printf(&2 × 10 = %d \n&,result2); result3 = 3 * 10; printf(&3 × 10 = %d \n&,result3); result4 = 4 * 10; printf(&4 × 10 = %d \n&,result4); result5 = 5 * 10; printf(&5 × 10 = %d \n&,result5);1 × 10 =10 2 × 10 =20输出结果 3 × 10 =304 × 10 =40 5 × 10 =50重复语句 C 语言中的各种循环需要多次重复执行一个或多个任务的问题考虑使用循环来解决 while 循环 3-1while 循环的一般语法: 工作原理while (表达式) { 语句; }计算表达式的值,当值为真(非0) 时,执行循环体语句,一旦条件为 假,就停止执行循环体。如果条件 在开始时就为假,那么不执行循环 体语句直接退出循环。示例while (index & 100) { ... ... index++; } while 循环 3-2[&初始化&]while(循环条件) { &循环体& }循环条件中使用的变量需要 经过初始化 while 循环 3-3while (index & 100) { ... ... index++; }while (1) while 循环主体中的语句必须 修改循环条件的值,否则会 形成死循环真 while 循环示例1(找出循环规律)0+1 1+1 2+1 上个数字 + 1 ...1 × 10 = 10 2 × 10 = 20 3 × 10 = 30 4 × 10 = 405 × 10 = 50重复 (上个数字 +1) × 10 内存#include&stdio.h& num result void main () null 11 2 1 100 10 { int num=1, while (num&=10) 输出: { 1 × 10 = 10 result=num*10; 2 printf(&%d × 10 = %d \n&,num,result); × 10 = 20 3 × 10 = 30 num++; 4 × 10 = 40 } 5 × 10 = 50 } 6 × 10 = 607 × 10 = 70 8 × 10 = 80 9 × 10 = 90 10 × 10 = 100 while 循环示例2#include 问题描述:&stdio.h& void main () { 写一个程序,要求它从摄氏温度0 度到250 度, int c=0,count=0; 每隔20 度为一项,输出一个摄氏温度与华氏温 输出: 度的对照表,同时要求对照表中的条目不超过10 1: C = while (c &= 250 && count&10)0, F = 32.00 2: C = 20, F = 68.00 { 条。 3: C = 40, F = 104.00 count++; printf(&%d: &,count);4: C = 60, F = 140.00 f=c * 9 / 5.0 + 32.0;5: C = 80, F = 176.00 6: C = 100, c, 212.00 printf(&C = %d, F = %7.2f\n&, F = f); 7: C = 120, F = 248.00 c = c + 20; 8: C = 140, F = 284.00 } 9: C = 160, F = 320.00 } 10: C = 180, F = 356.00 嵌套 while 循环? 嵌套 while 循环的语法while(i &= 10) { ... while (i &= j) { ... ... } ... }只有在内循环完全结束后, 外循环才会进行下一趟。外循环 内循环 嵌套 while 循环示例 问题描述:void main() { 用“*”打印一个直角三角形图案。 图案如下所 int 示: nstars=1, while(nstars &= 10) { 输出: 内层循环控制每行打印*号的个数 stars=1; * * ** while (stars &= nstars) ** 外层循环控制打印的行数 *** { *** **** printf(&*&); **** ***** ***** ****** stars++; *******} ****** ******** printf(&\n&); ******* ********* nstars++; ******** ********** } ********* } ********** do-while 循环while 循环的一般语法: 工作原理do { 语句; } while (表达式);它先执行循环体中的语句, 然后再判断条件是否为真, 如果为真则继续循环;如果 为假,则终止循环。示例do { ... ... scanf(“%d”,&answer); } while (answer != -1); do-while 循环示例int number=5, 请输入您猜测的数:3 问题描述: printf (&猜一个介于 1 与 10 之间的数\n&); 太小 do 猜数游戏。要求猜一个介于1~10之间的数字, 请输入您猜测的数:5 { printf(&请输入您猜测的数:&);您猜中了! 答案为 5 根据用户猜测的数与标准值进行对比,并给出提 scanf(&%d&,&guess); 输入数字 5 后, 示,以便下次猜测能接近标准值,直到猜中为止。 if (guess & number) do…while 循环中的条 printf(&太大\n&); 件为假, 输出结果消 else if (guess & number) 息后,程序终止。 printf(&太小\n&); } while (guess != number); printf(&您猜中了! 答案为 %d\n&,number);猜一个介于 1 与 10 之间的数 嵌套 do-while 循环? 嵌套 do-while 循环的语法do { ... do { ... }while( . . .) ... }while( . . . )只有在内循环完全结束后, 外循环才会进行下一趟。外循环 内循环 嵌套 do-while 循环示例int value, r_ value = 0; do { printf(&\n请输入一个数:&); scanf(&%d&, &value); if( value &= 0 ) printf(&该数必须为正数\n&); }while( value &= 0 ); printf(&\n反转后的数为:&); do { r_digit = value % 10; printf(&%d&, r_digit); value = value / 10; }while( value != 0 ); printf(&\n&); 该程序用 do- while 循环 将数字左右反转 int value, r_ value = 0; do { printf(&\n请输入一个数:&); scanf(&%d&, &value); if( value &= 0 ) printf(&该数必须为正数\n&); }while( value &= 0 ); printf(&\n反转后的数为:&); do { r_digit = value % 10; printf(&%d&, r_digit); value = value / 10; }while( value != 0 ); printf(&\n&);同样的程序用 通过示例比较 while 循环 将数字左右反转int value, r_ value = 0; while( value &= 0 ) { printf(&\n请输入一个数:&); scanf(&%d&, &value); if( value &= 0 ) printf(&该数必须为正数\n&); } printf(&\n反转后的数为:&); while( value != 0 ) { r_digit = value % 10; printf(&%d&, r_digit); value = value / 10; } printf(&\n&); 比较 while 和 do-while循环? 比较while 和 do-while 循环的工作原理do { 循环体; }while( 循环条件); do-while 循环是先执行 后判断,所以,即使开 始条件为假,循环体也 至少会被执行一次。while(循环条件) { 循环体; } while循环是先判断后 执行,所以,如果条 件为假,则循环体一 次也不会被执行。 总结? 循环结构的特点是,在给定条件成立时, 重复执行某程序段,直到条件不成立为止 ? while 循环用于在给定条件为真的情况下重 复执行一组操作,while循环先判断后执行 ? do-while循环先执行后判断,因此循环将至 少执行一次 ? 在循环中,需要修改循环变量的值以改变 循环条件,否则有可能形成死循环 ? 循环嵌套必须将内层循环完整的包含在外 层循环中 第五章 循环结构(二) 回顾? 循环结构的特点是,在给定条件成立时, 重复执行某程序段,直到条件不成立为止 ? while 循环用于在给定条件为真的情况下 重复执行一组操作,while循环先判断后执 行 ? do-while循环先执行后判断,因此循环将 至少执行一次 ? 在循环中,需要修改循环变量的值以改变 循环条件,否则有可能形成死循环 ? 循环嵌套必须将内层循环完整的包含在外 目标? 熟练使用for循环 ? 理解 break 和 continue 语句的用法 ? 熟练使用嵌套循环 for 循环for 循环的一般语法: for( 表达式1 ; 表达式2 ; 表达式3 ) { 1 2 4 语句; 3 }counter = 0; counter == 10; counter ++; 工作原理 inum = 1; inum & 25; inum = inum + 1; 1、计算表达式1的值,通常为循环变量赋初值; cnt = 100; cnt &0 cnt-2、计算表达式2的值,即判断循环条件是否为真,若值为真则执行循环体一次, 否则跳出循环; 3、计算表达式3的值,这里通常写更新循环变量的赋值表达式,然 分号用于分隔 for 循环的 后转回第2步重复执行; 三个表达式 for 循环示例1内存#include &stdio.h& number count void main() 6 2 5 1 { factorial int number,count,factorial=1; 120 1 printf(&\n 请输入任意一个正整数:&); scanf(&%d&,&number); for(count = 1; count &= count++) factorial=factorial* printf(&\n %d的阶乘 = %d\n&,number,factorial); } 循环执行五次请输入任意一个正整数:5 5的阶乘 = 120 逗号运算符? for语句中的三个表达式都可以是逗号表达 式 ? 逗号表达式就是通过“,”运算符隔开的多 个表达式组成的表达式 ? 逗号表达式从左往右计算。逗号运算符在 C 语言运算符中的优先级最低for(i = 0 , j = i &= i++, j--) printf(D\n%d + %d = %d‖,i, j, i + j); for 循环示例2请输入一个值 #include &stdio.h& 根据这个值可以输出以下加法表:5 void main() 0+5=5 1+4=5 { 2+3=5 int i,j, 3+2=5 printf(&请输入一个值 + 1 = 5 4 \n&); 初始化语 printf(&根据这个值可以输出以下加法表:&); 句只执行 一次 scanf(&%d&,&max); for(i = 0,j = i &= i++,j--) printf(&\n %d + %d = %d&,i,j,i + j); printf(&\n&); } 循环执行max次 for 循环的表达式? for 循环中有三个表达式 ? for 语句中的各个表达式都可以省略 ? 分号分隔符不能省略可省略for(&初始化循环变量& ;&循环条件& ; &修改循环变量的值&) { 不能省略 &循环体语句&; } 省略表达式1? 相当于省去了为循环变量赋初值,此时应 在for语句之前给循环变量赋初值int num=0; for(;num &= 10 ;num ++) { printf(&%d\n&,num*2); } int a=0,n; printf(&\n 输入n的值: &); scanf(&%d&,&n); for(;n&0;a++,n--) printf(&%d &,a*2); 省略表达式2? 即不判断循环条件,也就是认为表达式2 始终为真, ? 这时应在循环体内设法结束循环,否则将 成为死循环for(num=1;;num++) { ... } 省略表达式3? 即省去修改循环变量的值,但此时应在循 环体内设法更改循环变量的值for(i=1;i&=100;) { sum=sum+1; i++; } 省略三个表达式? 即不为循环变量赋初值,不设置循环条件 (认为表达式2为真值),不修改循环变量 的值,无终止地执行循环体。此时应在循 环体内设法结束循环,否则会成为死循环for( ; ; ) { printf(&这将一直进行下去&); i = getchar(); if(i == 'X' || i == 'x') } break 语句 2-1? break语句可以改变程序的控制流 ? break语句用于do-while、while、for循环中时, 可使程序终止循环而执行循环后面的语句 ? break语句通常在循环中与条件语句一起使用。 若条件值为真,将跳出循环,控制流转向循环 后面的语句 ? 如果已执行break语句,就不会执行循环体中位 于 break 语句后的语句 ? 在多层循环中,一个break语句只向外跳一层 break 语句 2-2跳出 for 循环for( ; ; ) { printf(&这将一直进行下去&); i = getchar(); if(i == 'X' || i == 'x') }跳出 while 循环while(1) { if(x == 10) }跳出 do-while 循环do {if (x == 10) }while (x& 15); break 语句示例内存 #include&stdio.h& ch count void main() 问题描述: { 0 H _ 5 1 统计从键盘输入的若干个字符中有效字符的个数, int count=0, 以换行符作为输入结束。有效字符是指第一个空 printf(&\n 请输入一行字符:&); while((ch=getchar())!='\n') 格符前面的字符,若输入字符中没有空格符,则 { 有效字符为除了换行符之外的所有字符。 if(ch==' ') count++; 循环执行 5 次 } printf(&\n 共有 %d 个有效字符。\n&,count); } 请输入一行字符:Hello world 共有 5 个 有效字符 continue 语句 2-1? continue 语句只能用在循环里 ? continue 语句的作用是跳过循环体中剩余 的语句而执行下一次循环 ? 对于while和do-while循环,continue 语句 执行之后的动作是条件判断;对于for循环, 随后的动作是变量更新 continue 语句 2-2while(…) { …… …… …… …… } while(…) { …… …… …… …… }继 续 下 一 次 循 环跳 出 整 个 循 环 continue 语句示例内存 #include&stdio.h& i sum void main() { 1 4570 0 null 101 13 1 78 问题描述: int i,sum = 0; 求整数1~100的累加值,但要求跳过所有个位为 for(i=1; i&=100;i++) { 3的数。 if( i % 10 == 3) 循环执行到 i = 13 sum += 循环执行到 i = 101 } printf(&sum = %d \n&,sum); } 输出: sum = 4570 void main() { 问题描述: int i,j,k; 控制打印的行数 for(i=1;i&=4;i++) 用“*”输出一个菱形图案,图案如下: { for(j=1;j&=4-i;j++) 控制每行打印的空格数 * printf(& &); for(k=1;k&=2*i-1;k++) * * * 控制每行打印的*号数 printf(&*&); printf(&\n&); ***** } 输出: for(i=1;i&=3;i++) * 控制打印的行数 ****** * { * 控制每行打印的空格数 * * for(j=1;j&=i;j++) * * * * * printf(& &); ***** for(k=1;k&=7-2*i;k++) * 控制每行打印的*号数 * * * * * **** printf(&*&); ***** printf(&\n&); * *** } } *嵌套循环示例1 void main() { 问题描述: int i,j,n; n=0; 打印输出100至200之间的全部素数。 for(i=100;i&=200;i++) { 分析:素数是指只能被1和它本身整除的数。算 j=2; while(i%j!=0) 法比较简单,先将这个数被2除,如果能整除, 从2到i之间寻找第一个能被整除的数 j++; 且该数又不等于2,则该数不是素数。如果该数 如果第一个能被整除的数等于 if(i==j) 该数本身,则说明该数为素数 { 不能被2整除,再看则是否能被3整除。如果被3 printf(&%4d&,i); n++; 控制每行输出8个素数 整除,并且该数不等于3,则该数不是素数,否 if(n%8==0) 输出: 则再判断是否被4整除,依此类推,该数只要是 printf(&\n&); 从100到200之间所有的素数为: } 能被小于本身的某个数整除时,就不是素数。 137 101 103 107 109 113 127 131 } 139 149 151 157 163 167 173 179 printf(&\n&); 181 191 193 197 199 }嵌套循环示例2 输出: void main() 请输入一个数: 58 { int i, ========== 该数是 58 do { 您是否还要输入其他的数(y/n)? y printf(&请输入一个数:&); 请输入一个数: 64 scanf(&%d&,&num); printf(&\n&); ========== for (i = 1; i &= 10; i++) 该数是 64 { 您是否还要输入其他的数(y/n)? n printf(&=&); Press any key to continue } printf(&\n 该数是 %d&,num); printf(&\n\n 您是否还要输入其他的数(y/n)?&); fflush(stdin); answer = getchar(); } while (answer != 'n'); }嵌套循环示例3 总结 2-1? for 循环与 while 循环类似,属于先判断后 执行 ? for 语句中有三个表达式:表达式1通常用 来给循环变量赋初值;表达式2通常是循环 条件;表达式3用来更新循环变量的值 ? for 语句中的各个表达式都可以省略,但要 注意分号分隔符不能省略 ? 如果省略表达式2和表达式3需要在循环体 内设法结束循环,否则会导致死循环 总结 2-2? break 语句用在循环中时,可以直接终止循 环,将控制转向循环后面的语句 ? continue 语句的作用是跳过循环体中剩余 的语句而执行下一次循环 ? 嵌套循环时,必须将被嵌套的循环语句完 整地包含在外层循环的循环体内 第六章字符型数据 回顾 2-1? for 循环与 while 循环类似,属于先判断后执 行 ? for 语句中有三个表达式:表达式1通常用来 给循环变量赋初值;表达式2通常是循环条 件;表达式3用来更新循环变量的值 ? for 语句中的各个表达式都可以省略,但要注 意分号分隔符不能省略 ? 如果省略表达式2和表达式3需要在循环体内 设法结束循环,否则会导致死循环 回顾 2-2? break 语句用在循环中时,可以直接终止循 环,将控制转向循环后面的语句 ? continue 语句的作用是跳过循环体中剩余 的语句而执行下一次循环 ? 嵌套循环时,必须将被嵌套的循环语句完 整地包含在外层循环的循环体内 字符型3-1在线保险单23 年龄:_____ 98340 保险总额:_____'M' 性别:_____int/floatchar 值0 32符号空字符 空格 ! & # 44 45值, -符号91 92值[ \符号3334 35 36 374647 58 59./ : ;9394 95 96 97 ~ 122]3839 40' ' '5' $ 'p' % '$' &' (48 ~ 57 0 ~ 9&2& ` a ~ z^6061 62&= &123124 125{ '2'| }正确4142)*63 126 ~ '2' +? '2' = 464 @ 127DEL (Delete 键)43+65 ~ 90 A ~ Z 字符型3-3占 8 位内存 gender='m'; unsigned0 至 255signed 或 unsignedchar gender='m';Signed -128 至 +127 接受并显示字符字符型数据字符型数据字符型变量 getchar() 函数语法: variablename =例如: c=getchar(); getchar():函数接收用户的输入.当程序执行 到getchar()函数时,该函数将从键盘取字符, 如果没有已经键入的字符,程序就会等待,直 到用户通过键盘输入字符,并按回车键之后, 函数getchar()才能得到结果,语句完成后程 序继续运行下去.造成这种情况的原因是操 作系统通常采用缓冲式输入方式.用户通过 键盘输入的字符临时保存在操作系统的” 输入缓冲区”(系统管理下的一块内存区域), 此后getchar()函数才能读到这些字符.另外 getchar()函数只能接受单个字符,输入数字 也按字符处理.当输入多于一个字符时,只接 收第一个字符(需要注意一点). fflush():函数用于清空输入缓冲区.stdin是标 准的输入,即键盘输入.分配给键盘的缓冲区 需要清空,以便存储新数据.有时,键盘缓冲区 中保留着旧信息,如果不清空,在接受字符时 会将旧信息返回,这样就可能引发错误. getchar()和putchar()示例 内存#include &stdio.h& a void main() { O char a,b; printf(& 请输入两个字符:\n&); a=getchar(); fflush(stdin); 输出: b=getchar(); 请输入两个字符: fflush(stdin); O putchar(a); K putchar(b); putchar('\n'); OK } b KPress any key to continue_ void main() 内存 问题描述: { 要求判别键盘输入字符的类别。可以根据输入字 printf(&\n 请输入一个字符: &); E 符的ASCII码来判别类型。由ASCII码表可知 c=getchar(); if(c&32) ASCII码值小于32的为控制字符。 在0~9之间的 printf(&\n 该字符是一个控制字符。\n&); 为数字,在A~Z之间为大写字母, 在a~z之间 else if(c&='0'&&c&='9') 为小写字母,其余则为其它字符。 printf(&\n 该字符是一个数字。\n&); else if(c&='A'&&c&='Z') printf(&\n 该字符是一个大写字母。\n&); else if(c&='a'&&c&='z') printf(&\n 该字符是一个小写字母。\n&); else 请输入一个字符:E printf(&\n 该字符是其他字符。\n&); 该字符是一个大写字母 }示例2-2 示例2.3内存a b int a,b; printf(&\n 输入操作数1,运算符,操作数2: &); 45 2 问题描述: scanf(&%d,%c,%d&,&a,&op,&b); op switch(op) 编写一个简单的计算器,实现两个整型数的四则 { * 运算。 printf(&\n %d+%d=%d\n&,a,b,a+b); case '+': case '-': printf(&\n %d-%d=%d\n&,a,b,a-b); case '*': printf(&\n %d×%d=%d\n&,a,b,a*b); case '/': printf(&\n %d/%d=%d\n&,a,b,a/b); default: printf(&\n 运算符错误!&); 输入操作数1,运算符,操作数2:45,*,2 } 45×2 = 90 注意: 小写字母与大写字母的差值是32注意: 在内存占一个字节 可参加整型数据的任何运算三、字符串常量1.定义:用一对双引号括起来的一串字符(系统在每个字符串的最后自动加入一个 字符’\0’ 作为字符串的结束标志)四、可对字符量进行的运算1.可以参与任何整数运算’B’-’A’ ‘a’+1 ‘9’+10 66-65=1 97+1=98 57+10=67 如‘a’&&’b’ ‘a’&‘b’2.字符常量可以进行关系运算 第七章函数 回顾 2-1? for 循环与 while 循环类似,属于先判断后执 行 ? for 语句中有三个表达式:表达式1通常用来 给循环变量赋初值;表达式2通常是循环条 件;表达式3用来更新循环变量的值 ? for 语句中的各个表达式都可以省略,但要注 意分号分隔符不能省略 ? 如果省略表达式2和表达式3需要在循环体内 设法结束循环,否则会导致死循环 回顾 2-2? break 语句用在循环中时,可以直接终止循 环,将控制转向循环后面的语句 ? continue 语句的作用是跳过循环体中剩余 的语句而执行下一次循环 ? 嵌套循环时,必须将被嵌套的循环语句完 整地包含在外层循环的循环体内 例题:请输入二个整数,来判断二个数是奇数还是偶数main() { int a,b; Printf(“请输入二个数来判断是奇数还是偶数:”); Scanf(“%d%d”,&a,&b); If(a%2==0) //判断a是否是偶数 Printf(“%d是偶数”,a); else Printf(“%d是奇数:”a); If(b%2==0) //判断b是否是偶数 重复语句(功能一样) Printf(“%d是偶数”,b); else Printf(“%d是奇数”,b); } 为什么使用函数void main() { :::::: x=x*x*x; void main() int cube(int a,b,c) { y=y*y*y; z=z*z*z; { :::::: 重复多次的同一 ans1=x+y+z; ans1=cube(x,y,z); 计算类型 a=a*a*a; ans=(a*a*a)+(b*b*b)+(c*c*c); ans2=cube(a,b,c); b=b*b*b; ::::: ans c=c*c*c; } } 函数 ans2=a+b+c; 主程序 ::::: } 函数可以把相对独立的某个功能抽象出来,使之成为 程序中的一个独立实体。可以在同一个程序或其他程 序中多次重复使用 函数机制的优点? ? ? ? 使程序变得更简短而清晰 有利于程序维护 可以提高程序开发的效率 提高了代码的重用性 函数定义void displayDiscount() double y) double max(double x, {price, discount_ printf(&请输入价格&); m=x&y?x:y; scanf(&%f, &price); discount_amt = 0.75 * } printf(&折扣额为 %f&, discount_amt); 该函数名为max,它有两个double类型的参数,返回 } 值为double类型。在函数体内有三条语句实现了求两个数中较大的数,并将它返回。 该函数名为displayDiscount,无参数,使用void说明 无返回值,函数体内的语句用于根据产品的价格求折 扣后的价格。 函数原型? 函数原型说明在形式上与函数头部类似,最后加一个分号。原型说明 中参数表里的参数名可以不写(只写参数类型)。 C语言规定:函数必须先定义,后调用(函数的返回值类型为int 或char 除外)凡是未在调用前定义的函数(即未在调用前写函数原型),c编译 程序都默认函数的返回值为int型。对于返回值为其他类型的函数,若把 函数的定义放在调用之后,应该在调用之前对函数进行说明(即写函数 原型)。 #include &stdio.h& float count (int, int); void main() { . . . . . . } float count(int x,int y) { . . . } 函数形参和实参void main ( ) { 实际参数 又叫实参 ... ... 函数调用 display ( 10, 20.5 ); }display ( int num, float fraction ) { ... ... 形式参数 又叫形参 } 函数调用float set_discount() ?#include&stdio.h& 通过在程序中使用函数名称,可以执行函数中包 { void main() 含的语句,这称为调用函数 :::::::::: { :::::::::: ::::::::: ? 函数之间允许相互调用,也允许嵌套调用 } set_discount(); ? 函数还可以自己调用自己,称为递归调用 displayDiscount(); float displayDiscount() :::::::: { :::::::: :::::::::: } :::::::::: } 函数嵌套调用#include&stdio.h& void main() { ::::::::: palindrome(); :::::::: :::::::: } void palindrome() {::::::::reverse();::::::::} void reverse() { :::::::::: :::::::::: }从一个函数调用另一个函数称为函数的嵌套调用 函数类型内置函数: ?由C语言系统提供; ?用户无须定义,也不 必在程序中作类型说明; ?只需在程序前包含有 该函数定义的头文件;自定义函数: ?用户在程序中根据需 要而编写的函数; 内置函数double sqrt(double x) double pow(double x, double y) double ceil(double x) double floor(double x) int toupper(int x)头文 件用途计算x的平方根 计算x的y次幂math.h求不小于x的最小整数,并以 double形式显示 求不大于x的最大整数,并以 double形式显示 如果x为小写字母,则返回对 应的大写字母int tolower(int x)int rand(void)ctype. h如果x为大写字母,则返回对 应的小写字母stdlib. 产生一个随机数 void exit(int retval) h 终止程序 内置函数sqrt 和pow 示例1的平方根: 1.00 1的立方: 1 #include &stdio.h& 2的平方根: 1.41 2的立方: 8 #include &math.h& 3的平方根: 1.73 3的立方: 27 4的平方根: 2.00 4的立方: 64 void main() 问题描述: 5的平方根: 2.24 5的立方: 125 { 6的平方根: 2.45 6的立方: 216 int x=1; 求自然数1~10的平方根和立方。 2 2.65 6 7的立方: 343 7的平方根: 64 double squareroot, 8的平方根: 2.83 8的立方: 512 9的平方根: 3.00 9的立方: 729 while(x &= 10) 10的平方根: 3.16 10的立方: 1000 { Press any key to continuesquareroot=sqrt(x); power=pow(x,3); printf(& %d的平方根:%3.2f\t%d的立方:%5.0f \n&, x,squareroot,x,power); x++;} } 内置函数ceil和floor示例#include &stdio.h& #include &math.h& void main() { printf(&==============floor()=========&); 2 6 64 printf(&\n floor(99.1) = %f \n&,floor(99.1)); ==============floor()========= printf(& floor(-99.1) = %f\n&,floor(-99.1)); floor(99.1) = printf(& floor(99.9) = %f\n&,floor(99.9)); 99.000000 floor(-99.1) = -100.000000 printf(& floor(-99.9) = %f\n&,floor(-99.9)); floor(99.9) = 99.000000 printf(&\n==============ceil()==========&); floor(-99.9) = -100.000000 printf(&\n ceil(99.1) = %f\n&,ceil(99.1)); ==============ceil()========== printf(& ceil(-99.1) = %f\n&,ceil(-99.1)); ceil(99.1) = 100.000000 printf(& ceil(99.9) = %f\n&,ceil(99.9)); = -99.000000 ceil(-99.1) printf(& ceil(-99.9) = %f\n&,ceil(-99.9)); 100.000000 ceil(99.9) = } ceil(-99.9) = -99.000000Press any key to continue toupper和tolower示例#include&stdio.h& #include&ctype.h& void main() { char msg1,msg2,to_upper,to_ 2 printf(&请输入一个小写字母:&); msg1=getchar(); to_upper=toupper(msg1); printf(&转换为大写:%c\n&,to_upper); printf(&请输入一个大写字母:&); fflush(stdin); msg2=getchar(); to_lower=tolower(msg2); printf(&转换为小写:%c\n&,to_lower); }请输入一个小写字母:d 转换为大写:D 请输入一个大写字母:E 转换为小写:e Press any key to continue6 64 内置函数rand示例产生 10 个 0 到 99 之间的随机数序列: #include&stdio.h& 44 73 26 58 37 94 27 42 28 90 #include&stdlib.h& Press any key to continue //#include&time.h& 2 6 64 void main() { printf(&产生 10 个 0 到 99 之间的随机数序列:\n\n&); //srand((unsigned)time(NULL)); for(i=0; i&10; i++) printf(&%d &, rand() % 100); printf(&\n&); 演示:示例4 } 传值调用传值调用void main() { int a = 0; //初始化a值为0 func(a); //调用函数func 0 printf(&%d&,a); //输出a的结果 } //定义函数func void func(int a) { a = 10; //让参数a等于10 }将会输出什么 请输入两个数 : 34 56 _递增前的值是 34 和 56调用函数 传值调用示例 num2 num1#include &stdio.h& 递增后的值是 void increment(int,int); 34 和 56 34 56 34 56 void main() { int num1,num2; FF23 FF05 printf(&\n 请输入两个数: &); scanf(& %d %d&,&num1,&num2); 将变量num1的 将变量num2的 printf(&\n值赋给形参val1 %d 值赋给形参val2 num2); 递增前的值是 和 %d\n&, num1, increment(num1,num2); 34 56 printf(&\n 递增后的值是 %d 和 %d\n&, num1, num2); } val1 调用后修改为35 调用后修改为57 val2 var1 var2 void increment(int val1,int val2) 57 { 35 56 val1++; 34 val2++; FF45 printf(&\nFFEA 子函数中值 %d 和 %d\n&, val1, val2); } 被调用函数num1 子函数中的值是 35 和 57num2 总结:传值调用在调用时,系统将实参拷贝一 个副本给形参,使形参具有与实参相同的值, 即实参值分别按位置传递给对应的形参,使 形参获取从实参传递来的值.这种调用方式 的特点是在被调用函数中改变形参的值,只 是改变其副本值,而不会影响调用函数中的 实参值. #include&stdio.h& void try(int,int,int); main() { int x=2,y=3,z=0; printf(“(1)x=%d y=%d z=%d\n”,x,y,z); try(x,y,z); printf(“(4)x=%d y=%d z=%d\n”,x,y,z); 程序的运行结果如下: } (1)x=2 y=3 z=0 void try(int x,int y,int z) { printf(“(2)x=%d y=%d z=%d\n”,x,y,z); (2)x=2 y=3 z=0 z=x+y; (3)x=4 y=9 z=5 x=x*x; (4)x=2 y=3 z=0 y=y*y; printf(“(3)x=%d y=%d z=%d\n”,x,y,z); } #include&stdio.h& void AreaOfRect() void AreaOfRect(); { void AreaOfTriangle(); int x,y; void AreaOfTriangle() void AreaOfRound(); 函数原型 printf(&请输入长方形的长:&); { void main() scanf(&%d&,&x); int x,y; void AreaOfRound() { 问题描述: printf(&请输入长方形的宽:&); printf(&请输入三角形的底:&); { scanf(&%d&,&y); scanf(&%d&,&x); do { 根据用户的选择求不同形状的面积。 printf(&面积为:%d\n&,(x * y)); printf(&请输入三角形的高:&); printf(&请输入圆形的半径:&); printf(& 0、退出\n 1、长方形\n 2、三角形\n 3、圆形\n&); } scanf(&%d&,&y); scanf(&%d&,&r); printf(&请选择功能:&); printf(&面积为:%d\n&,(x * y)/2); printf(&面积为:%d\n&,3.14*r*r); scanf(&%d&,&select); } } if(select == 0) switch(select) { case 1 : AreaOfRect(); //长方形 case 2 : AreaOfTriangle(); //三角形 case 3 : AreaOfRound(); //圆形 default : printf(&输入有误,请在 0~4 之间选择。\n&); } }while(1); 演示:示例6 }函数调用示例 函数返回值? C 语言中的 return 语句用于向调用函数返 回值,语法如下: return (&表达式&);? C语言中的函数至多可以返回一个值,不能返回 int divisibleCheck(int num) 多个值; { if (num % 5 == 0) ? 返回值的数据类型必须与函数原型中返回值的 return 数据类型匹配;1; else ? 当遇到 return 语句时,函数执行将终止。 return 0; } 程序控制流将立即返回调用函数; 函数返回值示例内存 #include &stdio.h& age1 age2 age3 int get_age(); void main() 78 54 65 { int age1, age2, age3; int get_age() age1 = get_age(); { age2 = get_age(); age3 = get_age(); printf(&\n请输入年龄: &); if ( (age1 & age2) && (age1 & age3)) scanf(&%d&,&age); printf(&\n年龄为 %d 的人最大\n&, age1); else if( (age2 & age1) && (age2 & age3)) } printf(&\n年龄为 %d 的人最大\n&, age2); else if( (age3 & age1) && (age3 & age2)) 请输入年龄:65 printf(&\n年龄为 %d 的人最大\n&, age2);请输入年龄:78 请输入年龄:54 }年龄为 78 岁的人最大 总结 2-1? 函数是程序中的一个相对独立的单元或模 块,程序在需要时可以任意多次地调用函 数来完成特定功能 ? 使用函数带来的好处: 程序更清晰、易维 护、分模块方便设计与开发、提高代码的 重用性 ? C语言提供了极为丰富的内置函数,这些 内置函数分门别类地放在不同的头文件中, 要使用这些内置函数,只要在程序前包含 相应的头文件即可 总结 2-2? 自定义函数是用户在程序中根据需要而编写 的函数 ? 函数的结构包括:返回值类型、函数名、参 数列表、函数体 ? 函数原型说明以便向编译器指出该函数使用 什么样的格式和语法 ? 函数调用时程序控制流将转向被调函数,被 调函数执行结束时,控制流返回主调函数 ? return 语句用于向调用函数返回值 第八章指针 图书馆的例子: 你去图书馆去借书,那么首先你得知道你要借的书名,到了图书馆后,告 诉管理员要借的书名(例如:这个书名叫《高数》而这本数放在三楼301号屋 子里)那么管理员就会去三楼301的屋子里把那本书拿过来给你。(屋子的编 号是唯一的)(书的内容就是高数的各种题及例子等等)咱们学习的C中:一个变量:x=10; 那么变量的名子就好比是图书的名子一 样(只不过这个书名是由你定义的,而这个书里的内容就是一个十进制的值 10),而咱们用的C++工具就好比是图书管理员,那么每次大家在用到X这个 变量的时候,比如说I这个操作,那么C++这个工具就会在内存(图书馆 里)开辟一块空间(并给一个唯一的地址,注:这时候这个唯一的地址就和 这个变量的名子绑在了一起),而这个空间名子就叫X,那么大家想一想, 找到了这个地址是不是也就找到了这个变量啊。 那么你在做X=20的时候,对于C++工具来说,首先要找到这个变量的地址 (就好比图书管理员先要找到三楼301号屋子一样)在把20这个值放到这个地 址里去,那么这时候X的值就变成了20这个值。而对于程序员来说,你只要记 住变量的名子是X就可以了,别的工作是由C++工具(管理员来完成的)。 1、程序执行中所用的数据都存于内存中,任何数 据都有一定的存储位置,占据一定数量的存储单元. 内存单元按顺序排列,每个单元有一个称为内存地 址的编号.如同通过通信地址可以唯一确定居住区 的每个住户一样,内存中的数据也可以通过内存单 元的地址进行确定,内存单元的地址用一个十六进 制数表示,如fff3,ff10等等.对程序员而言,记住变量 名要比记住用十六进制表示的内存单元地址更加 简便,所以我们要给程序变量起名,然后通过变量名 来引用内存单元的数据.(举图书馆的例子) 2、直接存取:我们在程序中只需指出变量名,无需 知道每个变量在内存中的具体地址,每个变量与具 体地址的联系由c 编译系统来完成.程序中我们对 变量进行存取操作,实际上也就是对某个地址的存 储单元进行操作.这种直接按变量的地址存取变量 值的方式称为:直接存取. 如图:假设程序已定义了三个整型变量I,j,k, 编译时系统分配四个字节给变 量i,四个字节给变量j,2008到 200b四个字节给变量k。 1、Printf(“%d”,i); 根据 变量名与地址的对应关系,找到变量i的地 2000 址2000,然后,从由2000开始的4个字节中 取出数据(即变量的值3) 2004 2、输入时如果用scanf(“%d”,&i);在执行时, 就把从键盘输入的值送到地址为2000开始 2008 的整型存储单元中。 3、如果有语句k=i+j;则从字节 取出i的值3,再从字节取出j的 值6,将它们相加后再将其和9送到k所占用 b字节单元中。………… 3 6 9 …… i的值 J的值 K的值 指针简介 2-1变量int x 10 int ptr_x ED53指针地址ED53内存 数据 指针 ptr_x 指向变量 x 指针简介 2-2? 指针也是一个变量,只不过该变量中存储 的是另一个对象的内存地址 ? 如果一个变量存储另一个对象的地址,则 称该变量指向这个对象 ? 由于指针值是数据,指针变量可以赋值, 所以一个指针的指向在程序执行中可以改 变。指针p 在执行中某时刻指向变量x,在 另一时刻也可以指向变量y 声明并初始化指针变量数据类型 *指针名;char * float *rate_ double *p, *q;int * ptrnum = NULL; 值为NULL的指针称为空指针,这意味着,指 针并不指向任何地址。 在头文件 stdio.h 中,NULL 定义为常量。请 牢记变量中只能存放地址(指针),不要将一 个变量(或任何其他非地址类型的数据)赋给 一个指针变量 ptrnum=100; 注意:指针变量的名子是ptrnum,而不是 Ptrnum,其中 int * ptrnum 中的*代表该变 量的类型为指针型变量。 举例:职业 民族 名子 职业 民族 名子 医生 汉 张三 医生 张三 //民族如果不写一般来说 教师 汉 李四 教师 李四 都会认为是汉族。 学生 苗 赵五 学生 苗 赵五 那么当说介绍赵五的时候应说 学生赵五是苗族的,而不能说学生苗赵五。 I//可以说a是整型变量 I//可以说b是整型变量 F//可以说c是单精度变量 Int *//但你不能说*aa是指针变量 ,因为在这里的*代表的是aa是特殊 变量,或说aa是指针变量。 与指针相关的运算符2-1int num, * ptrnum = &num 100 FF7CptrnumFF7C指针内存 与指针相关的运算符2-2int num, * ptrnum = & *ptrnum=15;num 100 15 FF7CptrnumFF7C指针内存 例如:int k=10;这是定义一个变量并给这个变量赋一个 值,那么在做例如:k=20;这时候k在=的左侧,大家想到的 是变量的名子,而不是值10,而当p=k+10的时候,k在=的 右侧,大家想到的是k的值10,而不是想到的是k这个变量的名 子。 (1)Int *p,k=0; P=&k; *p=100; //等价于k=100; *p=*p+1;//取指针变量p所指存储单元中的值,加1后再放入 p所指的存储单元中,即使得变量k中的值增1而为101。显 然,当*p出现在赋值号左边时,代表的时指针所指的存储单 元(即变量名),当*p出现在赋值号右边时,代表的是指针 所指的存储单元的内容(即变量的值)。
*p=*p+1; 以上语句可写成: *p+=1;或++*p 或(*p)++ 注意:在表达式++*p中,++和*两个运算符的优先 级别相同,但按自右至左的方向结合,因此, ++*p相当于++(*p),而在表达式(*p)++中一对括 号不可少,(*p)++表示先取p所指存储单元中的值, 然后增1个为表达式的值。不可以写成*p++,否则 将先计算*p作为表达式的值(如此时为100) ,然后使指针变量p本身增1,所以*p++并不使p 所指存储单元中的值增1而是移动了指针。 指针的特点? 指针变量的命名规则和其他变量的命名规 则一样 ? 指针不能与现有变量同名 ? 指针可存放 C 语言中的任何基本数据类型、 数组和其他所有高级数据结构的地址 ? 若指针已声明为指向某种类型数据的地址, 则它不能用于存储其他类型数据的地址 ? 应为指针指定一个地址后,才能在语句中 使用指针 指针使用示例1内存 #include &stdio.h& ptr_var var void main() { 12ff7c 10 int var = 10; 12ff7c 12ff78 int *ptr_ ptr_var = & printf(& var 的值是: %d&, var); printf(&\n var 的内存地址是: %x&, &var); printf(&\n 指针 ptr_var 的地址是: %x\n&, &ptr_var); printf(&\n var 的值是: %d&, *ptr_var); printf(&\n var 的地址是: %x\n&, ptr_var); } var的值是:10 var 的内存地址是:12ff7c 指针ptr_var的地址是:12ff78 var的值是:10 var的地址是:12ff7c 指针使用示例2内存 void main() { ptr1 num1 int num1 = 50, num2 = 100; 12ff7c 50 int *ptr1, *ptr2; ptr1 = &num1; 12ff7c printf(& num1 的值是: %d&, *ptr1); ptr2 num2 printf(&\n num1 的地址是: %x \n&, ptr1); 12ff78 ptr2 = &num2; 50 100 printf(&\n num2 的值是: %d&, *ptr2); 12ff78 printf(&\n num2 的地址是: %x \n&, ptr2); *ptr2 = *ptr1; printf(&\n 重新赋值后 num2 的值是: %d&, *ptr2); printf(&\n 重新赋值后 num2 的地址是: %x\n&, ptr2); } 引用调用引用调用void main() { int a = 0; //初始化a值为0 FFE0 func(&a); //调用函数F printf(&%d&,a); //输出a的结果 } //定义函数F void func(int *a) { a=FFE0 *a = 10; //让参数a等于10 }将会输出什么 请输入两个数 : 45 67 _num1 递增前的值是 45 和 67num2 引用调用示例num1 num2 子函数中的值是 46 和 68 #include &stdio.h& 调用前为45 调用前为67 void increment(int*, int*); 46 和 68 递增后的值是 46 68 67 45 67 45 调用后为68 调用后为46 void main() { FF05 FF23 FF23 FF05 int num1,num2; printf(&\n 请输入两个数: &); scanf(& 将变量num1的地址 %d %d&,&num1,&num2); 将变量num2的地址 printf(&\n 递增前的值是 %d 和 %d\n&,num1,num2); 赋给形参,即指针 赋给形参,即指针 ptr1指向变量num1 ptr2指向变量num2 increment(&num1,&num2); FF23 FF05 printf(&\n 递增后的值是 %d 和 %d\n&, num1, num2); } var1 var2 ptr2 ptr1 void increment(int *ptr1, int *ptr2) { (*ptr1)++; FF05 FF23 (*ptr2)++; printf(&\n 子函数中值 %d 和 %d\n&, *ptr1, *ptr2); } FF45 FF51 引用调用:调用函数的实参使用地址值,被调 用函数的形参要求是指针,并要求形参指针 的类型要与实参地址中存放的变量类型相同。 在引用调用时,调用函数实参的地址值传递 给对应形参的指针,让形参指针指向实参地 址中的存放的变量。因此,在引用调用中不 是将实参拷贝一个副本给形参,而是把实参 的地址给形参,即让形参直接指向实参,于 是便可以在被调用函数中通过改变指针所指 向的变量的值来影响实参的值,这是引用调 用的一个特点。 引用调用的优点是:调用时只传递变量的地址 值,而不拷贝副本,这在时间和空间的开销不 都将减少,因此可提高运行效率,特别是对复 杂类型的变量,只传地址会提高效率,这是传 址的突出优点。 第九章数 组(一) 为什么要使用数组3-1唉,有这么多不同主题的书。在哪 里才能找到有关中国音乐的书呢? 为什么要使用数组3-2文学类中国音乐类计算机类西方音乐类 为什么要使用数组3-3内存数组120 65 98 4容器中保 存的物品数组的元素日常生活中的容器程序中的数组 数组类型 2-1一维数组 示例:学员单门课程的成绩 多维数组899077…示例:学员两门课程的成绩科 目0 10 73 451 90 802 33 87学号 数组类型 2-2 声明一维数组datatype arrayName[size];类型说明符 int、char、float … 数组名 常量表达式: 数组大小int num[50]; char list_of_initials[20]; double pressure_level[6];# def

我要回帖

更多关于 小学英语语法总结全集 的文章

 

随机推荐