C语言与程序设计294_第1页
C语言与程序设计294_第2页
C语言与程序设计294_第3页
C语言与程序设计294_第4页
C语言与程序设计294_第5页
已阅读5页,还剩289页未读 继续免费阅读

下载本文档

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

文档简介

C语言与程序设计1第一章C语言与程序设计简介2计算机和程序设计基本概念C语言的发展历程和特点C语言程序的基本组成VisualC++上机操作31.1计算机和程序设计基本概念输入设备输出设备外存储器(辅存)

计算机系统软件外设系统软件应用软件硬件运算器控制器主机内存储器(主存)中央处理器(CPU)1.1.1计算机系统组成图1-1计算机系统组成41.硬件中央处理器内存外存输入设备输出设备数据流控制流图1-2计算机硬件结构图52.软件计算机硬件(裸机)操作系统C编译程序C源程序人图1-3硬件功能扩展与人机交互界面61.1.2程序与程序设计语言机器语言汇编语言高级语言用助记符号描述的指令系统如ADDA,B面向机器的语言7例如:给内存16进制地址为1000单元中的数据加上十进制数10,则用机器语言、汇编语言和高级语言表示如下:(1)用8086/8088机器语言表示101000011101000000000111/*将16进制1000地址中数据

AX寄存器*/1000001100001010/*给AX寄存器中的数据加10*/101000111101000000000111/*将AX寄存器中的数据

16进制1000地址*/8(2)用8086/8088汇编语言表示

MOVAX,[1000]

/*将1000地址中数据

AX寄存器*/

ADDAX,10/*给AX寄存器中的数据加10*/

MOV[1000],AX

/*将AX寄存器中的数据

1000地址*/9(3)用C高级语言表示

X=X+10;

/*X为1000地址的变量名*/101.2

C语言的发展历程和特点1.2.1

C语言发展历程

C语言诞生于20世纪70年代,最初是用于PDP-11计算机上实现UNIX操作系统;1977年出现了独立于机器的C语言编译文本,1978年贝尔实验室正式发表了C语言;1983年ANSI为C语言制定了ANSIC标准,并于1988年完成;现今C语言已成为世界上应用最广泛的计算机语言之一。111.2.2

C语言主要特点(1)

简洁、紧凑、方便、灵活。C语言共有32个关键字,9种控制语句,程序书写自由。(2)

运算符丰富。C语言的运算符包含的范围很广泛,共34

个运算符。C语言把括号、下标、赋值、强制类型转换等都作为运算符处理,从而使C语言的运算类型丰富、表达式类型多样化。(3)

数据结构丰富。(4)

结构化语言。

12(5)

语法检查不太严格,程序设计自由度大。(6)

允许直接访问物理地址。

C语言中含有位运算和指针运算,能够实现对内存地址的直接访问和操作。(7)

生成目标代码效率高。

C语言仅比汇编程序生成的目标代码(即机器语言程序)执行效率低10%~20%,这远高于其他高级语言的执行效率。(8)

适用范围大,可移植性好。

131.3

C语言程序的基本组成例1.1在显示器输出“Hello,China!”。#include<stdio.h>/*使用C语言提供的标准输入输出函数*/voidmain()/*主函数main*/{

printf("Hello,China!\n");/*用输出函数printf实现输出显示字符串*/}运行结果:Hello,China!14例1.2

求两个数a与b之和。#include<stdio.h>voidmain(){

int

x,y,sum;

/*定义x、y、sum三个整型变量*/

printf("Inputxandy:\n");/*在显示器上显示提示输入的信息*/

scanf("%d%d",&x,&y);/*由键盘输入x和y的值*/

sum=x+y;

/*完成x+y的求和并将结果送给sum*/

printf("x+y=%d\n",sum);/*输出求和结果*/}运行结果:Inputxandy:1215↙x+y=2715例1.3从键盘上输入两个整数,在屏幕上输出它们的最大值。#include<stdio.h>intmax(int

x,inty);

/*函数声明*/voidmain()

/*主函数*/{

int

a,b,c;

/*定义变量a、b、c为整型*/

printf(“Inputa,b=”);

/*输出提示字符串“Inputa,b=”*/

scanf("%d,%d",&a,&b);/*由键盘输入a、b值*/

c=max(a,b);/*调用函数max(),并将max()的返回值送给变量c*/

printf("Maxis:%d\n",c);/*输出结果*/}16intmax(int

x,inty)/*定义函数max(),形参x、y为整型。开头的int

表示返回值为整型*/{

intz;/*定义变量z为整型*/

if(x>y)/*条件判断语句,判断x是否大于y*/ z=x;/*x>y为真时将x值赋给z*/

else z=y;/*x>y为假时将y值赋给z*/

return(z);/*将z值返回给调用函数main()*/}运行结果:Inputa,b=8,12↙Maxis:12程序说明:

C程序的基本结构

函数

函数是构成C语言的基本单位,主要有以下几种类型:1.main函数:是任何一个C语言程序开始执行的地方每一个C源程序都必须有且只能有一个主函数(main函数)。

main是主函数的函数名,表示这是一个主函数。

172.用户自定义函数

由用户自定义,如上例中的max()函数。

函数(除主函数外)可以被其他函数调用。

函数的优点是保持程序的结构性,可共享。183.系统函数

printf函数是一个由系统定义的标准函数,可在程序中直接调用。系统函数由系统内含,但在使用时必须带上

包含该函数说明的头文件。如:

scanf、printf函数在头文件stdio.h中声明

194.函数的基本形式

1)函数的首部

返回值类型函数名(参数列表)

如:intmax(intx,inty)

函数名后必须带(),即使参数列表为空

2)函数体

函数体指首部后紧接的大括号部分{}

函数体一般包括两个部分:

声明部分:定义这部分所要用到的变量。

执行部分:由若干语句组成。205.语句

如:c=a*b;i=i+1;

每条语句(包括数据定义)的分号必不可少。

语句书写格式自由,一行可写几句,一句可写在多行。

C语言语句区分大小写。21注释

可用/**/来表示注释部分。/**/必须成对出现。

注释为了增加程序的可读性,与程序代码无关。

如果想暂时不执行某一段程序语句,又不想删

除。用/**/将这段程序括起来。22231.4

VisualC++上机操作1.4.1

Visual

C++的安装和启动241.4.2

Visual

C++环境的使用2526272829303132333435363738第二章C语言程序设计基础基本符号与基本数据类型常量与变量运算符与表达式数据的输入与输出12.1

基本符号与数据类型基本符号

C语言使用的全部字符是ASCII码字符集,它包括256个字符,每个字符都对应着一个不同的序号(码值);前128个字符为标准的ASCII码字符,其中序号为0、1、2、…、31以及127的字符为控制字符,它们完成规定的功能操作;序号从32到126的96个字符是文字字符,它们用于显示和打印。语言程序设计C2

其中:(1)序号从48~57:数字0~9。(2)序号从65~90:26个大写英文字母A~Z。(3)序号从97~122:26个小写英文字母:a~z。(4)其他一些可打印(显示)的字符,如各种标准符号、运算符号和括号。(5)一些特殊字符,如空格符、换行符、制表符(跳格)等。空格符、换行符、制表符等统称为空白字符,它们在程序中的主要作用是用来分隔其他成分,即通过加入一些空白字符把程序排成适当的格式,以增加程序的可读性。语言程序设计C31.专用符号(见表2.1)2.关键字(见表2.2)3.标识符

在程序中,常常用具有一定意义的名字来标识程序中的变量名、函数名和数组名,以便在程序中根据名字访问它,而程序中各种名字都是用标识符来表示的。C语言中关于标识符的规定如下:语言程序设计C4(1)一个标识符只能由字母、数字和下划线组成,而且第一个字符必须是字母或下划线,即数字不能作为标识符的第一个字符。(2)标识符中同一字母的大小写是有区别的,即看作为不同的字符。(3)标识符不能与关键字同名。例2.1以下4组用户定义标识符中,全部合法的一组是_______。A)_mainB)ifC)txtD)int

enclude-maxREALk-2siny-m-dDr.Tom_001_2010Date3COMsizeof语言程序设计C54.分隔符

C语言的分隔符主要有空格、逗号和分号。C语言中单词与单词之间可以用一个或多个空格“”进行分隔,语句与语句之间用一个分号“;”进行分隔,逗号“,”则用于程序定义同类型变量之间、函数参数表中参数之间以及输入输出语句中各个参数之间的分隔。语言程序设计C6数据类型数据类型基本类型构造类型指针类型空类型(void)字符型(char)枚举类型(enum)整型(int)实型(浮点型)单精度型(float)双精度型(double)数组类型结构体类型(struct)共用体类型(union)语言程序设计C72.2

常量定义:在程序运行过程中,其值恒定不变的量。语言程序设计C8常量直接常量符号常量(标识符定义的常量)字符型常量数值常量整型常量实型常量字符常量字符串常量整型常量三种形式:十进制整型常量的表示与数学上的整数表示相同。十进制整型常量没有前缀,由0~9的数字组成。八进制整型常量的表示形式是以数字0为前缀,后面跟由0~7的数字组成。八进制数通常是无符号数。十六进制整型常量是以0x或0X为前缀(0x或0X中x或X的前面是数字0而不是字母o),其后跟由0~9、A~F或a~f的数字组成。语言程序设计C9实型常量

C语言中的实型常量只能用十进制形式表示。实型常量只有两种进制表示形式:小数形式和指数形式。小数形式:由数字和小数点“.”组成(必须有小数点)。例如:-1.85、.426、728.、0.345、0.0都是十进制小数形式的实数,小数点前或后可以没有数字。指数形式:由十进制数加阶码标志“e”或“E”以及阶码组成,其一般形式为:aEn或aen,其中,a为十进制数,n为十进制整数(n为正数时“+”可以省略),其值为a×10n。语言程序设计C10以下是合法的实数:1.234e+12(等于1.234×1012)

3.7e-2(等于3.7×10-2)

78E3(等于78×103)

以下是非法的实数:

e-5(阶码“e”前无数字)

58.+e5(符号位置不对)

2.7E(无阶码)

6.4e-5.8(阶码为小数)语言程序设计C11符号常量

在程序中,可以定义一个符号来代表一个常量。

符号常量的定义形式如下:

#define符号常量名常量

例如:

#definePI3.14159

#defineNUM35

#defineName“Liuyu”

注意,#define与#include一样是宏命令而不是C语言语句,其末尾不能加分号“;”。符号常量一旦定义,就不能在程序中其他地方给这个符号常量再进行赋值。例如“PI=5.286”;是错误的。语言程序设计C12字符常量与字符串常量字符常量

用一对单引号“’’”括起来的一个字符,称为字符常量。例如,’a’、’0’、’A’、’*’都是合法的字符常量。字符常量在内存中存储的是字符的ASCII码。如’a’的ASCII码是97,而’A’的ASCII码则是65。

语言程序设计C13C语言还定义了一些特殊的字符常量,即以反斜杠字符“\”开头的字符序列,称为转义字符。转义字符是一种特殊的字符常量,即将“\”后的字符或字符序列,改变其字符原有的含义而转化为特定的含义,故称“转义”字符。例如转义字符’\n’不再表示字母“n”而作为“换行”符使用。(见表2.4)语言程序设计C14

使用字符常量时需要注意以下几点:(1)字符常量只能用单引号“‘”括起来。(2)字符常量只能是单个字符。(3)字符可以是字符集中的任意字符,但数字被定义为字符型之后就以ASCII码值参与数值运算;如’6’的ASCII码值为54是与数字6不同的。语言程序设计C15

非法的字符常量如下:

‘\197’(9不是八进制数中的数字)

‘\1673’(转义字符中的八进制数最多3位)

‘\ab’(作为十六进制数少了标识x)

‘ab’(字符常量只能是单个字符)

“m”(字符常量只能用单引号括起来)语言程序设计C16

字符串常量

用一对双引号“”””括起来的字符序列称为字符串常量,例如,以下是合法的字符串常量:

“CHINA”

“1020376”

“******”

“”(表示一个空格)

“”(表示什么字符也没有)

“\n”(表示一个转义字符“换行”)

语言程序设计C17

字符串常量在内存中存放时,系统仅存放双引号之间的字符序列,将这些字符按顺序以其ASCII码值存放(包括空格符)。为了表示字符串的结束,系统自动在字符串的最后加上一个字符串结束标志,即转义字符‘\0’(ASCII码值为0)。因此,长度为n个字符的字符串常量在内存中要占用n+1个字节的空间。例如,字符串“Cprogram”的长度为9,但在内存中所占的字节数为10。语言程序设计C18

字符常量与字符串常量的区别如下:(1)定界符不同。字符常量使用单引号“’”,而字符串常量使用双引号““”。(2)长度不同。字符常量的长度恒定为1,而字符串常量的长度可以是0,也可以是某个整数。(3)存储不同,字符常量存储的是字符的ASCII码值,而字符串常量除了要存储字符串常量中每个字符的ASCII码值外,最后还要存储字符串结束标志‘\0’字符。语言程序设计C19语言程序设计C2.3变量概念:其值可以改变的量三要素:名称、类型、值变量定义的一般格式:

数据类型变量1[,变量2,…,变量n];例:

inta;/*定义a为整型变量*/intm,n;/*定义m和n为整型变量*/floatx,y,z;/*定义x、y、z为单精度实型变量*/charch;/*定义ch为字符型变量*/变量初始化:定义时赋初值例:

intm=3,n=5;/*定义m和n为整型变量,

并分别赋予了初值3和5*/floatx=0,y=0,z=0;/*定义x、y、z为单精度实型变量,

并都赋了初值0*/charch=’a’;/*定义ch为字符型变量并赋初值字符’a’*/例:

输入任意两个整数,输出它们的和、差、积。#include<stdio.h>voidmain(){inta,b;/*定义a、b为整型变量*/printf(“Inputa,b=”);/*输出提示信息Inputa,b=*/scanf(“%d,%d”,&a,&b);/*由键盘输入a和b的值*/printf(“%d+%d=%d\n”,a,b,a+b);/*计算a+b并输出结果*/printf(“%d-%d=%d\n”,a,b,a-b);/*计算a-b并输出结果*/printf("%d*%d=%d\n",a,b,a*b);/*计算a*b并输出结果*/}运行结果:Inputa,b=5,8↙5+8=135-8=-35*8=4020整型变量占字节数随机器不同而不同,一般占一个机器字short、int、long可用sizeof(类型标识符)测量实型变量float:占4字节,提供7位有效数字double:占8字节,提供15~16位有效数字字符型变量字符变量存放字符ASCII码char与int数据间可进行算术运算语言程序设计第二章数据描述C运行结果:int=4short=2long=4unsignedint=4unsignedshort=2unsignedlong=4例:

通过sizeof获得int、short、long、unsignedint、unsignedshort和unsignedlong等数据类型所占内存的字节数。#include<stdio.h>voidmain(){

printf(“int=%d\n”,sizeof(int));

printf(“short=%d\n”,sizeof(short));

printf(“long=%d\n”,sizeof(long));

printf(“unsignedint=%d\n”,sizeof(unsignedint));

printf(“unsignedshort=%d\n”,sizeof(unsignedshort));

printf("unsignedlong=%d\n",sizeof(unsignedlong));}例:通过sizeof获得float、double和longdouble三种数据类型所占内存的字节数。#include<stdio.h>voidmain(){

printf(“float=%d\n”,sizeof(float));

printf(“double=%d\n”,sizeof(double));

printf("longdouble=%d\n",sizeof(longdouble));}运行结果:float=4double=8longdouble=8例:字符型和整型可以相互赋值。#include<stdio.h>voidmain(){

intk;

charch;

k=‘b’;/*将字符‘b’赋给整型变量*/

ch=66;/*将整数66赋给字符变量ch*/

printf(“%d%c\n”,k,k);/*以整型和字符型方式输出整型变

量k的值*/

printf(“%d%c\n”,ch,ch);/*以整型和字符型方式输出字符

变量ch的值*/}运行结果:98b66B212.4运算符和表达式C运算符算术运算符:(+-*/%++--)关系运算符:(<<===>>=!=)逻辑运算符:(!&&||)位运算符:(<<>>~|^&)赋值运算符:(=)条件运算符:(?:)逗号运算符:(,)指针运算符:(*&)求字节数:(sizeof)强制类型转换:((类型标识符))分量运算符:(.->)下标运算符:([])其它:(函数调用运算符())语言程序设计C22学习运算符应注意:(表2.5)运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型语言程序设计C23算术运算符基本算术运算符:+-*/%结合方向:从左向右优先级:----->*/%----->+-

说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据例5/2=-5/2.0=例5%2=-5%2=1%10=

5%1=5.5%2

1

-1

1

0

()语言程序设计C

2

-2.524自增、自减运算符++--作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值)后置i++,i--(先使用i值,再执行i+1或i-1)说明:++--不能用于常量和表达式,如5++,(a+b)++++--结合方向:自右向左优先级:-++-------->*/%----->+-

语言程序设计C例:#include<stdio.h>voidmain(){ inti=3; printf("%d\n",i++); printf("%d\n",i); i=3; printf("%d\n",++i); printf("%d\n",i);}运行结果:344425算术表达式定义:由常量、变量、函数和算术运算符组合起来的式子。

算术表达式的书写规则:所有字符必须大小一样的写在同一水平线上。凡是相乘的地方必须写上“*”,不能省略也不能用小数点“.”代替。表达式中出现的的括号一律使用圆括号“()”,并且一定要成对出现;不能使用方括号“[]”和花括号“{}”。函数的自变量(即函数的参数)必须写在圆括号“()”内。书写表达式时应注意数据的类型、运算符的优先级及结合性。语言程序设计C26关系运算符及优先次序关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:<<=>>===!=优先级高优先级低例如,下面都是合法的关系表达式:a+b>c+da>b==c>dx!=’d’(x=2)>=(b=a)语言程序设计C关系表达式的值:是逻辑值“真”或“假”,用1和0表示27ab!a!ba&&ba||b真假真假假假真真逻辑运算符和表达式逻辑运算符种类:!&&||逻辑运算真值表C语言中,运算量:0表示“假”,非0表示“真”,

运算结果:0表示“假”,1表示“真”,真假假假假假真真假假真真真假真真语言程序设计C28!&&||高低例:a<=x&&x<=b

a>b&&x>ya==b||x==y!a||a>b优先级:结合方向:!:从右向左&&:从左向右||:从左向右//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)语言程序设计C29例:a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’值为1值为0值为1值为1值为1值为1//(5>3)&&2||(8<(4-(!0)))值为1语言程序设计C30短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符。例:a&&b&&c//只在a为真时,才判别b的值;

只在a、b都为真时,才判别c的值例:

a||b||c//只在a为假时,才判别b的值;在a、b都为假时,才判别c的值例:a=1;b=2;c=3;d=4;m=1;n=1;

(m=a>b)&&(n=c<d)//结果m=0,n=1语言程序设计C31赋值运算符和表达式简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据(常量或表达式)赋给一个变量语言程序设计C说明:结合方向:自右向左左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套32例:inta,x;a=5;

/*将5赋值给变量a*/x=3*a+2;/*将表达式3*a+2的计算结果17赋值给变量x*/例:下面是不合法的赋值表达式:12=a

/*赋值运算符左侧是常量*/2*x=3*a+6/*赋值运算符左侧是表达式*/x=b/*赋值运算符右侧的b是没有赋过值的变量*/语言程序设计C33复合赋值运算符种类:+=-=*=/=%=《=》=&=^=|=含义:exp1op=exp2

exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3语言程序设计C说明:结合方向:自右向左左侧必须是变量,不能是常量或表达式赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型赋值表达式的值与变量值相等,且可嵌套34语言程序设计C例:

分析下面程序的运行结果。#include<stdio.h>voidmain(){

intn=2;

n+=n-=n*n;

printf("n=%d\n",n);}运行结果:n=-435不同类型数据间的转换什么情况下发生运算转换------不同类型数据混合运算时赋值转换------把一个值赋给与其类型不同的变量时输出转换------输出时转换成指定的输出格式函数调用转换------实参与形参类型不一致时转换运算转换规则:不同类型数据运算时先自动转换成同一类型语言程序设计C36doublefloatlongunsignedintchar,short低高说明:必定的转换运算对象类型不同时转换例:charch;

inti;

floatf;

doubled;ch/i+f*d-(f+i)intintdoubledoubledoubledoubledoubledoubleintintdoubledoubledoubledoubledoubledouble10+‘a’+i*f-d/l例:inti;

floatf;

doubled;

longl;37强制转换一般形式:(类型名)(表达式)例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6说明:强制转换得到所需类型的中间变量,原变量类型不变例:

#include<stdio.h>

voidmain(){floatx;inti;x=3.6;i=(int)x;printf("x=%f,i=%d",x,i);}结果:x=3.600000,i=3精度损失问题较高类型向较低类型转换时可能发生语言程序设计C38逗号运算符和表达式形式:表达式1,表达式2,……表达式n结合性:从左向右逗号表达式的值:等于表达式n的值例:a=3*5,a*4

a=3*5,a*4,a+5例:x=(a=3,6*3)

x=a=3,6*a例:a=1;b=2;c=3;printf("%d,%d,%d",a,b,c);printf("%d,%d,%d",(a,b,c),b,c);//a=15,表达式值60//a=15,表达式值20//赋值表达式,表达式值18,x=18//逗号表达式,表达式值18,x=3//1,2,3//3,2,3语言程序设计C392.5数据的输入和输出语言程序设计C字符输入/输出函数字符输出函数:putchar(ch)

函数putchar的作用是将一个字符输出到标准输出设备(通常指显示器)上,ch可以是一个字符变量或字符常量、整型变量或整型常量,也可以是转义字符。例如:chara=’A’;intk=65;putchar(a);putchar(‘A’);putchar(k);putchar(65);putchar(‘\101’);都可以输出大写字母A。字符输入函数:getchar(ch)

函数getchar的作用是从标准输入设备上(通常指键盘)读入一个字符。调用函数getchar不需要提供参数,调用该函数的返回值就是从输入设备得到字符的ASCII码值。例:

输入并输出一个字符。#include<stdio.h>voidmain(){charc;c=getchar();/*从键盘上输入一个字符*/putchar(c);/*将存入字符变量c中的字符输出到显示器上*/putchar('\n');/*输出一个换行符*/}程序运行时,如果从键盘上输入H并按【Enter】键,则可在屏幕上看到输出的字符H。40语言程序设计C格式输出函数printf一般形式:printf(“格式控制字符串”,输出项列表);

其中,格式控制字符串用于指定输出格式,它可包含3类内容:(1)普通字符:按字符原样输出。(2)转义字符:按转义字符的含义输出。例如,‘\n’表示换行,‘\b’表示退格(光标回退一个字符位置)。(3)格式字符:以%开始后跟一个或几个规定的字符组成了格式字符。(表2.7)例:使用不同格式字符的输出。#include<stdio.h>voidmain(){ inta=88,b=89; printf("%d%d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d\n",a,b);}运行结果:888988,89X,Ya=88,b=8941语言程序设计C格式输入函数scanf一般形式:scanf(“格式控制字符串”,输入项地址列表);

其中,格式控制字符串用于指定输入格式,它包含下面两类内容:(1)普通字符:要求用户必须按字符原样输入,不得做任何改变。(2)格式字符:格式字符的书写格式和功能与printf的格式字符完全相同;区别在于一个是用于输入,而另一个是用于输出。(表2.9)例:不同类型数据在不同格式字符控制下的输入。#include<stdio.h>voidmain(){ inta,b,x,y; charc1,c2; scanf("%2d%3d",&a,&b); scanf("%d,%*d,%d",&x,&y);

scanf("%3c%3c",&c1,&c2); printf("a=%d,b=%d\n",a,b);

printf("x=%d,y=%d\n",x,y);

printf("c1=%c,c2=%c\n",c1,c2);}运行结果:12345↙123,45,567↙abcdef↙a=12,b=345x=123,y=567c1=,c2=c4281第三章三种基本结构的程序设计82

程序的基本结构顺序结构

选择结构

循环结构ABABP成立?YNNAP成立?YNAP成立?Y83

语句分类表达式语句一般形式:表达式;例如:

i++;

k=k+2;

m=n=j=3;

a=1;84函数调用语句一般形式:函数名(实际参数表);例如:printf(“s=%d\n”,s);空语句一般形式:;复合语句一般形式:{

语句1;

语句n;

}85控制语句if…else(条件语句)switch

(多分支选择语句又称开关语句)while

(循环语句)do…while(循环语句)for

(循环语句)continue(结束本次循环)break

(退出循环或switch语句)goto

(转移语句)return(返回语句)86复合语句:用{…}括起来的一组语句例:{z=x+y;t=z/100;pritnf("%f",t);}说明:“}”后不加分号语法上和单一语句相同复合语句可嵌套87

顺序结构程序设计赋值语句一般形式:变量=表达式;例如:a=b+3;顺序结构程序例:输入三角形的三条边长,求三角形的面积。88[解]已知三角形的三条边长a、b、c,则求三角形的面积可用下面的公式求出:

程序如下:#include<stdio.h>#include<math.h>voidmain(){ floata,b,c,p,s; printf("Inputa,b,c="); scanf("%f,%f,%f",&a,&b,&c); p=1.0/2*(a+b+c); s=sqrt(p*(p-a)*(p-b)*(p-c));

printf("s=%6.2f\n",s);}运行结果:Inputa,b,c=3,4,5↙s=6.0089

选择结构程序设计if语句三种形式单分支if语句:if(表达式)语句;语句表达式真假例如:inta=5,b=3;if(a==b)printf(“a=b”);if(3)printf(“OK!”);if(‘a’)printf(“%d”,’a’);都是合法的。90例:输入任意两个整数,并按由大到小的次序输出。程序如下:#include<stdio.h>voidmain(){ inta,b,t;

printf("Inputa,b="); scanf("%d,%d",&a,&b); if(a<b)/*如果a<b则交换a、b的值*/ { t=a; a=b; b=t; } printf("%d,%d\n",a,b);}运行结果:Inputa,b=5,10↙10,591(2)双分支if语句:if(表达式)

语句1;

else

语句2;语句1语句2表达式真假例:输入任意两个整数,并按由大到小的次序输出。程序如下:#include<stdio.h>voidmain(){ inta,b; printf("Inputa,b="); scanf("%d,%d",&a,&b); if(a<b)

printf("%d,%d\n",b,a); else printf("%d,%d\n",a,b);}运行结果:Inputa,b=5,10↙10,5(2)多分支if语句:if(表达式1)

语句1;

else

if(表达式2)

语句2;

else

if(表达式3)

语句3;

else

if(表达式n)

语句n;else

语句n+1;92真语句n+1表达式n假语句n…表达式2语句2假真表达式1语句1真假93例:判断由键盘输入的字符类型。[解]根据ASCII码表来判别,即ASCII码值小于32时为控制字符,在‘0’~‘9’之间为数字字符,在‘A’~‘Z’之间为大写字母,在‘a’~‘z’之间为小写字母,其余则为其他字符。程序如下:#include<stdio.h>voidmain(){charc;printf(“Inputacharacter:”);c=getchar();if(c<32)printf(“Thisisacontrolcharacter.\n”);elseif(c>='0'&&c<='9') printf("Thisisadigit.\n");elseif(c>='A'&&c<='Z') printf(“Thisisacapitalletter.\n”);else if(c>='a'&&c<='z') printf(“Thisisasmallletter.\n”);else printf("Thisisanothercharacter.\n");}94if语句的嵌套三种形式

(1) if(表达式1) if(表达式2)语句1; else语句2; else if(表达式3)语句3; else语句4;95

(2) if(表达式1)

if(表达式2)语句1; else语句2;

else语句3;

(3) if(表达式1)语句1; else if(表达式2)语句2; else语句3;96例:#include<stdio.h>voidmain(){ intx=1,y=2,z=3; if(x>y)

if(y<z) printf("%d",++z); else

printf("%d",++y); printf("%d\n",x++);}程序运行的结果是

。A)331B)41C)2D)197条件运算符与条件表达式

一般形式:expr1?expr2:expr3

求值规则:先求解表达式1的值,若表达式1的值为真(非0),则表达式2的值即为整个条件表达式的值;否则表达式3的值即为整个条件表达式的值。例:10>8?5:15//表达式值为5;例:10<8?5:15//表达式值为15;98例:输入一个字符,如果是小写字母,则转换成对应的大写字母,如果是大写字母则不变。#include<stdio.h>voidmain(){ charch; printf("Inputonechar:"); ch=getchar(); ch=ch>='a'&&ch<='z'?ch-32:ch; putchar(ch); putchar('\n');}运行结果:Inputonechar:h↙H99

Switch语句

一般形式:

switch(表达式)

{ case常量表达式1:语句1; case常量表达式2:语句2;

case常量表达式n:语句n;

default:语句n+1;

}100例:用数字1~7代表周一~周日,根据键盘上输入的数字,输出星期几的英文单词。#include<stdio.h>voidmain(){ inta; printf("Inputdata:"); scanf("%d",&a); switch(a) {

case1:printf("Monday\n");break;

case2:printf("Tuesday\n");break;

case3:printf("Wednesday\n"); break;

case4:printf("Thursday\n"); break;

case5:printf("Friday\n"); break;

case6:printf("Saturday\n"); break;

case7:printf(“Sunday\n”); break;

default:printf("Inputerror!\n"); }}运行结果:Inputdata:4↙Thursday

循环结构程序设计While语句一般形式

while(表达式)

语句;

其中:表达式是循环条件,语句为循环体。101语句表达式真假102例:利用下面公式求π值,要求n=10000。[解]本题为求累加和问题,因此可用while语句实现;但是在循环体语句中应分解为两步实现求累加和任务;即:(1)计算出通项的值存于m;(2)用语句“sum=sum+m;”求累加和。103#include<stdio.h>voidmain(){

intn=1;

floatm,sum=0;

while(n<=10000)

{

m=1.0/(4*n-3)-1.0/(4*n-1);/*求通项的值*/

sum=sum+m;

/*求累加和*/

n++;

}

printf("PI=%f\n",4*sum);}运行结果:PI=3.141384do…While语句一般形式

do

语句;while(表达式);

其中:表达式是循环条件,语句为循环体。104表达式真假语句105例:利用下面公式求π值,要求n=10000。#include<stdio.h>voidmain(){intn=1;floatm,sum=0;do{m=1.0/(4*n-3)-1.0/(4*n-1);/*求通项的值*/

sum=sum+m;/*求累加和*/n++;}while(n<=10000);printf("PI=%f\n",4*sum);}运行结果:PI=3.141384for语句一般形式for(表达式1;表达式2;表达式3)语句;

其中,语句为循环体,它可以是一条语句或是用花括号“{}”括起来的复合语句。106假表达式2真表达式1语句表达式3107例:利用下面公式求π值,要求n=10000。#include<stdio.h>voidmain(){ intn; floatm,sum=0;

for(n=1;n<=10000;n++) { m=1.0/(4*n-3)-1.0/(4*n-1); sum=sum+m; } printf("PI=%f\n",4*sum);}运行结果:PI=3.141384break语句一般形式:break;break语句的作用是在switch语句中或在for、while、do…while语句的循环体中,当执行到break语句时则终止相应的switch、for、while、do…while语句的执行,并使控制转移到被终止的switch语句或循环语句的下一条语句去执行。108continue语句一般形式:continue;continue语句只能出现在for、while、do…while语句的循环体中。continue语句的作用是结束本次循环,跳过循环体中尚未被执行的语句,转而进行下一次是否继续进行循环的判断。109goto

语句

任何语句都可以带语句标号,带语句标号的语句一般形式为:

标识符:语句;

其中,标识符称为语句的标号。例如:L1:t=2*k;goto语句的一般形式为:

goto

语句标号;

当执行goto语句后,控制就立即转到goto后标号所标识的那条语句去继续执行。110循环嵌套

一个循环体内又包含另一个完整的循环结构时,就称为循环的嵌套。例如,下面的两个for语句嵌套:

for(i=0;i<3;i++)

{

for(j=0;j<4;j++)

printf(“i=%d,j=%d”,i,j);

printf(“\n”); }111112例:按下面格式输出九九乘法表。1*1=11*2=22*2=41*3=32*3=63*3=9…

1*9=92*9=18…

…9*9=81[解]我们可以用变量i来控制行的变化(由1~9),且i可以作为乘数,而用j来控制每行中项(一项8个字符)的变化,且j可以作为被乘数;每行结束时还要换一行。程序如下:#include<stdio.h>voidmain(){ inti,j;

for(i=1;i<=9;i++) { for(j=1;j<=i;j++) printf("%3d*%d=%2d",j,i,i*j); printf("\n"); }}113也可以用While循环的嵌套实现:程序如下:#include<stdio.h>voidmain(){ inti=1,j;

while(i<=9) { j=1; while(j<=i)

{ printf("%3d*%d=%2d",j,i,i*j);

j++; } printf("\n"); i++; }}114115例:对三位数ABC,若有ABC=A3+B3+C3,则称ABC是水仙花数,求出所有符合条件的水仙花数。例如:153=13+53+33。[解]从题中给出的三位数可知,该数的求解范围是100~999,故此用for循环求解。对于三位数的每一位A、B、C,百位数是将该三位数除以100而得到(两个整数相除,结果的小数部分舍去);对于十位数的分离,可以将三位数先除以10,即舍去了个位数而变成一个二位数,然后再对10取余即可以得到这个十位上的数;个位数则是对三位数直接对10取余得到。116程序如下:#include<stdio.h>voidmain(){ inta,b,c,i; for(i=100;i<=999;i++) {

a=i/100;

b=(i/10)%10;

c=i%10;

if(i==a*a*a+b*b*b+c*c*c)

printf("%d=%d^3+%d^3+%d^3\n",i,a,b,c);

}}运行结果:153=1^3+5^3+3^3370=3^3+7^3+0^3371=3^3+7^3+1^3407=4^3+0^3+7^3第四章数组本章要点:1.建立数组的概念;2.掌握数组的初始化和引用;3.掌握字符串与字符数组。

1问题:

假设我们要统计某个班级30个学生的数学成绩,现在需要定义30个变量(a1,a2,..a30)分别保存每个学生的成绩,这样做是否太复杂了,有没有更好的方法?2概念:数组:存储同一类型数据的有序集合元素:数组中的一个数值数组分类:一维数组:二维数组:

多维数组:

队列平面空间3…数组4.1一维数组学习要点

1.一维数组的定义

2.一维数组的引用和初始化

3.一维数组举例44.1.1一维数组的定义定义方式:数据类型数组名[常量表达式];数组元素由数组名和下标表示数组的长度:数组元素的个数合法标识符表示数组长度下标从0开始[]:数组运算符单目运算符不能用()a[0]0145a[1]a[2]a[3]a[4]a[5]23a内存占用字节数=数组元素个数*

sizeof(元素数据类型)注意下标的取值范围数组名表示内存首地址,是地址常量例:

inta[6];floatb[5];charch[4];第1个元素第2个元素数组下标5例:指出下面的数组定义中哪些是正确的,哪些是错误的。intx[40],y[20],z(10);floatb[7.5],s[8];intm;charm[15],ch[m];64.1.2一维数组的引用和初始化数组必须先定义,后使用

只能逐个引用数组元素数组元素表示形式:数组名[下标]其中:下标是常量或整型变量例如:a[5]b[i+2*j]/*i和j均为整型变量*/c[i+1]/*i为整型变量*/7如inta[5]={6,2,3};

等价于:a[0]=6;a[1]=2;a[2]=3;a[3]=0;a[4]=0;如inta[3]={6,2,3,5,1};(

)inta[]={1,2,3,4,5,6};由于数据的长度已经确定,可以不指定数组的长度初始化方式在定义数组时,为数组元素赋初值inta[5]={1,2,3,4,5};等价于:a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;说明:数组不初始化,其元素值为随机数当全部数组元素赋初值时,可不指定数组长度只给部分数组元素赋初值,未赋初值元素自动赋08一维数组元素的输入和输出

9

通常是通过for语句循环为数组的每一个元素读入数据或者输出数据的。例如:inta[10],i;for(i=0;i<10;i++)scanf(“%d”,&a[i]);为数组a的每一个元素输入数据。通过下面的for语句输出每一个数组元素的值:for(i=0;i<10;i++)printf(“%4d”,a[i]);104.1.3程序举例例:给数组a输入任意一组数据,然后实现数组元素的逆置,最后输出逆置后的数组元素。#include<stdio.h>voidmain(){inta[20],i,n,x;printf(“Inputnumberofelements:”);scanf(“%d”,&n);printf(“Inputelement:\n”);for(i=0;i<n;i++)/*输入数据*/ scanf(“%d”,&a[i]);printf(“Before:\n”);/*输出输入的数据*/for(i=0;i<n;i++) printf(“%4d”,a[i]);printf(“\n”);for(i=0;i<n/2;i++)/*实现逆置*/{x=a[i];a[i]=a[n-i-1];a[n-i-1]=x;

}printf(“After:\n”);for(i=0;i<n;i++) printf(“%4d”,a[i]);printf("\n");}运行结果:Inputnumberofelements:10↙Inputelement:12345678910↙Before:12345678910After:10987654321例:用数组实现Fibonacci数列前20项数据的输出。11[解]在第3章求Fibonacci数列的方法是每求出两个值时就进行输出,然后继续求后继的两个值。这里,我们每求出一个值就保存于数组f中。当求出所需长度的Fibonacci数列后,再通过for循环输出数组f中保存的Fibonacci数列值。#include<stdio.h>voidmain(){ inti; intf[20]={1,1}; for(i=2;i<20;i++) f[i]=f[i-2]+f[i-1]; for(i=0;i<20;i++) { if(i%5==0)

温馨提示

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

评论

0/150

提交评论