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

下载本文档

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

文档简介

第一章程序设计与C语言

§1.程序设计语言

一、程序设计语言的发展

电子计算机自40年代诞生以来,硬件上不断更新换代,软件也

是同步发展的。

作为软件的一个分支,程序设计语言也从机器语言发展到了第四

代。即机器语言、汇编语言、面向过程的高级语言、非过程化的高

级语言。

1.机器语言:CPU可以识别并执行的由二进制代码构成的指令

系统。

优点:CPU可直接执行、效率高

缺点:编程难、阅读修改维护难、不通用(依赖具体机器)

2.汇编语言:由简单的英语助记符代替0、1二进制码构成的指

令系统。

优点:程序执行效率较高、可以直接和硬件相联系

缺点:程序编写效率低、对编程人员要求高、不通用

用汇编语言编制的程序称为源程序(Sourceprogram),源程

序不能为CPU识别,必须将其翻译成机器语言程序,即所谓的目标

程序(Objectprogram)o这一过程称为“代真”。由于汇编语言

指令与机器语言指令基本上是一一对应的,所以可以借助于“汇编

程序”将代真过程自动化,取代手工代真。

3.面向过程的高级语言:又称为算法语言,即围绕解体过程,

以算法设计为中心,接近人的自然语言的程序语言。1954年出现的

FORTRAN语言是最早的算法语言。

优点:程序编写效率高、通用,维护、移植均十分方便

缺点:程序执行效率相对较低,但随着计算机运算速度的日

益提高,这一缺点已显得微不足道。但高级语言与硬件难以直接联

系。

用高级语言编制的程序亦叫源程序,CPU也不能识别,必须将

其翻译为机器代码(目标程序),这个过程称为编译,可利用编译程

序自动完成。经编译(乃至连接)后的程序代码一般在规模上比源

程序要大得多,因此执行效率比汇编语言低。

但从现代计算机发展水平来看,由于CPU可以达到每秒上亿次

的运算速度,因此执行效率显得并不重要了。相反,由于软件规模

越来越大,要求程序首先要正确,最大限度地减少错误的发生,并

且易于编写和阅读,其次再考虑执行效率。因此高级语言得到广泛

的应用,并不断涌现。

FORTRAN程序例:

PROGRAMCYLIND

INTEGERR,H

FEALV

READ(*,*)R,H

V=3.1415926*FTR*H

WRI7E(M0)V

10FORMA7{1X,F15.7)

END

(P2为C语言程序的例)

C语言既具有一般高级语言的特点,又具有汇编语言的特点,因

此是一种比较低级的高级语言,C程序编写和执行效率均比较高,

很快得到推广。

4,非过程化的高级语言:又称为更高级语言

用过程化语言解题,首先确定要解决什么问题,然后考虑怎样去

解决,将解题过程构造出来便得到算法。而利用非过程化语言解题,

只要告诉计算机解决什么问题即可,解题过程由计算机完成,无需

构造算法。因此又称为面向问题(面向应用)的语言。例如数据库

查询语言SQL、用于人工智能系统中的PROLOG语言、LISP语言

等。

二、C语言发展简况

1963年,C.Strachey(英国剑桥大学)推出CPL语言(Combined

ProgrammingLanguage)

1967年,MartinRichards(剑桥大学)推出BCPL语言(Basic.......)

1970年,KenThompson(美国贝尔实验室)设计出B语言,并写

出UNIX初版。

1972年,DennisRitchie(贝尔实验室)设计出C语言

1973年,Thompson和Ritchie合作,将UNIX的绝大部分(90%)

用C语言改写。

本课程以TurboC为蓝本,详细介绍C语言

三、程序设计语言的支持环境

分为硬件和软件两方面。

四、源程序的编辑、编译、连接与执行

1.编辑:即利用字处理软件将源程序逐字输入计算机,然后修

改并存盘。

2.编译:利用编译程序将源程序(.C)翻译成目标程序(.OBJ)

3.连接:目标程序与标准函数库连接形成可执行程序(.EXE)

4.执行:将可执行程序调入内存运行并输出结果。

TurboC集成化C语言环境,将上述4个过程融为一体,使操作

更为方便快捷。

§2.用库函数组装C程序

c语言是函数式语言,一个程序由多个函数组成,一个函数就相

当于一个程序模块(即子程序),编制c程序就是编制这些函数。

C语言本身提供了丰富的库函数(500多),编程时应充分利用

这些库函数。

函数的调用和其它程序语言类似,由函数名连同括号中的参数表

示。例如

sin(0.45)abs(-9)exp(x*x)

例在屏幕上显示“Programmingisfun.”

在C语言中没有专门的输出语句,而是通过“显示函数”来实

现信息的输出。C程序如下:

main()

(

printf("ProgrammingisfunAn");

)

C程序结构:

①C程序必须有且仅有1个主函数,用main表示

②主函数一般没有参数,但一对小括号不可省略

③大括号中为函数体,通常由一系列语句构成

④语句必须以分号结束

printf是C语言的一个库函数,用来显示指定的内容。

"'Programmingisfun.v为一个字符串,末尾的\n表示换行,它

是C语言中的“转义字符”。常用转义字符有

\n\t\a\b\'\"\\\0

换行tab鸣响退格’"\空值

C语言与其它语言不同,严格区分大小写,语句、函数均用小写

表示,变量通常也用小写,如写为大写则当成不同的量。

例计算一个数的正弦值。C程序如下

#include"math.h"

main()

(

floatx;

x=sin(0.19199);

printf("%f\n",x)

)

头文件(.h):调用C的库函数时要使用有关库函数的一些说明信

息,头文件中则存放了相应的说明信息。调用不同的库函数需要使

用不同的头文件。例如数学类的函数其说明信息存放在math.h文

件中,凡使用这类函数均应通过#include"math.h"命令将相关信

息包含到本程序中来(即复制过来)。

在调用printf函数输出时,函数参数一般有两部分:位于双引号

中的格式字符串、位于双引号外的是待输出的变量和表达式。双引

号中除了格式字符用于控制变量的输出,其余字符原样照输。例如

a=3;

b=4;

printfCIhesumof%dand%dis%d\n",a,b,a+b);

将显示:Tiesumof3and4is7

若printf中改为printf("%d,%d,%d\n",a,b,a+b);

则结果:3,4,7

§3.自己设计C函数

例如设计求三个实数的平均值的函数

c语言中没有现成的该函数,因此需要自己设计。函数如下:

floataverage(x,y,z)/*定义函数及类型*/

floatx,y,z;/*说明函数参数的类型*/

(

floataver;/*说明函数体中所用变量的类型*/

aver=(x+y+z)/3;

return(aver);/*返回函数的值至调用处*/

)

再通过下述主函数来调用上述函数:

main()

(

floata,b,c,ave;

a=3.5;b=4.6;c=7.9;

ave=average(a,b,c);

printf("average=%f",ave);

)

将上述两个函数放在一起则运行后显示结果:

average=5.333333

主函数中调用了average函数,因此average函数必须先于

main函数定义。

若将main函数置于前,则需在main中增加一个说明(声明)

语句:

floataverage();

为了使程序更为通用,将欲求平均的三个数在运行时由键盘输

入,即用

scanf("%f,%f,%f",&a,&b,&c);

代替赋值语句。

scant也是C语言的库函数,用来从键盘读入数据。与printf

函数类似,scant函数的参数也包括两部分:位于双引号中的格式

字符、位于双引号外的变量地址。上例中%£表示以实数型式输入数

据,逗号表示输入的数据之间也用逗号分隔,又例:

scanf("%f-%f-%f",&a,&b,&c);

则应打入:3.5-4.6-7.9

又如:

scanf("%f%f%f",&a,&b,&c);

则以空格分隔数据,应打入:3.54.67.9

&是地址运算符(取地址符),&a表示变量a的地址。

例输入圆的半径,计算圆的周长和面积。

main()

floatr,c,a;

printf("Pleaseinputradiushere");

scanf("%f",&r);

c=2*3.14159*r;

a=3.14159*r*r;

printf("lhecircumferenceis%f,theareais%f\n",c,a);

或将计算圆周长和面积分别设计成函数,然后调用:

main()

(

floatr,c,a;

floatcircumference(),area();

printf("Pleaseinputradiushere");

scanf("%f",&r);

c=circumference(r);

a=area(r);

printfC'lhecircumferenceis%f,theareais%f\n",c,a);

floatcircumference(r)

floatr;

floatcir;

cir=2*3.14159*r;

return(cir);

floatarea(r)

floatr;

return(3.14159*r*r);

程序的基本结构有三种:顺序结构、分支结构(选择结构)、循

环结构(重复结构)。

顺序结构只能解决比较简单的问题,较复杂的问题则需要利用分

支结构和循环结构。

例输入两个数,显示较大者。

main()

(

floata,b;

scanf("%f%f",&a,&b);

if(a>b)

printf("%f\n",a);

else

printf("%f\n",b);

}

只用了一个主函数。也可将找大数的功能设计成C函数,然后

通过main函数来调用:

max2(x,y)

floatx,y;

(

if(x>y)

printf("%f\n",x);

else

printf("%f\n",y);

}

main()

floata,b;

scanf("%f%f",&a,&b);

max2(a,b);/*操作型函数的调用*/

}

还可在函数中不打印,而将大数传回到主函数再打印。

例计算S=1+2+3+…+10

如果直接在主函数中求解,则C程序为:

main()

(

intsum,i;

sum=0;i=1;

while(i<=10)

(

sum=sum+i;

i=i+1;

)

printf("%d\n",sum);

)

运算结果:55

也可将求和设计成C函数:

总结:C函数的结构为

函数类型函数名(参数)

参数类型定义;

数据类型定义;

函数执行部分;

再调用函数的主调函数中,对函数的说明(声明)为:

函数类型函数名();

ANSI建议用现代风格定义、声明函数:

定义时:

函数类型函数名(参数及类型)

数据类型定义;

函数执行部分;

声明时:

函数类型函数名(参数及类型);

§4.C语言的主要特点

⑴与FORTRAN>BASICPASICAL等语言一样,C语言是一种

面向过程的语言;

⑵以函数为单位,具有模块结构的特点,提供大量的标准函数给

用户“装配”程序;

⑶提供丰富的运算符(30多种)和丰富的数据类型,有很强的

数据处理能力;

⑷具备高级语言和低级语言的特点,是开发大型系统软件的有力

工具。

§5.程序设计的概念

程序=数据结构+算法

程序=数据结构+算法+程序设计方法+语言工具和环境

§6.有关算法的知识

第二章数据描述与基本操作

构成程序的要素有数据结构和算法,其中心就是数据和操作。

§1.数据类型

数据类型是高级语言的体现,在低级语言中(如机器语言、汇编

语言)数据没有类型。

引进数据类型就引进了数据结构,不同的数据类型就形成了不同

的数据结构,就可以进行不同的操作,实现不同的目的要求。

在c语言中,变量总是有确定类型的,因此程序中的每一个变

量都要定义其类型,以便为它们开辟相应的存储空间、规定其存储

数据的范围以及相应的操作种类。

c语言为我们提供了丰富的数据类型:

短整型(short)

整型〈整型(int)

长整型(long)

小基本类型

①(简单类型)实型[单精度型卬。或)

(浮点型)[双精度型(double)

字符型(char)

.枚举类型(enum)

'数组类型

构造类型结构体类型(struct)

②《

(组合类型)共用体类型bunion)(联合类型)

文件类型(FILE)

③指针类型

④空类型(void)

一、数值的定点表示与浮点表示

一个数可以写成不同的形式,例如兀可以写为:

3.14159X10°,0.0314159X102,3141.59X10-3

它们在C语言中分别被表示为:

3.14159e0,0.0314159e2,3141.59e-3

由于指数部分eO,e2,e—3的阶码不同,使得尾数中小数点的

位置不固定,因此称为浮点数形式。

实数在C语言中一律以浮点形式存储,并且占4个字节,其中

尾数部分占3个字节,指数部分占1个字节。

如果一个数不带指数部分,则称为定点数。例如:3.14159,

10,一20。但3.14159在C语言中被表示成3.14159e0仍属于浮点数。

整数在C语言中是以定点形式存放的,并且占2个字节。通常定点

数均是指整数。

二、字符型数据

字符型数据由一对单引号括起来的一个字符构成。例如

'a','A',T,'2'等

字符型数据存储时占1个字节,以ASCII码存放。例如'a'存

放在内存中是其对应的ASCII码97,二进制为01100001o

因此,字符数据在内存中的存储形式与整数的存储形式类似,所

以C语言中字符型数据和整形数据间可以通用,甚至可以进行算术

运算。当以字符形式处理时,系统先将ASCII码转换成字符再处理,

若以整数形式处理,则直接将ASCII码作为整数进行处理。

例ch='A'

则ch+32等价于65+32=97

以整数形式输出ch则显示65

以字符形式输出97则显示a

例如P18上中

三、数据的存储及取值范围

不同类型的数据在存储时占据的字节数不一样,见P19上表

各种类型数据的取值范围和精度见P19中表。

四、有符号与无符号数据类型

1.有符号型

前面所述各种类型数据中都隐含为有符号(signed),即既可是正

数也可是负数。正负号由其二进制码的最高位来表示,0表示正,1

表示负。数值以补码形式存放,正数的补码就是该数的二进制数;

负数的补码:先取绝对值,转换成二进制再取反加1。例如int型中

10的补码为:0000000000001010

-10的补码为:1111111111110110(求原数的绝对值时只需

求反加1)。

由此可知为何short型的取值范围为-32768〜+32767。

•.•最大为最大111111111111=215-1=32767

最小为1000000000000000=-2,5=-32768

因此intx隐含为signedintx可简写为signedx;

shortx隐含为signedshortx;

longx隐含为signedlongx;

2.无符号型

如果处理的数据不出现负值,则可以使用无符号整数,这时最高

位不作为符号位,而作为有效位使用。例如

1000000000000000=215=32768(在signed中表示-32768)

这时最小为0000000000000000=0

最大为1111111111111111=216-1=65535(在signed

中表示T)

无符号数据由unsigned来定义。例如

intx;

unsignedy;

则X取值范围为-32768〜+32767;y的取值范围为0-65535。

3.关于字符

由于字符的存储形式与整数类似(字节数为1),因此也存在有

无符号的问题。TurboC系统默认char是有符号的,即chara相

当于signedchara,这时a可表示128个ASCII码字符,若表示扩

充字符,则如果按整型输出会显示负值。例如P20中。

4.求字节数运算符sizeof

该运算符可以求表达式或某类型数据所占的字节数。

例如sizeof(char)为1,sizeof(float)为4

doublex;

sizeof(x)为8

§2.常量和变量

一、直接常量与符号常量

直接常量就是可以直接看出其大小和类型的量,如

3.142.589e-3-2432767‘a'

符号常量由编译预处理命令#define定义,例如

#definePI3.14159

#defineAREA7.34196

定义了两个符号常量PLAREA,为了与变量区别,符号常量一般

用大写表示。例如P22中下

二、直接常量的书写

1.整型常量

以定点形式存储,C语言可使用10进制、8进制、16进制。

8进制数以0开头,16进制数以Ox开头。

例如P23中

若在整型常量后加字母1或L则代表长整数,存储时占据4个字

节。例如P23下P24上

2.实型常量

以浮点形式存储,但书写时既可用小数形式也可用指数形式。例

如0.345.345345.3.14159-2e3(-2E3)3.14e-3(3.14E-3)

0..0

实型常量不可以使用8进制和16进制形式。

3.字符常量

由单引号括起来的一个字符。例如

,a',A'4$

单引号中不能是单引号或\,若要将单引号和'作为字符常量,则

用转义字符:

4.转义字符

由'开头的具有特别意义的字符。有些字符如“回车”、“退格”

等不能由键盘输入,只能由转义字符表示,如\r表示回车,\b表

示退格,\n表示换行。

此外,'后跟3位八进制数代表ASCII码为该数的字符;\x后跟

2位十六进制数代表ASCII码为该数的字符。例如

'A'的ASCII码为65,即十六进制41或八进制101,则有

'\101'='\x41'='A'

见P24下表,P25中

5.字符串常量

由双引号括起来的一串字符。例如

"Programmingisfun7,"A”“a””$1000.00”

字符串存储时,系统自动在后面添上\0,表示字符串的结束。\0

是ASCII码为。的字符,代表空操作,用来标志字符串的结束。因

此不难理解"A"与'A'的区别,前者占2个字节A和\0,后者仅

占一个字节。例如

“ABCD”存储时|65|66|67685

“A”|65]

'A‘画

因此charc;c=,A,正确,而c="A"错

三、变量及其赋值

在面向机器的低级语言中,存储数据时需直接对地址进行操作。

在高级语言中,这一过程被抽象化了:地址由变量表示,地址所指

的内存单元的数据就是变量的值。不同的变量名就代表不同的地址

单元,因此在高级语言中不必对地址操作,只需对变量操作即可,

因而大大方便了程序的设计。

在C语言中,不同类型的变量占据的字节数不同,即占据的内

存单元数目不同,因此地址有多个,变量的地址是指它占据的第一

个内存单元的地址,即首地址。例如FFD8

FFD9

floatx;FFDA

FFDBII

则X占4个单元,利用地址操作符&可得到

变量x的地址,设&x=FFD8,则x占据的单元地址如上图所示。

向变量所占据单元存入数据在高级语言中是通过赋值来进行的。

如x=y;

x=4.0;

x=x+1.0;

上述各式中,若不看分号,则称为赋值表达式,如x=4.0,该表达

式的值就是该变量获得的值。故表达式x=4.0的值为4.0,而

3.0+(x=4.0)的值为7.0o

赋值语句的格式为|变量=表达羔"

由于x=4.0也为表达式,故y=(x=4.0);是允许的,从右到左运

算,可写为y=x=4.0;

四、变量的定义和初始化

(书上将定义写作声明,不妥!)

C程序中使用的每一个变量都必须事先定义。由于不同类型的变

量分配的内存单元数不一样,相应的操作也不一样。定义变量就是

定义其类型,为其分配相应数目的存储单元。例如

int

long11,12;

charc1,c2;

floatf1,f2,f3;

doubled1,d2,d3;

变量的初始化就是在定义变量的同时为其提供初值。例如:

inti1,i2=5;

charc1='a',c2='A';

floatf1=3.5,f2,f3;

上述三个语句与下列语句作用相同:

inti1,i2;

charc1,c2;

floatf1,f2,f3;

i2=5;

c1='a';

c2='A';

f1=3.5;

但仍有区别,前者是在编译阶段赋初值,后者是在程序运行时才赋

初值。

五、标识符

标识符是用来为变量、数组、函数等起的名字。标识符由字母或

下划线开头,后跟字母、下划线或数字。TurboC系统允许长度达

32个字符。

标识符中大小写作为不同的字符处理。命名时不可与c语言的

关键字同名,也最好不以下划线开头,因为c系统内部使用了一些

以下划线开头的标识符,可能会恰巧重名。

命名时一般均用小写,符号常量用大写,且名字尽量有意义。

例如sumareaNumber_ofLniovesnumber_of_movesj3_l

§3.运算符与表达式

运算就是对数据的操作和加工,而操作是算法的要素之一。

运算是通过运算符和运算量进行的,运算量就是操作数,将操作

数用运算符连接起来就得到一个表达式,表达式代表了一种运算。

操作数可以是常数、变量、函数等。例如下述均为正确的表达式:

3.15xa+3sin(a)+cos(b)PI*r*ry=a+b

其中=为赋值运算符,C语言的运算符十分丰富,达三十多个,

见P29上。

运算符在使用时首先要知道其优先级别(P351),还要知道结合

方向。

一、算术运算

1.双元算术运算符

+—*/%见P30表。例如

10%3为1

10%(-3)为1

-10%3为-1

-10%(-3)为-1

2.自反算术赋值运算符

在进行求和程序设计时,经常会用到求和语句

sum=sum+x;

C语言允许将上语句缩写为

sum+=x;

这里+=称为自反加赋值。同理

s=si-2;可缩为&4-=2;

total=total+x*y;可缩为total+=x*y;

此外还有自反减赋值(-=)、自反乘赋值(*=)、自反除赋值(/=)、

自反模赋值(%=)等。例如

x*=y+3等价于x=x*(y+3)

x*5等价于x=x%5

u-=v/w等价于u=u-v/w

3.自加和自减运算符(++和一)

++称为自加运算符,它进行增1运算;-称为自减运算符,它进

行减1运算。这两个运算符仅能作用于整型变量。例如

i++或++i均表示i的值增1(后缀形式和前缀形式)

i-或-i均表示i的值减1

因此,它们是i=i+l(i+=l)和i=i-l(i-=l)的特殊情况。

应当注意,i++和++i若单独作为语句,两者作用相同;但若用在

表达式中则i++表示先引用i再使i增值而++i则表示先使i增值再

引用i。例如设i=5,则

x=i++;x的值为5,而i自增为6,而

x=++i;i自增为6,x的值为6

又例如,设x=3;

y=x+++x++;x的值为5,v的值为6

y=++x+x++;(5,8)

y=x+++(++x);(5,8)

y=++x+(++x);(5,10)

4.正负号运算符(+和-)

属于单目运算符。例如+5,-28.3

5.运算符使用时应注意的问题

现代程序设计要求可靠性第一,效率第二。因此程序应首先易读,

然后才考虑其效率。我们可以充分利用括号、注释来改善程序的易

读性,对于那些费解的技巧,可将其分解,例如

sum+=++n;可分解为++n;sum+=n;

若还不够明确,可进一步分解为n=n+1;sum=sum+n;

z=(x++)+(++y);可写为

y=y+L

z=x+y;

x=x+1;

二、关系运算、逻辑运算与条件运算

1.关系运算

关系运算就是比较两个量的大小,关系运算符为>、>=、<、<=、

==、!=,例如

x>1.0a+b<=ck==3

关系表达式的值为真或假,分别由1和0表示。例如

i=3>2;结果i为1

』3<2;结果i为。

结果i为。

'a'=='A'+32结果为1

'A'>66结果为0

'A'>'B'同上

2.逻辑运算

逻辑运算符为:&&与)、II或)、!(非)

&&两边均为真时,总的结果才为真;

II两边有一个为真时,总的结果就为真;

!作用于真,结果为假;作用于假,结果为真。

逻辑表达式的结果与关系表达式一样只有真(1)和假(0)o例

x>l&&x<3a>0llb>0

且优先级!>&&>11

关系表达式和逻辑表达式均可作为条件来用,值为1时表示条件

成立,值为0时表示条件不成立。C语言进一步推至非0均表示条

件成立。例如

if(3+2)printf(Ktrue\nH);显示true

if(4-4)printf(HOK\rT);不显示

注意:C语言在处理由多个&&连接的逻辑表达式时,一旦碰到

。值,就不再处理下去,而将表达式作0处理。在处理由多个II连接

的逻辑表达式时,一旦碰到1值,就不再处理下去,而将表达式作

1处理。

3.条件运算

条件运算符?:为三目运算符,形式为

e1?e2:e3

称为条件表达式,取值规则为:el真时取e2,el假时取e3。例

z=a>b?a:b;表示取a、b中的大数。

又例如

inta,b,c,m;

m=a>b?(a>c?a:c):(b>c?b:c);

可用来求三个数中的大数。

条件运算符为右结合性,如

2>1?3:1>2?9:8

结果为3,即相当于2>1?3:(1>2?9:8),而非(2>1?3:1)>2?9:8,

即非9。

§4数据类型转换

在C语言中,数据类型转换有三方面的含义:通过运算符将操

作数从一种类型自动转换成另一种类型;使用圆括号进行强制类型

转换;使用C函数库中类型转换函数进行转换。

一、混合运算时的类型转换

运算时,首先将不同类型数据转换成同一类型,然后再进行运算。

转换规则为:

double<-float

t

long

t

unsigned

t

int<-char,short

横向箭头表示即使同一种类型数据进行运算时,C语言也要转

换,以提高精度;上箭头则表示运算对象类型不同时的转换方向。

例如10+'X'+2.4-678.6533*(2*'b')

(88)

又例如

charx;

inty;

float乙

则x+y+z运算时,首先x玲int,计算x+y,然后(x+y)->double,

z玲double,计算(x+y)+z,结果为double型。

二、赋值转换

赋值运算符“=”右边的类型高于左边的类型,采取截断方式;

反之采取补齐方式。总之,赋值后以“=”左边的变量类型为准。

例如

inti;i=3.14;i截取为3

floatx;x=3;x补齐为3.000000

赋值转换时应注意结果可能与原数相差较大,例如

unsignedu;inti;u=65535;i=u;则i结果为-1。

mimimimi

三、强制类型转换(显式转换)

用强制类型转换运算符(类型)作用于表达式,使之类型得到强

制转换。

例如(int)3.5将3.5转换为整型。又例如

main()

(

inti,j;

floatx,y;

i=-1;

j=3;

x=i/j;

y=(float)i/j;

printf(u%f,%f,,,x,y);

)

结果为:0.000000,-0.333333

但应注意,(float)i仅是得到i的浮点型数-1.0,变量i的值仍为

-1O

关于类型转换的库函数,以后再介绍。

§5数据的输入和输出

通过输入输出可实现人机交流信息。c语言输入输出均是由函数

来实现的,并且用于输入输出的函数很多,这些函数的一些公用说

明信息存放在头文件stdio.h中,因此一般应将其包含到引用的程序

中:#include"stdio.h"

本节重点介绍printf、scanf、getchar、putchar四个函数。

一、printf函数

printf函数中的参数为两部分:格式字符串和输出项。形式为:

printf(“格式字符串”,输出项表);

其中格式字符串中的一般字符原样输出,转义字符原样执行,只有%

开头的格式字符用来控制输出项的输出。例如

%d或%i用于输出int型,以十进制形式输出

%x以十六进制形式输出int型“abcdef”,%X则“ABCDEF”

%o以八进制形式输出int型

%u以无符号十进制形式输出整型

%c输出字符型(一个字符)

%s输出字符串

%e或%E以指数形式输出实数,指数分别用字母e或E

%f以小数形式输出实数

%g或%G以上两种格式中较短的形式输出。若以指数形式则

分别显示e或E

例如

%ld输出long型

%lf输出double型

例如

%4d输出4位宽度,多余的宽度补齐空格,右对齐。若原数

位数>4,则全部输出

%04d输出4位宽度,多余的宽度补0

%-4d输出4位宽度,左对齐

%7.2f输出7位宽度,小数占2位

%.4f输出时小数取4位

见P44表、P45表、P46例。

二、scanf函数

scanf函数中的参数也为两部分:格式字符串和变量地址。形式

为:

scanf(“格式字符串”,地址表);

地址可借用地址运算符&间接获得,因为分配给变量的地址不能

直接获得。这里所说的地址,实际上是变量占据若干存储单元的首

地址。

格式字符串中除了%开头的格式字符外,其它的一般字符要原样

输入。例如

main()

(

inti,j;

scanf("%d,%d”,&i,&j);

printf("lhemultiplicationis%d\n",i*j);

)

输入:3,5

显示:Themultiplicationis15

若将scant改为

scanf("i=%d,j=%d",&i,&j);

则输入时应打入:i=3,j=5

于是显示相同结果。若

',,,

scanf(%d%d)&i,&j);

则输入:35

格式字符与printf相同,例如整型用%d,%o,%x;字符型用%c;

实型用%f,%e;/卜,%Id输入长整型long,%lf输入双精度型double。

格式字符中可插入域宽,以限制读入数据的位数,例如

scanf(u%2d%3f%4f,,,&a,&b,&c);

输入:12345678987654321,则a为12,b为345.0,c为6789.0

格式字符中若插入*则表示虚读,例如

scanf("%3d%*4d%T,&i,&f);

输入:12345678765.43,则i为123,4567被跳过(虚读),f

为8765.43o

输入数据个数若多于scanf函数的要求数,则多余的数据继续被

后续的scanf函数使用。例如P50中。

三、getchar函数与putchar函数

1.getchar函数

用于从键盘上读入一个字符,是一个无参函数,形式为:

getchar。;

一般通过赋值语句将读入的字符存入变量。例如

charc;

c=getchar();

2.putchar函数

用于在显示器上显示一个字符,形式为:

putchar(c);

其中c是一个字符型数据。例如

charc='A';

putchar(c);

putchar('a');

putchar('\n');

输出:Aa换行。

例如P51下。

第三章C程序的流程设计

程序是用计算机语言描述的算法,算法设计是程序设计的中心内

容,而算法的两大要素就是操作和控制语句。c语言中的语句因而

分为这两大类:操作运算语句、流程控制语句。

§1算法

算法已在第一章作了介绍,在此略过。

§2用C语句描述算法

一、表达式语句

表达式语句完成各种操作运算,由表达式跟分号构成。例如

赋值表达式i=l赋值语句i=l;

x=sin(y)x=sin(y);

函数表达式printf("hello")函数调用语句printf("hello");

scanf("%d”,&i)scanf("%d”,&i);

只有分号没有表达式,称为空语句。

表达式语句含有以上三种:赋值语句、函数调用语句、空语句。

又比如sum+=x;i++;++i;

若将几个表达式用逗号连接在一起,就构成逗号表达式,若再加

分号将形成复合表达式语句。这里逗号称为逗号运算符,其运算优

先级最低。逗号表达式的值就是最右边表达式的值。例如

i=l,j=2表达式的值为2,故k=(i=l,j=2);则k为2

++i,-j表达式的值为1,故m=(++i,--j);则m为1

又例如

b=(a=6,a*3,a+3);则b的值最后为9,a的值为6

二、流程控制语句

同一组操作运算若采用不同的控制流程,会获得不同的结果。因

此流程控制语句的作用是相当重要的。

结构化程序设计主张使用三种程序结构:顺序、选择、循环。

顺序结构是一种自然结构,无需特别控制。

C语言中选择结构的流程控制语句是if-else,它是“二选一”

型的,但可推广到"多选一":if…elseif…elseif…else。C语言还特

别提供了开关语句switch来控制“多选一”。见P66上。

C语言的循环结构有三种控制语句:while,do…while,for

三、辅助控制语句(限定转向语句)

1.break语句

用在循环中表示结束循环操作。

用在多路选择结构中表示结束多路选择操作。

2.continue语句

用在循环中表示结束本次循环,并根据条件确定是否进入下一次

循环。

3.函数调用和返回

调用函数后通过return语句返回到调用处。

四、goto语句

got。标号;I转到指定标号处继续运行。

例如

loop:

gotoloop;

该语句与结构化程序设计思想相冲突,尽量少用。

五、C基本语句一览

见P68上。

六、复合语句

将若干个语句用大括号{}括起来就形成一个复合语句,复合语句

在语法上是一个整体,相当于一个语句。有些结构中只允许一个语

句,这时要处理多个语句可将它们用大括号括住,形成一个复合语

句即可。

复合语句又称为分程序,分程序中可以单独定义变量,但变量的

作用域仅限于分程序内。

七、exit函数

终止程序的执行,退回到操作系统,并可将参数传到操作系统。

例如

if(a>0)exit(1);

使用exit函数,应将stdlib.h文件包含到引用程序中。

§3选择型程序设计

选择型程序结构就是根据条件进行判断,然后从给定的操作中选

取某一个去执行。

一、if…else结构(二选一结构)

形式为

W条件)

语句1;

else

语句2;

语句1、语句2可为复合语句,条件通常是逻辑表达式和关系表

达式,也可是算术表达式,表达式的值为0表示假,非0表示真。

在应用中,若语句2为空,则else可以省略,成为

if(条件)

语句;

例如P69下。

二、elseif结构(多选一结构)

if(条件1)

语句1;

elseif(条件2)

语句2;

elseif(条件3)

语句3;

elseif(条件n)

语句n;

else

语句n+1;

各个条件中,哪一个条件成立就执行哪一个语句,若都不成立,

就执行语句n+1o

例如P74±O

三、switch结构(多选一结构)

switch(开关表达式)

case情况1:

语句1;

case情况2:

语句2;

case情况3:

语句3;

case情况n:

语句n;

default:

语句n+1;

测试开关表达式,判断与哪一种情况相符,就转到相应的case

执行,执行中若没有遇到break语句就一直执行下去。若与所有情

况皆不符,就转到default子结构执行。default子结构可以省略。

此处case相当于一个语句标号,转到某个case后就一直执行直

至遇到breako例如菜单选择程序

main()

(

intn;

printfC1-sort\n2-search\n3-list\nselect(1-3)");

loop:

scanf("%d,,,&n);

switch(n)

(

case1:sort();break;

case2:search();break;

case3:list();break;

default:printf(uwrongselection!");gotoloop;

例如P75中。

switch结构只进行相符的测试,而不具备elseif结构的条件测

试(比较大小)。

例如P77中。

§4循环型程序设计

循环就是反复进行某一个操作。在循环算法中,最具代表性的是

穷举和迭代。

一、穷举和迭代

穷早就是将问题的可能解一一测试,直至找到解为止。(或测试

结束)

穷举法在数学中和日常生活中有着广泛的应用,如:顺序查找、

招生、选拔赛等。

例如P79下搬砖。

迭代就是不断由新值取代旧值,逐步向解逼近。

迭代法在数学方程求解中应用广泛。

例如P80上人口增长。

例如P80中兔子问题

例如P80下一元方程的迭代法求解

方程f(x)=O的迭代求解,就是将方程改写为x=<b(x)的形式,

并选一个适当的初值x(),求出xi=6(x()),并将xi作为新的初值,

求出X2=6(X1),不断重复这一过程,于是可得到Xo,XpX2,x3,;

如果这些解趋向某一个值(收敛),则其极限就是所求的解。

实际求解时.,迭代次数不可能重复无穷次,故一般达到指定精度

便结束。

1.二分迭代法(见P81图)

给定方程f(x)=O,则先取两个粗略

解X]和X2,且f(Xi)与f(X2)异号,则

只要f(X)连续,X]和X2区间至少有一

个解。

1z、

二分迭代法就是每次取两个根的中点:%3=5(%1+工2),并根

据f(X3)与f(Xi)或f(X2)同号,而将求解区间缩至一半。对于上图则用

X3作为新的X2:X2=X3,X]不变,然后在新的XI和X2区间取中点,

以此不断重复,直至IXi—X21<£o为止。

2.牛顿迭代法

二f,(xo)代表切线的斜率tga,

.../,(%)=3_

./Uo)

,•…K

即由Xo可推得X”将X1作为新的Xo,又可推得新的X],记为X2,……,

于是得到数列:Xo,X1,X2,……,直至精度满足要求。

二、while结构

在C语言中有三种结构可以实现循环操作:while,do---while,for

while结构的形式为

while(条件)

循环体;

条件为真就执行循环体,每执行一次

后,对条件再判断一次。(先判断,后执行)M-S图

若循环体不止一句,则写成复合语句。例如

main()

(

intsum=0,i=1;

while(i<=10)循环体可写为:

(sum+=i;

sum=sum+i;

i++;

i=i+1;或简化为:

)sum+=i++;

printf("%d\nn,sum);

)

例如P83上下。

例如while((c=getchar())!=,y,);

循环体为空,其作用是等待用户按键,直到输入字母'y'时才往下继

续。

例如P85下搬砖

例如P87上台阶

例如P87下最大公约数

例如P88下牛顿迭代法求根

三、do…while结构

形式为

do循环体

循环体;

while(条件);在环条件

执行一遍循环体后,判断条件成立与否,

成立则再执行循环体,否则退出循环(先执行,JN-S图盾环体至

少执行一次。循环体不止一句时,须用{}括住。

10()

例如用do…while语句求X"

"=1

main()

(

intn=1,sum=0;n=l,sum=0

do{

将n加入sum

sum+=n;

n++;n增1

)

n<=100则继续

while(n<=100);

printf(l,%d,,,sum);

四、for结构

这是C语言中使用最多、功能最强的循初值

环语形式为循环条件

for(初值;条件;增值)

循环体

循环体;

循环体若不止一句,须用{}括住。-------Wt

100

例如用for结构求之〃

〃=1

main()

intn,sum=0;

for(n=1;n<=100;n++)

sum+=n;

printf(u%d,,,sum);

for语句中的初值、条件、增值可为任意表达式:

for(表达式1;表达式2;表达式3)循环体;

这时执行过程为:

①执行表达式1(总是要执行并只执行一次)

②求表达式2,非。则往下;为。则跳出循环

③执行循环体

④求表达式3,回到②

上例可缩写为:

main()

{不可缺少

intn,sum;.

for(n=1,sum=0;n<=100;sum+=n,n++);

printf("%d”,sum);

)

程序中表达式1和3均为逗号表达式,从而循环体为空,此时for()

后的分号不可遗漏,否则将printf()作为循环体。

又如延时程序:

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

空循环30000次。

例如P91中。

例如输入数字,非0时计算其平方,。时结束。

main()

(

voidprompt(),squarenumber(intnum);

intt,readnumber();

for(prompt();t=readnumber();prompt())

squarenumber(t);

温馨提示

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

评论

0/150

提交评论