C语言程序设计教程 第5版 课件 第6-11章 数组 -文件_第1页
C语言程序设计教程 第5版 课件 第6-11章 数组 -文件_第2页
C语言程序设计教程 第5版 课件 第6-11章 数组 -文件_第3页
C语言程序设计教程 第5版 课件 第6-11章 数组 -文件_第4页
C语言程序设计教程 第5版 课件 第6-11章 数组 -文件_第5页
已阅读5页,还剩333页未读 继续免费阅读

下载本文档

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

文档简介

数组第六章程序设计基础共

53页第2

页本章要点1.建立数组的概念;2.掌握一维数组和二维数组的定义、引用、存储结构和初始化方法;3.掌握一维字符数组的输入输出;4.掌握字符串处理函数的使用;5.掌握数组程序设计的方法。共

53页第3

页6.1数组的概念如何处理一个班学生的学习成绩?一行文字怎样存储?一个矩阵怎样存储?......

问题的提出:

数组:一组具有相同数据类型的数据的

有序集合

这些数据的特点:1.具有相同的数据类型

2.存放在连续的内存区域中

C语言为这些数据提供了一种构造数据类型:数组。共

53页第4

页6.2一维数组6.2.1一维数组的定义和引用1.一维数组的定义

类型说明符数组名[正整型常量表达式];说明:类型说明符:数组的类型。数组名同变量名命名规则,数组名代表数组首地址,是地址常量。常量表达式指明数组中元素个数,必须大于零。可以是数值常量、符号常量和字符常量,不能是变量。例如:

floatmark[100];

charstr[200];

ints[10],b[10],c;数组的名字数组元素的个数数组的类型共

53页第5

页数组定义应注意:(1)数组名后是用方括号而不是圆括号。

inta(10),d(6);

(2)数组定义中的常量表达式表示数组元素个数。必须是大于零的常量。

intb[-8];intc[0];(3)

C语言中不允许对数组的大小作动态定义。可以使用符号常量表示数组的大小。intn;scanf(“%d”,&n);{inta[n];……}intn=10,a[n];#define

SIZE10inta[SIZE];共

53页第6

页2.一维数组的引用

数组元素的引用形式:数组名[下标]下标指出在数组中第几个元素(1)下标的值是数组元素的序号,可以是整型常量、整型变量或整型表达式。规定从0开始,直到n-1.

w[10]数组的10个元素分别是:w[0]、w[1]、…、w[9]。例:inta[4],i=1;a[0]=2;//将数组a的第1个元素赋值为2a[1]=4;//将数组a的第2个元素赋值为4a[2]=a[0]+a[1];//2+4的值赋给第3个元素

a[3]=a[i-1];//a[0]的值赋给第4个元素共

53页第7

页(2)只能逐个引用数组元素,不能一次引用整个数组例:inta[10];

scanf(“%d”,a);(

)

printf(“%d”,a);(

)(3)数组元素引用时注意不要下标越界,编译程序不检查是否越界,下标越界将访问数组以外的空间。(4)

数组必须先定义,后使用,注意区分数组的定义和数组元素的引用。共

53页第8

页数组中的每个元素在功能上等价于一个一般的变量。例如:输入100个学生成绩,并求出总成绩。floatm[100],sum=0;for(i=0;i<100;i++){

scanf(”%f”,&m[i]);

sum+=

m[i];

}数组方式floatx,sum=0;for(i=0;i<100;i++){

scanf(”%f”,&x);sum+=x;

}简单变量

x

sum85

m[0]m[1]m[2]

m[99]

sum82856378906385

851488279501482263167950优点:数据重用数据有序共

53页第9

页mark[0]mark[1]mark[2]mark[3]...mark[99]86.592.077.552.0...94.02000H2004H2008H200CH。。。218CH引用数组元素时,根据首地址和下标,自动计算出该元素的实际地址,取出该地址的内容进行操作。如引用mark[2]:(1)计算

2000+2*4=2008(2)取出2008的内容下标与地址的关系floatmark[100];[]

为下标运算符,

数组名、数组元素是两种不同性质的数据。

数组名是数组的首地址,是一个地址常量。

数组元素则是数值。共

53页第10

页6.2.2

一维数组的初始化和输入输出

1.数组的初始化:在数组定义时为数组元素赋初值称为数组初始化.方法:将初值依次写在花括号{}内。如:inta[5]={2,4,6,8,10};存储形式:存储单元1000存储单元1004共

53页第11

(1)给数组中前边部分元素赋初值,其他元素按零值处理。如:inta[9]={1,2};/*a[0]=1,a[1]=2,a[2]~a[8]值为0*/inta[5]={0};/*数组全部元素赋初值0*/inta[5]={,,1,2,3};错误(2)对数组元素全部赋值可以不指定长度。

inta[]={0,1,2,3,5};等价于:inta[5]={0,1,2,3,5};

(3)初值的个数不能超过数组总元素的个数。

inta[3]={1,2,3,4};/*语法错!*/数组初始化说明:2.一维数组在程序中赋值

C语言除了在定义数组变量时用初值列表对数组整体赋值以外,无法再对数组变量进行整体赋值。

inta[5];

a={1,2,3,4,5};

a[]={1,2,3,4,5};

a[5]={1,2,3,4,5};

使用赋值语句逐一赋值例

inta[4];a[0]=1;a[1]=2;a[2]=3;a[3]=4;

使用循环语句逐一赋值例如,将数组a的各元素赋值成奇数序列。

inta[10],i;for(i=0;i<10;i++)a[i]=2*i+1;例如,接受用户键盘输入赋值给数组各元素。

inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);这种方法是在编程中普遍使用的一种方法,它适用于对某数组元素进行有规律的赋值或接受用户通过键盘输入对数组元素的赋值

使用循环语句输入数组元素共

53页第14

页3.一维数组元素的输出输出数组全部元素main(){inta[5]={1,2,3,4,5},i;for(i=0;i<5;i++)printf("%d",a[i]);…...}输出数组部分元素main(){inta[5]={1,2,3,4,5};printf("%d,%d",a[1],a[2]);…...}如何使两个数组的值相等?main(){inta[4]={1,2,3,4},b[4];

b=a;

}解决方法方法1:逐个元素赋值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];方法2:通过循环赋值

inti;for(i=0;i<4;i++){

b[i]=a[i];}原因:数组名b表示数组的首地址,即b[0]的地址,其值不可改变,不能被赋值!共

53页第16

页【例1】从键盘上输入6个数存入数组中,再按输入顺序的逆序存放在该数组中并输出。#include<stdio.h>intmain(){inta[6],i,j,k,t;for(i=0;i<6;i++)scanf("%d",&a[i]);k=6/2-1;for(i=0;i<=k;i++){

j=6-i-1;t=a[j];a[j]=a[i];a[i]=t;}for(i=0;i<6;i++)printf("%3d",a[i]);return0;}算法分析:采用循环设计。a[i]与a[j]进行交换,其中i=0,1,…n/2-1,j=n-i-1341562a[0]a[1]a[2]a[3]a[4]a[5]

6.2.3一维数组应用举例运行程序时如何输入数据?341562↙f[0]f[1]f[2]f[3]f[4]f[5]f[19]……...1f[19]145231901【例2】

用数组求Fibonacci数列

前20个数。235

inti,f[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)printf("\n");printf("%8d",f[i]);}

F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥2)f数组的第1、2个元素被初始化为1..#include<stdio.h>intmain(){

return0;}max(i=0)max(i=2)max(i=3)【例3】找最大值算法计算最大值算法分析:采用打擂台的方法,任意指定某数为擂主,然后擂主依次与其他数比较,若某数大于擂主,则替换擂主。循环结束,擂主变量中一定是最大的数。找最大值程序#include<stdio.h>intmain(){inta[10],i,max;for(i=0;i<10;i++)scanf("%d",&a[i]);

max=a[0];for(i=1;i<10;i++){if(a[i]>max)

max=a[i];

}printf("max=%d\n",max);return0;}替换擂主指定第1个元素为擂主输入10个数,找出其中最大值并输出。如何找出最大值元素的位置?【例4】用冒泡排序法将10个整数按照从小到大的顺序排序。排序过程分析:

(1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然后比较第二个数与第三个数;依次类推,直至第n-1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上;

(2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安置在第n-1个元素位置;

(3)重复上述过程,共经过n-1趟冒泡排序后,排序结束。由以上可推知:6

个数要比较5趟第一趟中要进行两两比较5次第二趟中比较4次······若有n个数,则要进行n-1趟比较第i趟比较中要进行n-i次两两比较。3849657613273097

第一趟38496513273076

第二趟384913273065第三趟3813273049

第四趟13273038

第五趟132730

第六趟

1327

第七趟4938659776132730

初始关键字n=838497697979797132730137676762730136565652730134949492730133838382730冒泡排序图示效果forj=1toNUM–i输入NUM个数给a[0]到a[NUM-1]fori=0toNUM–1a[j-1]>a[j]真假a[j-1]

a[j]输出a[0]到a[NUM–1]冒泡排序N-S流程图

#include<stdio.h>#defineNUM10

intmain(){inta[NUM],i,j,t;printf("input%dnumbers:\n",NUM);for(i=0;i<NUM;i++)/*输入NUM个整数*/

scanf("%d",&a[i]);

for(i=0;i<NUM-1;i++)/*趟数,共NUM-1趟*/

for(j=1;j<NUM-i;j++)/*实现一次冒泡操作*/

if(a[j-1]>a[j])/*交换a[j-1]和a[j]*/{t=a[j-1];a[j-1]=a[j];a[j]=t;}printf("thesortednumbers:\n");for(i=0;i<NUM;i++)/*输出排好序的数据*/printf("%d",a[i]);

return0;}运行结果:input10numbers:10127689345↙thesortednumbers:12345678910另一种方法:for(i=0;i<NUM-1;i++)for(j=0;j<NUM-i-1;j++)if(a[j]>a[j+1]){

t=[j];a[j]=a[j+1];a[j+1]=t;}【例】用选择排序法将10个整数从小到大排序排序过程:

(1)首先通过n-1次比较,从n个数中找出最小的,将它与第一个数交换—第一趟选择排序,结果最小的数被安置在第一个元素位置上;

(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二个数交换—第二趟选择排序;

(3)重复上述过程,共经过n-1趟排序后,排序结束。冒泡排序的缺陷:在比较交换的过程中,大的数不能一次到位,效率低。

选择排序法的基本思想:以冒泡排序法为基础,在两两比较后并不马上进行交换,而是在找到最小的数之后,记住最小数的位置(数组中的下标),待一轮比较完毕后,再将最小的数一次交换到位。初始:[49386597761327]ji=11349一趟:

13

[386597764927]i=22738二趟:

1327

[6597764938]三趟:

132738

[97764965]四趟:

13273849

[769765]五趟:

1327384965

[9776]六趟:

132738496576

[97]kkkkjjjjjjjjjjk选择排序图示效果输入n个数给a[0]到a[n-1]fori=0ton-1forj=i+1tona[j]<a[k]真假k=j输出a[0]到a[n-1]k=ia[i]

a[k]k!=i真假选择法排序N-S流程图#include<stdio.h>intmain(){inta[10],i,j,k,t;printf("Input10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);

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

k=i;

for(j=i+1;j<10;j++)if(a[j]<a[k])k=j;/*记录最小数下标位置*/

if(k!=i)/*若最小数不在下标位置i*/{t=a[i];a[i]=a[k];a[k]=t;}/*交换位置*/}printf("Thesortednumbers:\n");for(i=0;i<10;i++) printf("%d",a[i]);return0;}共

53页第28

定义二维数组的一般方式:类型说明符数组名[常量表达式1][常量表达式2];[例如]

inta[3][3]

存储形式:

二维数组在内存中按行的顺序存放,即先存放第一行的元素,再存放第二行的元素。根据数组的数据类型,为每一元素安排相同长度的存储单元。[例如]floata[3][4];

6.3二维数组6.3.1二维数组的定义行数列数二维数组用两个下标确定各元素在数组中的顺序,可用排列成i行,j列的元素组来表示。元素个数=行数*列数共

53页第29

页说明:二维数组除了维数比一维数组多一维外,其它性质与一维数组全部类似。下面写法是否正确?

①inta[0][3];

用于定义数组长度的常量表达式的值必须是大于0的正整数。

②inti=3,j=4;

inta[i][j];

定义数组元素的个数必须使用常量表达式,而不能使用变量。理解二维数组例inta[3][4];a[0][0]a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[1][2]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[0]a[1]a[2]行名014523a[0][1]a[0][2]a[0][3]a[1][0]a[1][1]a[0][0]a[1][3]a[2][0]a[2][1]a[2][2]a[2][3]a[1][2]67101189a[0]a[1]a[2]二维数组a是由3个元素组成每个元素a[i]由包含4个元素的一维数组组成共

53页第31

页6.3.2二维数组的引用

二维数组的引用与引用一维数组元素一样,也用下标法引用二维数组元素。

二维数组元素表示形式:数组名[下标1][下标2]

下标1和下标2是整型常量、整型变量或整型表达式。其编号是从0开始的。

例如:若有inta[2*5][3*4],i=15;

则使用a[3*3][0],a[1][i-5]都是合法的。说明:数组名a代表的是数组a在内存中的首地址,因此,可以用数组名a来代表数组元素a[0][0]的地址。数组名是常量,不可对它赋值。下标不要越界共

53页第32

页一、二维数组的初始化1.分行给二维数组赋初值。如:inta[2][3]={{2,3,1},{1,2,3}};2.将所有数据写在一个{}内,按顺序赋值。

即按数组元素在内存中排列的顺序赋初值。

inta[2][3]={2,3,1,1,2,3};6.3.3二维数组的初始化和输入输出按行赋值按元素顺序赋值共

53页第33

页3.对部分元素赋值如:

inta[3][3]={{1},{0,1},{0,0,1}};相当矩阵:4.如果对数组全部元素赋初值,第一个下标可省略,但第二个下标不可省略。如:a[3][4]={{0,1,3,1},{2,1,0,2},{1,1,2,0}};

可写成a[][4]={0,1,3,1,2,1,0,2,1,1,2,0};二维数组定义后没有输入值,则其值为随机数。inta[3][3]={{1},{0},{0,0,1}};相当矩阵:inta[2][3]={{5,6},{7,8}};inta[2][3]={5,6,7,8};[例]得到的数组为:560780得到的数组为:567800共

53页第34

页1.二维数组的输入

inta[2][3],i,j;for(i=0;i<2;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);2.二维数组的输出

inta[2][3],i,j;for(i=0;i<2;i++)for(j=0;j<3;j++)printf("%5d",a[i][j]);二、二维数组的输入、输出先读入第一行元素,再读入第二行元素先输出第一行元素,再输出第二行元素错误用法:scanf("%d",&a);错误用法:for(i=1;i<=2;i++)for(j=1;j<=3;j++)printf("%5d",a);共

53页第35

页6.3.4二维数组程序举例[例1]将一个矩阵a2×3转置存到另一个矩阵b3×2中。分析:用数组a、b分别代表矩阵a、b;

a矩阵的行数必须要等于b矩阵的列数。执行:b[j][i]=a[i][j];

即可完成转换。涉及到两个下标的,一般用两重循环。求矩阵转置问题也可以在矩阵本身进行,但应是方阵。共

53页第36

页intmain(){inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf(“arraya:\n”);for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%5d",a[i][j]);

b[j][i]=a[i][j];}printf("\n");}printf("arrayb:\n");for(i=0;i<3;i++){for(j=0;j<2;j++)printf("%5d",b[i][j]);printf("\n");}return0;}运行结果如下:

arraya:123456arrayb:142536

53页第37

页[例2]求方阵A4*4的转置阵,并将该转置阵输出(限定在一个数组进行)intmain(){inta[4][4],i,j,t;printf("arraya:\n");for(i=0;i<4;i++)for(j=0;j<4;j++)scanf("%d",&a[i][j]);/*输入*/

for(i=0;i<4-1;i++)/*转置*/for(j=i+1;j<4;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}printf(“rotateda:\n");for(i=0;i<4;i++)

{for(j=0;j<4;j++)printf("%4d",a[i][j]);/*输出*/printf("\n");}

return0;}程序运行情况:arraya:234<回车>678<回车>101112<回车>141516<回车>rotateda:59136101471115481216转置部分还可改写如下:for(i=1;i<4;i++)for(j=0;j<i;j++){t=a[i][j];a[i][j]=a[j][i];a[j][i]=t;}二维数组输入共

53页第38

页#include<stdio.h>main(){inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,7,4,6},{-1,2,0,8}};

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=9,row=1,colum=0[例3]求3×4矩阵中最大元素的值及其所在行和列号。共

53页第39

页将程序补充完整:#include"stdio.h"main(){

inta[3][3]={1,7,3,9,2,4,5,6,0},i,cj=1;for(i=0;i<3;i++)cj=cj*a[][]printf("%4d\n",cj);/*输出*/}[例4]编写求整型矩阵A3*3的主、副对角线元素之积程序。#include"stdio.h"main(){

inta[3][3]={1,7,3,9,2,4,5,6,0},i,cj=1;for(i=0;i<3;i++)cj=cj*a[][];printf("%4d\n",cj);/*输出*/}

53页第40

页矩阵与二维数组:找出关系。主对角:i==j

副对角:i+j==n-1

上三角:for(i=0;i<n;i++)for(j=i+1;j<n;j++)

下三角:for(i=1;i<n;i++)for(j=0;j<i;j++)

53页第41

页矩阵与二维数组:找出关系。外围元素之和:for(i=0;i<n;i++)for(j=0;j<n;j++)

if(i==0||j==0||i==(n-1)||j==(n-1))共

53页第42

页6.4字符数组6.4.1一维字符数组的定义

用来存放字符数据的数组是字符数组。字符数组的定义和应用与一般数组相同。

C语言没有提供字符串数据类型,用字符数组存放字符串,字符数组中的各元素依次存放字符串的字符。最后一个元素必须是’\0’。格式:char数组名[常量表达式]

强调:字符串实际占有单元的数量等于字符串长度+1。定义时应注意考虑元素总个数应比实际长度多1。例如:charc[6];C数组具有6个元素,可以存放长度等于或小于5的字符串,也可以存放6个字符型数据。共

53页第43

页1.用单个字符对字符数组初始化例如:charch[6]={‘C’,‘H’,‘I’,‘N’,‘A’,’\0’};把5个字符分别赋给ch[0]到c[4].在内存中存放情况:6.4.2一维字符数组的初始化说明:(1)初值的个数不能超过数组元素的个数,否则语法错

(2)初值的个数小于数组长度,系统自动添入结束符‘\0’(3)初值的个数与数组元素相等,定义时可省略长度

(4)因字符串常量自动加\0,因此常人为地在字符数组后加一个\0。CHINA\0c[0]c[1]c[2]c[3]c[4]c[5]串长=5共

53页第44

页2.用字符串常量对字符数组初始化

将字符串存储到字符数组中,字符串和第一个’\0’构成有效字符串。对字符串的操作,就是对字符数组的操作。但是它和普通字符数组的操作不同。普通数组中的元素是确定的,一般用下标控制循环;而字符串使用结束符’\0’来控制循环。Boy\0\0ch[0]ch[1]ch[2]ch[3]ch[4]例;

charch[5]=

"Boy";例:charch[6]={"CHINA"};charch[6]="CHINA"; /*省略{}*/charch[]="CHINA"; /*省略长度值*/chard[12]="Howareyou"chard[]={‘H’,’o’.’w’,‘,’,’a’,’r’,’e’,‘‘,’y’,’o’,’u’,’\0’};共

53页第45

页例如:

chara[6]={'g','r','e','e','n','\0'};charb[5]="123";a[2]='\0';a[5]=b[1];printf(“%c\n”,a[1]);

6.4.3一维字符数组的引用输出a数组的第2个字符第46

页main(){inti;

chara[3];for(i=0;i<3;i++)scanf("%c",&a[i]);

for(i=0;i<3;i++)printf("%c",a[i]);printf("\n");}

输入数据顺序:

dos输出数据顺序:

dos6.4.4字符数组的输入与输出1.单字符输入输出(用格式符%c或字符输入函数)

chara[3];for(i=0;i<3;i++)

a[i]=getchar();

for(i=0;i<3;i++)putchar(a[i]);printf("\n");

第47

页chara[7];scanf("%s",a);2.字符串整体或部分输入输出(用格式符%s)--输入输出项必须是以字符串的地址形式出现;也可以是字符串常量:printf(

%s\n

,

abcd

);--只能输入不包括空格、\t和\n的字符串;

--若要输入空格,用gets函数;

--数组名前不加&符号。如:chara[10];scanf("%s",a);printf("%s\n",a);输入:Howareyou<回车>输出:How空格、跳格和回车是输入数据的结束标志.数组名共

53页第48

用%s输出字符串时,从输出项提供的地址开始输出,直到遇到字符串结束符

\0

为止。若字符串长度超过数组定义长度,则给出警告错误.若字符串长度与数组定义长度相等,则字符串结束标志无法存储,输出字符串后继续输出后续存储单元内容。若:charb[3]="xyz",c='H',a[10]="abcd\072";

printf("b=%s\n",b);

printf("c=%c\n",c);printf("a=%s\n",a);输出:b=xyzc=Ha=abcd:十进制58对应的ASCII字符:第49

页strcat字符串连接

strcpy字符串复制

strcmp字符串比较

strlen字符串长度

strlwr将字符串中的大写字符转换为小写字符

strupr将字符串中的小写字符转换为大写字符

(使用时注意程序前边加:#include<string.h>)6.4.5字符串处理函数C函数库中提供一些用来处理字符串的函数:

puts输出字符串

gets输入字符串

(使用时注意程序前边加:#include<stdio.h>)第50

页(1)puts(字符数组)

将一个字符串输出到终端并换行。

(2)gets(字符数组)~输入一个字符串到字符数组,该字符数组的起始地址为该函数值。可以输入带空格的字符串。main(){charstr[]=

book

;puts(str);}其作用与printf("%s\n",str)等效main(){charstr[12];gets(str);puts(str);}输入:Howareyou<回车>输出:Howareyouscanf函数与gets函数的使用

例:利用scanf函数可以连续输入多个字符串,输入时,字符串间用空格分隔。

charstr1[40],str2[40],str[40];scanf("%s%s%s",str1,str2,str3);

输入:I□love□china!↙

str1:"I",str2:"love",str3:"china!"。

例:使用%ns格式控制符限制输入的字符个数。

charstr[10];scanf("%9s",str);//最多可读入9个非空格字符到str中

getsscanf输入的字符串中可包含空格字符输入的字符串中不能包含空格字符只能输入一个字符串可连续输入多个字符串(使用%s%s…)不可限定字符串的长度可限定字符串的长度(使用%ns)遇到回车符结束遇到空格符或回车符结束第52

页(3)strcat(字符数组1,字符数组2)~连接两个字符串,把字符数组2连到字符数组1上,该数值为字符数组1的地址。如:charstr1[40]="Clanguage";charstr2[]="program";printf("%s",strcat(str1,str2));

输出:Clanguageprogram(4)strcpy(字符数组1,字符数组2)

~将字符数组2拷贝到字符数组1中去。字符数组1的长度应大于字符串2的长度。如:charstr1[10],str2[]="redflag";strcpy(str1,str2);

不能用赋值形式str1=str2第53

页(5)

strcmp(字符串1,字符串2)

~

两个串的比较;说明:1)确定字符串大小的基本规则:按照串中对应位置字符的ASCII码值的大小确定大小。

"abc"<"b" 因为字符a<b"abc">"abadef"因为字符c>a2)比较结果由函数值带回。例如:if(str1==str2)错误

if(strcmp(str1,str2)==0)正确当出现第一对不相等的字符时,就由这两个字符决定所在字符串的大小,返回其ASCII码比较的结果值。第54

页(6)strlen(字符数组)~测试字符数组的长度(不包括\0”);

如:charstr[10]="yellow";printf(“%d”,strlen(str));

结果:(7)strlwr(字符串)~将大写字符串变小写字符串。(8)strupr(字符串)~将小写字符串变大写字符串。第55

页【例1】输出字符串中的数字字符。#include"stdio.h"intmain(){chara[80];inti=0;gets(a);while(a[i]!=‘\0’)//注意控制循环的方法{if(a[i]>=‘0’&&a[i]<=‘9’)putchar(a[i]);i++;}return0;}6.4.6字符数组应用举例通常用来判断字符串的结束第56

页#include<stdio.h>intmain(){charstr1[20],str2[20];inti=0;printf("Inputastring:");scanf("%s",str1);while(str1[i]!=‘\0’){str2[i]=str1[i];i++;}str2[i]='\0';printf"%s",str2);return0;}【例2】从键盘输入一个字符串,复制到另一个字符数组后显示

分析:将第一个字符串字符逐个添加到数组str2数组中。去掉第一个串的结束符‘\0’,添加第二个数组的结束符'\0'。添加结束符‘\0’输入字符串第57

页#include"stdio.h"intmain(){charstr1[50]={"abcdef"},str2[20]={"1234567"};inti=0,j=0;while(str1[i]!='\0')i++;while((str1[i++]=str2[j++])!='\0');puts(str1);puts(str2);return0;}【例3】用程序实现连接两个字符串。找到str1的结束符将str2的字符传送到str1的尾部while(str2[j]!='\0')

str1[i++]=str2[j++];str1[i]='\0‘;【例4】对长度为7个字符的字符串,除首、尾字符外,将其余5个字符按降序排列。如:原来的字符串为CEAedca,排序后输出为CedcEAa。#include"stdio.h"#defineN7intmain(){inti,j;chart,s[10];printf("输入7个字符的字符串:");gets(s);for(i=1;i<N-1;i++)for(j=i+1;j<N-1;j++)if(s[i]<s[j]){t=s[i];s[i]=s[j];s[j]=t;}printf("\n%s",s);return0;}【例5】从字符串str中删除第i个字符开始的连续n个字符

注意:str[0]代表字符串的第一个字符。#include"stdio.h"intmain(){charstr[81];inti,n;printf("请输入字符串str的值:\n");scanf("%s",str);printf("请输入删除位置i和待删字符个数n的值:\n");scanf("%d%d",&i,&n);

while(str[i+n-1]){str[i-1]=str[i+n-1];i++;}str[i-1]='\0';printf("删除后的字符串str是:%s\n",str);return0;}将被删除的字符后面的字符依次复制到要删除的字符起始位置。共

61页第60

页#include"stdio.h"#include“string.h”main(){charstr1[80],min[80];intk,len;printf("Inputstringstr1:\n");gets(str1);strcpy(min,str1);/*假定第一个字符串是最短字符串*/len=strlen(min);/*最短字符串的长度记为len*/gets(str1);while(str1[0]!=‘\0’)/*以空字符串为输入结束标记*/{k=strlen(str1);if(k<len){len=k;strcpy(min,str1);}/*确定最短字符串*/gets(str1);/*继续输入其他字符串*/}printf(“len=%d,min=%s\n”,len,min);}[例6]:输出若干个字符串中最短的字符串。分析:这是一个求最小值的问题.求出各字符串的长度,再进行比较。结束输入的标志是空字符串(直接按回车,则输入空字符串,第1个字符是‘\0’)。共

61页第61

页本章注意问题1.注意数组的定义和引用的区别;C语言中数组的下标从0开始;2.C语言不进行下标的越界检查;3.数组名是地址;4.字符数组在定义时必须考虑到存储字符串结束符的位置;5.注意区别数组与简单变量初始化的方法,特别是字符数组的初始化方法;6.掌握运用字符串的操作函数。第七章程序设计基础函数共

93页第63

页本章学习要点函数的定义函数的调用函数间的数据传递变量的存储类型变量的作用范围内部函数和外部函数编译预处理共

93页第64

页模块化程序设计方法:人们在求解某个复杂问题时,通常采用逐步分解、分而治之的方法,也就是将一个大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用程序时,往往也是把整个程序划分成若干个功能较为单一的程序模块,然后分别予以实现,最后再把所有的程序模块象搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为模块化程序设计方法。函数F1()main()F11()F2()F21()F22()C语言程序的结构7.1函数的概念和函数的定义C程序是函数的集合体,每个函数是一个独立的程序模块;一个C程序必须包含一个主函数,或若干个子函数,程序总是从主函数开始执行所有子函数地位平等,可互相调用、自我调用。函数可集中或分散存放在一个或多个源程序文件中。·引入函数的优点:减少重复编写程序的工作量;使程序便于调试和阅读。

通过对函数的学习,掌握模块化程序设计的理念,为将来进行团队合作,协同完成大型应用软件奠定一定的基础。main:主函数e,d,h,g被多次调用a,b,c,d,e,f,g,h,相互调用mainabdeghhgedcgf函数是C程序的最小单元。主函数可以调用其它函数,其它函数可以相互调用.函数调用举例main()

/*主函数*/{

printstar();

/*调用printstar函数画****/

print_message();

/*调用print_message函数写字*/

printstar();

/*调用printstar函数画****/}

printstar()

/*printstar函数*/{printf(“\n**********”);}print_message()

/*print_message函数*/

{printf(“\nHelloworld!”);}运行结果:**********

Helloworld!**********

一个c程序由一个或多个源文件组成#include“lx2.c”#include“lx3.c”main()

{

printstar();

print_message();

printstar();}

printstar()

{printf(“\n**********”);}print_message(){printf(“\nHello!”);}Lx1.cLx2.cLx3.c共

93页第69

页数学函数

math.h字符和字符串函数

ctype.h,string.h输入/输出函数

stdio.h动态存储分配函数

calloc(),malloc()形式无参函数有参函数空函数库函数用户定义函数:C函数的分类共

93页第70

页7.1.2函数的定义定义函数应包括的内容:(1)指定函数的名字,以便以后按名调用;(2)指定函数的类型,即函数值的类型;(3)指定函数的参数的名字和类型(有参);(4)指定函数执行的操作,即函数完成的功能。在程序中用到的所有函数,必须先定义,后使用。定义函数的一般形式:[类型标识符]函数名([形式参数表]){[说明与定义部分]

语句}7.1.2函数的定义各形参之间用”,”隔开形参可以缺省,但括号不可省函数返回值类型,函数无返回值,用void定义返回值类型函数体(是一段程序,实现函数的功能)函数名字有值,它代表函数的入口地址。这是有参函数定义形式1.无参函数的定义形式定义格式

类型标识符函数名()

{

[说明部分]

语句

}第72

页[例7-1]

voidprint_message(){printf("Howareyou!\n");}函数用途:此类函数用于完成某项固定的处理任务,执行完成后返回调用者。函数print_message的功能是:

输出:Howareyou!

第73

页2.有参函数的定义形式

定义格式类型符函数名(类型符1形参名1,类型符2形参名2,…,类型符n形参名n

){[变量声明部分]

执行部分}函数体

函数用途

此类型的函数主要是根据形参的值来进行某种事务的处理,需要时可将处理后的结果值返回给调用函数

。它最能体现调用函数与被调函数之间的数据联系。有参函数可以有返回值也可以没有返回值。形参列表至少要有一项,形参之间要用逗号“,”分开

指明形参类型

[例]intmax(intx,inty){

intz;

z=x>y?x:y;returnz;}共

93页第74

页形参变量的说明,在函数体中不在说明了。不能(intx,y)函数内部可以定义只能自己使用的变量,称内部变量3.形式参数说明在形参表中说明的形参,在函数体中不再说明,可以同一般变量一样直接使用。

形参调用前不占内存单元,调用时分配内存单元。调用结束后释放。形参是函数的内部变量,只在函数内部才有意义。对每个形参必须指明其名字和数据类型。多个形参用逗号分隔。函数的出口//函数定义例1计算浮点数x的n次方。doublepower(doublex,intn){

doublep=1;

inti;

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

p=p*x;

returnp;}//函数定义例3

显示信息的无参函数。voidPrint_message(void

){

printf("Inputdata:\n");

}函数定义举例//函数定义例2交换两个变量的值。voidSwap(intx,inty){

int

temp;

temp=x;x=y;y=temp;

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

}757.1.3函数的调用

1.函数调用的一般形式为:

函数名(实际参数列表);或函数名(实际参数列表)说明:实参必须有确定的值,可以是常量、变量、表达式及函数调用。实参与形参的类型、个数、顺序必须一致。多个实参用逗号分隔。共

93页第76

2.

执行过程:计算各个表达式(VC++6.0实参求值顺序按自右至左);把得到值赋给对应形参;程序将控制从调用函数处转移到被调用函数,执行函数体;遇到return语句或执行完最后一条语句,返回到函数调用处继续执行。函数调用以语句的形式出现函数调用以表达式形式出现3.函数调用的具体方式(1)函数语句:

(把函数调用作为一个语句)

一般形式:函数名(实际参数表);

使用情况:这种方式常用于调用一个可以忽略返回值或没有返回值的函数,只要求函数完成一定的操作。例如:调用print_message();

例如:调用Swap(a,b);

93页第77

页voidSwap(intx,inty){

inttemp;temp=x;x=y;y=temp;printf("x=%d,y=%d\n",x,y);}intmain(){inta,b;scanf(“%d%d”.&a,&b);Swap(a,b);printf(“%d,%d,”,a,b);

return0;

}3.函数调用的具体方式共

93页第78

页(2)函数表达式:(函数调用出现在一个表达式中)一般形式:变量名=函数表达式

使用情况:这种表达式称为函数表达式。要求函数带回一个确定的值参加表达式的运算。例如:c=3+max(a,b);d=pow(c,i);

printf(“%d”,max(a,b));m=f1(a,max(b,c));

e=f((x1,x2,x3),(y1,y2));d=f((a,b));函数有几个参数?#include<stdio.h>intMax(intx,inty){

if(x>y)

returnx;

else

returny;}intmain(){

inta,b,max;

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

max=Max(a,b);

printf("max=%d",max);

return0;}关于函数求值的顺序:例:有函数调用语句:

inti=3;printf(”%d,%d”,i,++i);输出结果为:4,4

93页第79

页分析输出函数的结果:自右向左:4,4自左向右:3,4避免这种不确定性:改为:

inti=3,j;j=i;printf(”%d,%d”,i,++j

温馨提示

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

评论

0/150

提交评论