《C语言》教案第五章

更新时间:2023-05-21 08:17:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第五章 数组及其应用 构造数据类型之一 [ ] :数组运算符 数组:有序数据的集合,用数组名标识 单目运算符 元素:属同一数据类型,用数组名和下标确定 优先级(1)

§5.1 一维数组5.1.1 一维数组的定义 定义方式: 例 int a[6];合法标识符

左结合 不能用( )

数据类型

数组名[常量表达式];表示元素个数 下标从0开始

a

0 1 2

3 数组名表示内存首地址, 4 是地址常量 5

a[0] a[1] a[2] a[3] a[4] a[5]

编译时分配连续内存 内存字节数=数组维数* sizeof(元素数据类型)

例 int i=15; 例 int data[5]; int data[i]; ( 不能用变量定义数组维数) data[5]=10; //C语言对数组不作越界检查,使用时要 注意

一维数组的引用

数组必须先定义,后使用 只能逐个引用数组元素,不能一次引用整个数组 数组元素表示形式: 数组名[下标] 其中:下标可以是常量或整型表达式 例 int a[10]; printf(“%d”,a); ( ) 必须 for(j=0;j<10;j++) printf(“%d\t”,a[j]);

( )

5.1.3 一维数组的初始化 初始化方式

int a[5]={1,2,3,4,5}; 在定义数组时,为数组元素赋初值 等价于:a[0]=1; (在编译阶段使之得到初值) a[1]=2; a[2]=3; a[3]=4; a[4]=5; 说明: 数组不初始化,其元素值为随机数 对static数组元素不赋初值,系统会自动赋以0值 只给部分数组元素赋初值 当全部数组元素赋初值时,可不指定数组长度

如 int a[5]; static int a[5]={6,2,3}; int a[]={1,2,3,4,5,6}; 等价于: a[0]=6; a[1]=2;a[2]=3; a[3]=0; a[4]=0; 等价于:a[0]=0; a[1]=0; a[2]=0; a[3]=0; a[4]=0; 如 编译系统根据初值个数确定数组维数 int a[3]={6,2,3,5,1}; ( )

#include <stdio.h> 5.1.4 一维数组程序举例#define SIZE 10 例 读10个整数存入数组,找出其中最大值和最小值 main() { int x[SIZE],i,max,min; printf("Enter 10 integers:\n"); for(i=0;i<SIZE;i++) 步骤: { printf("%d:",i+1); 1. 输入:for循环输入10个整数 scanf("%d",&x[i]); 2. 处理: } (a) 先令max=min=x[0] max=min=x[0]; (b) 依次用x[i]和max,min比较(循环) for(i=1;i<SIZE;i++) 若max<x[i],令max=x[i]{ if(max<x[i]) max=x[i]; 若min>x[i],令min=x[i] if(min>x[i]) min=x[i]; 3. 输出:max和min } printf("Maximum value is %d\n",max); printf("Minimum value is %d\n",min); }

例 用数组求Fibonacci数列前20个数

#include <stdio.h> main() { int i; int 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("%12d",f[i]); } }

0 1 2

3 4 5

1 1 2 3 5 ……...

f[0] f[1] f[2] f[3] f[4] f[5]

19

f[19]

f[19]

例 用冒泡法对10个数排序

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

)对前n-1个数进行第二趟冒泡排序,结果使次大的数 被安置在第n-1个元素位置 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束

如果有n个数,则要进行n-1趟比较,在第j趟比较中要进行 n-j两两比较

38 49 49 38 65 76 97 13 97 76 97 27 13 30 97 27 97 30 初 始 关 键 字 n=8

38 49 65 13 76 27 76 13 30 76 27 76 30 97 第 一 趟

38 49 13 65 27 65 13 30 65 27 65 30

38 13 49

13 38 27 38 13 38 30 27 38 30 49

13 27 30 38

13 27 30

1327

49 27 13 49 30 27 49 3065

76 第 二 趟第 三 趟 第 四 趟 第 五 趟 第 六 趟 第 七 趟

输入n 个数给a[1] 到 a[n] for j=1 to n-1 for i=1 to n-j 真 a[i]>a[i+1]

a[i] a[i+1] 输出a[1] 到 a[n]

#include <stdio.h> main() { int a[11],i,j,t; printf("Input 10 numbers:\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("The sorted numbers:\n"); for(i=1;i<11;i++) printf("%d ",a[i]); }

#define N 6 数组定义:必须用常量表达式 main() { int a[N],b[ B -60],c[]={1,2,3,4,5,6},i; for(i=0;i<N;i++) scanf(“%d%d”,&a[i],&b[i]); for(i=0;i<N;i++) 数组元素引用 printf(“%d ”,a[i]); printf(“\n”); for(i=0;i<N;i++) printf(“%d ”,b[i]); printf(“\n”); for(i=0;i<N;i++) Ch6_001.c c[i]=a[i]+b[N-i-1]; for(i=0;i<N;i++) printf(“%d ”,c[i]); }

§5.2 二维数组5.2.1 二维数组的定义

定义方式: c[0][1][1] 5 数据类型 数组名[常量表达式][常量表达式]; c[0][1][2] 6 数组元素的存放顺序 例 int a[3][4]; float b[2][5]; 原因:内存是一维的 int c[2][3][4]; 二维数组:按行序优先 int a[3,4]; ( ) 多维数组:最右下标变化最快0 1 2

0 c[0][0][0] c[0][0][1] 1 c[0][0][2] 2 元素个数=行数*列数c[0][0][3] 列数 3 int c[2][3][4] 行数 4 c[0][1][0]c[0][1][3] c[0][2][0] c[0][2][1] c[0][2][2] c[0][2][3] c[1][0][0] c[1][0][1] c[1][0][2] c[1][0][3] c[1][1][0] c[1][1][1] c[1][1][2] c[1][1][3] c[1][2][0] c[1][2][1] c[1][2][2] c[1][2][3]

7………...

int a[3][2]

a[0][0] a[1][0] a[2][0]

a[0][1] a[1][1] a[2][1]

3 4 5

a[0][0] a[0][1] a[1][0] a[1][1] 20 a[2][0] 21 a[2][1] 22 23

二维数组理解二维数组a是由3个元素组成0 1 2 3 4 5 6 7 8 9 10 11 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]

例 int a[3][4];2000 2002 a[0] a[0][0] a[0][1] 1 3 2008 2010 a[1] a[1][0] a[1][1] 9 11 2016 2018 a[2] a[2][0] a[2][1] 17 19 行名 2004 a[0][2] 5 2012 a[1][2] 13 2020 a[2][2] 21 20006 a[0][3] 7 2014 a[1][3] 15 2022 a[2][3] 23

a[1]

a[2]

每个元素a[i]由包含4个元素 的一维数组组成

5.2.2 二维数组的引用形式: 数组名[下标][下标]

5.2.3 二维数组的初始化 分行初始化:

部分初始化 全部初始化 第一维长度省略初始化

部分初始化 按元素排列顺序初始化 第一维长度省略初始化 全部初始

化 例 int a[2][3]={{1,2,3},{4,5,6}}; 例 int a[2][3]={{1,2},{4}}; 例 int a[][3]={{1},{4,5}}; 例 intint2a[2][3]={1,2,4}; 1例 a[2][3]={1,2,3,4,5,6}; 5 3 4 6 1 2 0 4 0 0 例 int 0 a[][3]={1,2,3,4,5}; 1 0 4 5 0 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 11 22 34 40 50 60 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 1 2 3 4 5 0 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

5.2.4 二维数组程序举例例 将二维数组行列元素互换,存到另一个数组中 #include <stdio.h> 1 4 a= 1 2 3 main() b= 2 5 4 5 6 { int a[2][3]={{1,2,3},{4,5,6}}; 3 6 int b[3][2],i,j; printf("array a:\n"); printf("array b:\n"); for(i=0;i<=1;i++) for(i=0;i<=2;i++) { for(j=0;j<=2;j++) { for(j=0;j<=1;j++) { printf("%5d",a[i][j]); printf("%5d",b[i][j]); b[j][i]=a[i][j]; printf("\n"); } } printf("\n"); } }

#include <stdio.h> 例 求二维数组中最大元素值及其行列号 main() { int a[3][4]={{1,2,3,4}, {9,8,7,6}, max=a[0][0] {-10,10,-5,2}}; for i=0 to 2 int i,j,row=0,colum=0,max; for j=0 to 3 max=a[0][0]; for(i=0;i<=2;i++) a[i][j]>max 真 假 for(j=0;j<=3;j++) if(a[i][j]>max) max=a[i][j] row=i { max=a[i][j]; colum=j row=i; colum=j; 输出:max和row,colum } printf("max=%d,row=%d, \ colum=%d\n",max,row,colum); }

例 读入下表中值到数组,分别求各行、各列及表中所有数之和 #include <stdio.h> 12 4 6 main() 84 23 322 { int x[5][4],i,j; 12 6 15 7 934 for(i=0;i<4;i++) 8 23 3 for(j=0;j<3;j++) 27 5 17 15 9 31 scanf("%d",&x[i][j]); 2 5 17 24 for(i=0;i<3;i++) 37 39 35 111 x[4][i]=0; for(j=0;j<5;j++) for(i=0;i<5;i++) x[j][3]=0; { for(j=0;j<4;j++) for(i=0;i<4;i++) printf("%5d\t",x[i][j]); for(j=0;j<3;j++) printf("\n"); { x[i][3]+=x[i][j]; } x[4][j]+=x[i][j]; } x[4][3]+=x[i][j]; }

§5.3 字符数组5.3.1 字符数组的定义 ch[3][4]; 例 char c[10],

5.3.2 字符数组的初始化 逐个字符赋值 用字符串常量逐个字符赋值 用字符串常量 用字符串常量 逐个字符赋值 逐个字符赋值 有问题!

5.3.3 字符数组的引用例例charch[5]={ H , e , l , l , o }; char ch[6]={“Hello”}; 例 char ch[5]={ B , o , y }; 例 char ch[5]={ H , e , l , l , o }; char ch[5]=“Boy”; char ch[6]=“Hello”; H B charoch[]=“Hello”; \0 e ll y ll o \0 H e o\0 ch[0]H ch[1]e ch[2]l ch[3]l ch[4]o ch[0] ch[1] ch[2] ch[3] ch[4] ch[0] ch[1] ch[2] ch[3] ch[4] ch[0] ch[1] ch[2] ch[3] ch[4] ch[5]

二维字符数组初始化 二维字符数组初始化

例 char diamond[][5]={{'.', '.','*'},{'.','*','.','*'}, {'*', '.', '.', '.' ,'*'},{'.','*', '.','*'},{'.', 例 char fruit[][7]={“Apple”,”Orange”, '.','*'}};diamond[0] . . p * p r . a

”Grape”,”Pear”,”Peach”};* \0 \0

diamond[1] A fruit[0] . diamond[2] O fruit[1] *

.l.n .p *r c

e* g. e*

\0 e \0

\0 \0* \0 \0 \0

diamond[3] G fruit[2] . diamond[

4] P fruit[3] . fruit[4] P

r * a

e .e

aa

\0\0 \0h \0

\0 \0\0

例 输出一个字符串0

I a m a b o y

#include <stdio.h> main() { char c[10]={'I',' ','a','m',' ','a',' ','b','o','y'}; int i; for(i=0;i<10;i++) printf("%c",c[i]); printf("\n"); }

1 2 3 4 5 6 7 8 9

5.3.4 字符串和字符串结束标志 无字符串变量,用字符数组处理字符串 字符串结束标志:‘\0’

例 hello”共5个字符,在内存占6个字节 字符串长度5h e l l o \0 0

104 101 108 108 111

内存存放字符ASCII码

5.3.5 字符数组的输入输出 逐个字符I/O: %c 整个字符串I/O: %s 例 用%c main() { char str[5]; int i; for(i=0;i<5;i++) 例 用%s scanf(“%c”, &str[i]); main() for(i=0;i<5;i++) { char printf(“%c”, str[i]); str[5]; } scanf(“%s”, str); printf(“%s”, str);} 用字符数组名,不要加& 输入串长度<数组维数 遇空格或回车结束 自动加‘\0

用字符数组名, 遇‘\0 结束

例 main( ) { char a[5]={ H , e , l , l , o }; printf(“%s”,a); } 结果:Hello#-=* 例 main( ) { char a[ ]=“Hello”; printf(“%s”,a); } 结果:Hello

0

1

2

3

4

h

e

l

l

o

用 %s”输出时,遇‘\0 结 束

本文来源:https://www.bwwdw.com/article/yw14.html

Top