C语言程序设计课堂笔记_第1页
C语言程序设计课堂笔记_第2页
C语言程序设计课堂笔记_第3页
C语言程序设计课堂笔记_第4页
C语言程序设计课堂笔记_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计

笔记

(第一版)

3

春莫申

编著

y

石家庄铁道大学

一、C语言的基本知识

(1)字符集与标识集

LC语言的字符集和包括:

大、小写英文字母;数字;运算符;括号:包括小括号,中括号和大括号;

标点符号;特殊符号(例如数学符号);空格符、换行符、制表符。

注:不在字符集中的字符可以在两个双引号(称为字符串常量)或两个单引号

(称为字符常量)之间出现,还可以出现在注释行中。

2.标识符:

在C语言中,任何一个标识符必须满足下列语法规则:

以字母或下划线中的任意字符开头and在第一个字符后,可以是任意的数字、

字母、下划线组成序列。

关键字:

关键字又称保留字,一般为小写字母。关键字是C编译程序预先登陆的标识

符,它们代表固定的意义,用户不能随便使用。

特定字:

特定字包括:define>undef、include>ifdef、ifndef>endif>line»

用户定义字:

用户定义字命名时的注意事项:

关键字和特定字不能作为用户定义字使用;标识符最好根据其所代表的含义

取其英文或汉语拼缩写,以便于阅读和检查;根据经验,应避免使用容易混淆的字符;字母

的大写和小写代表的意义是不同的;C语言有许多库函数,用户定义字不要与其中某个函数

同名。

(2)变量与常量

1.变量

在C语言中,所有的变量都必须先定义后使用。这样做的原因是:编译系统

会根据定义为变量分配内存空间,分配空间的大小与数据类型有关;未经过定义的标识符,

系统将不允许其作为变量名使用,这样会给程序员调试程序带来方便;编译系统可以根据变

量的类型检查对该变量的运算的合法性。

定义变量的格式为:类型说明符变量名表;

使用逗号分隔变量名表中的多个变量,并使用分号结束语句;如果不使用

变量名表,也可分别定义每个变量。

需要特别注意的是,在没有使用赋值符号对其赋值之前,其初始值为不定值。

其原因是在分配给当前定义的变量的内存空间中存有之前占用此空间的程序的数据,故其初

始值为不定值,将0赋给变量即可解决这个问题。

2.常量

定义常量的方法:在第二行写下指令即可,如定义常量m的指令是:#define

PI3.1415926(define和PI是有间隔的)。我们可以把这种常量叫做符号常量。但是,这

种符号常量与其他高级语言用const方法定义的符号还是有区别的。此外,还需注意用

预处理命令#define为变量命名时,通常用大写字母,以区分变量名。

注:i++的含义是在i的基础上加上1,并且++号在i的前面和后面是有不同的含

义的,++在前,先加后用,++在后,先用后加。(需结合课件3.3)

(3)C语言的数据类型

本节需注意的有三点,数据类型不同的变量在内存中的储存方式和所占的字节

都有可能不同,一种高级语言支持的数据类型越多,程序设计时就越方便,越容易;当整数

超出int的表示范围时,可以使用double或float来表示数据;无意义的数字串视作字符处

理。

详细的数据类型属性图见课本第20页。

(4)整型数据

1.整型数据在内存中的存储方式

一个整型数在内存中的存储方式与二进制有关:带符号的整数在计算机内

部采用二进制补码存储,不带符号的整数则采用二进制原码存储。

不同位数的整型数据的取值范围是不同的,对于8位整型数据来说,表示

带符号数的范围是-128727,表示不带符号数的范围是0-255;对于16位整型数据来说,

表示带符号数的范围是-32768-32767,表示不带符号数的范围是0~6535;而对于32位整型

数据,表示带符号数的范围是-2147483648-2147483647,表示不带符号数的范围是

0-4294967295.

2.整型变量

按照整型变量所占的二进制数来分类,整型变量分为短整型(short)、普通

整形(int)和长整型(long)三种。而根据整型变量是否带符号来分类,可以分为不带符号

的整型变量和带符号位的整型变量。无符号用关键字unsigned表示,用unsigned与短整型、

普通整型和长整型三种类型相匹配,又可以构成无符号短整型、无符号普通整型、无符号长

整型三种类型。

3.整形常量

十进制表示不能以数字0开头,八进制以数字0开头,而十六进制以数字

。和x开头。编译程序以开始的数字区分三种不同的进制。

如果不做特殊指定,整型常量按照普通整型变量的长度来存储。

4.用printf()显示整型数据

显示整型数的转换字符有d、o、x、u等。

%d:表示把数据按十进制整型输出。

%o:表示把数据按八进制整型输出。

%x:表示把数据按十六进制整型输出。

%u:表示把数据参数按无符号整型输出。

5,用scanf()输入整型数据

scanf()函数的使用格式:

scanf("格式信息输入项1,输入项2,…);需要注意的是,输入项必须

使用地址,普通变量的地址是在变量名前加取地址符&。

输入整型数的转换字符有d、o、x、u等。

%d:表示把数据按十进制整型输入。

%o:表示把数据按八进制整型输入。

%x:表示把数据按十六进制整型输入。

%u:表示把数据参数按无符号整型输入。

格式信息中除了有%开始的转换说明,还可以有普通字符,只是这些字符

不是显示在屏幕上,而是要求使用者在输入数据时,要在相应位置输入相同的字符(除了空

格符、制表符或换行符)。

(5)浮点数

L浮点数的表示范围:

-3.4*10A32~3.4*10A32„(32位系统)。

2.浮点常量

C程序中的浮点常量由整数部分、小数部分、指数部分组成。浮点常量的

构成规则是:整数部分可以不写,小数部分可以不写,但不能同时不写;指数部分可以省略

(相当于是用小数表示法);若有指数部分,e(或E)两边都至少有一位数;指数的数字必

须是整数(范围为1~3位的整数),可以为负或正号,正号可以省略。

3.用printf()显示浮点数据

输出浮点数据可以用的转换说明是%f和%e。%f显示小数表示的普通浮点

数,%e显示科学计数法表示的浮点数。输出双精度(double)类型时,还需要在转换字符

前加上字母I。

注:域宽问题:域宽不是指整数位的宽度,而是指整个浮点数显示的宽度,

还包括了小数点,若不指定域宽和精度,默认的精度是6.如果指定的域宽大于所显示的域宽,

未用的位置用空格填写,如果指定的域宽小于所显示的数实际域宽,按数的实际域宽显示。

简单来说,域宽即整数位数,小数位数,与小数点的位数之总和。

(6)字符型数据

1.字符数据在内存中的存储方式

字符型数据在内存中所占位数是固定的,只占1字节(8位)。

2.字符变量与字符常量:

C语言中的字符常量的表示方法是用单引号将一个字符括起来。;例

如H、I,,A,,可以使用字符常量为字符变量赋值此处要注意的问题是:单引号中的字符

只能是一个字符;不能用双引号括起来一个的字符表示单个字符常量,即charbeta;

beta="a",这种情况是错误的;非图形字符,如退格、换行等,也可以表示成字符型常量。

表示方法是使用转义符'与一些特殊字符构成转义序列;除此以外,字符型常量可以像整型

数据一样参与四则运算,其实质字符型对应的ASCII码之间进行的运算。

3.用scanf()输入字符:

当scanf()读入一组数据是,如果不使用%c进行转换,scanf()扫视输

入信息,跳过空格符、制表符或换行符,寻找下一个输入域。但是若使用%c进行转换,情

况则不同,scanf()不会跳过空格符、制表符、或换行符,而是直接把笑一个字符输入各

参数,不论它是什么,即使是空格符等非正常值,也会被顺次赋给变量。

4.用getchar()输入字符和用putchar。输出字符

getchar()函数是接收一个从标准输入/输出设备上输入的字符。一般的标

准输入设备是键盘。调用getchar()函数的方法是:字符变量=8©£1^()。

putchar()函数是向标准输入设备/输出设备上输入一个字符。一般的标准

输出设备是屏幕终端。

Putchar。函数与getchar。函数不同,需要把输出字符作为函数的参数,

放在括号里,括号里的内容是不能缺省的。调用的方法一般是:putchar(字符变量或字符常

量)putchar。函数的括号中返回的数据类型是整型,返回值为字符的ASCII码值。

5.字符串常量

用双引号括起来的字符序列是字符串常量。需注意,形如“a”与H是完

全不同的,前者是字符串常量,占的字节数是2;后者是字符常量。占的字节数是1。

字符串常量的输出有两种方法,一种是直接输出:“printf("howare

you")”,另一种是使用%s转换说明:“printf(“%s”,"howareyou")”。

(7)不同数据间的混合运算

L自动转换:

自动转换是指编译程序自己自发进行的转换,转换的原则是为两个运算

对象的计算结果尽可能地提供多的存储空间,自动转换表见课本33页。

应注意:自动转换只针对两个运算对象,不能对表达式的所有运算符进

行一次性的自动转换。例如:5/4+3.2的计算结果是4.20,因为5/4是按整型进行计算的,故

5/4的值为1而非1.25,所以整个表达式的值是4.20而非4.45,并不因为3.2是浮点型而将

整个表达式按浮点型计算。

2.强制转换

强制装换的格式为(数据类型名)操作对象。

3.赋值表达式的类型转换

当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型相同

时,不需要进行数据类型的转换。

当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型不相同

时,系统负责将右边的数据类型转变为左边的数据类型。

编写程序时应该遵循的原则是尽量不要在不同的数据类型之间进行转换,

如果一定要进行,可以在同种类的数据类型间进行长度增加的转换,但是不要进行长度减少

的转换,以期避免数据丢失。

二、顺序和选择结构程序设计

(1)结构化程序设计

1.结构化程序设计的三种基本结构

顺序结构:顺序结构就是一组逐条执行的可执行语句。按照书写顺序,自上

而下执行。

选择结构(分支结构)。选择结构是一种先对给定条件进行判断,然后根据

判断的结果执行相应的命令的结构。

循环结构。循环结构是指多次重复执行同一组命令的结构。具有循环结构的

程序一般必须指定循环终止的条件,以便对程序的循环进行有效的控制,以免进入无限循环

(或称死循环)状态。循环结构一般有两种,当型循环和直到型循环。当型循环的含义是:

当条件P成立时,反复执行A,条件P不成立时,结束循环;直到型循环的含义是:反复

执行A,直到条件P不成立。通常情况下,我们称条件P为循环条件,而将动作A称为循

环体。

循环次数是指循环动作所进行的次数。有些程序在循环执行之前是无法预知

循环次数的,而另一些程序在循环之前就知道循环次数。

(2)语句与分程序

1.复合语句与分程序结构

复合语句在语法上相当于一个简单语句,在程序中可以作为一个独立语句来

看待,因此又称分程序。复合语句的执行按在其中的语句顺序执行。复合语句中的每个说明

语句和执行语句都必须带分号,而在花括号的后面不用加分号。用复合语句代替多个简单语

句是C语言的特征之一。其优点是:使用灵活,并可以在分程序中使用局部变量。

(3)顺序结构程序设计

顺序结构设计的步骤可以归纳为:

用预处理命令包含文件或进行宏定义;定义变量(即分配存储空间);为变量赋

初值(可以用赋值语句或输入函数);计算;输出结果(用输出函数)。

如果在编译程序中如果有用到一些较为复杂的数学计算,应该在C的编译的

开头写上#include"math.h"

(4)算术运算符和赋值运算符

1.算术运算符的种类及运算

两个数相除,结果仍为整数,商向下取整数,相当于数学中的整除运算;

取模运算%实际上是数学运算的求余数运算。

2.算术表达式及算术运算符的优先级

算术运算符的优先级与数学中基本相同,即先乘除,后加减。取模运算的

优先级与乘除相同。函数和括号的优先级最高。

3.算术运算符的结合性

C语言规定双目算术运算符的结合性是自左至右,双目运算符的结合性和

数学运算一致。

在做除法时,一定要验证除数是否为零的问题。

4.普通赋值运算符

赋值号与数学中的等号是不同的,如X=X+1在数学中是不成立的,但是

在编译中,表示将X+1后的值再赋给X;赋值运算的优先级小于算术运算符。赋值运算符

的结合性是自右至左。

(5)复合赋值运算符

复合赋值运算符的使用规则是:*(^=丫与*=*(^丫等价,例如,a*=b-2等价

于a=a*(b-2)o

(6)选择结构设计

4.1.1关系运算符和关系表达式

1.关系运算符工

关系运算:是对两个操作数之间进行比较的运算符

关系运算的结果:为逻辑值“真”或“假”

(逻辑值也称“布尔”值,boolean)„

C语言中提供六种关系运算符:<、<=、>=、>、==、!=

★优先级:«<=>=»高于(==!=)

★“等于”的关系运算符是,而是赋值运算符

2.关系表达式

关系表达式:用关系运算符把两个表达式连接起来的式子

一般形式为:

表达式1关系运算符表达式2

例如:

x>3工

y*5<100/a

x==0

x!=10

3.关系表达式的值

关系表达式的运算结果为真或假,由于C语言无逻

辑类型常量,规定用1和0代替。

逻辑真,记为1,逻辑假,记为0。

反之:用。表示假,非。表示真。

非零即真,如!5(对五取反)的逻辑值为0。

各种运算符的运算顺序是!(非运算)>算术运算符〉关系运算符〉&&>||>赋值运算符

c语言中的逻辑运算符有三个:

逻辑与(&&)、逻辑或(II)、谴辑非(!)

&&(逻辑与)两个量都为真时为真(1),否则为假(0)

||(逻辑或)两个量中只要有一个为真时为真(1),只有都

为假时为假(0)

!(逻辑非)一个量为真时为假(0),假时为真(1)

表4・3逻辑运算真值表

ab!a!ba||b

丰。丰。00卡1

聿。00101

0本01001

001100

逻辑表达式是用逻辑运算符连接起来的的式子,如果出现形如逻辑表达式i&&(H)

逻辑表达式2类型的算式,则应先计算逻辑表达式1或逻辑表达式2的值,再进行两个表达

式结果之间的与运算或或运算。逻辑计算的结果非真即假,也就是非0即1。

参加逻辑运算的可以是任何类型的数据,但是系统只会根据其是0还是非0简单的

判定真假。

在书写表达式时,要注意一些由格式不当引起的语义错误,例如5<=X<=20,在数

学中有很明确的含义,即X大于等于5,小于等于20.。随着X的取值范围变化,这个语句

可能为真,亦可能为假,但在计算机中,如果以这个语句恒为真,执行顺序为由左至右,不

管X的值为几,X<=5的值只能为1或0(非真即假,所以非0即1),0和1均小于20,故

整个语句的值永远是1,故在计算机中要想表示该表达式的正确意思,应用X>=5&&X<=20

这种形式来表达,此类问题是需要格外注意的一点。

应注意,等号的表达是用=="=”在计算机中是赋值符号。

练习:计算下面表达式的值。

9-!4<8&&3||6>7

由运算顺序可知,现计算非运算,故先计算!4的值,4非0,取反即为0,故

9-0<8为假,故与运算符左边的值是0;同理可判定与运算符的右边为1,故整个表达式的

值是0

If语句:

简单if语句流程图语句的执行过程:

先计算“条件”,若条

件成立(值为“真”),则

执行“语句体”;否则什

么也不做。

此处的“语句体”可以

是简单语句,也可以是

用一对大括号气》”括起

来的复合语句。

简单if语句流程图

前导语句

If(条件表达式)

语句1:

语句2?

语句m

后续语句

单分支语句结构如下:

前导语句

if(条件)

{

语句体1;

}

else

{

语句体2;

}

后续语句

多分支结构如下:

if^elseif语句实现多分支选择结构

其一般形式为:

if(表达式1)

语句体1;

elseif(表达式2)

语句体2;

elseif(表达式3)

语句体3;

I!

else懈表达式n)

语句体n;

耐se

语句体n+1;

当IF语句中只有一个条件时,大括号可以不写,但为形成良好的编写习惯建议写下

大括号。

IF的条件语句是真时,才会执行大括号里的语句,如果为假,则不执行括号内语句。

多分支语句对于括号的要求与单列语句是一致的。但此时强烈建议写上大括号,因

为在分支太多而无大括号是,会出现系统自己无法找到与某个else配对的If的情况,此时

系统会没有用花括号明确表明嵌套关系的情况下,会把else划归离它最近的IF,C语言的

这种规定可能会导致运行结果与编程目的不符的结果。

例题:

3.中国三大电信运营商的电话号码段如下:

(1)中国移动:

2G号段:134、135、1B6、137、138、139、150、

151、152、158、159

3G号段:157、187、188

(2)中国联通:

2G号段:130、131、132、155、156

3G号段:185、186

(3)中国电信:

2G号段:133、153

3G号段:180、189

要求:根据输入的号码段,输出运营商及号段种类

如输入:180,输出:中国电信3G.

ttinclude"stdio.h〃

voidmain()

{

intcl;

printf(〃请输入您的号段:〃);

scanf(〃%d〃,cl);

if((cl>=134&&cl<=152)||cl>=158||cl<=159)

printf(〃您的号码是中国移动2G号码〃);

elseif(cl==157||cl==158||cl==159)

printf(〃您的号码是中国移动3G号码〃);

elseif((cl>=130&&cl<=132)||cl==155||cl==156)

printf(〃您的号码是中国联通2G号码〃);

elseif(cl==185||cl==186)

printf(〃您的号码是中国联通3G号码〃);

elseif(cl==133||cl==153)

printf(〃您的号码是中国电信2G号码〃);

elseif(cl==180||cl==189)

printf(〃您的号码是中国电信3G号码〃);

else

printf(〃您输入的号码有误,请重新输入〃);

Switch条件语句:

1.形式

Switch(某个变量)

{Case常量1:语句1;break;

Case常量2:语句2;break;

Case常量n:语句n;break;

2.注意事项:

Switch的条件常量必须是整形数或者字符,不能是小数或分数。

同一个switch结构中的常量表达式的值应该不同,否则会发生错误。

Switch结构中的break很重要,如果不出现break,系统将依次执行switch中的各条语

句。

Switch结构中的最后一句可以不加break,因为结构已经快要结束了,会自动跳出结构。

多个case可以执行相同的语句,不用每个语句都写一遍,在最后一条写上即可。

形如:

Case常量1

Case常量2

Case常量3

Case常量4:语句1;break;

Case常量5语句2:break;

条件运算符和条件表达式:

1.一般形式为:

表达式1?表达式2:表达式3;

当表达式1为真,就执行表达式2;表达式1为假,就执行表达式3。

2.使用时的注意事项:

条件运算符?和:是一对运算符,在条件表达式中不可分开单独使用。

一个条件表达式或用于赋值语句中,或用于另一个表达式中,不要单独构成一条语

句,即x<y?x+y:x-y;无任何输出,是无意义的,因为X和Y均无赋值。

条件运算符的结合性是自右向左,即a>b?a:c>d?c:d应理解为a>b?a:(c>d?c:d)

条件运算符“?”和“:”是一对运算符,其优先级别高于赋值运算符,低于算术运

算符。

3.例题应用举例:

3,根据输入的时毗将一天24小时分为凌晨⑻

〈6)、上午(才,6Y2)、中午('殖12Y4)、下午

fp',14Y8)、晚上(忙18~24)输乱

解答:

ttinclude"stdio.h〃

voidmain()

intt;

scanf&t);

(0<=t&&12>t)?((0<=t&&6>=t)?printf(〃凌晨〃):printf(〃上午〃))

:((24>=t&&14〈=t)?((14〈二t&&18>=t)?printf(〃下午〃):printf(〃晚上〃))

:printf(“中午〃));

While循环

1.While表达式的条件必须用括号括起来。

2.While(i),在设定这个循环条件时。应该注意i的设定,预防进入死循环。

3.当循环体中有两句及以上的语句时,必须用大括号把这些语句括起,这一点与IF语句

一致。

4.计数变量i要注意其初值和位置,不同的位置与处置也许会对循环造成极大的影响。

5.循环的三个要点是:循环变量的初始值,循环条件和循环条件的增量。

6.While语句的一般形式:

While(表达式)

循环体语句;

7.表达式一般是关系表达式或逻辑表达式。

8.do-while语句的语法格式

do

语句体;

While(表达式);/*结束*/

Do-while语句用于实现直到型循环,不管条件是否成立,至少执行循环体一次。

For循环

For(表达式1;表达式2;表达式3)

{

循环语句;

表达式1、表达式2、表达式3的功能分别是初始表达式、循环条件表达式、变值增量表达

式。

For语句与while语句并没有什么本质上的区别,只是for语句把while语句中的几个关键条

件集中起来,写在了括号里,便于观察,这种方法在程序语句条数不多时没有什么卵用,只

有在语句条数很多时才能体现出优势。

For语句的使用很灵活,三条语句都可以省略掉,由其他位置的语句代替。

循环嵌套

一个循环体中含有另外一个循环体,这样的方式称为循环嵌套,循环嵌套可以嵌套同种循环,

也可以嵌套不同种的循环。

内层循环与外层循环的关系类似于秒针、分针、时针的关系,最内层的循环从初始条件到溢

出条件走完一遍,其外层循环的计数单位才加上一,及其类似于当秒针从0到60跑完一个

循环,分针才会走动一格。把握原则即可。

Break语句和continue语句的区别:系统一旦读到break语句时,会自动跳出当前循环,往

下执行,而系统continue语句时,会跳到循环的条件判定处,如果条件符合,将重新从头执

行循环。

循环结构是最重要的计算机结构,因为计算机的优势就在于可以连续不断的重复工作。

用循环结构解决实际问题的方法大致可以分为以下几类:求和(积),迭代,穷举等。

函数

函数是一段可以重复调用、功能相对完整的程序段

C程序的执行是从main函数开始的,也要从main程序结束,函数与函数之间并没有从属关

系,函数之间可以相互调用,但不能调用main函数。

一个函数的使用主要包括函数声明、函数调用和函数定义其格式如图所示:

6.2.2函数的结构

include<stdio.h>函数声明

floatfac(intk);

voidrnainQ函数调用

longt;

t=fac(8)/(fac(5)*fac(8<5));

printf("C(8,5)=%ld\nH,t);

)I

floatfac(intk)

inti;longf=1;

for(i=1;i<=k;i++)f=f*i;

retum(f);

)

如果函数是在另一个函数中声明,那么这个被声明的函数只能在它声明的函数中调用。如果

想要让所有的函数都可以调用定义的函数,那么应该在所有的函数开头(即最上方)声明该

函数。

函数声明的作用是通知系统该函数已经定义过。

当一个函数的定义在它的调用之前,就可以不用声明。

函数声明的一般格式:函数原型(定义函数的第一行)+分号

函数大致可以分为四类:无返回值无参数、无返回值有参数、有返回值无参数、有返回值有

参数,图表如下:

r无参数clrscr();

无返回值・

有参数window(20,5,60,20);

函数

无参数x=rand()%100;

有参数v=4/3.0*pi*pow(4.5,3);

无参数无返回值调用类型的格式与举例:

格式:

1.无参数无返回值类型

表示无参数

⑴定义r

void函数名(void)可省略

{-

表示无返回值

不要省略

(2)声明

void函数名(void);函数体

(3)调用

用函数语句调用:函数名();

举例:(计算梯形面积程序)

/*Note:VourchoiceisCIDE*/

ttinclude"stdio.h"

uoidarea();

uoidnain()

<

area();

>

uoidarea()

<

inta,b,c,d;

printi(“请谙入梯形的上底、下底和高:,,);

scanf("%d%d%d",fea,&b,&c);

d=((a+b)*c)/2;

printf(“梯形的面积是

有参数无返回值的格式与举例:

格式:

2.有参数无返回值类型

(1)定义表示有参数

void函数名(形参列表)

表示无返回值

不要省略

(2)声明

void函数名(形参列表);

(3)调用

用函数语句调用:函数名(实参列表);

举例(计算n到m的值):

/*Note:VourchoiceisCIDE*/

ttinclude"stdio.h"

uoidsum(intm,intn,inta);

uoidmain()

<

int,a=0;

printF「请输入累加的上限和下限“);

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

sum(m,n,a);

>

uoidsum(intm.intn,inta)

<

For(;n<=n;m++)

<

a=a+m;

>

printer累加和为常d'a);

>

无参数有返回值类型:

格式:

3.无参数有返回值类型

(1)定义

数据类型函数名(void)

return返回值;

}

(2)声明

void函数名(void);

(3)调用

用函数表达式调用:变量=函数名();

有参数有返回值类型:

4•有参数有返回值类型

(1)定义表示有参数

数据类型函数名(形参列表)

表示有返回值

return返回值;不要省略

)---------------表示符结果返回,

(2)声明返回值-函数的值

void函数名(形参列表);

(3)调用

用函数表达式调用:变量二函数名(实参列表);

x___________

接收返回值

返回值的数据类型必须与函数的数据类型相同。

形参与实参二三事

实参对型惨的数据传递只能是单向的,只能由形参传递给实参,而不能从形参传递给实参。

形参与实参的三个一致性要求:

形参与实参的必须个数相等、数据类型一致、数据一一对应。

数据传递

数据传递的方法主要包括三类:参数传递及函数返回值、批量数据传递、外部变量三种办法。

利用参数传递及函数返回值是比较常用的数据传递方法,用return语句即可实现。

利用数组名实现批量数据传递的方法是使用传递数组,可分为传值和传址两类,传递数据名

的特点包括效率高,无需返回值,可双向传递但有安全隐患。

利用外部变量实现数据传递

使用外部变量实现数据传递的原因是外部变量作用域广,寿命长,有记忆能力、为各函数共

享,便于函数间的数据交流,实现多值的返回;使用外部变量的缺点:破坏了信息传递的隐

蔽性、降低了函数的通用性和可移植性。

函数的调用方式:

函数的递归调用:是指一个函数在它的函数体内,直接或间接的调用该函数本身。

直接递归调用间接递归调用

解递归问题的关键是找出递归规律和递归

终止条件。

递归规律:使问题向递归终止(边界)条件转化的规律

O递归规律必须使问题越来越简单。

递归终止条件:也就是所描述问题的最简单情况,

它本身不再使用递归规律。

函数的嵌套调用:是指在执行调用函数时,被调用函数又调用了其它函数。

函数的嵌套调用嵌套函数之间的关系有些类似于微机原理中的中断原理,即先不断的递归调

用到不满足调用条件为止,再不断地进行返回操作知道最初的一层。递归调用也可以看作是

一种特殊的嵌套函数效果图如下:

变量的作用域和生存期:

「按定义位置{r外内部部变量

变量j(动态存储变量

〔按存储位置<静态存储变量

、寄存器变量

内部变量:

内部变量是指定义在某个函数内的变量,其定义合法仅限于该函数。

作用域:只在本函数范围内可见。

生存期:函数调用的开始至结束。

外部变量:

外部变量是指定义在所有函数之外的变量,其定义在整个程序中皆合法。

作用域:整个程序中可见。

生存期:程序的整个运行期间。

内部变量和外部变量的作用域与生存期小结

作用域生存期

仅限函数内(或复合函数(或复合语句)调用的开

内部变量语句内)引用始至结束。

外部变量在整个工程中引用程序的整个运行期间

当外部变量与内部变量重名时,遵循就近原则,即哪个定义近,变量就被赋予了那个值。

静态存储区:

使变量进入静态存储区的两种方式:将变量定义在函数外部(外部变量);在函数内部使

用static关键字定义变量(内部变量);常量一般也放在静态存储区中,

动态存储区:

将变量定义在函数内部,并用auto声明。(内部变量)。

作为函数定义的形参,如:

voidmain,)

(

autointx=1,y=5;/*内部变量x、y声明为动态存储7

加中,y|;

}

voidfuc(intm,intn)产形参m、n作为函数的形参为动态存储”/

(

inttime=0;/*内部变量time使用动应存储7

printf("m+n=%dH,m+n|;

)

CPU寄存器:

将变量定义在函数内部,并用register声明即可使函数进入CPU寄存器。

内部变量和外部变量的作用域与生存期小结

定义存储类别

位置存储位置作用域生存期

美美宇

static仅在当前文件中引用

外部

静态存储区程序的整个贬行期间

变量

不用static可在整个工程中引用

静年存储区static程序的整个运行期间

内部auto仅限函数内(或复合语

动态存储区

变量(可省)句)内引用函数(或复合语句)调用的

开始至结束

CPU寄存器register

数组:

数组是指一组具有相同相同名称、相同数据类型的有序变量组成。数组满足下列条件:具有

相同的名字;具有相同的数据类型;在存储器中连续存放。

一维数组的定义格式:类型标识符数组名[常量表达式];在定义时,中括号中必须是常量

而不能是变量,常量表达式说明数组的大小,即数组中元素的个数,故只能使用常量,且该

常量时整形数,不能是小数。

数组名要符合标识符的命名规则,且不能和其他变量重名。

一维数组在引用时,引用格式是:数组名[表达式],引用时表达式可以使常量、也可以是

变量,表示调用了数组中下标为变量值的数组元素;数组下标从0开始,但不能大于[数组

长度-1]的那个数;引用时只能引用某一个数组中的元素,不能引用整个数组;C语言编译

系统不检查数组下标的越界问题!!

intA[5]={11,20,32,14,15);

intB[5]={47,12,25,21,67);

上述形式叫做数组的初始化,大括号中的数被依次付给了变量中的每个元素,初始化允许只

初始化一部分元素,若初始化的数没有覆盖数组中所有的元素,则没有覆盖的元素没默认赋

值为0;静态数组(static)的默认初值均为零,动态数组初值不定;初始化时允许省略数组

长度(即在方括号中可以不填元素个数)。

二维数组

二维数组的定义:类型标识符数组名【常量表达式1】【常量表达式2】,其中常量表达

式1表示二维数组的行数、常量表达式2表示二维数组的列数。

二维数组的引用形式:数组名【行下标】【列下标工二维数组的元素数是行数乘列数,行下

标和列下标的取值范围是【a-1]

二维数组的初始化:

全部初始化:按行分段初始化:形如int【213】{{1,2,3},{4,5,6}}一个大括号括起的是一

行的元素;按行连续初始化:形如int【2【3】{1,2,3,4,5,6}这些数值会按顺序依次赋给从00

到12对应下标的元素。部分初始化:形如int【2】[3]={{1,2,3},{4,5,6}}和int[【2】【3】

={1,2,3}则未被初始化到得元素会自动赋值为0;第一维长度省略初始化,例如int【】【3】

={{1},{4,5}}=>a[2】【3】,int【】【3]={l,2,3,4,5}=>a⑵[3],按行顺序初始化的省略是

和元素总个数和赋值个数综合确定的,比如上面的例子,1,2,34,5共有5个元素,所以第一

个空格中只能填2,如果填1的话只有三个元素,装不下五个元素,所以只能填2使得数组

包含元素格式刚刚大于赋值数值的个数。定义时无论数组有几维,初始化时只能省略第一

维!!!

数组与函数的参数:

数组值做函数的实参:与单独变量做函数的参数完全一样,只是单独变量做参数时使用的是

变量名,数组元素作参数时填的是数组名[元素序号]。数组做函数的实参:在调用时直接

使用数组名即可,数组名此刻不但代表共同的名字,还代表着数组的首地址,即数组中第一

个元素的地址,换句话说,数组作实参时,传递的是地址而不是值;在把整个数组做参数的

函数在函数名后的括号中,应该有定义一个形参数组,如图:

7.3数组作为函数的参数Ia[1]

—a[2]

例7.10用函数计算数组元素的总和。a[3]

a[4]

#include"stdlo.h"

a[5]

voidmain()

a[6]

inta[8]={1,2,3,4,5,6,7,8},c;—a[7]

c=sum(a,8);/*函数调用:将数组名a和其组元数作为实参*/

printf("sumis%d",c);

sum(intbfj^intz)/*函数定义:同型数组b和变量z做形参*/

{inti,s=0、^

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

此处是否标注组员数无影

s=s+b[i];

响,形参数组的作用是接收

return(s);

实参数组的首地址。

在传递完成后,形参数组与调用的数组实际上已经是同一个数组,改动任何一个,另外一个

也会自动做出相同的改变。

字符数组:

C语言中,单引号括起来的是字符,双引号引起来的是字符串,同时C语言中没有字符串数

据类型。

字符数组就是数据类型为字符型的数组。

字符数组的初始化方法:

chartest[8]={'a','b','c','d',"e\T,'g\'h'>;

chartest[8]="abcdefgh";

chartest[]=Hgong1403class";

二、字符数组的初始化

与一般数组一样,字符数组也可以初始化,如:

charchName[8]={'A',T,'『,*c','e'};

(1)如果花括弧内的字符个数大于数组长度,则按语

法错误处理。

(2)如果花括弧内的字符个数小于数组长度,则只将

这些字符赋给数组中前面那些元素,其余的元素自

动定为空字符(即'\0')O

(3)字符数组的长度也可用初值来确定

(4)也可以直接用常量字符串进行初始化赋值

字符串的输入输出方法:

7.4.2字符串的输入输出方法

1.单个字符的输入输出-用“%c",字符逐个输入输出

方法一:

chars[80];

scanf("%c",&s[i]);/*0<i<=79*/

printf("%c",s[i]);/*0<i<=79*/

方法二:[

chars[80];

s[i]=getchar();/*0<i<=79*/

putchar(s[i]);/*0<i<=79*/

2.字符串整体输入输出•用“%s”格式控制符

方法一:

charstr[80];

scanf("%s",str);"遇到空格不再接收数据,回车输入结束(无&)*/

printf("%s",str);

方法二(推荐):

charstr[80];

gets(str);"输入都可接收,遇到回车结束输入*/

puts(str);

注:scanf和gets在输入结束后会自动补'\0'

在接收字符串时,使用scanf和gets是不同的,scanf遇到空格或回车都不再接受字符,而

gets只把回车当成结束输入的标志。

7.4.3字符串及其结束标志30':

字符串是用双引号括起来的若干有效字符序列。

字符串可以包括字母、数字、专用字符、转义字符

等。如“Iamastudent"、“Basic"、"x+y=%d\n"

等都是合法的字符串。

万般来讲,字符串是利用字符数组存放的。在进

行字符处理时,必须事先知道字符数组中的字符个

数,这在程序设计过程中是很麻烦的一件事。

I为了有效而方便地处理字符数组,c语言提供了7

:不需要了解数组中有效字符长度的方法。其基本思彳

7想是:在每个字符数组的有效字符后面(或字符串末7

!尾)加上一个特殊字符'\0’(其ASCII码值为0),在处理,

7字符数组的过程中,一旦遇到结束符w,就表示已?

7达到字符串末尾。同时,c语言允许用一个简单的字;

:符串常量初始化一个字符数组,如:彳

chartest[50^="Happy";

)等价于彳

chartest[20]={'H','a','p','p','y','\0'};

在使用键盘输入数据时,在输入完成后,按下回车键,系统会自动的在末尾补上'\0',不用

手动输入,但注意,不要超过数组长度,'\0’虽然并不显示,但是也会占用一个数组名额。

字符数据与数值数组传递的比较:

5.字符数组的传递:5.数值数组的传递:

voidmain()voidmain()

((

charch[10]="student";chara[10]={2,4,7,1,2,5,5,3,968);

printf("%c",count(ch));printf("%d",count(a,10));

)}

i

温馨提示

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

评论

0/150

提交评论