数组知识学习

文档属性

名称 数组知识学习
格式 rar
文件大小 34.3KB
资源类型 教案
版本资源 教科版
科目 信息技术(信息科技)
更新时间 2010-06-02 20:53:00

图片预览

文档简介

(共40张PPT)
第5章 数 组
5.1 一维数组
5.2 二维数组
5.3 字符数组
5.1 一维数组
int a,b;
int c[10];
则 c[0],c[1],…,c[9]都是变量。
5.1.1 一维数组的定义
类型标识符 数组名[元素个数];
例如:
char str[20];
数组名为 str,有20个元素:
str[0],str[l],str[2],…….,str[19]
5.1.2 一维数组的存储形式
对于 int a[10];
编译系统为数组a分配10*sizeof(int) 个字节的存储区域。
5.1.3 一维数组的初始化
和 int b1=0, s=0; 类似,有
int a[10] ={0, l,2,3,4,5,6,7,8,9} ;
(1) 全部赋初值,可不指定长度,如
int a[ ] ={0, l,2,3,4,5,6,7,8,9} ;
(2) 部分赋初值,长度不能省略,如
int a[10] ={1,2,3} ;
char b[5] ={‘+’,’-’} ;
(3) 初值不能多于数组长度,如
int a[3]={1,2,3,4} 是错误的。
5.1.4 一维数组的引用
数组名[下标]
下标可以是整型表达式。
例如:
int a[10];
a[0]=5;
a[1]=2*a[3/4];
a[5]=a[3%2]+a[6-6];
5.1.5 一维数组应用举例
例5.1 用数组求Fibonacci数列的前40项。
1,1,2,3,5,8,13,21,……
f1=1, f2=1, fn=fn-1+fn-2 (n>2)
#include
void main()
{ int i; long f [40]={1,1};
for(i=2;i<40;i++) f[i]=f[i-2]+f[i-1];
for(i=0;i<40;i++)
{ if(i%5==0) printf("\n");
printf("%10ld",f[i]);
}
}
【例5.2】用选择排序法对N个数从小到大排序。
分析:设 N=5
a[0] a[1] a[2] a[3] a[4]
原序列: 8 6 3 1 2 i=0, k=3
第1遍选择: 1 6 3 8 2 i=1, k=4
第2遍选择: 1 2 3 8 6 i=2, k=2
第3遍选择: 1 2 3 8 6 i=3, k=4
第4遍选择: 1 2 3 6 8
for ( i=0; i<4; i++ )
{ k=i;
for(j=i+1; j<5; j++) if( a[k]>a[j] ) k=j;
t=a[k]; a[k]=a[i]; a[i]=t;
}
#include
#define N 8
void main()
{ float a[N],t; int i,j,k;
for(i=0;ifor(i=0;i{ k=i;
for(j=i+1;jt=a[k]; a[k]=a[i]; a[i]=t;
}
for(i=0;i}
【例5.3】用冒泡排序法对n个数从小到大排序。
对5个数,从小到大排序: N=5
第一遍选择:
8
6
3
1
2
第一次
6
8
3
1
2
第二次
6
3
8
1
2
第三次
6
3
1
8
2
第四次
6
3
1
2
8
结果
6 3 1 1
3 1 2 2
1 2 3 3
2 6 6 6
8 8 8 8
第一遍 第二遍 第三遍 第四遍
for(i=0;ifor(j=0;jif(a[j]>a[j+1])
{t=a[j]; a[j]=a[j+1] ; a[j+1]=t; }
#include
#define N 8
void main()
{ float a[N] ,t;
int i,j,k;
printf("input %d numbers:\n",N);
for(i=0;ifor(i=0;ifor(j=0;jif(a[j]>a[j+1])
{t=a[j]; a[j]=a[j+1] ; a[j+1]=t;}
printf("the sorted numbers:\n");
for(i=0;i}
#include
#include
#define N 8
void main()
{ int a[N],i,x;
printf("input %d numbers:\n",N);
for(i=0;iprintf("input x to look for:");
scanf("%d",&x);
for(i=0;iif(a[i]==x){ printf("find: %d it is a[%d]\n",x,i);
exit(0);}
printf("%d not been found.\n",x);
}
【例5.4】在n个数中查找某一个数。
返回目录
5.2 二维数组
5.2.1 二维数组的定义
类型标识符 数组名[常量表达式][常量表达式];
例如:
float a[3][4];
定义a为3行4列的数组,共有12个元素,即:
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]
5.2.2 二维数组的存储形式
二维数组在内存中按行存放。
int a[3][2];
a[0][0] a[0][1]
a[1][0] a[1][1]
a[2][0] a[2][1]
a[0][1]
a[1][0]
a[1][1]
a[2][0]
a[2][1]
a[0][0]
(1)全部元素赋初值
int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
int a[3][4]={ l,2,3,4,5,6,7,8,9,10, 11,12};
(2) 部分元素赋初值。
int a[3][4]={{l},{5},{9}};
int a[3][4]={1,5,9,4};
(3)一维的长度可不指定。
int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
5.2.3 二维数组的初始化
5.2.4 二维数组的引用
数组名[下标][下标]
如:
int x[2][3];
x[0][0]=3;
x[1][2]=x[0][0]+5;
x[1][2] ++;
5.2.5 二维数组应用举例
【例5.5】 输入一个4×4的整数矩阵,分别求两对角线上元素之和。
m[0][0] m[0][1] m[0][2] m[0][3]
m[1][0] m[1][1] m[1][2] m[1][3]
m[2][0] m[2][1] m[2][2] m[2][3]
m[3][0] m[3][1] m[3][2] m[3][3]
分析:当 i==j 时, m[i][j]在主对角线上
当 i+j==3 时,m[i][j]在次对角线上
#define N 4
#include
void main()
{int m[N][N];
int i, j, r1=0, r2=0;
for( i=0;i{ printf("one line:");
for(j=0;j{ scanf("%d",&m[i][j]);
if(i==j) r1+=m[i][j];
if(i+j==N-1) r2+=m[i][j];
} }
printf("the result: %d, %d\n",r1,r2);
}
分析:当 i=j 时, m[i][j]在主对角线上
当 i+j=3 时,m[i][j]在次对角线上
m[0][0] m[0][1] m[0][2] m[0][3]
m[1][0] m[1][1] m[1][2] m[1][3]
m[2][0] m[2][1] m[2][2] m[2][3]
m[3][0] m[3][1] m[3][2] m[3][3]
例 5.6 矩阵转置
1 2 3 1 4 7
4 5 6 2 5 8
7 8 9 3 6 9
即a[i][j]与a[j][i]互换,
期中 i>j。
#include
#define N 4
void main()
{ int a[N][N], temp; int i,j;
for(i=0; ifor(j=0; jfor(i=0; ifor(j=0; j{ temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp; }
for(i=0; i{ for(j=0; jprintf("\n");
}
}
即a[i][j]与a[j][i]互换,
期中 i>j。
【例5.7】有一个3×4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。
分析:
int a[3][4], max, row, colum, i, j ;
对数组a输入数据;
max=a[0][0]; row=0; colum=0;
对所有i,j,如果max则 max=a[i][j]; row=i; colum=j;
main()
{ int i,j,row,colum,max;
int a[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+1,colum+1);
}
返回目录
5.3 字符数组
5.3.1 字符数组的定义
char a[10];
a[0]=’C’; a[1]=’H’; a[2]=’I’;
a[3]=’N’; a[4]=’A’;a[5]=’\0’;
在内存中的状态如下:
5.3.2 字符数组的初始化
char c[7]={‘a’, ‘ ’ ,‘b’ ,‘o’, ‘y’ };
在内存中的状态如下:
a

b
o
y
\0
\0
又如
char c[ ]={‘a’, ‘ ’ , ‘b’,’o’,’y’,’\0’};
char c[ ]={“a boy”};
char c[ ]= “a boy”;
三者等价。
数组c在内存中的状态:
a

b
o
y
\0
注意:数组名是常量。
如 char a[10]; a=“abcde”;是错的。
但 char a[10]=“abcde”;是对的。
5.3.3 字符数组的输入/输出
1. 逐个字符的输入、输出
函数 getchar和putchar,
函数scanf和printf的‘%c’。
例5.8 输入一行字符,将其中的小写字母转换成大写字母,其余不变。如输入“ab”
#include
void main()
{ char c[81]; int i;
for( i=0; (c[i]=getchar()) !='\n'; i++ );
c[i]='\0';
for(i=0;c[i]!='\0';i++)
{ if ( c[i]>='a'&&c[i]<='z' ) c[i]-=32;
printf("%c",c[i]);
}
}
a
b
\0
2. 整个字符串的输入/输出
将例5.8修改如下:
#include
void main()
{ char c[81]; int i;
scanf("%s",c);
for(i=0;c[i]!='\0';i++)
if(c[i]>='a'&&c[i]<='z') c[i]-=32;
printf("%s",c);
}
运行结果:
HangZhou China↙
HANGZHOU
遇到空格、Tab符、回车符终止,并写入 ’\0’
5.3.4 常用字符串处理函数
1.字符串输出函数puts
函数原型:int puts (char *str);
使用方法:puts(str);
例如:
char s[ ]=” Beijing\nChina”;
puts(s);
输出:
Beijing
China
2. 字符串输入函数gets
函数原型: char *gets (char *str);
使用方法:gets(str);
例如:
char str[81];
gets(str);
从键盘输入:Computer Science↙
gets函数和puts函数的头文件为stdio.h。
3.字符串连接函数strcat
函数原型:
char * strcat (char *str1, char *str2);
使用方法:strcat(str1,str2);
例如:
char str1[15]=”Beijing ”;
char str2[ ]=”China”;
printf(“%s”, strcat(str1,str2));
输出:
Beijing China
4.字符串拷贝函数strcpy
函数原型: char * strcpy (char *str1, char *str2);
使用方法: strcpy(str1,str2);
例如:
char str1[10]=”012345678”,
str2[ ]=”China”;
strcpy(str1,str2);
‘0’ ‘1’ ‘2’ ‘3’ ‘4’ ‘5’ ‘6’ ‘7 ‘ ‘8’ ‘\0’
‘C’ ‘h’ ‘i’ ‘n’ ‘a’ ‘\0’ ‘6’ ‘7 ‘ ‘8’ ‘\0’
5.字符串比较函数strcmp
函数原型:int strcmp (char *str1, char *str2);
使用方法:strcmp(str1,str2);
例如:
strcmp(“abc”,”abc”)的返回值为0
(即’\0’-‘\0’的值);
strcmp(“abc”,”abcd”)的返回值为-100
(即’\0’-‘d’的值);
strcmp(“abc”,”aBef”)的返回值为32
(即’b’-‘B’的值)。
6.求字符串长度函数strlen
函数原型:int strlen (char *str);
使用方法:strlen(str);
例如:
char str[10]=”China”;
printf(“%d”,strlen(str));
输出结果为5。
5.3.5 二维字符数组
char str[3][10]={“China”,”Holland”,”America”};
str[0] → ‘C’ ‘h’ ‘i’ ‘n’ ‘a’ ‘\0’ ‘\0’ ‘\0’ ‘\0’ ‘\0’
str[1] → ‘H’ ‘o’ ‘l’ ‘l’ ‘a’ ‘n’ ‘d’ ‘\0’ ‘\0’ ‘\0’
str[2] → ‘A’ ‘m’ ‘e’ ‘r’ ‘i’ ‘c’ ‘a’ ‘\0’ ‘\0’ ‘\0’
【例5.9】有三个字符串, 要求找出最大者。
#include
#include
void main()
{ char string[20], str[3][20]; int i;
for(i=0;i<3;i++) gets(str[i]);
if(strcmp(str[0],str[1])>0) strcpy(string,str[0]);
else strcpy(string,str[1]);
if(strcmp(str[2],string)>0) strcpy(string,str[2]);
printf("\n the largest string is: \n%s\n",string);
}
str[0] → ‘C’ ‘h’ ‘i’ ‘n’ ‘a’ ‘\0’ ‘\0’ ‘\0’ ‘\0’ ‘\0’
str[1] → ‘H’ ‘o’ ‘l’ ‘l’ ‘a’ ‘n’ ‘d’ ‘\0’ ‘\0’ ‘\0’
str[2] → ‘A’ ‘m’ ‘e’ ‘r’ ‘i’ ‘c’ ‘a’ ‘\0’ ‘\0’ ‘\0’
5.3.6字符串应用举例
【例5.10】将字符数组中的字符串按逆序存放。
a b c \0
c b a \0
#include
#include
void main()
{ char s[81],t;
int i,j;
gets(s);
for( j=0; s[j]!='\0'; j++);
for( i=0,j--; i{ t=s[i];s[i]=s[j];s[j]=t;}
printf("the reverse string:%s\n",s);
}
a b c d e \0
i=0 i=1 j
#include
#include
void main()
{ char s[81],ch; int i;
printf("input string: "); gets(s);
printf("delete character: ");
ch=getchar();
for(i=0;s[i]!='\0'; )
{ if(s[i]==ch) strcpy(s+i,s+i+1);
else i++;
}
puts(s);
}
【例5.11】从输入的字符串中删除一指定字符。
A
B
C
D
C
\0
C
A
B
D
C
\0
\0
A
B
D
\0
\0
\0
#include
void main()
{ char str[81],c;
int i,num=0,word=0; gets(str);
for(i=0;(c=str[i])!='\0';i++)
if(c==' ') word=0;
else if(word==0) { word=1; num++;}
printf("There are %d words in the line.\n",num);
}
【例5.12】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
A
B
O
Y
\0
返回目录
同课章节目录