C语言程序设计概述课件_第1页
C语言程序设计概述课件_第2页
C语言程序设计概述课件_第3页
C语言程序设计概述课件_第4页
C语言程序设计概述课件_第5页
已阅读5页,还剩124页未读 继续免费阅读

下载本文档

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

文档简介

大家好12讨论:两个问题你怎么理解C语言程序设计?你认为自己掌握得怎么样?C语言程序设计程序:其本质是指令序列或集合,为了实现特定目标或解决特定问题而设计出来,能让计算机执行一个或多个操作。程序设计:给出解决特定问题程序的过程。C语言:一种计算机程序设计语言。3为什么要学习程序设计?为什么要先学C语言?4为什么要学习程序设计?计算机的本质:程序的机器进一步了解计算机的工作原理,理解和应用计算机;掌握用计算机处理问题的方法;培养分析和解决问题的能力;

5为什么要先学C语言?6计算机语言1、机器语言2、汇编语言3、高级语言——机器指令的集合——符号化的机器语言——通用自然的算法语言78计算机语言机器语言:10000(让计算机执行一次加法运算)汇编语言:ADDA,B(执行寄存器A中的数与B中的数相加,然后将结果存放到A)高级语言:a=a+b高级语言源程序机器语言目标程序计算结果编译解释执行高级语言与自然语言相近,简单易学,不必深入懂得计算机内部结构和工作原理功能强,不依赖于具体机器,写出的程序对任何型号计算机都适用或只须作很少的修改计算机不能直接识别用其编写的程序,要对其进行翻译并转换为机器指令的程序,一个语句往往对应多条机器指令出现了2500种以上,应用比较广泛的有100多种,如:FORTRAN、BASIC、PASCAL、C、C++、JAVA910◆C语言特点

1、语言简洁、紧凑,使用方便灵活

2、运算符丰富

3、数据结构丰富,具有现代化语言的各种数据结构

4、具有结构化的控制语句

5、语法限制不太严格,程序设计自由度大

6、C语言允许直接访问物理地址,能进行位操作,

可实现汇编语言的大部分功能

7、生成目标代码的质量高,程序执行效率高

8、程序可执行性好为什么要先学C语言?功能丰富、表达能力强、使用灵活方便、应用面广、目标程序效率高、可移植性好;较简单且更为基本,在此基础上,很容易过渡到C++等其它高级语言;既具有高级语言的特点,又具有低级语言的特点;既适于编写系统软件,又能方便地用来编写应用软件。11C语言程序设计

概述1314C语言中的三大定律—表达式定律表达式定律任何能产生数值结果的运算、操作都可以作为表达式,并可以放到任何需要数值结果的地方,只要数值类型能够匹配常见的可以产生数值结果的运算和操作算术、逻辑、位运算等?:、&、*等有返回值的函数赋值常见的需要数值的地方有:赋值条件判断函数调用15C语言中的三大定律—类型定律类型定律任何类型都可以在任何需要类型的地方使用;用任何类型定义的变量都要占用内存已知特例函数返回值不能定义为数组类型函数参数定义为数组类型,此时该参数不占用内存,而是共享函数调用者传入的数组空间常用类型基本数据类型、指针、数组、结构……常见的需要类型的地方定义变量定义指针、数组和结构函数参数和返回值sizeof16C语言中的三大定律—参数传递定律参数传递定律函数调用时的参数传递永远都是传值(址)调用,把实参的值(址)拷贝给形参实参:调用者提供的参数形参:函数定义的参数基本数据类型无容置疑struct也无容置疑指针作为参数时,把指针变量的内容(就是其指向的内存地址)做了拷贝数组名作为参数时,把它等同于指针看待了17要点C语言基础三种基本结构函数数组指针结构体18一、C语言基础程序的概念

程序应包括两方面内容:(1)对数据的描述,即数据结构。(2)对数据操作的描述,即算法。

程序=算法+数据结构19C语言基础算法的描述自然语言描述法流程图描述法伪代码描述法N-S流程图描述法20C语言基础自然语言描述法:就是用人们日常使用的语言,如:汉语、英语或其他语言来描述算法。如例1.1就是用自然语言来描述求解最大公约数的算法。用自然语言来描述和表示算法的优点是通俗易懂,缺点是但文字过于冗长,容易出现歧义性。因此,除了简单的问题外,一般不用自然语言描述算法。21C语言基础算法举例1:例如:求解两个正整数p和q的最大公约数g的算法

步骤1:如果p<q,则交换p和q。步骤2:令r是p/q的余数。步骤3:如果r=0,则令g=q,结束算法,g即为求得的最大公约数;否则令p=q,q=r,转向步骤2。22C语言基础流程图描述法:用图框表示各种操作,如图所示:起止框输入输出框加工框判断框流程线23C语言基础伪代码描述法:伪代码(pseudocode)是用介于自然语言和计算机程序设计语言之间的文字和符号来描述算法,即用计算机程序设计语言中具有的关键字和汉字相结合的方法表示算法的操作流程。用伪代码表示算法,并无固定的、严格的语法规则,只要求把意思表达清楚。

例如:“打印x的绝对值”的算法。

ifx>=0then输出xelse输出-x24C语言基础N-S图表示法:N-S流程图符号:顺序结构:图1-1选择结构:图1-2循环结构:图1-3,图1-4AB

P成立

不成立

AB当P成立A

直到P不成立A图1-1图1-2图1-3图1-425C语言基础结构化程序设计的特点:由三种基本控制结构:顺序结构、选择结构和循环结构。有限制的使用goto语句。借助于结构化程序设计语言来书写。采用自顶向下,逐步求精或自底向上,逐步积累的程序设计策略。26C语言基础C程序的特点:对于变量,先定义其数据类型,再使用。C程序由函数构成,一个程序至少要有一个以上的函数。C程序总是从main()函数开始执行。书写格式自由,在一行可以写若干语句。数据的输入与输出是通过输入输出函数实现,例如:scanf(),printf()函数等。27C语言基础关键字:又称为保留字,是一种预先定义的具有特殊意义的标识符。C语言的关键字有类型标识符、控制流标识符、预处理标识符和其他标识符等。

C语言的关键字都是小写的.28C语言的基本语法单位C语言中的关键字(32个):autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatfor

goto

ifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedvoidvolatiewhile

29C语言基础标识符:标识符是指用来表示变量名、符号常量名、函数名、数组名、文件名的字符序列。C语言中各种名称都由标识符来表示。30C语言基础标识符必须满足以下条件:1、第一个字符必须是字母或下划线。2、其它部分必须由字母、下划线或数字组成。 3、大小写字母表示不同意义。 4、在TurboC中,系统能识别的标识符最大长度是32位。 5、标识符不能使用C中的关键字。标识符是以字母或下划线打头的,后随字母或下划线或数字组成的字母下划线数字串。31C语言基础常量:在程序执行过程中其值保持不变的量称为常量。常量有数值常量和符号常量,符号常量名一般用大写形式表示。数值常量又分:整型常量实型常量字符型常量(包括字符常量和字符串常量)分别用单引号和双引号注意转义字符的使用32C语言基础符号常量用如下形式定义:

#define<标识符><常量>

例如: #definePI3.14159

#define

N100 #defineNAME“zhangsan”33C语言基础整型常量:用十进制数、八进制数和十六进制数三种形式表示。C语言规定:八进制整数以数字“0”开头的数字序列,如0733,-0732;十六进制整数以“0x”开头的数字序列,如0xffff,0x1111,-0x38。十进制整数如:123,-369,78,168L(L或小写l表示是长整形数据,超过-32768~32767)34C语言基础实型常量:

有小数形式和指数形式两种书写格式。 日常数据:32.5 0.00325 -325 小数书写:32.5 0.00325 -325.0 指数书写:3.25e1 3.25e-3 -3.25e232.5e0 32.5e-4 -0.325e3注:指数书写时,e(或者E)前必须有数字,e后的指数必须为整数。35C语言基础字符常量: 用一对单撇号括起来的一个字符,如‘a’、‘c’、‘A’、‘?’等单撇号中的单个字符;

但不能是单撇号或反斜杠:即‘’’、‘\’都是不合法的。要辨识单撇号字符和反斜杠字符,必须用转义字符来表示。 几种常见的转义字符参见P31表3136C语言基础字符串常量: 用双撇号括起来的零个或多个字符序列,如:“zhangsan”

,“x”,“hello”

字符串总的字符数称为字符串的长度,不包含结束符。系统在每一个字符串的末尾都自动加一个“字符串结束标志”,即‘\0’。字符串长度为1的“x”在内存中存放成:可以看出,字符串“x”在内存中占两个字节,而字符‘x’在内存中只占一个字节。X\037C语言基础变量:在程序运行过程中不断改变的量称为变量。变量用变量名,即标识符来表示,在C语言中要求对所有的变量“先定义,后使用”。变量定义的一般格式是: <数据类型标识符><变量名表>;38C语言基础[变量的存储类型]变量的数据类型变量名标识符命名规则intfloatcharPointerto…arraystruct[auto]staticregisterextern变量的:有效范围作用时间变量的:取值范围操作C语言基础基本类型构造类型指针类型空类型整型字符型实型枚举类型(浮点型)单精度型双精度型数组类型结构体类型共用体类型数据类型3940C语言基础整型变量,分为四种类型: (1)基本型,用int表示。 (2)短整型,用shortint或者short表示 (3)长整型,以longint或者long表示 (4)无符号型 unsignedint(无符号整型)、

unsignedshort(无符号短整型)

unsignedlong(无符号长整型)注意它们在内存中所占的字节数及其取值范围整形数据分类表参见教材!41C语言基础实型变量:分为单精度(float)和双精度(double)单精度占内存4个字节双精度占内存8个字节其中:float型变量只能接受7位有效数double型变量只能接受10位有效数C语言基础字符变量:在内存中占一个字节.只能存放一个字符。字符在内存中以ASCII码形式存放例如:字符‘A’

在内存中存放的是65字符‘f‘

在内存中存放的是102字符和数字的转化:charch;intI; i=ch-’0’;42转义字符:C语言基础字符形式\n\t\b\v\r字符形式\f\\\ddd\‘\xhh含 义换行横向跳格(跳到下一个输出区域)竖向跳格退格回车含 义走纸换行反斜杠字符\单引号‘1至3位八进制数所代表的字符1至2位十六进制数所代表的字符利用\ddd\xhh转义字符,可以表示任何ASCII码字符可以用来控制printf的输出位置4344C语言基础C语言有丰富运算符按其功能大致可分为(13类):

算术运算符关系运算符逻辑运算符赋值运算符逗号运算符位运算符条件运算符指针运算符

分量运算符(指向运算符)

下标运算符

求字节数运算符sizeof

强制类型转换运算符要求掌握基本运算符的优先级和结合方向运算符的优先级和结合方向参见教材45C语言基础表达式是程序设计中非常重要的概念之一,用运算符将常量、变量、函数连接起来构成的式子称之为表达式。注意以下两点: 1.参加表达式运算的量必须有确切的值,表达式经过运算后,也一定会得到一个确切的值。 2.计算表达式的值要注意三个方面问题

a、运算符的结合性。

b、运算符的优先等级。

c、数据类型的转换。C语言基础算术运算符双目运算符有五种:+,-,*,/,%(求余运算符)单目运算符有三种:-,++,--算术运算符的优先级是:先乘除,后加减,先括号内,再括号外。结合方向是:从左至右。注:1、++、--只能用于变量,不能用于常量。2、++、--和负号运算符的优先级别是一样的,但比正号运算符的优先级别高。3、++、--的结合方向是:自右至左。这两个运算符常用于循环变量表达式中。46C语言基础赋值运算符有两种:赋值运算符复合赋值运算符赋值运算符:=复合赋值运算符(共有10种)+= -= *= /= %=<<= >>= &= ^= |=赋值运算的结合方向是从右向左。47C语言基础关系运算符:六种<,<=,>,>=,==,!=

<,<=,>,>=的优先级高于==,!=优先级:算术运算符

关系运算符赋值运算符结合性:从左至右

C语言规定:“0”为假非“0”为真。48C语言基础逻辑运算符:三种

&&(与),||(或),!(非)注:!为单目运算符,优先级最高&&和||为双目运算符结合性为从左至右特别值的一提是&&和||为“短路”运算符,所谓“短路”运算符是指从左到右进行计算,只要结果能够确定,就不再进行下去。

书上P43例子2.1349举例:短路运算符:main(){intx,y,z;x=y=z=0;++x||++y&&++z;/*x变为1,y和z不变*/

printf(“x=%d,y=%d,z=%d\n”,x,y,z);

x=1,y=0,z=0x=y=z=0;

++x&&++y||++z;/*x,y变为1,z不变*/

printf(“x=%d,y=%d,z=%d\n”,x,y,z);

x=1,y=1,z=0}50512.3.2赋值运算符和赋值表达式赋值表达式举例:

intx;x=-3+4*5-6;x变量中的结果为:11

x=3+4%5-6;x变量中的结果为:1

x=-3*4%-6/5;x变量中的结果为:0

x=(7+6)%5/2;

x变量中的结果为:1522.3.2赋值运算符和赋值表达式设:a=12;a+=a-=a*a;a中的内容为-264

a+=a-=a*=a;a中的内容为0a=5+6;表示:11赋给变量aa+=3;表示:a+3的结果赋给变量ax*=y+3;表示:y+3的结果乘x变量的内容,得出的结果赋给变量xx%=3;表示:x%3的结果赋给变量x

532.3.2赋值运算符和赋值表达式例:求下列算术表达式的值。(1)设x=2.5,y=4.7,a=7x+a%3*(int)(x+y)%2/4(2)设a=2,b=3,x=3.5,y=2.5(float)(a+b)/2+(int)x%(int)y(3)设a=12a+=a-=a*aa+=a-=a*=a结果为:2.5结果为:3.5结果为:-264结果为:0542.3.3关系运算符和关系表达式例如:inta=3,b=2,c=1,d=4;则:a+b>c+d

表示:a+b大于c+d,结果为0

c>a+b

表示:c大于a+b,结果为0

a>b!=c表示:a>b不等于c,结果为0

a==

c+b

表示:a等于c加b,结果为1

a=

b>c

表示:b大于c的结果赋给a,结果为1注意优先级,结合方向从左至右!!!55C语言基础C语言的输入和输出是通过调用输入/输出函数来完成的,常用的有三对:getchar()putchar()用于单个字符的输入输出gets()puts()用于字符串的输入输出scanf()printf()用于各种类型数据的输入输出注:这些函数在使用时,要在源程序的开始位置,包含一条编译预处理命令:#include"stdio.h"格式控制要求掌握最基本的56举例:输入输出格式控制#include<stdio.h>main(){ intx,y; scanf("%2d%*2s%2d",&x,&y); printf("%d",x*y);}程序执行时从键盘输入:12341234↙运行结果是:144例如:main(){printf(”%3s,%7.2s,%.4s,%-5.3s\n”,“china”,”china”,”china”,”china”),}

程序运行结果:china,ch,chin,chi57二、3种基本结构 C语言的语句根据语句执行是否改变程序流程, 分为四类:顺序语句如:表达语句,函数调用语句选择语句如:if语句,switch语句循环语句如:for、while、do-while语句转移语句如:break、continue、return等注:C语句的关键字和基本语句都是用小写字母表示。58三种基本结构顺序结构的程序由顺序语句组成,所谓顺序语句是指语句执行后不改变程序的执行流程的那些语句。顺序语句主要有:表达式语句:在表达式的后面加一个分号空语句:仅有一个分号构成的语句复合语句:用大括号括起来的一组语句59三种基本结构分支结构:在实际生活中,经常会遇到许多需要判断的问题,程序设计中将这一类问题归结为分支问题。

C语言中,用if和switch语句来实现分支结构。这种语句特点是:根据所给出的条件,在给定的操作中选择一组去执行。60三种基本结构格式1:

if(表达式)语句;功能:计算表达式的值,非0时,执行语句; (或判断条件是否成立,如果满足,则执行语句;)

否则执行if语句的下一条语句。Y表达式语句if语句的下一语句N61三种基本结构格式2:

if(表达式)语句1;

else语句2;功能:计算表达式的值,结果为非0,执行语句1;否则执行语句2。表达式语句1if语句的下一语句NY语句2计算机中非0表示“真”62三种基本结构格式3:

if(表达式1)语句1;

elseif(表达式2)语句2;

elseif(表达式3)语句3; ......

elseif(表达式n)语句n;

else语句n+1;

功能: 当条件1成立时,执行语句1;否则,如果条件2成立,执行语句2,......,直到当条件n成立时,执行语句n,否则执行语句n+1。63三种基本结构YY表达式1表达式2表达式3表达式4NNNN语句5语句4语句2语句3语句1YYif语句的下一语句64三种基本结构注意:条件是表达式,它必须用以对括号括起来。表达式的值“非0”为真,“0”为假。整个if语句在程序中被看作是一条语句。if语句中的各语句可以是一条语句,也可以是由{}构成的一个复合语句。else总是和它上面的、离它最近的if语句(未曾配对过)配对。格式3称为if语句的嵌套格式,用于解决多项分支问题。65三种基本结构

为提高程序的可读性,C语言提供了另一个解决多项分支问题的语句,即switch语句。 其一般格式为:

switch(<表达式>){case常量表达式1;语句序列1;break;case常量表达式2;语句序列2;break;......case常量表达式n;语句序列n;break;default:语句序列n+1;}66三种基本结构注意:(1)switch后的表达式,可以是整型或字符型,也可以是枚举类型。(2)每个case语句后的常量表达式只能是常量组成的表达式。(3)每个case语句后的常量表达式必须互不相同。(4)case的次序不影响执行结果。(5)在执行完一个case后面的语句后,程序流程转到下一个case后的语句开始执行。(6)如果指向执行某个case后的语句序列,那么就要在这个case的语句序列后面使用break语句。67三种基本结构表达式语句1语句2语句n语句n+112ndefault……Switch语句的下一语句不使用break的情况68三种基本结构表达式语句1语句2语句n语句n+112ndefault……Switch语句的下一语句break;break;break;break;使用break的情况69三种基本结构条件运算符要求有三个操作对象,是C语言中唯一的三目运算符。其一般格式为:

<表达式1>?<表达式2>:<表达式3>表达式1表达式2表达式3条件表达式语句的下一条语句例3.20:输入一个字符,判断是否是大写字母,若是,将其转换成小写字母,否则不转换,并且将转换的结果输出。程序如下:

main(){charch;scanf(“%d”,&ch);ch=(ch>=‘A’&&ch<=‘Z’)?(ch+32):ch;printf(“ch=%c\n”,ch);}71三种基本结构循环结构用来解决现实生活中的循环问题。C语言中提供了三中循环语句:(1)for语句(2)while语句(3)do-while语句搞清楚这三种循环结构的区别72三种基本结构for循环用于循环次数已知的情况。其一般格式为:for(<表达式1>;<表达式2>;<表达式3>)循环体语句计算表达式1循环语句体计算表达式3for语句的下一语句表达式2073三种基本结构说明:在for语句中,<表达式1>、<表达式2>和<表达式3>都可以缺省。<表达式2>缺省,系统会认为此处的值永远为1,将形成死循环。因此,在循环体中要有退出循环体的语句。for语句的三个表达式可以是任何类型的表达式,最常用的是逗号表达式,这样,可以同时对多个变量赋初值。743.4.1for语句1.缺省<表达式1>的情况;

inti,sum=0;i=1;

for(;i<=100;i++)sum=sum+6;2.缺省<表达式3>的情况;

inti,sum=0; i=1;

for(;i<=100;){sum=sum+6;++i;} 要在循环体中设有改变循环条件的语句!753.4.1for语句3.缺省<表达式2>的情况;

inti,sum=0;

for(i=1;

;i++){if(i>100)break;sum=sum+6;}4.<表达式1><表达式2><表达式3>都缺省的情况;

inti=1,sum=0;

for(;

;){if(i>100)break;

sum=sum+6;++i;} 要在循环体中设有跳出循环的语句! 要在循环体中设有改变循环条件和跳出循环的语句!76三种基本结构 while语句的一般格式为:

while(<表达式>)循环体语句

while语句的执行流程如图所示:循环语句体while语句的下一语句表达式0非0 如果循环次数未知,用while77三种基本结构while语句一般用于事先不知道循环次数,在循环执行的过程中,根据条件来决定循环是否结束。说明:在循环体中如果包含一个以上的语句时,则应该用花括号括起,构成复合语句。在循环体语句中,一定要有改变循环条件的语句,使循环能够终止。783.4.2while语句

例:用while语句来实现100个6相加。

main(){

inti=1,sum=0;

while(i<=100){sum=sum+6;

i++;}

printf("Thesumis:%d",sum);}改变循环条件的语句循环结束条件判断循环体79三种基本结构

do-while语句的一般格式为:

do循环体语句while(<表达式>);

do-while语句的执行流程如图所示:循环语句体do-while语句的下一语句表达式0非080三种基本结构do-while语句与while语句的区别:do-while语句是在判断条件是否成立之前,先执行循环体语句一次;while语句则是先判断条件是否成立,如果条件成立才执行循环体.因此,while语句的循环体可能一次都不执行;而do-while语句的循环体至少被执行一次,这是while语句和do-while语句的根本区别。81Continue/

break语句有时在程序中需要提前结束本次循环,进入下一次循环,这是就需要continue语句。

continue语句的一般格式是:

continue;它的作用是结束本次循环.continue语句不造成强制性的中断循环,而是强行执行下一次循环。break语句也可用于循环语句。

break语句用于强制性中断循环,从循环语句跳出,从而结束循环,转移到循环语句后的语句去执行。82综合应用程序举例例3.37拼数。模拟编译程序,将以字符形式读入的数字序列转换成对应的实数.例如,由键盘输入'1'、'2'、'3'、'.'、'4'、'5',转换成对应的实数123.45.例3.28求10到200之间的孪生素数对。孪生素数对指两个素数的值相差2的一对素数,如11与13,17与19,…,等等。

例3.40输入一个正整数,产生回文数。83三、函数函数定义函数的形式参数与实在参数函数的调用规则函数的嵌套调用和递归调用变量的作用域和存储类别这一章比较难掌握,知识点也比较多,应该结合程序反复理解书上的一些概念84函数一个C程序可以由一个或多个函数组成;一个C程序必须从main()函数开始执行。函数间可以相互调用,但不能调用main函数,它是由系统调用的;函数又分为如下两类:无参函数和带参函数。参数用来向函数传递不同的数据。函数都可以返回或不返回一个函数值。返回一个函数值可供调用它的函数使用,或者用来判断函数的执行状态。85函数主函数子函数1子函数2子函数n…子函数21子函数22子函数n1…子函数n2子函数n3子函数221函数之间的调用关系示意图86<类型说明符><函数名>([<形式参数表列>])[<形式参数类型说明>]{<变量定义部分><函数体语句> } 如: fun(x,y,z)

intx,y,z;

或写成:fun(intx,inty,intz)函数定义的一般格式是:87例4.2关于函数的定义。intmax(x,y)intx,y;{intt;t=(x>y)?x:y;return(t);}main(){inta,b,c;scanf(“%d,%d”,&a,&b);c=max(a,b);printf(“Thismaxis:%d\n”,c);}

类型说明符X,y是形式参数无返回值无形式参数形式参数类型说明函数名a,b是实参88形式参数与实在参数(单向赋值)

在定义函数时函数名后括号内的变量表列就称为形式参数表,简称形参。而在调用函数时函数名后括号内的变量表列被称为实在参数表,简称实参。形式参数:随函数的调用而产生,随函数的结束而消亡的。实在参数:作用是给相应的形参赋值,所以在调用函数前,实参必须要有一个确切的值(常量、变量或表达式)。89函数的返回值

如果被调用函数要向调用函数返回一个值,那么需要使用return语句。

return语句的一般格式如下:

return(<表达式>);或return<表达式>;

说明:函数中可以有多个return语句,执行到哪个return语句,就从那一个return语句返回。return只能返回一个值,而不能返回多个值。表达式值的类型应与定义函数时函数的类型一致。若函数没有返回值,可以用void关键字来定义函数,表示“无类型”。90被调用函数必须是已经存在的函数、库函数或用户已定义过的函数。如果使用库函数,还要在使用库函数的源文件开头用#include声明库函数所在的头文件。如果使用用户自定义的函数,还要在主调函数中说明用户函数的返回值类型,函数说明的一般形式为:<类型说明符><函数名>();推荐在程序的开头对程序中的所有函数进行定义;嵌套调用和递归调用函数调用规则例4.9n的阶乘可以采用两种形式定义: (1)n!=1*2*3*4*…*n (2)1当n=1时f(n)=n!=n*f(n-1)当n>1时 第二种就是递归定义。程序如下: longfacl(intn) { longf; if(n==1) f=1; elsef=n*facl(n-1); return(f); }91从变量的作用域分:全局变量局部变量从变量存储类别和生存周期分:静态存储类型动态存储类型概念比较多,要求对概念加深理解,搞清变量与函数的关系函数中变量的分类92局部变量和全局变量在C语言中如果按作用域分,变量分为:

局部变量和全局变量。在一个函数内部定义的变量被称为局部变量,这种变量的作用域是在本函数范围内。说明:main函数也是一个函数,它内部定义的变量只能在main函数内部使用,而在其它函数内部不能使用main函数内部定义的变量。不同的函数中可以使用相同的变量名,但它们是属于不同函数的变量,它们的作用域是不同的,在不同的区域内分配空间。形参也属于局部变量,作用范围在定义它的函数内。93局部变量和全局变量在函数外部定义的变量称为外部变量,外部变量属于全局变量。全局变量的作用域是从定义变量的位置开始到本源文件结束。说明:在一个函数内部,既可以使用本函数定义的局部变量,也可以使用在此函数前定义的全局变量。全局变量的作用是使得函数间多了一种传递信息的方式。4.全局变量的作用范围是从定义位置开始起直到程序结束处。5.如果在一个函数内部,一个局部变量和全局变量重名,那么是局部变量起作用,而外部变量不起作用。例4.11关于全局变量

intx,y;/*外部变量*/ floatf1(inta) {…} floata,b;

intf2(intc)全局变量x,y {intz;的作用范围 …}全局变量a,b main()的作用范围 {intm,n; …}94

函数一个C程序在运行时,用户区被分为三大块:程序区,用来存放C程序运行代码。静态存储区,用来存放变量,这个区域中存储的变量被称为静态变量,如全局变量。动态存储区,用来存放变量以及进行函数调用时的现场信息和函数返回地址等,在这个区域存储的变量被称为动态变量,如形参、函数体内部定义的局部变量等。

95

函数我们把程序运行期间变量在内存中存在的时间称为变量的生存周期。

变量的生存周期和变量的作用域可分为如下几类:局部变量的生存周期,从定义它的函数运行开始到函数运行结束。其作用域在定义它的函数内。静态局部变量的生存周期,从程序的运行开始到整个程序运行结束。其作用域为定义它的函数内。全局变量的生存周期,从定义它的源程序开始到整个程序运行结束。其作用域为定义它的源程序内。静态全局变量的生存周期,从定义它的源程序运行开始到定义它的源程序运行结束。其作用域在定义它的源程序内。96四、数组一维数组二维数组字符数组数组的定义、初始化和输入输出数组排序数组名或数组元素作为函数参数一维数组与指针字符数组与字符串数组这一章节的内容比较多,排序、字符串操作等算法应该掌握97定义:<类型说明符><数组名>[<常量表达式>];如:inta[5];floatx[10];说明:<类型说明符>用来定义数组中各个数据元素的类型。在任何一个数组中,数组元素的类型都是一致的。<常量表达式>用来标识数组中元素的个数。<常量表达式>必须是整型常量、符号常量或由常量或符号常量组成的表达式,而不允许是变量。一维数组中的各个元素在内存中是按顺序存放的。一维数组

98输入方法:inta[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for(i=0;i<10;i++)scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for(i=0;i<10;i++)printf("%d",a[i]);只能逐个对数组元素进行操作(字符数组例外)

一维数组的输入和输出

99 数组排序是计算机科学中的典型问题之一。排序的方法很多,经常使用的有两种。设有数组a[n+1],数据存于a[1]~a[n]。

1.冒泡排序法,算法思想是:(1)从a[1]到a[n],把相邻的两个数两两进行比较。(2)每次比较中,若前一个比后一个大,对调位置,这样一趟扫描后,最大的数就落在比较范围内的最后位置上。

数组排序100冒泡排序示例初始状态:985420第一趟第一次:985420第二次:985402第三次:985042第四次:980542第五次:908542第一趟结束:098542第二趟结束:029854第三趟结束:024985第四趟结束:024598第五趟结束:024589

N从最后一个元素开始相邻的两个元素比较每一趟在余下的数中选择一个最小的置顶N个数据需要n-1次两两比较101冒泡排序程序(部分)do{

done=1;for(j=8;j>=i+1;--j)if(a[j]<a[j-1]){done=0; t=a[j];a[j]=a[j-1];a[j-1]=t;

}

i++; }while((i<8)&&!done); printf(“Thesortednumbers:\n”); for(i=1;i<9;i++) printf(“%4d”,a[i]); printf(“\n”); }每一次循环相邻的两个数比较,根据大小决定是否交换102选择排序法它的指导思想是不急于调换位置算法描述:(1)从a[1]到a[n]逐个检查,找出最小值,记位置k,一遍扫描完后,将a[1]和a[k]对调,将最小值放在最前面。(2)从a[2]到a[n]范围内找出最小值放在a[2]中,……。一般的,在a[i]与a[n]中找出最小值位置k,将a[k]与a[i]交换,如此重复n-1次。103选择排序程序如下(部分) for(i=1;i<8;++i) {k=i; for(j=i+1;j<9;++j)if(a[j]<a[k])k=j;if(k!=i) {temp=a[i];a[i]=a[k];a[k]=temp;} } printf(“Thesortednumbers:\n”); for(i=1;i<9;i++) printf(“%4d”,a[i]); printf(“\n”); }每一次循环选出一个最小值a[k]和第i个变量a[i]交换,其他元素的值不变104二维数组

二维数组定义的一般形式为:<类型说明符><数组名><常量表达式1>][<常量表达式2>];a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]a[2][0]a[2][1]a[2][2]a[2][3]a[2][4]a[3][0]a[3][1]a[3][2]a[3][3]a[3][4]a[0]a[1]a[2]a[3]105二维数组的输入和输出数组的输入和输出只能逐个对数组元素进行操作(字符数组例外)intb[2][3],i,j;输入方法:输入第i行第j列元素:scanf(“%d”,&a[i][j]);输入整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)scanf(“%d”,&a[i][j]);输出方法:输出第i行第j列元素:printf(“%d”,a[i][j]);输出整个数组元素:for(i=0;i<2;i++)for(j=0;j<3;j++)printf(“%d”,a[i][j]);106二维数组应用举例:例5.10:求一个二维数组中最大值所在的行、列值。输出最大值,以及最大值所在的行、列值。程序如下:

main(){inti,j,max,col,row;staticinta[5][4]={{10,11,12,13},{14,15,16,17}, {18,19,11,12},{24,25,27,26},{35,37,36,30}};printf(“Arraya:\n”); for(i=0;i<5;i++) {for(j=0;j<4;j++) printf(“%3d”,a[i][j]); printf(“\n”);}107二维数组应用举例: printf(“\n”); max=a[0][0];row=0;col=0; for(i=0;i<5;i++) for(j=0;j<4;j++) {if(max<a[i][j]) { row=i; col=j; max=a[i][j]; } } printf(“Themaxnumber%3dat%d,%d”, max,row,col);}求出二维数组的最大值108字符数组

C语言中的字符数组是用来存放字符串的。

字符数组定义的一般格式为:

char<数组名>[<常量表达式>];

例如:chara[3];/*字符数组定义*/ a[0]=‘Y’;/*字符数组元素的引用*/ a[1]=‘O’; a[2]=‘U’;

注意:当按字符串的形式给字符数组赋值时,系统会自动给这串字符的后面加一个字符串结束符‘\0’。因此上面的例子若按单个字符%c输入输出没错,但是按字符串%s输入输出时会产生错误,建议预留结束符的位置。109逐个输入输出for(i=0;s[i]!='\0';i++){ s[i]=getchar(); putchar(s[i]);或scanf("%c",&s[i]);printf("%c",s[i]);}putchar('\n');scanf("%s",s);printf("%s",s);或gets(s);puts(s);chars[10];一次性输入输出字符数组的输入输出110字符串处理函数strcpy——stringcopychar*strcpy(char*dest,constchar*src);strlen——stringlengthsize_tstrlen(constchar*s);返回字符串的实际长度,不包括'\0'strcat——stringcombinationchar*strcat(char*dest,constchar*src);strcmp——stringcomparisonintstrcmp(constchar*s1,constchar*s2);111数组作为参数数组元素作函数参数将数组元素作为函数的参数,它的使用规则与变量作为函数参数的规则是一样的,只需将数组元素写在实参位置上即可。例:max(a[0],a[1]);数组名作函数参数整个数组作函数参数传递到被调用函数中时,在实参位置处写出数组名,在形参位置处写出数组名及其定义即可。例:floatx[10],avg;avg=fun(x);112简单变量作函数参数只有当函数被调用时,形参才在内存中开辟空间。调用结束后,形参自动从内存中被释放掉。实参与形参的关系是单向赋值的关系113数组作函数参数114五、指针指针的概念指针变量数组与指针字符串与指针指针数组综合举例115指针变量是用来存放内存地址的。

定义指针变量的一般格式为: <类型标识符>*<标识符>;其中,符号*表示“指向…的指针”。

如:inti,*p;inti,*p=&i;

&取变量地址运算

*取指针变量所指向的变量内容的运算

在指针变量中只能存放地址,因此,将一个整数赋给一个指针变量是不合法的。指针的定义与引用

116指针变量作为函数参数调用函数和被调函数对同一内存单元的内容进行操作时,可将该变量的地址作为实参传递给被调函数,即传递参数是指针变量,可以得到多个返回值,类似用数组名做参数。用指针变量作为函数参数,在调用函数中,实在参数应是指针变量或者是变量的地址。在被调函数中,形式参数被说明成指针变量。117main(){inta,b,*pa,*pb;printf(“pleaseinputaandb:”);scanf(“%d%d”,&a,&b);pa=&a;pb=&b;

swap(pa,pb);printf(“\n%d,%d\n”,a,b);}程序运行的过程及结果如下:Pleaseinputaandb:599,5例

定义一个可以实际交换两个变量数值的函数。

swap(int*p,int*q){inttemp;temp=*p;*p=*q;*q=temp;}用指针做函数参数,可以得到多个返回值(因为是共同对内存进行读写)两个指针指向的内容交换118

指针与数组任何能由数组下标完成的操作也可由指针来完成。

当一个指针变量被初始化成数组名时,就说该指针变量指向了数组。如:charstr[20],*ptr; ptr=str;ptr被置为数组str的首地址。要访问str的第6个元素,则str[5],*(ptr+5),*(str+5),ptr[5]都是正确的。

119

指针与字符串 一维指针数组的定义形式为:

温馨提示

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

评论

0/150

提交评论