声明
本文内容大多取自《高级语言程序设计一书》,为本人学习笔记记录,切勿用于商业用途。
第一节 结构化程序设计方法
结构化程序设计是以模块功能和处理过程设计为主的详细设计的基本原则,这一概念最早由 E.WDijkstra 在 1965 年提出,是计算机软件发展的一个重要里程碑。
具体地,采取以下方法可以保证获得结构化程序。
1)自顶向下,逐步求精
2)模块化设计
3)结构化编码:经模块化设计后进入编码阶段,任何程序都由顺序、选择和循环三种基本结 构组成,对于复杂问题可以通过三种基本结构的组合、嵌套实现,以清晰地表示程序的逻辑结构。
第二节 结构化程序三种基本结构
一、顺序结构
顺序结构是程序的一个基本结构,它是按照书写顺序依次执行操作。
二、选择结构
选择结构又称分支结构,是根据某个或某些条件,从若干个操作中选择某 个操作执行的一种控制结构。具体的,选择结构分为单分支选择结构、双 分支选择结构和多分支选择结构三种。
三、循环结构
是由循环控制条件控制循环体是否重复执行的一种控制结构。循 环结构分为当型循环结构、直到型循环结构和次数型循环结构三种。
(1)当型循环结构 当型循环结构首先判断循环控制条件是否成立,当循环控制条件成立则执行一次循环体,重复 上述过程,当循环控制条件不成立时结束循环,如图 4-5 所示。需要注意的是,该结构中,若第一 次判断循环控制条件就不成立,则循环体一次也不执行。
(2)直到型循环结构 直到型循环结构首先执行一次循环体,然后判断循环控制条件是否成立。若成立,则重复上述 过程,直到循环控制条件不成立时结束循环,如图 4-6 所示。需要注意的是,该结构中先执行一次 循环体,然后才判断循环控制条件是否成立,所以即使循环控制条件不成立,循环体也至少执行一 次
(3)次数型循环结构 次数型循环结构是按照已知的重复次数执行循环体的一种控制结构,如下图所示。其中,表达式 1 的作用是对循环控制变量赋初值,表达式 2 作为循环控制条件,表达式 3 的作 用是更新循环控制变量的值。
第三节 顺序结构程序设计
一、赋值语句
赋值语句的格式包括两种。
(1)第一种
【格式】变量=表达式;
【功能】计算表达式的值,然后赋予变量。
(2)第二种
【格式】变量 复合赋值运算符 表达式;
【功能】将变量和表达式进行指定的算术或位运算后,再将运算结果赋予变量。本质上,赋值 语句是赋值表达式后面跟一个分号。
二、函数调用语句 C 语言中事先编好的函数
C 语言中事先编好的函数(称为库函数或系统函数)或用户自定义函数(用户函数)都是通过 函数调用实现其功能的,并获得函数的返回值。
其中,库函数分类存放在扩展名为“h”的文件中,称为头函数或头文件,若需要在 C 源程序 中使用某个或某些库函数,则必须在源程序的开头包含如下的命令:
#include<头文件名.h>
函数调用语句的格式和功能如下:
【格式】函数名(参数 1,参数 2,...,参数 n);
【功能】调用指定的库函数或用户自定义函数,对圆括号中的参数进行该函数指定的运算,运 算结果作为函数的返回值返回。
本质上,函数调用语句是函数调用后面跟一个分号。
三、表达式语句
表达式语句的格式和功能如下:
【格式】表达式;
【功能】计算表达式的值。
本质上,表达式语句是表达式后面跟一个分号。需要注意的是,任何表达式都可以构成语句。 前面介绍的赋值语句和函数调用语句都是表达式语句的特例。因为“变量=表达式” 、“函数名(参 数 1,参数 2,…,参数 n)”都是表达式,它们后面跟一个分号,就构成了表达式语句。
四、复合语句
复合语句的格式和功能如下:
【格式】{
语句 1;
语句 2;
· · ·
语句 n;
}
【功能】依次执行语句 1,语句 2,…,语句 n。
【说明】
1)复合语句可以包含多条语句,但整体上是作为一条语句看待。
2)复合语句中若有数据定义语句,则应放在复合语句中其他语句的前面。
五、字符输入/输出函数
C 语言中输入和输出的操作,均是利用 C 语言编译系统提供的库函数实现的,C 语言本身并没 有提供这两类语句。
1. 字符输出函数 putchar( )
【调用格式】putchar(ch)
【参数】“ch”可以是一个整型变量、字符型变量、整型常量或字符型常量,也可以是一个转 义字符或整型表达式,但不能是字符串。
【功能】把一个字符输出到标准输出设备(显示器)。此外,就功能而言带“%c”格式说明符 的 printf( )函数可以完全代替 putchar( )函数的功能。
【返回值】输出 ch 对应的单个字符。
【说明】
1)putchar( )函数只能用于单个字符的输出,一次输出一个字符。
2)C 源程序中若使用了 putchar( )函数,则必须在 C 源程序(或文件)的开头加上编译预处理 命令#include<stdio.h>或#include"stdio.h"。
2. 字符输入函数 getchar( )
【调用格式】getchar( )
【参数】无参数。
【功能】从标准输入设备(键盘)输入一个字符。另外,就功能而言带“%c”格式说明符的 scanf( )函数可以完全代替 getchar( )函数的功能。
【返回值】输入的单个字符。
【说明】
1)getchar( )函数只能用于单个字符的输入,一次输入一个字符。输入的数字也是按字符处理。 当输入多于一个字符时,只接收第一个字符。
2)getchar( )函数输入的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,而 作为表达式的一部分。
3)C 源程序中若使用了 getchar( )函数,则必须在 C 源程序(或文件)的开头加上编译预处理 命令#include<stdio.h>或#include"stdio.h"。
#include<stdio.h>
int main(void)
{
char ch1,ch2;
int a;
ch1=getchar( ); /*从键盘输入一个字符并赋予字符型变量 ch1 输入第一个字符D*/
ch2=getchar( ); /*从键盘输入一个字符并赋予字符型变量 ch2* 这里第二个字符输入的是回车/
printf("%c,%d\n",ch1+32,ch2);
putchar(getchar( )); /*从键盘输入一个字符作为 putchar( )函数的参数(,getchar( )函数读入字符'E',putchar( )函数以 getchar( )函 数的返回值作为参数,输出字符'E')*/
putchar(':,');
a=getchar( ); /*从键盘输入一个字符赋予整型变量(这里获取输入的第二个字符也就是回车) a*/
printf("%d\n",a); /*输出整型变量 a 的值*/
return 0;
}
说明:本例中首先从键盘输入字符’D’和回车,输入的字符’D’被读入并保存至字符型变量 ch1, 回车也作为有效字符被读入并保存至字符型变量 ch2。语句 printf("%c,%d\n",ch1+32,ch2);的功 能是将 ch1 中的大写字母’D’转换为小写字母’d’输出,以十进制形式输出 ch2 中的回车的 ASCII 码值。
然后,从键盘输入字符’E’和回车,getchar( )函数读入字符’E’,putchar( )函数以 getchar( )函 数的返回值作为参数,输出字符’E’;回车也作为字符被读入并保存至整型变量 a,并以十进制形式 输出回车的 ASCII 码值。
六、格式输入/输出函数
1. 格式输出函数 printf( )
【调用格式】printf(格式控制字符串,输出项表)
【参数】
“格式控制字符串”是由控制输出格式的字符组成的字符串。
“输出项表”是用逗号分隔的若干个表达式。
【功能】按照用户指定的格式把指定的数据输出到标准输出设备(显示器)。
【返回值】返回值为整型,等于正常输出的数据个数。
【说明】
“格式控制字符串”又称“转换控制字符串”,是用一对双引号括起来的字符串,其作用是将 输出项表中的数据从内存的二进制形式转换成指定的格式输出。格式控制字符串由格式说明符、附 加格式说明字符、转义字符和普通字符组成。
(1)格式说明符
格式说明符由“%”和“格式字符”组成,其作用是将要输出的数据按格式说明符指定的格式 输出。在一个格式控制字符串中可以有多个格式说明符,每一格式说明符都以“%”开始,以一个 格式字符作为结束。
(2)输出表列:
要输出的数据,可以是变量或表达式,可以 没有,多个时以“,”分隔)
格式字符
1、d格式符:
输出十进制整数,有3种用法
%d格式:按数据实际长度输出,数据范围 -32768~32767。
2、%md格式:
m指定输出字段的宽度
数据位数小于m,左端补空格,反之按实际输出。
例:
/* %d 格式的 printf( ) 函数使用 */
#include <stdio.h>
void main()
{
int a=123 , b=12345 ;
printf("%4d\n %4d\n ", a , b);
printf("%8d\n %2d\n ", a , b);
}
输出:
3、%ld格式:
输出长整型数据
可以用%mld格式指定输出列宽
/* %d 格式的 printf( ) 函数使用 */
#include <stdio.h>
void main()
{
long c=135790;
printf("%ld \n", c);
printf("%8ld ", c);
}
4、o格式符
八进制输出整数
是将内存中的二进制位整个按八进制输出,所以输出 值没有符号。
可以指定输出宽度%mo,长整型可以用%lo格式输出。
5、x格式符:
十六进制输出整数
同o格式符,无符号,即无负十六进制数。
可以指定输出宽度%mx ,长整型可以用%lx格式输出。
/* %d 格式的 printf( ) 函数使用 */
#include <stdio.h>
void main()
{
int a= -1;
printf("%d , %o , %8o , %x ", a , a , a , a);
}
6、c格式符:输出一个字符
值在0~255的整数,可以用%c形式输出为字符
#include <stdio.h>
void main()
{
char c='a';
int i=97;
printf("%c , %d\n ",c,c);
printf("%c , %d\n" ,i ,i);
}
运行结果:
7、s格式符:
输出一个字符串
有%s,%ms,% -ms,%m.ns,% -m.ns五种用法
#include <stdio.h>
void main()
{
printf("%3s\n %7.2s\n %.4s\n %-5.3s\n ", "CHINA", "CHINA", "CHINA", "CHINA");
}
8、f格式符:
输出实数
%f格式:整数部分全部输出,小数6位。
可以有非有效数字输出,因为单精度有效位7位,双精度16位。
%m.nf格式:占m列,其中n位小数,左补空格。
% -m.nf格式:右补空格
#include <stdio.h>
void main()
{
float x,y;
x=111111.111;
y=222222.222;
printf("%f\n",x+y);
}
9、e格式符:
指数形式输出实数
%e格式:不指定m和n,小数6位,指数部分共5位, 其中e和指数符号各1位,
指数值3位。
%m.ne和% -m.ne格式:m、n、-的含义同前面。 没有n时,自动=6。
10、g格式符:
输出实数
可以自动根据数值大小选择 f 或 e 格式(选列少的)
不输出无意义的零
如 输出1.2 %f :1.200000 %g :1.2
输出不同类型的数据,需要使用不同的格式字符,其中:
格式字符d——以有符号的十进制整数形式输出。
格式字符f——以小数形式、按系统默认的宽度,输出单精度和双精度实数。
格式字符c——输出一个字符(只占一列宽度)。
格式字符s——输出一个字符串。
- 所有的 C 语言程序都需要包含 main() 函数。 代码从 main() 函数开始执行。
- printf() 用于格式化输出到屏幕。printf() 函数在 “stdio.h” 头文件中声明。
- stdio.h 是一个头文件 (标准输入输出头文件) and #include 是一个预处理命令,用来引入头文件。 当编译器遇到 printf() 函数时,如果没有找到 stdio.h 头文件,会发生编译错误。
- return 0; 语句用于表示退出程序。
%d 格式化输出整数
%f 格式化输出浮点型数据
2、格式输入函数scanf( )
【调用格式】scanf(格式控制字符串,输入项首地址表)
【参数】“格式控制字符串”是由控制输入格式的字符组成的字符串。
“输入项首地址表”由若干个输入项首地址组成,相邻两个输入项首地 址之间用逗号分隔。
【功能】从键盘按照“格式控制字符串”中规定的格式读取若干个数据,然 后按照“输入项首地址表”中的顺序,依次将数据存入相应的变量对应的地 址。
【返回值】输入的数据个数
【说明】
1、格式控制字符串
格式控制字符串可以包含三种类型的字符,即格式说明符、空白字符(空格、回车 和键)和非空白字符(又称普通字符)
scanf()函数的格式说明符的一般形式:
%[*][宽度][F|N][h|l]格式字符
强调::::
地址表列:变量地址或字符串地址,地址间“,”分隔。
强调:地址列表中每一项必须以取地址运算符&开头。
(1)宽度。宽度是指定该项输入数据所占列数。
(2)赋值抑制字符*。赋值抑制字符表示本输入项对应的数据读入后,
不赋予相应 的变量(该变量由下一个格式字符输入)
(3)类型修饰符——F、N、h、l分别表示远指针、近指针、短整型和长整型。
例:
用scanf函数输入数据
#include <stdio.h>
int main()
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);
}
输入分隔符的指定
一般以空格、TAB或回车键作为分隔符
输入数据时,遇非法输入则认为数据结束
其它字符做分隔符:格式串中两个格式符间有其它字 符,
则输入时对应位置也要有相同的字符。
在以%d、%f、%lf、%e 输入数值型数据时,遇到以下情况,系统认为数据输入结束。
遇到空格或回车或〈Tab〉键时输入结束,可用它们作为数据之间的分隔符。
遇到宽度结束。例如”%3d”,只取 3 列,即系统自动按域宽截取所需数据。
遇到输入数据与格式说明符类型不一致,则输入结束。
遇到非法输入结束。例如在输入数值型数据时,遇到字母等非数值符号
(数值符号仅由数字字 符 0〜9、小数点和正、负号构成)
例:
【例 】
从键盘输入一个学生的学号、性别和一门课程的成绩后输出该学生的信息。
#include <stdio.h>
int main()
{
int num; //定义整型变量 num 存放学生的学号
char sex; //定义字符型变量 sex 存放学生的性别
float score; //定义实型变量 score 存放学生一门课程的成绩
printf("Please input number:\n");
scanf("%d",&num); //从键盘输入学生的学号
printf("Please input sex:\n");
getchar( );
scanf("%c",&sex); //从键盘输入学生的性别
printf("Please input score:\n");
scanf("%f",&score); //从键盘输入学生一门课程的成绩
printf("num:%d,sex:%c,score:%6.2f\n",num,sex,score); //输出该学生的学号、性别和一门课程的成绩
return 0;
}
运行:
第四节 选择结构程序设计
选择结构是通过对给定条件进行判断决定所要执行的操作。选择结构分为单分支选择结构、双 分支选择结构和多分支选择结构三种。C 语言为这三种选择结构分别提供了相应的语句。
1、单分支选择结构
C语言中实现单分支选择结构的语句是if语句。if语句的一般形式:
【格式】if(表达式)语句;
【功能】计算表达式的值,若为“真”(非0),则执行语句;否则不执行语句。
【说明】
1、if语句中的“表达式”必须用一对圆括号括起来。
2、“表达式”可以是任何类型,除了常用的关系表达式或逻辑表达式外,也允 许是其他类型的数据,如整型、实型或字符型等。
3、语句可以是任何语句(除了数据定义语句),也可以是另一个if语句(称为 嵌套的if语句)。
2、双分支选择语句
C语言中实现双分支选择语句的是if-else语句。if-else语句的一般形式:
【格式】
if(表达式)语句1;
else 语句2;
【功能】
计算表达式的值,若为“真”(非0),则执行语句1;否则执行语句2。
【说明】
1、if语句中的“表达式”必须用一对圆括号括起来。
2、“表达式”可以是任何类型,除了常用的关系表达式或逻辑表达式外,也允 许是其他类型的数据,如整型、实型或字符型等。
3、语句1和语句2可以是任何语句(除了数据定义语句),也可以是另一个if- else语句(称为嵌套的if-else语句)。
4、“语句1”和“语句2”可以是一条简单的语句,也可以是复合语句。不管 是简单语句还是复合语句中的各个语句,每条语句后面的分号必不可少。
5、else子句是if语句的一部分,必须与if配对使用,不能单独使用。
例:
#include <stdio.h>
int main()
{
int a,b;
a=1;
b=2;
if(a>b)
printf("%d>%d\n",a,b);
else
printf("%d%<%d\n",a,b);
}
3、if-else-if语句的嵌套(分支嵌套的特殊形式)
这种嵌套是在每一层else分支下嵌套一个if-else语句,即:
需要注意以下几点:
1、从上至下逐一对表达式进行判断,只有遇到某一表达式值为“真”(非0) 时,则执行与之相对应的语句,执行完毕后跳出整个选择结构;如果没有任 何一个表达式值为“真”,则执行最后一个else后面的语句n+1.
2、不管有多少分支,程序在执行完一个分支后其余的分支将不再执行。
3、else if不能写成elseif,即else和if之间需要有空格分隔。
4、if语句的嵌套层数没有限制,可以多重嵌套。多重嵌套可以扩展选择的分 支数量,但嵌套的层数太多会增加变成的难度。因此,嵌套的层数不宜过多。
【例1】:
判断输入字符种类
#include<stdio.h>
void main()
{
char c;
printf("Enter a character:");
c=getchar();
if(c<32) printf("The character is a control character\n");
else if(c>='0'&&c<='9') printf("The character is a digit\n");
else if(c>='A'&&c<='Z') printf("The character is a capital letter\n");
else if(c>='a'&&c<='z') printf("The character is a lower letter\n");
else printf("The character is other character\n"); }
【例2】:
输入三个数,按由小到大的次序输出
#include <stdio.h>
int main()
{
int a,b,c,t; /*定义4个基本整型变量a、b、c、t*/
printf("Please input a,b,c:\n"); /*双引号内的普通字符原样输出并换行*/
scanf("%d,%d,%d",&a,&b,&c); /*输入任意3个数*/
if(a>b) /*如果a大于b,借助中间变量t实现a与b值的互换*/
{
t = a;
a = b;
b = t;
}
if(a>c) /*如果a大于c,借助中间变景t实现a与c值的互换*/
{
t = a;
a = c;
c = t;
}
if(b>c) /*如果b大于c,借助中间变量t实现b与c值的互换*/
{
t = b;
b = c;
c = t;
}
printf("The order of the number is:\n");
printf("%d,%d,%d\n",a,b,c); /*输出函数顺序输出a、b、c的值*/
return 0;
}
4、多分支选择语句
除了 if 语句的嵌套可以实现多分支选择结构外,C 语言还提供了一种直接实现多分支选择结构 的 switch 语句。通常多分支选择结构是用 n 个条件控制 n+1 个操作。
【说明】switch(表达式)
switch(表达式)
{
case 常量表达式 1:语句组 1;break;
case 常量表达式 2:语句组 2;break;
…
case 常量表达式 n:语句组 n;break;
[default:语句组 n+1;[break;]]
}
【功能】
1、switch后面的“表达式”常用的是字符型或整型表达式。
2、“常量表达式”是由常量或符号常量组成的表达式,所有常量表达式的值必 须互不相同。
3、当switch后面的“表达式”的值,与某个case后面的“常量表达式”的值 相等时,则执行case后面的语句(组),当执行到语句break;时,跳出该 switch语句,转而执行switch语句的下一条语句。
4、如果switch后面“表达式”的值没有与任何一个case后面的“常量表达式” 的值相等,则执行default后面的语句(组)。之后,执行switch语句的下一 条语句。
【说明】
1、每个case后面的“常量表达式”的值,必须各不相同,否则会出现相互矛 盾的现象。
2、case后面的“常量表达式”仅起到语句标号的作用,并不进行条件判断。 系统一旦知道入口标号,即从此标号开始执行,不再进行标号判断,所以必须 加上语句break;,以便结束switch语句。
3、程序的执行结果与各case和default子句的先后次序无关。
4、多个case子句,可共用同一个语句(组)。
5、switch语句实现的多分支选择结构,完全可以用if语句或if语句的嵌套实现。
6、break语句是C语言的一种语句,其功能是中断正在执行的语句。在 switch语句中其作用是执行完某一语句(组)后,跳出该switch语句,无条 件转至switch语句的下一条语句。若省略break语句,则执行完某一语句(组) 后,将继续执行switch语句中其后的所有语句(组)。
7、default及其后面的语句(组)可以省略。省略时,若表达式的值和n个常 量表达式的值均不同,则不执行任何操作就跳出该switch语句。
8、语句组不需要用一对花括号{}括起来。
9、switch语句允许嵌套。
#include <stdio.h>
main()
{
char grade;
grade =getchar();
switch(grade)
{
case 'A' : printf("85~100 \n");break;
case 'B' : printf("70~84 \n"); break;
case 'C' : printf("60~69 \n"); break;
case 'D' : printf("<60 \n"); break;
default : printf("Error \n");
}
}
第五节 循环结构程序设计
C 语言中,循环结构包括当型循环结构、直到型循环结构和次数型循环结构三种。相应地,提 供了 while、do-while 和 for 三种循环语句实现上述循环结构。本质上,循环语句是在给定条件成 立时,重复执行某一程序段(循环体)。
具体地,可通过以下四种方式构成循环结构:
* for 语句。
* do-while 语句。
* while 语句。
* goto 语句和 if 语句。
1、while语句
while语句主要用于实现当型循环结构,其一般形式:
【格式】
while(表达式)
语句;
【功能】
计算表达式的值,当其值为“真”(非0),则执行语句;重复执行上 述操作,直至表达式的值为“假”(0)时为止。
【说明】
1、语句又称为“循环体”,可以是任何语句(除了数据定义语句外),通常是 复合语句。
2、表达式称为“循环控制条件”,可以是任何类型的表达式,常用关系或逻辑 表达式。
3、先判断后执行循环体。即表达式不成立时,循环体最少执行0次。
4、当循环体内无改变表达式的语句(例如i++)时,while(1)将是死循环。
5、若循环体中又含有“循环语句”,则称为循环的嵌套,即多重循环。
6、在书写格式上建议语句(循环体)比while缩进若干格,以便识别重复执行 的的操作。
关于while循环语句:
1、w1hile循环先判断表达式,后执行循环体。循 环体有可能一次也不执行。
2、循环体若包含一个以上语句,应该用{}括起 来。
3、循环体应包含有使循环趋向结束的语句;
4、下列情况,退出while循环
#条件表达式不成立(为零)
#循环体内遇 break , goto
5、无限循环(死循环)
while(1)
循环体 ;
【例1 】用while语句显示1~10的平方
#include <stdio.h>
main()
{
int i=1;
while(i<=10)
{
printf("%d*%d=%d\n",i,i,i*i);
i++;
}
}
【例2】计算 1+2+…+100 之和(利用 while 语句实现)
#include <stdio.h>
main()
{
int i,sum;
i=1;
sum=0;
while(i<=100)
{
sum=sum+i;
i++;
}
printf("%d\n",sum);
}
2、do-while语句
do-while语句主要用于实现直到型循环结构,其一般形式:
【格式】
do 语句;
while(表达式); /*本行的分号不能省略*/
【功能】
1、执行语句。
2、计算表达式,如果其值为“真”(非0),则转置1继续循环;否则,转至3。
3、执行do-while语句的下一条语句。
【说明】
1、语句又称为“循环体”,可以是任何语句(除了数据定义语句外),通常是 复合语句。 2、表达式称为“循环控制条件”,可以是任何类型的表达式,常用关系或逻辑 表达式。需要注意的是,表达式必须用圆括号括起来,其后有一个分号。
3、先执行循环体,在判断循环控制条件。适用于无论循环控制条件是否成立, 先执行一次循环体的情形。此外,do-while语句能够实现的功能for语句也能 实现,而且更简洁。 4、若循环体中又含有“循环语句”,则称为循环的嵌套,即多重循环。
5、在书写格式上建议do和while对其,以便识别重复执行的操作。
【例 1】计算 1+2 十…+100 之和(利用 do-while 语句实现)
#include <stdio.h>
main()
{
int i,sum;
i=1;
sum=0;
do
{
sum=sum+i;
i++;
}
while(i<=100);
printf("%d\n",sum);
}
3、for 语句
for 语句主要用于实现次数型循环结构。在三种循环语句中 for 语句最为灵活,不仅可用于循环 次数已经确定的情况,也可用于循环次数虽不确定但给出了循环继续条件的情况。
for 语句的一般形式如下:
【格式】
for(表达式 1;表达式 2;表达式 3)
语句;
常用形式:for(循环变量赋初值;循环条件;循环变量增值) 循环体语句;
【功能】
1)计算表达式 1,实现变量赋初值。
2)计算表达式 2,如果其值为非 0,则执行 3);否则转至 4)。
3)执行语句,并计算表达式 3,然后转至 2)。
4)不执行语句,退出 for 循环,执行 for 语句的下一条语句。
【说明】
1、“表达式1”的作用是对循环控制变量赋初值;“表达式2”的作用是控制循 环的条件;“表达式3”的作用是循环后修正变量,使循环趋于结束。
2、“表达式1”可以是任何类型,其后有一个分号,“表达式1”可以省略。
3、“表达式2”可以是任何类型,其后有一个分号,“表达式2”可以省略。 省略时相当于“表达式2”的值永远为“真”(非0),所以循环将一直执行, 这种情况称为“死循环”,一般应避免。
4、“表达式3”可以是任何类型,其后没有分号,“表达式3”可以省略。
5、“语句”又称为“循环体”,可以是任何语句(除数据定义语句外),通常 为复合语句。
6、“表达式1”“表达式2”和“表达式3”均可以省略,甚至三者全部省略, 但它们之间的分号不能省略。
7、书写格式上建议以for为准,语句缩进若干格,以便识别重复执行的操作。
8、当“表达式1”和“表达式3”省略时,相当于while循环,即先判断后执行 循环体,循环体至少执行0次;当“表达式3”省略时,则循环体内应有改变 “表达式2”的语句;当“表达式2”省略时,无终止条件,则循环体内应有跳 出该循环的语句,如break、goto、exit()或return等。
【例1】计算 1+2 十…+100 之和(利用 do-while 语句实现)
#include <stdio.h>
main()
{
int i,sum;
sum=0;
for(i=1;i<=100;i++)
{
sum=sum+i;
}
printf("%d\n",sum);
}
【例2】计算 n 的阶乘 n!(n!=1×2×…×n)。
程序代码如下:
#include <stdio.h>
main()
{
int i,n;
long fact=1; /*将累乘器 fact 赋初值为 1*/
printf("Input n:");
scanf("%d",&n); /*从键盘输入一个正整数 n*/
for(i=1;i<=n;i++)
{
fact*=i; /*利用 for 语句实现累乘*/
}
printf("%d!=%d\n",n,fact);
return 0;
}
4、break 语句和 continue 语句
1、break语句
【格式】break;
【功能】强制结束当前的循环,不在执行循环体中break语句后面的语句,跳出循环。
【说明】
1、break语句能用在三种循环语句和switch语句中,其作用是跳出本层循环 或跳出switch语句。
2、通常,break语句与if语句联合使用,表明程序在满足一定条件下提前结束 循环,在循环体中单独使用break语句是没有意义的。
2. continue 语句
【格式】continue;
【功能】立即结束本次循环,转去判断循环控制条件是否成立,即 1 跳过 continue 之后的语 句,重新判断循环控制条件,决定是否继续执行循环。
【说明】
1)continue 语句只能用于三种循环语句的循环体中。
2)通常,continue 语句与 if 语句联合使用。在循环体中单独使用 continue 语句是没有意义 的。
【例1】 输出100~200之间不能被3整除的数
#include <stdio.h>
void main()
{
int i;
for(i=100;i<=200;i++)
{
if(i%3==0) continue;
printf("%d\n",i);
}
}
break语句和continue语句的区别
1、break语句能用于三种循环语句和switch语句,continue语句只能用于三 种循环语句。
2、continue语句的作用是强制结束本次循环,而不是终止整个循环过程;
break语句的作用是终止整个循环过程,不再判断循环控制条件是否成立。需要注意的是,循环嵌套时break语句和continue语句均只影响包含它们的最 内层循环,与外层循环无关。
循环的嵌套
循环语句的循环体内又包含另一个完整的循环结构称为循环的嵌套。多重循环 是嵌套的循环结构,外面的循环语句称为“外层循环”,“外层循环”的循环 体中的循环称为“内层循环”。原则上,循环嵌套的层数是任意的。for语句、 while语句和do-while语句都允许循环的嵌套。
多重循环中,内层循环必须完整地包含在外层循环的循环体中,不能出现内、 外层循环体交叉的情况,但是允许在外层循环体中包含多个并列的内层循环。
5、循环的嵌套
循环语句的循环体内又包含另一个完整的循环结构称为循环的嵌套。多重循环是嵌套的循环结 构,外面的循环语句称为“外层循环”,“外层循环”的循环体中的循环称为“内层循环”。原则 上,循环嵌套的层数是任意的。for 语句、while 语句和 do-while 语句都允许循环的嵌套。
多重循环中,内层循环必须完整地包含在外层循环的循环体中,不能出现内、外层循环体交叉 的情况,但是允许在外层循环体中包含多个并列的内层循环。
喜欢网络安全与编程的朋友可以关注下我的公众号