C语言概述 第一章
目标 回顾编程语言 C语言的发展与特点 C语言程序的结构和语法规则 C程序编译和开发过程
编程语言 用于编写软件的编程语言 机器语言:用二进制代码(0和1)组成的,用不同的二进制代码组合表示机器的不同指令。 汇编语言 高级语言(BASIC FORTRAN PASCAL C JAVA ….) 第四代语言(4GL) 如:UNIX Shell
机器语言 用二进制代码(0和1)组成的,用不同的二进制代码组合表示机器的不同指令。机器语言中的每一条指令,代表了机器可执行的一个基本操作 。 指令由操作码和地址码两部分组成 。 机器语言的特点是面向机器,程序编写难度大,调试修改繁琐,兼容性差,但机器语言执行速度最快 。
汇编语言 用一些特定的符号代替机器语言的二进制数代码 ,这些符号也称为助记符. 通过汇编程序翻译成机器语言翻译成机器语言的目标程序,该过程称为汇编过程 . 汇编语言比机器语言易读、易改,执行速度与机器语言相仿,比高级语言快得多,适用于实时控制和实时处理 .
高级语言 高级语言是接近人们的自然语言和数学语言、以及面向问题的程序设计语言,它容易学习和掌握,并且通用性强 源程序,转换成相应的机器语言目标程序 有两种方式:编译方式、解释方式 与前面的语言有明显区别的是: 并不涉及计算机如何执行任务,而只指定它必须做什么。
面向对象与面向过程的语言 面向过程的语言,如:c语言。基于对某些具体事件的处理。应用函数实现具体的功能。 面向对象的语言,如:c++,java等。基于对一类问题的处理。以类为模板创建对象来实现具体的功能。
进入 C 语言时代 1969-1973 年间,贝尔实验室的 Dennis Richey 和 David Kerningham 开发了 C 语言。 C 语言易于人们的阅读和理解。 由于此语言具有快速和简洁的特点,因此在系统程序员和商业软件制造商之间非常流行。
C语言的发展 ALGOL B C
C 语言的应用领域 C 语言最初用于系统程序设计 UNIX 操作系统是用 C 语言开发的 系统程序是计算机操作系统或操作系统支持的实用程序的组成部分 操作系统、解释器、编辑器以及汇编器通常称为系统程序 UNIX 操作系统是用 C 语言开发的 有许多种 C 编译器,可以满足几乎所有类型 PC 的需要
C语言的主要特点 模块化的程序设计语言。用具体的函数来实现 面向过程,流程式设计。 其它特点参见课本 P2
流程式设计 一个关于理发的例子: 进入理发室是否有空位子坐下等候是否轮到自己洗头坐到理发椅上开始理发吹干是否满意付钱离开理发店 流程图
中级语言 高级语言 C 汇编语言
C语言的结构和语法规则 [函数类型] 函数名 ([函数参数列表]) { 数据定义和声明; 可执行语句序列; }
C语言的结构和语法规则 C 语言的示例 /* Welcome.cpp*/ void main() { printf(“欢迎到华育国际来!\n"); }
C语言的结构和语法规则 每个C程序都必须有一个main函数。 函数体要由一对{}括起来。 每条语句后都要有“;”。 C程序的输入输出操作是由库函数scanf和printf完成的。 注释符有两种‘//’ 和 ‘/* */’
C程序编译和开发过程 用C语言编写的程序称为C源程序 经编译以后的C语言源程序称为目标程序 将目标程序与函数库进行连接,生成最终的可执行程序称为可执行程序 可 执 行 程 序 源 程 序 目 标 程 序 编译 连接 C函数库
变量和类型 第二章
目标 讨论变量命名 区分变量和常量 列出C语言程序中的各种数据类型并使用它们 讨论各种运算符及其优先级
关键字 在一个特定语言的上下文中有特殊意义的单词 所有的数据类型都是保留的关键字 在指定变量名的同时还要指定将要存储在其中的数据类型-变量声明
关键字 常用的关键字: break case char continue default do double else float for goto if int long return sizeof static struct switch void while
C语言的数据类型 整型(int) 单精度型(float) 实类型 基本类型 双精度型(double) 字符型(char) 数组类型 构造类型 结构体类型(strcut) 共用体类型(union) 指针类型 枚举型(enum) 空类型(void)
基本数据类型 基本数据类型 int float char double 单个或多个数字系列 存储含有小数位 存放一个字符
int 类型 存储数字数据 声明方式:int num; 不能存储类似于“Alan” 或“abc”等任何其他类型的数据 分配32 位(4 个字节)的内存空间,整数的范围是从 -32768 到 32767 示例:12322、0、-232
float 类型 存储整数或包含小数位的值 声明方式:float num; 分配32 位(4 个字节)的内存空间 示例:23.05、56.5、32
double 类型 存储超出float类型大小的限制的值 声明方式: double num; 分配64 位(8 个字节)的内存空间 示例:23.34232324
char 类型 存储一个字符信息 声明方式: char gender; gender='M'; 分配8位(1 个字节)的内存空间 示例:'a'、'm'、'$'、'%'、'1'、'5'
void 类型 告诉编译器没有任何类型的值 声名方式:void num 不返回任何值
派生数据类型 通过修改四种基本数据类型以适应不同的 情况而产生的数据类型叫做派生数据类型 基本数据类型 派生数据类型 数据类型修饰符 int 只允许正数 int unsigned int unsigned short int 比int占更少 的空间 short int Long int longdouble long int/double 比int/double占更多的内存空间
signed 和 unsigned 类型 signed最重要的是修改char数据类型 unsigned 类型指定变量只能接受正值 unsigned int varNum; varNum=23123; 加上unsigned前缀,正数的取值范围是原来的两倍 修饰符可以与 int 和 float 数据类型一起使用 unsigned int 支持的范围是从 0 到 65535
long 和 short 类型 要求某个整数的长度比正常长度更长或更短时,使用long 和short short int 占 8 位(1 个字节)的内存空间 允许的数字范围是从 -128 到 127 long int 占 32 位(4 个字节)的内存空间 2,147,483,648 到 2,147,483,647 long double 占 128 位(16 个字节)的内存空间
数据类型及其范围 2-1 类型 近似大小(字节) 最小范围 char 1 -128 到 127 Unsigned char 0 到 255 int 2 -32,768 到 32,767 unsigned int 0 到 65,535 signed int 与 int 相同 short int unsigned short int 0 到 65, 535
数据类型及其范围 类型 近似大小(字节) 最小范围 signed short int 2 与 short int 相同 long int 4 -2,147,483,648到 2,147,483,647 signed long int 0 到 4,294,967,295 unsigned long int float -3.4x1038—3.4x1038 double 8 -1.7x10308—1.7x10308 long double 10 -3.4x104932—3.4x104932
常量 常量就是一个保持不变的值 示例 5 数字/整型常量 5.3 数字/浮点常量 'Black' 字符串常量 'C' 字符常量
常量 其值不能改变 整型常量:可以用十进制,八进制或十六进制来表示。 实型常量 符号常量 字符型常量
整型常量 可以用十进制,八进制或十六进制来表示 十进制:0—9,无前缀,无小数部分 八进制:0—7,前缀为0,无小数部分 十六进制:0—F,前缀为0x,无小数部分 整型中的长整型可用L作为后缀,无符号的可用U做后缀。
实型常量 实型常量是由整数部分和小数部分组成的,它只有十进制的两种表示方法。 定点数形式 指数形式(科学表示法): 1.234e3=1.234x103 实型常量的后缀用F表示单精度型,用L表示双精度型。
符号常量 定义一个符号来代表一个常量—符号常量 用预编译处理命令#define来定义符号常量如: #define PI 3.1415926 #define NAME “王明”
字符型常量 字符型常量包含字符常量和字符串常量 字符常量: 用一对单引号括起来的一个字符,如:‘a’,‘Q’,‘3’等 转义字符常量:p18 字符串常量:用一对“”括起来的0个或多个字符的序列。如:“I am a girl!” 注意:每个字符串后面都有一个‘\0’ 作为结束标志,要占用一个字符的空间
声明示例 main () { char abc; /*声明abc */ int xyz; /*声明xyz */ float length; /*声明length */ double area; /*声明area */ long liteyrs; /*声明liteyrs */ short arm; /*声明arm */ }
数据的溢出 超过数据类型所定义的范围就会出现数据溢出。 main() {int a,b; a=32767; b=a+1; printf(“%d,%d”,a,b); } 输出:32767,-32768
通过变量,可以为内存中的位置提供一个有意义的名称 15 内存中的数据 数据15 通过变量,可以为内存中的位置提供一个有意义的名称 应用程序要为每一项数据分配内存 需要多少内存 数据被存储在哪个
变量 其值可以改变的量 一个变量应该有一个名字,在内存中占据一定的存储空间。 变量的两个要素: 变量名:符号地址,在对程序编译连接时由系统为每一个变量名分配一个内存地址。在程序中从变两种取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。 命名规则 变量值:不同类型的变量占用的内存单元数不同。
变量的定义与初始化 定义格式: 数据类型 变量名1,变量名2,……; 如:int a,b; 初始化: 数据类型 变量名1,变量名2,……; 如:int a,b; 初始化: 数据类型 变量名1[=初值1],变量2[=初值2],……; 如:double m=2.332;
表达式 操作数 运算符 2 * y + 5 运算符和操作数的有效组合 在程序执行的过程中,变量 的实际值和表达式中出现的 常量一起使用
赋值运算符 可以用在任何有效的 C 表达式中 通用的形式:变量名=表达式 将同一个值赋给多个变量的操作叫做多重赋值 a=b=c=10 但是,不能像下面的语句中那样赋值: int a=int b=int c=10
常用的运算符 分4 类 算术 逻辑 关系 位 一元、二元运算符都是算术运算符 用于对包含关系运算符的表达式 进行合并或取非 测试两个变量或一个变量和一个 常量之间的关系 位 将数字按位进行计算
算术表达式 在C中,可以用算术运算符、数字和字符操作数来表示数学表达式。 示例 ++i % 7 5 + (c = 3 + 8) a * (b + c/d)22
关系运算符和逻辑运算符 > 用于测试两个变量或一个变量和一个常量之间的关系 >= < <= == != 运算符 大于 >= 大于等于 < 小于 <= 小于等于 == 等于 != 不等于
逻辑运算符 逻辑运算符用于对包含关系运算符的表达式进行合并或取非 && || ! 与 || 或 ! 非 示例:if ((a>10) && (a<20)) 使用逻辑运算符的表达式,返回 0 表示假,返回 1 表示真
位运算符 将数字转换成等价的二进制形式后再处理数据(按位表示法) 运算符 描述 按位与 ( x & y) 如果两个操作数的相应位均为 1,则该位的结果值为 1 按位或 ( x | y) 如果两个操作数的相应位有一个为 1,则该位的结果值为 1 按位取反 ( ~x) 将操作数按位取反 (0 到 1 和 1 到 0) 按位异或 ( x^y) 如果参加运算的两个操作数的相应位同号,则结果为 0,异号则为 1
位运算符 位运算符将数字视为二进制值,并按位进行相 应运算,运算完成后再重新转换为数字 操作数 位操作 位表达式 数字 10 & 15 1010 & 1111 1010 10 10 | 15 1010 | 1111 1111 15 10 ^ 15 1010 ^ 1111 0101 5 ~ 10 ~1010 1011 -11 位运算符将数字视为二进制值,并按位进行相 应运算,运算完成后再重新转换为数字
其他运算符 条件运算符 ?: 逗号运算符 指针运算符 强制类型转换运算符
算术运算符 幂运算符的示例: 9^2 ++和--运算符前置和后置有很大区别 9是底数,2是指数 结果是9*9=81 一元运算符 操作 二元运算符 - 一元减 + 加 ++ 递增 减 -- 递减 * 乘 % 模 / 除 ^ 幂 计算一个 整数除法 的余数 幂运算符的示例: 9^2 9是底数,2是指数 结果是9*9=81 ++和--运算符前置和后置有很大区别
运算符优先级 优先级建立了计算算术表达式时,一组运算符相对于另一组的层次关系 优先级指 C 计算运算符的顺序 可通过将表达式括在括号中 来改变运算符的优先级 运算符类型 运算符 结合律 一元 - ++ -- 从右向左 二元 ^ 从左向右 * / % + -
运算符优先级 当一个表达式中的运算符具有相同优先级时, 结合律还指出C语言计算这些运算符的顺序 示例:-8*4%2-3 计算顺序如下: 完成的操作 结果 -8(一元减法) -8 -8*4 -32 -32%4 0 0-3 -3
比较运算符之间的优先级 不存在相对于其他算术运算符有较高的优先级 始终按从左向右顺序进行计算
修改优先级 括号 ( ) 的优先级最高。 使用括号 ( ) 可修改运算符的优先级。 用括号括起来的优先级较低的运算符具有最高的优先级,最先执行。 在括号嵌套 ( ( ( ) ) ) 的情况下,最里层的最先执行。 包含多个括号的表达式从左向右进行计算。
修改优先级 考虑下面的示例: 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (2<6 AND 10>11)) 计算如下: 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR (True AND False)) 5+9*3^2-4 > 10 AND (2+2^4-8/4 > 6 OR False)) 5+9*3^2-4 > 10 AND (2+16-8/4 > 6 OR False)) 5+9*3^2-4 > 10 AND (2+16-2 > 6 OR False)) 里层括号的优先级大于其他所有的运算符 计算外层 的括号
修改优先级 5+9*3^2-4 > 10 AND (18-2 > 6 OR False)) 5+9*3^2-4 > 10 AND (True OR False)) 5+9*3^2-4 > 10 AND True 5+9*9-4 > 10 AND True 左侧表达式按约定进行
修改优先级 5+81-4 > 10 AND True 86-4 > 10 AND True
类型转换 运算符的操作数属于不同的数据类型,运算时通常会将这些操作数转换为同一类型 char ch; int i; float f; double d; result=(ch/i)+(f*d)-(f+i); int double float double
转换 通过使用转换可以将一个表达式强制转换成某一种类型。 转换的通用语法是: (type) (表达式) type 任意有效的 C 数据类型 示例: 经过赋值运算后, (int)f 返回的整型值重新转换为浮点数,f 本身的值不变。 float x,f; f = 3.14159; x = (int) f;
条件运算符和条件表达式 格式 表达式1?表达式2:表达式3 #include<stdio.h> void main() { int n,s; scanf("%d",&n); s=(n%2==0)?0:1; switch(s) { case 0:printf("%d是一个偶数",n);break; case 1:printf("%d是一个奇数",n);break; }
顺序结构程序设计 第三章
程序的三种基本控制结构 顺序结构:各部分顺序执行 选择结构(分支结构) 循环结构 当循环 直到循环
顺序执行语句 C语言的语句可以分为5类: 控制语句 表达式语句 函数调用语句 复合语句 空语句 顺序执行语句
标准输入/输出 C 语言中的标准库提供了输入和输出函数 标准库提供: 输入/输出函数来处理输入、输出、字符 和字符串操作 标准库提供: 输入/输出函数来处理输入、输出、字符 和字符串操作 标准输入通常是指键盘 标准输出通常是指显示器(也称控制台) 可以用文件代替标准输入和输出设备
头文件 <stdio.h> 这是一个预处理命令 stdio.h 是一个文件,称为头文件 包括对应于 C 语言程序中使用的输入/ #include <stdio.h> 这是一个预处理命令 stdio.h 是一个文件,称为头文件 包括对应于 C 语言程序中使用的输入/ 输出函数的宏 所设计的 printf()、scanf()、putchar()、 getchar() 等函数需要使用头文件中的这些宏才能正确执行
带格式的输入/输出 printf() – 用于带格式的输出 scanf() – 用于带格式的输入 能以用户控制下的各种预指定格式读入和输出数据 格式说明符指定了变量值输入和输出的格式
printf () printf ("control string ", argument list); 控制字符串 参数列表 都需要一个格式命令-与参数列表需要在数量、类型和顺序上匹配 需要由“ ”括起来。由文本字符和空格、格式命令和非打印字符组成
printf () 控制字符串由三类项目中的一项或多项组成: 文本字符:由可打印字符组成 格式命令: 以 % 符号开始,随后紧跟与数据项相应的格式代码 非打印字符:包括制表符、空格和换行
格式指示符 格式指示符的一般形式如下: %[修饰符]格式字符 例如: 我们要打印一个有符号的十进制整数(类型为int),则会使用格式字符%d 对于无符号的十进制整数(类型为unsigned int),则使用%u 对于浮点变量(类型为float),则使用%f
格式代码 上表中,c、d、f、lf、e、g、u、s、o 和 x 都是类型说明符 格式 printf() scanf() 单字符 %c 字符串 带符号的十进制整数 %d 浮点数 (十进制记数法) %f %f 或 %e %lf 浮点数(指数计数法) %e 浮点数( %f 或 %e 中较短的一个) %g 不带符号的十进制整数 %u 不带符号的十六进制整数(使用“ABCDEF”) %x 不带符号的八进制整数 %o 上表中,c、d、f、lf、e、g、u、s、o 和 x 都是类型说明符
控制字符串与格式代码 …… 编号 语句 控制字符串 控制字符串包括的内容 参数 列表 参数列表的说明 屏幕 显示 1. printf("%d",300); %d 仅由格式命令组成 300 常量 2. printf("%d",10+5); 10 + 5 表达式 15 3. printf("Good Morning Mr. Lee. "); 早上好 李先生. 仅由文本字符组成 无 Good Morning Mr. Lee. 4. int count = 100; printf("%d", count); count 变量 100 ……
printf() 示例 显示整数、浮点数和字符串的程序 #include <stdio.h> void main() { int a = 10; float b = 24.67892345; char ch = 'A'; printf("Integer data = %d\n", a); printf("Float Data = %f\n",b); printf("Character = %c\n",ch); printf("This prints the string\n"); printf("%s","This also prints a string\n"); }
printf() 中的修饰符 “-” 修饰符 字符宽度修饰符 数据项在范围内向左对齐,从范围最左侧的位置开始输出数据项 可以用于浮点型、双精度型和字符数组型(字符串)。 范围宽度修饰符是一个整数,定义了数据项的 最大范围宽度。
printf() 中的修饰符 精度修饰符 可以用在浮点型、双精度型或字符数组型(字符串)中。如果用在浮点型或双精度型数据中,数字字符串表示小数右侧最多可输出的数字位数 “0” 修饰符 字段的默认填充符是空格。如果用户希望用零作为填充符,需要使用此修饰符 “l” 修饰符 可以借助于此修饰符将整数显示为长整型或双精度型参数。相应的格式代码为 %ld “h” 修饰符 此修饰符用于显示短整数。 相应的格式代码为 %hd
修饰符示例 printf()中的修饰符的使用的示例 #include <stdio.h> void main() { printf("The number 555 in various forms:\n"); printf("没有修改: \n"); printf("[%d]\n",555); printf("用 – 修饰 :\n"); printf("[%-d]\n",555); printf("用宽度修饰符 :\n"); printf("[%10d]\n",555); printf("用0修饰符 : \n"); printf("[%0d]\n",555); printf("用0修饰符并规定宽度为10:\n"); printf("[%010d]\n",555); printf("用左对齐, 0修饰符并且规定宽度为10: \n"); printf("[%-010d]\n",555); } printf()中的修饰符的使用的示例
scanf() 用于接受数据 的通用格式 printf()语句中的使用的格式极其语法同 样适用与scanf()语句 “格式字符串”包含三种类型的字符: 1、格式指示符 同printf()的用法大致相同,只是对于scanf()函数,格式指示符中的e,E,g,G同f的作用相同,都是输入实数时用的 2、空白字符 (空格、跳格键、回车键)作为相邻两个输入数据的默认分隔符 3、普通字符 要求在输入时必须原样一起输入的内容 scanf("control string ", argument list); 控制字符串 参数列表
格式化输入 函数scanf() 按指定的格式从键盘读取数据,并将其赋给一个或多个变量 scanf()也使用格式化字符串来描述输入格式 例如: int a; scanf("%d",&a); 用于从键盘读取一个十进制整数,并将其赋给整型变量a
格式化输入 scanf()函数的一般格式 scanf(“格式字符串”,输入项的地址列表); scanf("%d%d%f",&a,&b,&f1); 输入多个变量时,可以用空格、制表符或换行符来标识每个变量的输入结束,只要值之间有空白字符,scanf()便能将每个值赋给相应的变量 例如本题可以输入:10 20 5.6 也可以输入:10 20 5.6 还可以输入: 10 20 5.6
格式化输入 格式控制符 宽度修饰符 用来限定输入数据所占列数 #include "stdio.h" void main() { char b,c; scanf("%3c%4c",&b,&c); printf("b=%c,c=%c\n",b,c); }
格式化输入 格式控制符 长度修饰符 抑制修饰符 在输入长整型数据和双精度浮点数时,必须要使用长度修饰符“l” 抑制修饰符为“*”,表示它后面的数据读入后,不赋给相应的变量 例如: int a,b; scanf("%2d%*3d%4d",&a,&b); 输入1234567890,则a被赋值为12,b被赋值为6789
格式化输入 scanf()注意事项 1、scanf()函数没有精度控制。例如:scanf("%3.1f",&a);是错误的。 2、输入数据时,如果输入了空格,回车键,或是Tab键,系统认为该数据输入结束;或是遇到了宽度控制符;或非法录入时系统都会认为输入结束。 3、使用格式控制符“%c”录入单个字符时,空格和回车键都会作为有效字符输入的。 4、格式字符串中出现的普通字符必须按原样输入。例如: scanf("a=%d,b=%d",&a,&b); 我们要想把12和23输入到a,b中,必须键入 a=12,b=23 按回车键
格式化输入 scanf()使用实例 从键盘输入一个大写字母,要求改用小写字母输出。提示:大小写英文字母的ASCII值相差32。 #include "stdio.h" void main() { char c1,c2; printf("请输入一个大写英文字母:"); scanf("%c",&c1); c2=c1+32; printf("该英文字母%c的小写形式为%c\n",c1,c2); }
printf() 和 scanf() 参数列表之间的区别 如果希望读取基本数据类型变量的值,应在变量名的前面加上符号& 当读取指针变量指向的值时,在变量名前不能使用 &
scanf() 示例 scanf()使用非打印字符来判断输入数据是什么时候开始和结束的 可以忽略空白区域和行边界来获取数据 #include <stdio.h> void main() { int a; float d; char ch, name[40]; printf("Please enter the data\n "); scanf("%d %f %c %s", &a, &d, &ch, name); printf("\nThe values accepted are : %d, %f, %c, %s", a, d, ch, name); } scanf()使用非打印字符来判断输入数据是什么时候开始和结束的 可以忽略空白区域和行边界来获取数据
控制台输入/输出 控制台输入/输出函数将其操作指向系统的标准输入和输出 C 中最简单的控制台输入/输出是: getchar() – 从键盘读取一个(且仅一个)字符 putchar() – 在屏幕上输出一个字符
getchar() 用于从键盘读取输入数据,方式为一次读一个字符 缓冲字符,直到用户按回车键
getchar() 示例 getchar()的使用示例 #include <stdio.h> void main() { char letter; printf("\nPlease enter any character: "); letter = getchar(); printf("\nThe character entered by you is %c", letter); } getchar()的使用示例
putchar() C 中的字符输出函数 需要参数 单字符常量 转义序列 字符变量 putchar() 函数的参数
putchar() 的选项和效果 参数 函数 效果 字符变量 putchar(c) 显示字符变量 c 的内容 字符常量 putchar('A') 显示字母 A 数值常量 putchar('5') 显示数字 5 转义序列 putchar('\t') 在光标位置插入制表符 putchar('\n') 在光标位置插入回车
putchar() #include <stdio.h> void main() { putchar('H'); putchar('\n'); putchar('\t'); putchar('E'); putchar('\n'); putchar('\t'); putchar('\t'); putchar('L'); putchar('\n'); putchar('\t'); putchar('\t'); putchar('\t'); putchar('O'); }
字符串输入输出函数 gets()和puts()函数 无格式控制的专门对字符串处理的函数 必须包含头文件stdio.h 需要一个字符串参数,显示该参数并自动换行 puts("Hello, world."); 与 printf("Hello, world.\n"); 的效果相同
本讲总结 如何使用printf()函数? 如何使用scanf()函数? 如何使用getchar()与putchar()函数? gets()与puts()是什么函数?
循环 第五,六章
目标 理解 while 循环和 do-while 循环 理解 C 语言中的 for 循环 使用逗号运算符 理解嵌套循环 使用 break 和 continue 语句 理解 exit() 函数和goto语句
什么是循环? 循环是程序中重复执行,直到满足指定条件才停止的一段代码 C语言中,控制循环执行的条件在编码时用到了关系和逻辑运算符
循环结构的 3 种类型 while 循环 do...while 循环 for 循环
while 循环 语句可以是空语句、一个简单的语句或语句块 如果while循环中包含一组语句,必须用{}括起来 只要条件为真循环就会继续。 通用语法: while ( 表达式 ) 语句 ; 语句可以是空语句、一个简单的语句或语句块 如果while循环中包含一组语句,必须用{}括起来 只要条件为真循环就会继续。
While循环的流程图 表达式 否 语句 否
while 循环—一个简单的例子 和for循环不一样,while循环在执行 循环前检查条件 #include <stdio.h> main() { int i = 1,s; while( i<=10) s+=i; i++; } printf(“\n 最后的结果是:%d. \n “,s); 和for循环不一样,while循环在执行 循环前检查条件
统计从键盘上输入的数字的个数 #include<stdio.h> void main() { int n=0; char c; c=getchar(); while(c!=‘\n’) if(c>=‘0’&&c<=‘9’) n++; } printf(“”);
do…while 循环 通用语法 do...while 循环中,循环体中的代码 语句; }while(条件); do...while 循环中,循环体中的代码 在条件测试执行前执行一次条件变为 False 时,do while 循环终止; 控制权传递给紧跟在 while 语句之后的语句
do-while的流程图 语句 表达式 否 是
do-while 循环—一个简单的例子 #include <stdio.h> main() { int i = 1,s; do s+=i; i++; } while( i<=10) printf(“\n 最后的结果是:%d. \n “,s);
do…while 循环 接受并显示一些整数,直到输入0(零),然后退出整个循环,并打印输入的整数的个数 #include <stdio.h> main () { int n, i; i = 0; do printf(“\请输入一个数 : "); scanf("%d",&n); printf(" No. is %d ",n); i++; } while (n! = 0); printf (“\你一共输入了 %d 个数”,--i); } 接受并显示一些整数,直到输入0(零),然后退出整个循环,并打印输入的整数的个数
课本例题 P80 例:5.6
for 循环 for循环的通用语法: 初始化计数是一个赋值语句, 它在进入循环前设置循环控制变量 { 语句; } 初始化计数是一个赋值语句, 它在进入循环前设置循环控制变量 条件测试是一个关系表达式, 它决定何时退出循环 再求值参数定义每次执行循环时 循环控制变量如何变化
for 循环 for 循环的三个部分必须用分号 (;) 隔开 组成循环体的语句可以是单个语句,也可以是复合语句 只要测试条件的求值结果为 true,for 循环就继续执行。当条件变为 false时,程序将继续执行 for 循环后面的语句
for循环的流程图 表达式1 表达式2 表达式3 语句 假 真
for 循环 #include <stdio.h> void main() { int i; printf("\tThis is a \n"); for(i=1;i<=6;i++) printf("\n\t\t nice"); printf("\n\t\t world.\n"); }
逗号运算符 通过在for循环中包含多个初始化表达式或增量表达式,可以扩展for循环作用域 格式是 :exprn1, exprn2 ; 表达式被逗号运算符隔开,从左向右求值
逗号运算符 #include <stdio.h> main() { int i, j , max; printf("Please enter the maximum value \n"); scanf("%d", &max); for(i = 0 , j = max ; i <=max ; i++, j--) printf("\n%d + %d = %d",i, j, i + j); }
for循环更多知识 使用for循环可以包含部分定义,或不包含任何定义 for( ;num<100)或 for( ; ;) 使用for循环可以不包含任何循环体(语句),有助于提高某些算法的效率和创建时间延迟循环 for(i=0;i<xyz_value;i++)
一个for循环的例子 输入n个数,求出最大值 #include<stdio.h> void main() {int n,i,max,a; printf(“请输入数的个数:”); scanf(“%d”,&n); for(i=1;i<=n;i++) {printf(“请输入第%d个数:”,i); scanf(“%d”,&a); if(a>max) max=a; }printf(“最大的是:%d”,max); }
嵌套 for 循环 如果一个for循环出现在另一个for循环中,则称它为嵌套循环 for(i = 1; i<max1; i++) { …… for(j = 0; j < = max2; j++) … … }
嵌套 for 循环 这个程序是在每一行中显示“*”的数量增加1 #include <stdio.h> void main() { int i, j, k; i = 0; printf(“输入你的行数:”); scanf("%d", &i); printf(“\n”); for (j = 0; j < i ; j++) for (k = 0; k <= j; k++) printf(“*”); } 这个程序是在每一行中显示“*”的数量增加1
跳转语句 通用语法: return 语句用于从函数中返回 return 语句可以带有值,该值将返回给 调用程序 它使执行返回到调用函数的位置 return expression return 语句用于从函数中返回 return 语句可以带有值,该值将返回给 调用程序 它使执行返回到调用函数的位置 表达式是可选的 一个函数中可以使用多个return语句,但 是遇到第一个return语句时返回
跳转语句 (自学) 通用语法: goto 语句将控制权传递给C程序中同一 函数内的其他语句 它实际上违背了严格的结构化程序设计语言的原则 goto label goto 语句将控制权传递给C程序中同一 函数内的其他语句 它实际上违背了严格的结构化程序设计语言的原则 它们降低了程序的可靠性,并使得程序难以维护
goto 语句 格式: goto 语句标号; 实现了语句的跳转,使语句不再顺序执行。
exit(int return_code) 跳转语句 通用语法: exit(int return_code) exit() 用于跳出一个程序 是一个标准库函数 该函数的用途是立即终止程序, 控制权交给操作系统
跳转语句 通用语法: 用于在 switch 语句中终止case 也可以用于在循环中突然终止循环 当循环中遇到 break 语句时,循环立 即终止, 控制权传递给循环之后的语句
break 语句 #include <stdio.h> main () { int i, j; for(i = 1, j = 0;i <=100; i++) printf(" Enter %d count2 : ",i); scanf("%d", &j); if(j==100) break; }
跳转语句 通用语法: continue 语句让封闭循环进行下一次迭代 遇到该语句时,跳过循环体中剩余的语句, 控制权传递给重新初始化步骤 遇到该语句时,跳过循环体中剩余的语句, 控制权传递给重新初始化步骤 在while循环和do…while循环中,程序控制 权传递个条件测试语句 在for循环中,continue影响循环的增量部分, 然后执行条件测试
continue 语句 打印1-100之间不能被9整除的数 #include <stdio.h> main () { int i; for(i = 1; i <=100; i++) if(i % 9 == 0) continue; printf("%d\t",i); } 打印1-100之间不能被9整除的数
break 语句与continue 语句 break 语句可以从程序的循环体内跳出来
例题 P 84例5.11 P 85例5.12
循环结构程序设计应用(自学) 穷举法 迭代法