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

下载本文档

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

文档简介

C程序设计§1.3简单的C程序介绍

为了更好、更快地掌握C程序,我们先看几个C语言程序:例1.main(){printf("Thisisacprogram\n");}例2.main()/*求两个数之和*/

{

inta,b,sum;/*这是定义变量*/

a=123;b=456;sum=a+b;printf("sumis%d\n",sum);}例3.main()/*主函数*/{inta,b,c;/*定义变量*/scanf("%d,%d",&a,&b);/*输入变量a和b的值*/c=max(a,b);/*调用max函数,将得到的值赋给c*/printf("max=%d",c;)/*输出c的值*/}intmax(x,y)intx,y;/*对形参x、y作类型定义*/{intz;//max函用到的变量z,也要加以定义

z=y;if(x>y)z=x;return(z);/*将z的值返回,通过max带回调用处*/}通过分析,初步看到:1.C程序全部由一个一个的函数构成。至少有一个主函数main(),其它函数可被主函数调用或相互调用。其它函数可为C函数库中函数,也可为自己编的函数。上述特点称为程序的模块化.2.

函数的构成:

函数说明+函数体

函数体:

变量定义与执行语句

可允许空函数:

dump(){}函数说明包括:函数名、类型、属性、参数等3.

函数的执行一定从main()开始。尽管main()函数位置可自由。4.

书写自由,一个语句可多行,一行可多个语句。5.

每一条语句必须有一个分号;6.C语言的输入/出均以函数形式出现。scanf(),printf().7.

可用/

/对C语言加注释第二章数据类型、运算符与表达式§2.1.数据类型

著名计算机科学家沃思提出:

程序=数据结构+算法

所以,存放数据的方式直接反映了一种语言的数据表达能力。数据的存储方式又称之为:数据类型。

举一个例子:以考生各科成绩及总分排队问题为列。

成绩的存放–––以数组形式

排队方法––––算法C数据类型丰富,分为:基本类型构造类型指针类型空类型整型字符型实型单精度双精度数组结构体共用体数据有常量、变量之分,均为其中一种类型。枚举例:#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}还可用一个符号表示一个常量符号常量2.2.2变量

程序执行中可以改变的量称为变量。变量包括变量名和变量值。变量名

用标识符命名,对应一定数量的内存存贮单元,其单元数视变量类型而定。标识符

由字母、数字、下划线组成且由字母或下划线开头的字符串。

标识符可用来命名变量及作为常量名、函数名、类型名、文件名等,一个程序内不得有重复名。

如:_sum,sum,student_name,price等

习惯上,变量名、函数名等用小写字母表示。常量名用大写字母表示(以增加可读性)。C语言中,变量须先定义,后使用如:intstudentstudent=30;

则若写成student=30,则未定义,编译时指出其错。

一旦变量被定义,即可在编译时为其分配相应数量的单元,并检查其运算的合法性。§2.3整型数据2.3.1整型常量整型常量

整型常数C语言提供了三种形式

十进制如:256,308,-120等八进制以数字0开头表示的整数例:0235,0146-012等.0235=2×82+3×8+5=15710

0146=1×82+4×8+6=10210-012=-(1×8+2)=-1010十六进制以"0x"开头的整型数

如:0x16,0x28§2.4实型数据2.4.1实型常量有二种表示形式

1.十进制形式如:0.126,523.64等2.

指数形式对于较大或较小的数,可用指数形式

0.00001261.26E–512600001.26E+6或1.26E6'E','e'均可.§2.5字符型数据

用一对单引号括起来的单个字符。

如'a','A',二者不一样.

此外,以"\"开头后接一个字符或n个字符代表了一种特殊字符常量。–––转义字符。

如\n––换行,\r––回车2.5.1字符常量其它如下表:字符形式\n\t\v\b\r\f\\\'\ddd\xxh功能换行横向跳格(即跳到下一个输出区)竖向跳格退格回车走纸换页反斜杠字符“\”单引号(撇号)字符1到3位8进制数所代表的字符1到2位16进制数所代表的字符其定义方式为:

charc1,c2;c1='A';c2='B';字符变量只占一个字节单元。2.5.2字符变量用来存放一个字符的变量.

一个字符存入一个字符变量。其对应单元存放的是其ASCII码,即ASCII码的二进制形式。

由此:字符变量中的数据是一整型数据。输出时既可输出字符,亦可输出整数,且字符变量可作整数运算。2.5.3字符数据的实际存放形式例1:main(){charc1,c2;c1=97;c2=98;printf("%c%c",c1,c2)}运行结果ab

看如下几个例子:例2:main(){charc1,c2;c1='a';c2='b';c1=c1–32;c2=c2–32;printf("%c%c",c1,c2)}运行结果AB例3:main(){inti;charc;i='a';c=97;printf("%c,%d\n",c,c);printf("%c,%d\n",i,i);}

运行结果:a,97a,97用双引号括起来的字符串。

例:"GoodMorning!"

注意'A'与"A"是不同字符串存放时,在最后加上"/0"––空字符。

于是:GoodMorning!/02.5.4字符串常量"A"A/0但'A'

A注意:1.

字符串长度=实际字符个数+1,但最后\0不输出.

printf("GoodMorning!")此处不写/0。自动加上。2.

单个字符的字符串不能赋给字符变量。

例:charc;c="a";是错误的。§2.8算术运算符与算术表达式运算符:运算的符号表示。

C语言有丰富的运算功能,先简述之2.8.1.C运算符1.

算术运算符+,–,,/,%,等3.

逻辑运算符!,&&,¦¦2.

关系运算符>,<,==,>=,<=,!=4.

位运算符<<,>>,~,¦,^,&.5.

赋值运算符=等6.

条件运算符?=7.

逗号运算符,8.

指针运算符*,&11.

分量运算符•,,12.

下标运算符[]13.

其它运算符如函数的调用()9.

求字节数运算符sizeof10.

强制类型转换运算符(类型)

2.8.2算术运算符和算术表达式一、基本算术运算符+

加法正值3+6,+3–减法负值6–4,–5乘法38/除法8/5%求余7%4的值为3注:

两个整型数据相除(结果为整,一般向零靠拢)。–5/3–1“/”中,有一个float,则结果为double型,使用时千万注意int/int出现数据丢失。四、自增,自减运算符设有inti=3;++自增1––自减1则:++i,i++都会使i变为4,但有区别:++i:先使i值+1,再使用i值;i++:先使用i值,再使i值+1.j=++i;j=4,i=4.(i=i+1;j=i;)j=i++;j=3,i=4.

(j=i;i=i+1)同理:––i,i––,均使i值–1,但:

又如:printf("i=%d\n",i++);

结果:i=3若:

printf("i=%d\n",++i);

结果:i=4––i:先使i值–1,再使用i值;i––:先使用i值,再使i值–1i=3;几点注意:1.++和––运算法只能用于变量,不得用于常量和表达式.2.++,–

–,的结合性为从右至左,而一般算术运算符为从左至右。如:如5++,(a+b)++均为不合法.–i++"–"和"++"为同一优先级.–i++相当于–(i++)若i=3,则结果为–3,i为4.++,––主要用于循环变量自增或自减。第三章最简单的C程序设计§3.1C语句概述C语句全部为可执行语句,对应若干机器操作指命令C程序由许多源文件组成。(分别编译,然后连接)每一个源文件由预编译命令和若干函数组成。每一个函数由说明部分和语句部分组成。其结构如图除说明部分外,重要部分为语句部分。C程序源程序文件1源程序文件i源程序文件n预编译命令函数1函数n说明部分执行部分(语句)……控制语句––改变语句的执行顺序共有9种控制语句:if()~else~(条件)for()~(循环)while()~(循环)do~while(循环)continue(结束本次循环)switch(多分支选择)break(中止整个循环)goto(转移)return(函数返回)()表示条件,~表示语句

在C程序的顺序、选择、循环三种结构中,选择结构是一重要结构第四章逻辑运算和判断选取控制问题:条件如何表达?逻辑运算、关系运算§4.1关系运算符

关系运算比较运算,如:a>3为一比较运算,当a=5,a>3成立。结果称为“真”,否则,如:a=1,a>3不成立,为假。上述表达式a>3称为关系表达式。4.1.1

关系运算符及其优先次序1.<,<=,>,>=为同一优先级,==,!=等为同一优先级,但前者高于后者。2.关系运算符优先级低于算术运算符。C语言提供了六种关系运算符

<<=>>===!=优先级为:3.关系运算符优先级高于赋值运算符。如下图:算术运算符赋值运算符关系运算符高低举例:c>a+bc>(a+b)a>b!=c(a>b)!=ca==b<ca==(b<c)a=b>ca=(b>c)4.1.2

关系表达式关系表达式的结果值规定为1或0.如:a>b,a+b>b+c,(a=3)>(b=5),'a'>'b',(a>b)>(b<c)完整的定义:用关系运算符将两个表达式(算术、关系、逻辑、赋值、字符等表达式)连接起来的式子。1––结果为真(成立)0––结果为假(不成立)§4.2逻辑运算符和逻辑表达式

用逻辑运算符将关系表达式、逻辑表达式连接起来的式子–––逻辑表达式。a&&b当a,b均为1时,才为1a¦¦b当a,b中有一个为1时,才为1!a当a为1,!a为0,反之为1.由此看到:¦¦和&&为双目运算符.!为单目运算符。4.2.2

逻辑表达式

1.逻辑表达式的值与关系表达式值一样,真为1,假为0。例:a=4则!a值为0.此处只要a0,为真.则!a值为0.a=4,b=5a&&b为1

前面已定义了逻辑表达式,以下看一看逻辑表达式的值及具体的运算。程序的三种基本结构

从结构化程序设计角度出发,程序有三种结构:·顺序结构·选择结构·循环结构1.顺序结构表示ABAB先执行A,再执行B.2.选择结构表示为ABPTFBTPFA存在某条件P,若P为真,则执行A,否则执行B。3.循环结构表示为PFTAAP为T(1)当型结构当P条件成立时(T),反复执行A,直到P为“假”时才停止循环.有两种结构:当型和直到型(2)

直到型APFTA直到P为真

先执行A,再判断P,若为F,再执行A,如此反复,直到P为T.

另外:由选择结构可以派生出另一种基本结构––多分支结构.KK=K1A1A2AiAn……K=K2K=Ki

已证明:上述三种结构组成的程序可以解决全部的问题,所以任何一种高级语言都具备上述三种结构。§4.3if语句–––条件判断4.3.1if的三种形式功能:当表达式值非0时,执行语句A,否则不执行语句A.表达式语句A=00例如:

if(x>y)printf("%d",x)形式1

if(表达式)

语句A其流程图:形式2if(表达式)

语句Aelse语句B功能:表达式为非0,执行语句A

表达式为0,执行语句B表达式语句A语句B0=0例:if(x>y) printf("%d",x); elseprintf("%d",y);形式3if(表达式1)

语句1

elseif(表达式2)

语句2elseif(表达式3)

语句3……elseif(表达式n)语句nelse

语句n流程:表达1表达2表达3表达n语句1语句2语句3语句n语句n语句1……0=0=0000如:if(3)prinft("o.k");if('a')…1.表达式可以是逻辑、关系,甚至是算术表达式。2.上述形式中的语句必须以分号结束3.上述形式中的语句可以是由{}括起来的复合语句。此时,在{}外可以不用分号.注意的问题:main(){floata,b,t;

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

{t=a;a=b;b=t;}printf("%5.2f,%5.2f",a,b);}例4.1输入两个实数,按代数值由小到大次序输出这两个数。

3.6,–3.2–3.20,3.60运行情况如下:例4.2输入三个数,按大小顺序输出。main()

{floata,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b)

{t=a;a=b;b=t;}if(a>c)

{t=a;a=c;c=t;}if(b>c)

{t=b;b=c;c=t;}printf("%5.2f,%5.2f,%5.2f",a,b,c);}运行情况如下:3,7,11.00,3.00,7.004.3.2.if语句的嵌套if(表达式1)内嵌ifelse内嵌注意:else与最近的if配对.一般形式在上述形式的if语句中,又可以是if语句–––称为嵌套。if(表达式2)语句1if(表达式3)语句3else语句2else语句4例:if()if()语句2else语句3if(){if()语句1}

else…所以:必要时加{}.if()语句1else§4.4switch语句–––开关语句

问题:当某一表达式有n个取值,每一取值执行一语句,则如果用内嵌if十分繁锁,而用switch简单.一般形式:switch(表达式){case常量表达式1:语句1

case常量表达式2:语句2

case常量表达式n:语句ndefault:语句n+1}例:

根据成绩等级打印百分数段.switch(grade){case'A':printf("85~100\n");case'B':printf("70~84\n");case'C':printf("60~69\n");case'D':printf("<60\n");default:printf("error\n");}

根据表达式的取值,判断其与哪一个常量表达式相等。如=表达式i,则自语句i开始执行,直到语句n+1止。若与所有常量表达式值不相等,则从default后的语句开始执行。功能:以上存在一个问题:没有完全起到分支作用。解决办法:增加break语句,使之跳出switch结构。switch(表达式)

{case常表1:语句1;

break;

case常表2:语句2;

break;……

case常表n:语句n;

break;default:语句n+1;}注:

1.

常表值必须互不相等,否则二异性。2.case顺序无关紧要。3.

不一定非用break不可,有时几种情况合并执行一组语句。switch(grade){case'A':case'B':case'C':printf(">60\n");break;case'D':printf("<60\n");break;}第五章循环控制§5.1概述

前面已介绍了顺序结构,选择结构,本章介绍循环结构。如:

sum=1+2+3+…+100;实际问题:

一组重复执行的语句。则用循环结构解决。C语言用四种形式循环2.

while语句3.

do…while语句4.

for语句1.if语句与goto语句§5.3while语句1.形式:while(表达式)语句2.执行过程:先判断表达式的值。若0.则执行其后面的语句,否则while执行完毕。专门的当型循环语句––while语句3.

流程图:表达式语句0=0下一语句将上述例子用while语句写出

while(i<=100){sum+=i;i++;}语句中应有使表达式=0的语句。否则会出现无限循环–––"死"循环。注:

while后面的语句一般为复合语句,即:加{}§5.4do…while语句

一种专门的“直到型”循环语句。2.执行过程:先执行语句,再判表达式的值,若0,再执行语句,否则结束循环3.流程:语句表达式0=01.形式:do语句while(表达式);main(){inti,sum=0;i=1;do{sum=sum+i;i++;}while(i<=100);printf("%d",sum);}程序如下:while语句与do…while语句的区别:当第一次执行时,若表达式=0时,则while语句与dowhile有所不同,dowhile执行一次后面的语句,而while不执行。§5.5for语句1.形式

首先计算表达式1,接着执行表达式2,若表达式2的值0,则执行语句,接着计算表达式3,再判断表达式2的值.依此重复下去,直到表达式2的值=0(假)。一种形式更为灵活的循环语句。2.执行过程for(表达式1;表达式2;表达式3)语句3.

流程:计算表达式1求表达式2值语句计算表达式3结束for语句=0(假)0(真)用for语句写出上述例子for用while代替的流程表达式1;

while(表达式2){语句表达式3;}for(i=1;i<=100;i++)sum+=i;for语句完全可以用while代替,但for直观、简单、方便4.for语句的几种特例例:任意输入两个整数a,b,求main(){inti,j,a,b,sum;printf("pleaseinputtwonumber!\n")scanf("a=%d,b=%d",&a,&b);i=a;j=b;可以省略表达式1,但须保留分号;这时在for之前就得赋值给循环变量;if(a>b){i=b;j=a;}for(;i<=j;i++)sum=sum+i;printf("\nsum=%d",sum);}

表达式2一般不可省略,否则为无限循环相当于:while(1){sum=sum+i;i++;}例:for(i=1;;i++)sum=sum+i;相当于条件永真、永不为0,若用while表示

表达式3亦可省略,但在循环体中须有语句修改循环变量;以使表达式2在某一时刻为0而正常结束循环。例:for(sum=0,i=1;i<=100;){sum=sum+v;i++;}

若同时省略表达式1,表达式3,则相当于while(表达式2)语句。相当于

while(i<=100)

{

sum+=i;i++;}例:for(;i<=100,){sum+=i;i++;}§5.6

循环的嵌套

与其它语言一样,当循环体中又包含了另一个完整的循环语句时–––嵌套。C有三种循环语句,均可以相互嵌套:

while(){…while() …{}}§5.7

几种循环的比较1.对于同一问题,四种循环可相互替代。但不提倡用goto.2.for循环功能强于while,do…while.但若不是明显地给出循环变量初终值(或修改条件),则应用while或do…while.以增强程序的结构化和可读性。3.要防止无限循环––死循环。4.循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。§5.8

break语句和contiune语句

问题:计算圆的面积r2,半径取1,2,3,4…,当面积>100时结束。for(r=1;r<=10;r++){area=pirr;if(area>100)break;

}printf("%f",area);}5.8.1break语句

从结构化程序要求出发,用break,退出循环,进入下一条语句。

注:break只能用于循环语句和switch语句。5.8.2continuce语句

main(){intn;for(n=100;n<200;n++)if(n%3!=0)printf("%d",n);}问题:编写程序,打印100~200中不能被3整除的数。换一种方式:main(){intn;for(n=100;n<=200;n++){if(n%3==0)continue;printf("%d",n);}}continue语句起了结束本次循环的作用。§5.9

程序举例例1:

求Fibonacci数例:1,1,2,3,5,8,…前40个数。程序要点:每输出4个数时换行。f1=f1+f2;

f2=f2+f1;交替的结果正好为一序列规律:

F1=1,F2=1Fn=Fn–1+Fn–2(n>2)程序如下:main(){longintf1,f2; inti; f1=1;f2=1; for(i=1;i<=20;i++) { printf("%12ld%12ld",f1,f2);if(i%2==0)printf("\n");f1=f1+f2;f2=f2+f1;}}f1=1,f2=1fori=1to20

输出f1,f2f1=f1+f2f2=f2+f1图5.13运行结果为:15342331597109467502551422935245782415781718553772584177111211393832040570288739088169213896104181286571964181346269922746563245986321144987676546368317811217830914930352102334155

判一个数m是否为素数的方法:

每打印10个数,换一次行。当用2,3,…的整数去除它时均不能除尽,则为素数。程序如下:#include<stdio.h>

#include<math.h>main()

{例2.

求100~200的素数.intm,k,i,n=0;for(m=101;m<=200;m=m+2)

{

if(n%10==0)printf("\n");

k=sqrt(m);for(i=2;i<=k;i++)

if(m%i==0)break;if(i>=k+1){printf("%d",m);n=n+1;}}}101103107109113127131137139149151157163167173179181191193197199运行结果如下:一.冒泡法:排序过程:(1)比较第一个数与第二个数,若a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。#include<stdio.h>main(){inta[11],i,j,t;printf("Input10numbers:\n");for(i=1;i<11;i++)scanf("%d",&a[i]);printf("\n");

for(j=1;j<=9;j++)for(i=1;i<=10-j;i++)

if(a[i]>a[i+1])

{t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("Thesortednumbers:\n");for(i=1;i<11;i++)printf("%d",a[i]);}二、

排序问题–––计算机处理数据的一个重要问题排序算法较多,一种最简单的算法–––选择排序法用得较多。基本思路:设有n个数,需将它们从小到大顺序排列。则:2.在剩下的n–1个元素中,找出第二小的元素并把它放在第二个位置上。3.对上述过程重复,直至剩下一个元素。1.从n个元素中,通过比较,找出最小元素,放在第一个位置上。例:8,4,20,100,28,1,两次交换第2次:1,4,20,100,28,8–––

一次交换第3次:1,4,8,100,28,20–––

一次交换第4次:1,4,8,28,100,20,1,4,8,20,100,28两次交换第5次:1,4,8,20,28,100–––

一次交换第1次:4,8,20,100,28,11,8,20,100,28,4

从以上例子可以看到:用到两种循环,第一种循环––找第i小的元素,第二种循––对其后的元素的一一比较。流程图:初始化输入n个元素a数组i1ji+1a[i]>a[j]交换a[i]a[j]BANoYesjj+1j>nii+1i>n–1打印结果结束内循环外循环BANoYesYesNo程序:main(){inta[11];inti,j,t;printf("pleaseinput10n~:\n");for(i=1;i<=n;i++)scanf("%d",&a[i]);printf("\n");for(i=1;i<=9;i++)for(j=i+1;j<=10;j++)if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;}printf("thesortednumbers:\n");for(i=1;i<=10;i++)printf(“%d”,a[i]);}第六章数组

前面所用到的数据均为基本类型(整、实、字符),为了丰富数据类型,须提供强有力的数据表达方式。C语言提供了一种构造类型数据–––由基本类型按某一规则组合在一起。

其中数组:同一种(基本)类型按一定顺序组合在一起的数据类型。§6.1

一维数组6.1.1一维数组的定义1.数组名的确定方法同变量名。2.C语言用方括号[]表示数组元数个数。形式:类型说明符数组名[常量表达式];例:inta[20];floatx[100];3.常量表达式为常量和符号常量。不允许有变量,其表达式的值代表了元素的个数。例:inta[20];

表示有20个元素且元素从0开始编排:a[0],a[1]…,a[19]4.可在定义时对静态数组和外部存储(全局)数组赋初值,方法如下:

对部分元素赋初值

staticinta[10]={0,1,2,3,4};静态

对全部元素赋初值

staticinta[10]={10,11,12,13,14,15,16,17,18,19,}如此,只有前5个元素初值确定,后5个元素由系统设置。如对数组元素赋同一初值,必须一一写出:staticinta[10]={0,0,0,0,0,0,0,0,0,0};若赋全部元素的初值,可省略常量表达式

…a[]={0,1,2,3};

表示a[4],即只有4个元素。6.1.2一维数组的引用2.引用方式:数组名[下标]

代表了一个元素,等价一个同类型的变量。3.一般地,一维数组各元素分配在连续地内存单元之中。1.须象使用变量那样,先定义,后使用例:a[0]5+a[1]6为正确的算术表达式§6.2二维数组6.2.1二维数组的定义1.不可将定义写为inta[4,10]。形式类型说明符数组名[常量表达式][常量表达式]例:inta[4][10];floatx[8][20];2.可将二维数组的元素看成为若干个特殊的一维数组。

如:

intb[3][4];则:有三个特殊的一维数组b[0],b[1],b[2],每一个又有四个元素:b[0][0],b[0][1],b[0][2],b[0][3],b[1][0],b[1][1],b[1][2],b[1][3],b[2][0],b[2][1],b[2][2],b[2][3],3.二维数组的存放方式为:按行存放。由此可推广至三维、n维数组的定义和存放。即:最右边的下标变化最快。4.初始化:

按行给二维数组赋初值:staticinta[3][4]={{1,2,3,4},{5,6,7,8,},{9,10,11,12,}};可以去掉其中的{}。

可以对部分元素赋初值,但需表达清楚。如:staticinta[3][4]={{1,2},{3},{8}}。则相当于120030008000可通过赋初值决定数组大小。如为二维,则只可省略第一维的大小.staticinta[][4]={1,2,3,…,12};6.2.2二维数组元素的引用形式:数组名[下标][下标]

其中的下标为整型表达式,但不得越界。与一维数组元素一样,二维数组元素相当于同类型的简单变量。6.2.3程序举例a=123456b=142536程序如下:main(){staticinta[2][3]={{1,2,3},{4,5,6}};staticintb[3][2],i,j;例1

将一个二维数组行和列元素互换,存到另一个二维数组中。例如:printf("arraya:\n");for(i=0;i<=1;i++){for(j=0;j<=2;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<=2;i++){for(j=0;j<=1;j++)printf("%5d",b[i][j]);printf("\n");}}运行结果如下:

arraya:123456arrayb:142536例2.有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号。max=a[0][0]fori=0to2forj=0to3a[i][j]>maxmax=a[i][j]row=icolum=j输出:max和row,colum真假二维数组一般用二重循环据此写出以下程序:main(){inti,j,row=0,colum=0,max;staticinta[3][4]={{1,2,3,4},{9,8,7,6},{–10,10,–5,2}}max=a[0][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;

}printf("max=%d,row=%d,colum=%d\n",max,row,colum);}输出结果为:

max=10,row=2,colum=1§6.3字符数组6.3.1字符数组的定义类型名数组名大小1.初始化:

直接给出字符串中的各字符

staticchara[4]={'G','o','o','d'};

存放字符数据。字符串–––用字符数组存放。charc[10];若字符多于元素个数,则语法错,反之,后而补"\0"可以去掉定义时的大小设置,而通过自动赋值决定 长度(大小)staticcharx[]={'I','','a','m','','a','','s','t','u','d','e','n','t'};2.字符数组的引用每一个字符数组元素相当于一个字符变量。格式符:%c–––逐个输入/输出字符。

%s–––整个串一次输入/输出。1.输出(用%s)

用%s输出时,不输出‘\0’.

在printf中须直接写数组名.

staticcharc[]={"Iamastudent"};printf("%s",c);6.3.2字符数组的输入输出若数组长度大于字符串长度,则遇到‘\0’

即停止输出

staticcharc[10]="china";printf("%s",c);输出时遇到第一个‘\0’即结束。2.输入(用%s)输入多个字符串,可用空格隔开。

Staticcharstr1[5],str2[5],str3[5];scanf("%s%s%s",str1,str2,str3);输入字符串时,系统自动加上‘\0’则:输入Howareyou?str1:How\0str2:are\0str3:you\0输入:Howareyou则只会将How输入,且存为scanf中须用地址量,数组名表示地址量。str:How\0……

但若:staticcharstr[13]scanf("%s",str);6.3.4字符串数组举例例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。程序如下:

#include"stdio.h" main() { charstring[81]; inti,num=0,word=0;charc;gets(string);for(i=0;(c=string[i])!='\0';i++) if(c=='')word=0; elseif(word==0) { word=1; num++; }printf("Thereare%dwordsintheline\n",num);}运行情况如下:

Iamaboy.Thereare4wordsintheline第七章函数§7.1概述1)除main外,其它为系统函数、自编函数,系统函数:由系统提供,用户可调用。自编函数:由用户按语法规则编写。C程序由一个main和任意个函数组成。

2)

除main函数外,其它函数可相互调用main()abcdxz3)函数不可嵌套定义,具有全局性、平行性,4)函数分为有参与无参函数5)程序从main开始执行,最后又回到main函数结束。§7.2定义与调用类型标识符函数名(){说明部分语句

}类型标识符:表示返回值类型。1.无参函数定义形式调用方式函数名();若有返回值可出现在表达式中无返值可单独出现类型标识符函数名(形参表列)

形参说明

{说明部分语句

}2.有参函数

定义形式例:

求二数之最大值

intmax(intx,inty)

{

intz;

z=x>y?x:y;

return(z);

}出现return语句,返回值一般与函数类型一致.调用方式函数名(实参表列);

无值返回:

有值返回:3.形参与实参调用时:

实参值单向传递形参。

函数被调用时,临时分配单元给形参,调用完毕,这些单元被释放。注:

实参可为表达式,其值传递。实参:出现在调用函数中,形参:出现被调用函数中。

实参、形参类型一致。

可在形参表列中对形参说明。4.函数返回值变量等

通过return语句将返回值传给函数名,可有多个return.

返回值类型为函数类型。一般return中的返回值类型应与函数定义时的类型一致,不一致时,以函数定义类型为准。return(表达式);由函数名只能得到一个返回值。5.调用函数应对被调用函数的返回值类型作出说明:(函数名相当于一变量,但应有所区别)例:

求二实数之和

main(){floatadd();floata,b,c;

scanf("%f,%f",&a,&b);c=add(a,b);类型符函数名();它不同于函数的定义(功能定义)printf("sum=%f";c);}floatadd(floatx,floaty){floatz;z=x+y;returnz;}

以下几种情况可省略对被调函数的说明:当返回值为整型、字符型。在调用之前定义函数。

在整个文件的开头定义函数。6.实参传递给形参时,实参的计算有的系统自左至右,有的自右至左。7.调用系统函数,需根据系统提供的手册而确定是否要加上预编译命令,如:getchar()需加include"stdio.h"§7.3嵌套调用

函数不能嵌套定义,但可嵌套调用a(){调用b}b(){}main{调用a}求取大于50小于100的能被3整除的数的和。#include<stdio.h>intsum(intx,inty){ints=0;intcheck(int); for(inti=x;i<y;i++) s=s+check(i); returns;}intcheck(inty){if((y%3)==0)returny;elsereturn0;}voidmain(){ inta=51,b=100; printf("求和为:%d\n",sum(a,b));}§7.4递归调用

递归:

一个函数在其函数体中又出现直接或间接地调用自身的语句.直接调用

intf(intx){inty,z;

z=f(y);}间接调用

intf1

(intx){inty,z;

z=f2(y);}

intf2

(intt)

{inta,b;

a=f1

(b);}以上仅给出了递归的概念.显然:

上述例子会无限递归(无限执行)。所以,在递归调用时都有条件限制。n!=1(n=0,1)n(n–1)!(n>1)即:

条件成立,调用递归,否则结束。一个最常用的例子:

求n!1.从数学上定义2.程序

floatfac(intn){

floatf;if(n<0)printf("inputerror!\n");elseif(n==0¦¦n==1)f=1;

elsef=nfac(n–1);return(f);}voidmain()

{

intn;floaty;printf("inputainteger!")scanf("%d",&n);y=fac(n);printf("%d!=%15.0f",n,y);}3.执行过程:

设输入n5main(){

f=5fac(4);

}fac(4){

f=4fac(3);

returnf;}fac(3){

f=3fac(2);

returnf;}–fac=4!n=4n=3fac=3!fac(2){

f=2fac(1);

returnf;}fac(1){

f=f(1);

returnf;}n=1fac=1n=2fac=2!可简化表示为n=1n=2n=3n=4fac=4!fac=3!fac=2!fac=1n=5

当变成机器代码时,将其拉成直线(线性程序代码)。例:P118汉诺塔(Hanoi)问题BCAn个盘子保证小(上),大(下)问题:

将A塔上n个盘子移至C(借助于B)。移动时,保证三个塔始终是大盘在下,小盘在上。必须用递归方式解决1)

先将A塔n–1个盘子借助于C移至B上2)将A上剩下的一个移至C上.3)将B上n–1个盘子借助于A移至C上.可以看到:1)、3)为同一问题,都为n–1个盘子借助于一个空塔移至另一塔上。程序如下:

voidmove(chargetone,charputone)

{printf("%c––>%c\n",getone,putone);

}voidhanoi(intn,one,chartwo,charthree)/*将n个盘从one借助two,移动three*/{if(n==1)move(one,three);else{hanoi(n–1,one,three,two);move(one,three);hanoi(n–1,two,one,three);}}

voidmain(){intm;printf("inputthenumberofdisdes":);scanf("%d",&m);printf("Thesteptomoving%3ddisdes:\n",m);hanoi(m,'A','B','C');}运行情况如下:

inputthenumberofdisdes:3Thesteptomoving3diskes:A>CA>BC>BA>CB>AB>CA>C两个函数:move(getone,putone)

表示从getone塔移一个盘子至putone塔hanoi(n,one,two,three)

表示n个盘子从one塔借助于two塔(空)移至three塔。

调用时塔用字符常量'A','B','C'表示。§7.5数组作为函数参数分为两种情况:1.

数组元素作为实参2.

数组名同时为形、实参一、数组元素作为实参

由于数组元素与相同类型的简单变量地位完全一样;因此,数组元素作函数参数也和简单变量一样,也是值的单向传递intx,a[10];如:

xa[5]即a[5]为一元素,与x完全一样。例:设有两个同样大小的一维数组,a[10],b[10]将相应元素比较,统计a中大于b中对应元素的个数,小于的个数,相等时的个数。程序如下:

main()

{

intlarge(int,int);inta[10],b[10],i,n=0,m=0,k=0;printf("enterarraya:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");printf("enterarrayb:\n");for(i=0;i<10;i++)scanf("%d",&b[i]);printf("\n");

for(i=0;i<10;i++){

if(large(a[i],b[i])==1)n=n+1;

elseif(large(a[i],b[i])==0)m=m+1;

elsek=k+1;

}printf("a[i]>b[i]%dtimes\na[i]=b[i]%dtimes\na[i]<b[i]%dtimes\n",n,m,k);if(n>k)printf("arrayaislargerthanarrayb\n");elseif(n<k)

printf("arrayaissmallerthanarrayb\n");else

printf("arrayaisequaltoarrayb\n");}intlarge(intx,inty){

intflag;if(x>y)flag=1;elseif(x==y)flag=0;elseflag=-1;return(flag);}运行情况如下:

enterarraya:1357986420enterarrayb:5389–1–35604a[i]>b[i]4timesa[i]=b[i]1timesa[i]<b[i]5timesarrayaissmallerthanarrayb特点:

直接用数组名作参数时,则为地址传送(不是值传送),即实参数组的首地址传递给形参数组首地址。所以,实参、形参数组共享相同的内存单元。1.形参数组可不指定大小,也可用另一参数作大小,以确定使用实数组的元素个数。2.形参、实参数组必须类型一致。3.多维数组方式一样,仅第一维大小的说明可省略二、数组名作实、形参例1.

有一个一维数组score,

温馨提示

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

评论

0/150

提交评论