资源描述
. .
C语言复习提纲
第一章 C语言程序设计概述
一、Visual C++6.0开发环境
1、了解Visual C++6.0的安装过程;
2、了解Visual C++6.0的工作界面,菜单和工具栏的使用;
▲二、掌握C语言程序运行的过程
1、编辑:是指把按照C语法规那么编写的程序代码通过编辑器〔Visual C++ 6.0,Turbo C 3.0〕输入计算机,并存盘。在存盘时,C源文件的扩展名为 .c
2、编译:将C语言源程序编译成目标程序,即对源程序进展编译,并将源程序转换为扩展名为.obj的二进制目标代码〔即把已经编辑好的源程序翻译成二进制目标代码的过程〕。
3、连接:将用户程序生成的目标代码文件〔.obj〕和系统提供的库文件〔.lib〕中的某些代码连接在一起,生成一个可执行文件〔.exe〕。
4、执行:执行生成的可执行代码,并输出结果。
5、调试:是将编制的程序投入实际运行前,用手工或编译程序等方法进展测试,修正语法错误和逻辑错误的过程。
▲三、构造化程序设计的根本概念
1、概念
以模块化设计为中心,将待开发的软件系统划分为假设干个相互独立的模块,将原来较为复杂的问题化简为一系列简单模块的设计,任何模块都可以使用一些根本的构造来实现,任何复杂的程序,都可以使用这些根本构造按一定的顺序组合起来,这些根本构造的特点都是只有一个入口、一个出口,这样的程序设计方法称为构造化程序设计。
2、根本思想
构造化程序设计的根本思想是采用"自顶向下,逐步细化、模块化设计、构造化编码"的程序设计方法和"单入口单出口"的控制构造。
3、三种根本构造
⑴顺序构造⑵选择构造⑶循环构造
4、三种根本构造的特点
⑴只有一个入口⑵只有一个出口
⑶每一个根本构造中的每一局部都有时机执行到
⑷构造内不存在“死循环〞
5、设计原那么
⑴自顶向下⑶逐步细化⑶模块化设计
⑷构造化编码
▲四、C程序的根本组成:
C程序是由假设干个函数构成的,至少有一个主函数main(),main()的位置可以任意,其他各函数在程序中的前后位置也是可以任意的。程序的执行总是从主函数开场,在主函数中完毕。主函数是可以调用其他任何非主函数的函数,任何非主函数也可以调用其它任何非主函数。
C程序的根本组成:声明区、主程序区、函数定义区。
1、声明区
处在程序文件的所有函数的外部,一般包含:包含头文件、宏定义、类定义、构造体定义、函数声明、全局变量声明、条件编译等。
2、主程序区
主程序以main()函数开场,main()函数〔主函数〕是程序运行时的入口,包含局部变量的声明、函数调用、一般运算、构造控制、对象与构造的处理、文件处理等。
3、函数定义区
函数的定义包含函数说明和函数体两局部。
4、注释
//或/* */为注释,不能嵌套
不产生编译代码,不影响程序的执行效率。
▲五、标识符
1、标识符的定义:用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。
2、标识符的命名规那么:由字母、数字或下画线组成,并且第1个字符必须为字母或下画线。
注意:标识符区分大小写,即大写字母和小写字母的通常意义不同,且不能与关键字重名。
练习1_1:以下变量标识符哪些是正确的,哪些是不正确的?
a3bcifa!bc _abc abc_3abca_bc 3abc
3、标识符分类:关键字、预定义标识符、用户自定义标识符。
第二章 数据类型、运算符和表达式
图2_1 C语言的数据类型
数据类型
根本类型
空类型〔无值类型〕void
构造类型
指针类型
实型〔浮点型〕
联合型类型union
单字符型char
整型int
单精度型float
双精度型double
字符型
宽字符型w-char
逻辑型bool
类类型class
枚举类型enum
构造类型struct
数组类型
▲一、C语言的数据类型
C语言中根本数据类型包括整型、实型、字符型、枚举类型,构造类型有数组、构造体、共用体等。
⑴、根本数据类型〔见P17〕
⑵、构造类型又称为组合类型,它是由根本类型按照某种规那么组合而成的。
n 数组:是由具有一样数据类型的元素组成的集合。
n 构造体:是由不同的数据类型构成的一种混合的数据构造,构成构造体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元。
n 共用体:是类似于构造体的一种构造类型,与构造体不同的是构成共同体的数据成员共用同一段内存单元。
n 枚举:是将变量的值一一列举出来,变量的值只限于列举出来的值的X围内。
⑶、指针类型变量用于存储另一变量的地址,而不能用来存放根本类型的数据。它在内存中占据一个存储单元。
⑷、类是一种数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质。
二、常量和变量
⑴、常量:在程序运行的整个过程中,其值始终保持不变的量。
n 整型常量:表示形式有十进制、八进制〔以0开头〕和十六进制〔以0x或0X开头〕。整型常量可以后缀字母L〔或l〕表示长整数,后缀字母U〔或u〕表示无符号整数。
n 实型常量〔浮点型常量〕:表示形式有一般形式和指数形式。实型常量缺省为double型〔双精度型〕,如后缀f或F,那么为float型〔单精度型〕。
n 字符常量:用单撇号括起来的一个字符。如'A','*'等。
转义字符:用反斜杠引导的,具有特定含义的字符(见P22表2-4),如 '\n','\367','\x8a'。
注:C语言字符集中的任何一个字符均可用转义字符来表示。
n 字符串常量:用双撇号括起来的字符序列。如"student","XXXX"等。
n 布尔常量:false,true。
n 符号常量:
² #define 宏名 常数
练习2_1:以下哪些是合法的常量:
①12.7f②0986③0986.012④、0625L⑤87U
⑥-0x98C2⑦01a⑧-6.87E-2 ⑨1.2e0.5 ⑩E-3
⑾0xFF ⑿2L⒀'\72' ⒁160 ⒂-0xffff
⒃5E2.0⒄-0xcdf⒅1.3E⒆2E0⒇0668
〔21〕011 〔22〕0xe 〔23〕-01 〔24〕-0x48a 〔25〕0x
⑵变量:指程序在运行时其值可改变的量。
n 变量应先定义〔声明其类型和名称〕后使用;
n 变量定义的一般形式为:
u < 数据类型 > <变名1>,<变名2>,…,<变名n>;
n 在定义一个变量的同时,也可以给它赋以初值。
练习2_2以下正确的变量标识符是
①3abc②$amount③Num_of_Student④if⑤a!bc
⑥_above ⑦_abc⑧a>b⑨sin ⑩day
▲三、运算符和表达式
1、算术运算符和算术表达式
注意:int i=1.2*3; //结果为3,而不是3.6。 int i=5/3结果为1。
表达式17/5的结果是3,表达式17%5的结果是2。
2、赋值运算符和赋值表达式
注意:
n 赋值运算符的结合性是从右至左的
n 复合赋值运算符:int a=12; a+=a-=a*=a;〔a=a+(a=a-(a=a*a)),结果为0〕
注意:
在C语言中,定义int a=b=c=3;是错误的,而定义int a,b,c;a=b=c=3;是正确的。
练习2_3设m=9,i=3,那么执行运算m%=i+1后,m的值是多少?结果1。
m=m%(i+1)→m=9%(3+1)→m=1。
3、关系运算符和关系表达式
注意:
n 关系运算符的优先级低于算术运算符。例如:a+b>c 等价于 (a+b)>c,a!=b>c 等价于 a!=(b>c)
n “=〞与“==〞的区别
4、逻辑运算符与逻辑表达式
注意:
n 逻辑非的优先级最高,逻辑与次之,逻辑或最低
练习2_4 假设有inta=3,b=0;那么表达式a&&!b的值为1。
练习2_5设有变量说明:int a=8,b=7;那么执行语句:printf("%d,%d \n",++a,b--),输出的结果是9,7
练习2_6设a,b,c均为int型变量,那么执行语句a=b=3;c=++a||++b;后,b的值为3。
练习2_7设x、y和z都是int型变量,且x=8, y=3, z=5, 那么表达式x*y/z+6-14%z的值为6。
练习2_8设有定义:int x=1,y=-1;那么执行语句printf("%d\n",(x--&++y);后的输出结果是0。
练习2_9 设x,y,z,t均为int型变量,那么执行以下语句x=y=z=1;t=++x||++y&&++z; 后,x、y、z、t的值分别为2,1,1,1。
6、条件运算符
表达式1?表达式2:表达式3
注意:
n 结合性是自右向左。a>b?a:c>d?c:d相当于a>b?a:(c>d?c:d)
n 条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符。如:
a>b?a-b:b-a相当于a>b?(a-b):(b-a)
练习2_10设有变量说明:int x=3,y=5;那么表达式:z=x>y?x:y运算后,z的值是5。
7、位运算符
位运算符是对其操作数按其二进制形式逐位进展运算,参加位运算的操作数必须为整数。
练习2_11 int a=5,b=6;a&b=4;a|b=7;a^b=3;~b=-7;b<<2=24;b>>2=1。
注:在位运算中,操作数左移三位,其结果相当于操作数乘以8。
8、逗号运算符
表达式1, 表达式2, ……, 表达式n
注意:
自左至右,依次计算各表达式的值,“表达式n〞 的值即为整个逗号表达式的值。如:a = 3 * 5, a * 4, a + 5的值为20。
▲四、运算符的优先级与结合性
1、所谓结合性是指,当一个操作数两侧的运算符具有一样的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。
自左至右的结合方向,称为左结合性。反之,称为右结合性。
结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。
2、表达式求值
n 按运算符的优先级上下次序执行。例如,先乘除后加减。
n 如果在一个运算对象〔或称操作数〕两侧的运算符的优先级一样,那么按C语言规定的结合方向〔结合性〕进展。
例如,算术运算符的结合方向是“自左至右〞,即:在执行“a – b + c〞时,变量b先与减号结合,执行“a - b〞;然后再执行加c的运算。
练习2_12 设int x=2,y=3,z=4; 执行语句行x++;y+=1;z=x+y--以后,x,y和z的值分别是多少?
答案:3,3,7
练习2_13假设有定义int m=2;那么逻辑表达式(m=3)&&(m= =3)的值是1。
练习2_14 如果a=5,b=3,c=7,d=9,那么条件表达式a<b?a:c<d?c:d的值为多少?结果为7。
练习2_15设a=5,b=6,c=7,d=8,m=2,n=2,执行(m=a>b) && (n=c>d);后,n的值为2。
练习2_16 如果a=5,b=3,c=7,d=9,那么条件表达式a<b?a:c<d?c:d的值为7。
第三章 顺序构造程序设计
▲一、顺序构造程序设计——数据的输入和输出
1、格式化输出——printf()函数
n printf()函数的一般格式如下:printf("格式字符串" [,输出项表]);
² 输出项表:要输出的数据项〔可以没有,有多个时以“,〞分隔〕
² 格式控制串:包含两种信息
格式说明: %[修饰符]格式字符,用于指定输出格式
如:格式控制字符“%c〞表示的含义是输出一个字符型数据。
普通字符或转义序列:原样输出。
n 格式控制字符:
表3_1 printf()函数格式字符
格式转换字符
含义
举例
%d,%i
以十进制整数输出
int a=65;printf(“%d〞,a)//65
%c
输出一个字符型数据
int a=65;printf(“%c〞,a)//A
%s
输出一个字符串
printf(“%s〞,“abcd〞)//abcd
%e,%E
以指数形式输出一个浮点型数据〔小数位数缺省值为6位〕
float x=984.235497426;
printf("%e",x);//9.842355e+002
%f(有效数字6-7位)
以十进制小数形式输出一个浮点型数据〔小数位数缺省值为6位〕
float x=984.235432426;
printf("%f",x);//984.235413
%g,%G
按照%e,%f输出宽度较短的格式输出,不输出无意义的0
float x=23.240;
printf("%g",x);//23.24
n 修饰符:
表3_2 printf()函数修饰符
修饰符
功能
例如
m
数据最小宽度. >m,正常输出;<m ,左补空格.
int a=36;printf("a=%5d\n",a);
//□□□36
.n
对实数,表示输出n位小数;对字符串,表示截取的字符个数
float a=123.456;
printf("a=%8.2f\n",a);//□□123.46
–
输出的数值靠左端,右边补空格。
printf("s=%-5.3s","guangdong")
//gua
0
小于指定宽度左边补0。
int b=789;
printf("b=%05d\n",b);//00789
如:在C程序的格式输出中,%d表示输出十进制整数,%6.2f表示输出长度为6位,有2位小数的实数。printf("s=%-5.3s","student");的输出结果是s=stu 。
2、格式化输入——scanf()函数
scanf()函数的一般格式
scanf("格式字符串", 输入项首地址表);
注:
①格式输入函数scanf()可以从键盘上接收不同数据类型的数据。
②格式化输出函数〔printf()〕和格式化输入函数〔scanf()〕都包含在头文件“stdio.h〞中。
n 格式字符串。格式字符串可以包含3种类型的字符:格式指示符、空白字符〔空格、Tab键和回车键〕和非空白字符〔又称普通字符〕。
格式指示符与printf()函数的相似,空白字符作为相邻2个输入数据的缺省分隔符,非空白字符在输入有效数据时,必须原样一起输入。
n 输入项首地址表──由假设干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。
输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。
变量首地址的表示方法: &变量名
其中“&〞是地址运算符。
n 数据输入操作
² 如果相邻2个格式指示符之间,不指定数据分隔符〔如逗号、冒号等〕,那么相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。
例如,scanf("%d%d",&num1,&num2);
假设给num1输入12,给num2输入36,那么正确的输入操作为:12□36↙
或者:12↙
36↙
注:使用“↙〞符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作完毕。
² “格式字符串〞中出现的普通字符〔包括转义字符形式的字符〕,务必原样输入。
例如,scanf("%d,%d",&num1,&num2);
假设给num1输入12,给num2输入36,正确的输入操作为:12,36↙
练习3_1已有定义double d,f;,数据的输入方式为:3.69<CR> 3.2<CR>,根据定义和数据的输入方式,输入函数语句的正确形式为scanf("%lf%lf",&d,&f)。
〔scanf("%4.2lf%3.1lf",&d,&f) 或scanf("%4.2f%3.1f",&d,&f)都是错误的〕
练习3_2 有以下程序段
int m=2, n=2;n = m++ -1;printf("%d %d\n", m ,n); 输出结果是3,1。
第四章 选择构造程序设计
▲一、算法
1、算法的概念:算法是指为解决一个问题而采取确实定的、有限的方法和步骤。
2、算法的描述方法最常用的有自然语言、流程图、N-S流程图、PAD图和伪代码等。
▲二、顺序构造程序设计
顺序构造是构造化程序设计中最简单、最常见的一种程序构造。顺序构造中的语句是按照书写的先后次序执行的,并且每个语句都会被执行到。
练习4_1编写一个程序,从键盘上输入一个学生5门课的成绩,计算出该学生的总成绩和平均成绩,并用自然语言描述算法。
解:设变量 a、b、c、d、e分别表示学生5门课的成绩,sum表示总成绩,aver表示平均成绩, 那么用自然语言描述算法如下:
①输入学生5门课的成绩a、b、c、d、e;
②求总成绩sum=a+b+c+d+e;
③求平均成绩: aver =sum/5.0;
④输出总成绩和平均成绩。
程序如下:
#include <stdio.h>
main()
{
float a,b,c,d,e,sum,aver;
printf("请输入学生5门课的成绩\n");
scanf("%f,%f,%f,%f,%f",&a,&b,&c,&d,&e);
sum=a+b+c+d+e;
aver=sum/5.0;
printf("总成绩=%0.2f,平均成绩=%.2f\n",sum,aver);
}
练习4_2 编写一个程序,从键盘输入梯形的上底、下底和高的值〔浮点数〕,计算并输出其面积〔保存两位小数〕,并用N-S构造图表示算法。
解:设变量a、b、h、area分别表示梯形的上底、下底、高和面积,那么用N-S构造图表示算法如下:
输入梯形的上底a、下底b和高h
计算梯形的面积:
area=(a+b)*h/2.0
输出结果。
程序如下:
#include <stdio.h>
main()
{
float a,b,h,area;
printf("请输入梯形的上底、下底和高\n");
scanf("%f,%f,%f",&a,&b,&h);
area=(a+b)*h/2.0;
printf("梯形的面积为%0.2f\n",area);
}
练习4_3编写一个程序,从键盘输入圆的半径,计算并输出圆的周长和面积〔保存两位小数〕,用伪代码表示出算法。
解:设用变量r 、length、area分别表示圆的半径、周长和面积,那么用伪代码表示算法如下:
BEGIN
input r
length=2*3.14*r
area=3.14*r*r
print length,area
END
程序如下:
#include <stdio.h>
#define PI 3.14
main()
{
float r,length,area;
printf("请输入圆的半径\n");
scanf("%f",&r);
length=2*PI*r;
area=PI*r*r;
printf("圆的周长为%0.2f\n",length);
printf("圆的面积为%0.2f\n",area);
}
▲三、选择构造程序设计
1、if语句
⑴、if语句的一般格式
if(表达式)
{语句组1;}
[else
{语句组2;} ]
n if语句中的“表达式〞必须用“(〞和“)〞括起来。表示程序执行的条件,常用关系运算符、逻辑运算符等表示的条件表达式,其结果只有两个值“1”或“0”〔成立或不成立〕。
如:表示字符型变量ch是大写英文字符的C语言表达式是ch>='A'&&ch<='Z',要判断字符变量ch中的值是否为数字字符,那么其表达式是ch>='0'&&ch<='9'。
n else子句〔可选〕是if语句的一局部,必须与if配对使用,不能单独使用。
n 当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式〔即去掉花括号〕。
⑵、if语句的执行过程
n 缺省else子句时
n 当“表达式〞的值不等于0〔即判定为“逻辑真〞〕时,那么执行语句组1,否那么直接转向执行下一条。
n 指定else子句时
n 当“表达式〞的值不等于0〔即判定为“逻辑真〞〕时,那么执行语句组1,然后转向下一条语句;否那么,执行语句组2。
⑶、if语句的嵌套与嵌套匹配原那么
n if语句允许嵌套。所谓if语句的嵌套是指,在“语句组1”或〔和〕“语句组2”中,又包含有if语句的情况。
n if语句嵌套时,为防止嵌套的if-else语句的二义性,C语言规定:else总是与在其之前最近的未配对的if语句组成配对关系。
练习4_4:铁路托运行李,假设每X车票可按每公斤0.3元托运40公斤以内的行李,如果超过40公斤时,超过的局部每公斤加价0.5元,试编写一道计算行李托运费的程序。
解:/*程序功能:计算行李托运费*/
#include <stdio.h>
Void main()
{
float w,x;
printf("输入行李的重量:");
scanf("%f",&w);
if(w>40.0)
x=40.0*0.3+(w-40.0)*0.8;
else
x=w*0.5;
printf("行李重量w=%.2f公斤,托运费x=%.2f元\n",w,x);
}
2.switch语句
⑴、switch语句的一般形式
switch(表达式)
{ case 常量表达式1:语句组;break;
case 常量表达式2:语句组;break;
......
case 常量表达式n:语句组;break;
[default:语句组;[break; ]]
}
⑵、执行过程
n 当switch后面“表达式〞的值,与某个case后面的“常量表达式〞的值一样时,就执行该case后面的语句〔组〕;当执行到break语句时,跳出switch语句,转向执行switch语句的下一条。
n 如果没有任何一个case后面的“常量表达式〞的值,与“表达式〞的值匹配,那么执行default 后面的语句〔组〕。然后,再执行switch语句的下一条。
⑶说明
n switch后面的“表达式〞,可以是int、char和枚举型中的一种。
n 每个case子句后面的“常量表达式〞的值,必须各不一样,否那么会出现相互矛盾的现象〔即对表达式的同一值,有两种或两种以上的执行方案〕。
n case后面的常量表达式仅起语句标号作用,并不进展条件判断。系统一旦找到入口标号,就从此标号开场执行,不再进展标号判断,所以要退出switch语句,方法是使用break语句。
n 各case及default子句的先后次序,不影响程序执行结果。
n 多个case子句,可共用同一语句〔组〕
n 用switch语句实现的多分支构造程序,完全可以用if语句或if语句的嵌套来实现。
练习4_5以下程序段的输出结果是
intx=7,y=8,z=9;
if(x>y)
x=y,y=z;z=x;
printf("%d,%d,%d\n",x,y,z);
结果:7,8,7
练习4_6以下程序的输出结果是
#include <stdio.h>
void main()
{
int m=5;
if(m++>5)
printf("%d\n",m);
else
printf("%d\n",m--);
}
结果:6
练习4_7以下程序的输出结果是
#include <stdio.h>
void main()
{
int k=1,x=0,y=0;
switch(k)
{ case 0:y++;
case 1:x++;
case 2:x++;y++;
}
printf("x=%d,y=%d\n",x,y);
}
结果x=2,y=1
第五章 循环构造程序设计
▲一、循环程序设计
1、while语句
⑴、一般格式
while(循环继续条件)
{ 循环体语句组;}
⑵、执行过程
①求解“循环继续条件〞表达式。如果其值为非0,转②;否那么转③。
②执行循环体语句组,然后转①。
③执行while语句的下一条。
练习5_1:/*程序功能:求1~100的累计和*/
#include <stdio.h>
void main()
{ int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/
while( i<=100 )
{ sum += i;/*实现累加*/
i++;/*循环控制变量i增1*/
}
printf(“sum=%d\n〞,sum);
}
程序运行情况如下:
sum=5050
2、do-while语句〔直到型循环〕
⑴、一般格式
do
{ 循环体语句组; }
while(循环继续条件);/*本行的分号不能缺省*/
当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。
⑵、执行过程
①执行循环体语句组。
②计算“循环继续条件〞表达式。如果“循环继续条件〞表达式的值为非 0〔真〕,那么转向①继续执行;否那么,转向③。
③执行do-while的下一条语句。
⑶、do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。
因此do......while语句不管条件是否成立,至少要执行一次循环体。
练习5_2:用do-while语句求解1~100的累计和。
/*程序功能:求1~100的累计和*/
main()
{ int i=1, sum=0; /*定义并初始化循环控制变量,以及累计器*/
Do
{
sum += i; /*累加*/
i++;
}
while(i<=100);/*循环继续条件:i<=100*/
printf(“sum=%d\n〞,sum);
}
3、for语句
⑴、for语句的一般格式
for([变量赋初值];[循环继续条件];[循环变量增值])
{ 循环体语句组;}
⑵、for语句的执行过程
①求解“变量赋初值〞表达式。
②求解“循环继续条件〞表达式。如果其值非0,执行③;否那么,转至④。
③执行循环体语句组,并求解“循环变量增值〞表达式,然后转向②。
④执行for语句的下一条语句。
⑶、说明
①“变量赋初值〞、“循环继续条件〞和“循环变量增值〞局部均可缺省,甚至全部缺省,但其间的分号不能省略。
②当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。
③“循环变量赋初值〞表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式〔如逗号表达式〕。
例如,for(sum=0;i<=100;i++) sum += i;
for(sum=0,i=1;i<=100;i++) sum += i;
④“循环继续条件〞局部是一个逻辑量,除一般的关系〔或逻辑〕表达式外,也允许是数值〔或字符〕表达式。
如:while(!E)等价于while(0),while(E)等价于while(1)。
for语句最为灵活,不仅可用于循环次数已经确定的情况,也可用于循环次数虽不确定、但给出了循环继续条件的情况。
练习5_3:求n的阶乘n!〔n!=1*2*……*n〕。
/*程序功能:求n!*/
main()
{ int i, n;
long fact=1;/*将累乘器fact初始化为1*/
printf(“Input n: 〞);
scanf(“%d〞, &n);
for(i=1; i<=n; i++)
fact *= i;/*实现累乘*/
printf("%d ! = %ld\n", n, fact);
}
程序运行情况如下:
Input n: 5↙
5 ! = 120
练习5_4 有以下程序
#include <stdio.h>
void main()
{
int a=10,b=10,i;
for(i=0;a>8;b=++i)
printf("%d %d ",a--,b);
}
程序输出的结果是10 10 9 1
练习5_5 有以下程序
#include <stdio.h>
void main()
{ int k;
for(k=0;k<10;k++);
printf("%d",k);
}
答案:10
练习5_6以下程序的运行结果是
#include <stdio.h>
void main()
{
int m;
for(m=1;m<=50;m++)
{
if(m%12!=0)
continue;
printf("%4d",m);
}
printf("\n");
}答: 12 24 36 48
4、循环的比拟
⑴、While和 for都是先判断后循环,而do-while是先循后判断。即do-while语句在条件不成立时循环体也要被执行一次。
⑵、while和do-while语句的条件表达式只有一个,只起到控制循环完毕的作用,循环变量的初值等都用其他语句完成;for语句那么有3个表达式,不仅能起到控制循环完毕的作用,还可给循环变量赋初值。
练习5_7对于以下程序段
int m=-1;
do
{
m=m*m;
}
while(!m);
循环执行的次数为多少?答:1次。
练习5_8对于以下程序段
int k=5;while (k=0) k=k-1; printf("%d\n",k);,循环体执行的次数为多少次?答:0次。
练习5_9 对于以下程序段
int a=5;while(a>=1) a--;程序执行后,a的值是0。
练习5_10以下程序
#include <stdio.h>
void main()
{ int i;
for(i=0;i<10;i++);
printf("%d",i);
}输出结果是10。
5、循环的嵌套
⑴、循环语句的循环体内,又包含另一个完整的循环构造,称为循环的嵌套。循环嵌套的概念,对所有高级语言都是一样的。
⑵、for语句和while语句允许嵌套,do-while语句也不例外。
练习5_11:编程:
输出以下图形 *
***
*****
*******
*********
解:/*程序功能:打印5行"*",第一行1个,第二行3个,第三行5个...*/
#include <stdio.h>
void main()
{ int i=1;
while(i<=5)
{ int j=1,k=1;
while(j<=5-i)
{ printf(" ");
j++;
}
while(k<=2*i-1)
{ printf("*");
k++;
}
printf("\n");
i++;
}
}
6、break语句与continue语句
⑴、一般格式: break;
continue;
⑵、功能
①break:强行完毕循环,转向执行循环语句的下一条语句。
②continue:对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定。
⑶、说明
①break能用于循环语句和switch语句中,而continue只能用于循环语句中。
②break是终止整个循环的执行,而continue只是完毕本次循环。
③循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关。
练习5_12 求Fibonacci数列前12项的和。
解:
每月新增兔子数Fn={1,1,2,3,5,8,13,21,34,…}〔斐波那契数列〕
月份n 兔子数Fn
1 F1=1
2 F2=1
3 F3=2=F1+F2
4 F4=3=F2+F3
…
n Fn=Fn-1+Fn-2
由此可写出递推公式
1 (n=1)
F(n)= 1 (n=2)
F〔n-1〕+ F〔n-2〕 (n>3)
程序代码如下:
#include<stdio.h>
void main()
{
int F1=1,F2=1;
int F,S=2,n=3;
while(n<=12)
{
F=F1+F2;
F1=F2;
F2=F;
S=S+F;
n++;
}
printf("S=%d\n",S);
}
第六章 数组
数组是数目固定、类型一样的假设干变量的有序集合。
▲一、一维数组
1、一维数组的定义:数据类型数组名[常量表达式][, 数组名2[常量表达式2]……];
n “数据类型〞是指数组元素的数据类型。
n 数组名,与变量名一样,必须遵循标识符命名规那么。
n “常量表达式〞必须用方括号括起来,指的是数组的元素个数〔又称数组长度〕,它是一个整型值,其中可以包含常数和符号常量,但不能包含变量。
n 数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开场顺序编号。
n 数组名中存放的是一个地址常量,它代表整个数组的首地址。同一数组中的所有元素,按其下标的顺序占用一段连续的存储单元。
注:数组名能与其他变量名一样,数组名后是用方括号括起来的常量表达式,不能和圆括号。
2、数组元素的引用
引用数组中的任意一个元素的形式:数组名[下标表达式]
n “下标表达式〞可以是任何非负整型数据,取值X围是0~〔元素个数-1〕。
n 1个数组
展开阅读全文