07数组Word下载.docx
- 文档编号:21250978
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:18
- 大小:21.68KB
07数组Word下载.docx
《07数组Word下载.docx》由会员分享,可在线阅读,更多相关《07数组Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
必须:
for(j=0;
j<
10;
j++)
printf(“%d\n”,a[j]);
7.1.3一维数组程序举例
例1、计算、打印Fibonacci数列的前20项
{intf[20]={1,1};
for(i=2;
i<
20;
i++)
f[i]=f[i-1]+f[i-2];
for(i=0;
{printf("
%d,"
f[i]);
if(i%5==0)printf("
\n"
);
}
}
例2、整数数组中的查找算法
无序数组
#defineN10
{inta[N]={3,4,1,2,5,6,9,0,7,8};
intkey;
&
key)
N;
if(a[i]==key)break;
if(i==N)printf("
%d\n"
-1);
elseprintf("
i);
有序数组
{inta[N]={1,2,3,4,5,6,7,8,9,10};
N&
&
a[i]<
=key;
if(i==N||a[i]>
key)printf("
例3、整数数组的冒泡排序(从小到大)
思路:
从后向前相邻两个数比较,小值向前移位
N下标
1
2
3
4
5
6
7
x[N]
8
第0趟
第1趟
第2趟
第3趟
第4趟
第5趟
第6趟
共N-1趟排序;
第i趟的目标:
x[i]到位。
i∈[0,N-2]
第i趟的比较范围:
j∈[i+1,N-1]
#defineN8
{intx[N]={7,8,5,6,3,4,1,2};
inti,j,tmp;
=N-2;
{for(j=N-1;
j>
i;
j--)
if(x[j-1]>
x[j])
{tmp=x[j-1];
x[j-1]=x[j];
x[j]=tmp;
}
i++)printf("
x[i]);
例4、整数数组的沉底排序(从小到大)
从前向后相邻两数比较,大值向前移位
x[N-1-i]到位。
j∈[0,N-2-i]
练习:
读入十个整数存入数组,找出其中的最大值和最小值。
解题步骤:
1.输入:
for循环输入10个整数
2.处理:
(a)先令max=min=x[0]
(b)依次用x[i]和max,min比较(循环)
若max<
x[i],令max=x[i]
若min>
x[i],令min=x[i]
3.输出:
max和min
7.2二维数组的定义与引用
7.2.1二维数组的定义
数据类型数组名[常量表达式][常量表达式];
floatf[3][4]
内存结构:
按行存放
f[0][0],…,f[0][3],f[1][0],…,f[1][3],…,f[2][3]
f的逻辑结构:
f[0],f[1],f[2]
f[i]为一维数组。
f[i][0],…,f[i][3]
{floatf[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
floatg[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
floath[3][4]={1,2,3,4,5,6,7,};
/*不完全赋值*/
floatf[3][4]={{1,2},{5},{9,10,11,12}};
思考;
如何利用循环语句对一个二维数组进行赋值.
7.2.2引用二维数组元素的各种方法
地址表示的灵活:
scanf("
f[i][0]);
f[i]是子数组的名字,是f[i][0]的起始地址
f[0][0]);
f[0]);
f);
f是数组的名字,是f[0]的起始地址,也是f[0][0]的起始地址
思考:
如何计算二维数组在内存中具体存放的位置?
[]是运算符,下标就是运算数。
对于数组f[3][4]
f[i][j]表示f后的第i*4+j个单元。
则:
f[1][4]等同于f[2][1]
C编译器不负责越界检查。
7.2.3二维数组程序
例1:
将一个二维数组的行和列进行互换,存到另一个二维数组中去
#include<
stdio.h>
{inta[2][3]={{1,2,3},{4,5,6}};
intb[3][2],i,j;
printf("
arraya:
i<
=1;
i++)
{for(j=0;
=2;
%5d"
a[i][j]);
b[j][i]=a[i][j];
}
arrayb:
b[i][j]);
例2:
求矩阵中的最大值、最小值、平均值
#defineN4
{inta[N][N]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
intmax,min,aver,i,j;
max=min=a[0][0];
aver=0;
for(j=0;
j<
j++)
{if(max<
a[i][j])max=a[i][j];
if(min>
a[i][j])min=a[i][j];
aver=aver+a[i][j];
aver=aver/(N*N);
........
例3:
求矩阵的乘积
{inta[N][N]={{1,1,1,1},
{1,1,1,1},
{1,1,1,1}
};
intb[N][N]={{1,0,0,0},
{0,2,0,0},
{0,0,3,0},
{0,0,0,4}
intc[N][N];
{c[i][j]=0;
for(k=0;
k<
k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
%d\t"
c[i][j]);
7.3字符数组
7.3.1字符数组与字符串
用字符数组存储字符串。
chars[10];
chars[10]={'
a'
'
b'
c'
};
缺省字符值为'
\0'
chars[10]={"
abc"
chars[10]="
;
chars[]="
字符串的结束标记:
'
0(严重关注!
)
字符数组的长度:
空间的大小。
字符串的长度:
有效字符的个数。
例:
”CProgram”数组长度和字符串长度分别为?
7.3.2字符串处理函数
#include"
string.h"
gets(s)
for(i=0;
(s[i]=getchar())!
='
\n'
i++);
s[i]='
puts(s)
s[i]!
i++)putchar(s[i]);
strlen(s)
字符串长度不包括'
for(len=0;
s[len];
len++);
该表示等价于?
strcpy(dest,src)
strncpy(dest,src,n)
字符串只能如此赋值!
进行字符串的部分赋值
src[i];
i++)dest[i]=src[i];
dest[i]=0;
或
dest[i]=src[i];
strcat(dest,src)
如dest空间不够大,会产生难以预计的破坏效果!
dest[i]!
src[j]!
j++,i++)
dest[i]=src[j];
连接两个字符串后面都有’\0’,连接的时候将字符串1后面的’\0’取消,只在新串后保留’\0’
strcmp(s1,s2)
字符串比较的规则:
对字符串自左向右依次进行ASCII的比较,直到出现不同的字符或者’\0’
<
0s1小于s2
>
0s1大于s2
=0s1等于s2
s1[i]&
s2[i];
if(s1[i]!
=s2[i])break;
result=s1[i]-s2[i];
strupr(s)
转变数组元素为大写字符
strlwr(s)
转变数组元素为小写字符
注意:
字符数组的基本遍历套路。
s[i];
i++)......
7.4一维字符数组程序
例1、在字符串s的第k个字符后,插入一个字符ch
//数组插入套路
{chars[20]="
abcdefghijk"
ch='
x'
intk=3,len,i;
for(len=0;
len++);
for(i=len;
i>
k;
i--)
s[i+1]=s[i];
s[k+1]=ch;
puts(s);
例2、在字符串s的第k个字符后,插入字符串t
t[]="
123"
intk=3,slen,tlen,i;
for(slen=0;
s[slen];
slen++);
for(tlen=0;
t[tlen];
tlen++);
for(i=slen;
s[i+tlen]=s[i];
t[i];
s[k+i+1]=t[i];
例3、在字符串s中删除第k个字符
//数组删除套路
intk=3,i,len;
for(i=k+2;
=len;
s[i-1]=s[i];
例4、在字符串s中删除第pos个字符开始的k个字符。
intpos=2,k=3,i,len;
for(i=pos+k+1;
s[i-k]=s[i];
例5、逆序字符串
{chars[]="
tmp;
inti,j;
for(i=0,j=strlen(s)-1;
j;
i++,j--)
{tmp=s[i];
s[i]=s[j];
s[j]=tmp;
例6、判断一行字符包含的字符数、单词数。
单词:
连续的字母数字串。
创意:
inword标志当前字符是否在一个单词中。
enumFLAG{IN,OUT};
IloveProgram!
1245"
inti,nw;
enumFLAGinword=OUT;
for(i=0,nw=0;
if(s[i]=='
'
)inword=OUT;
else
if(inword==OUT)
{inword=IN;
nw++;
nw=%d\n"
nw);
7.4类型转换程序
例1、字符数组转换为整数
"
=》123
123asd"
-123a22"
=》-123
{chars[10]="
-234a22"
inti,mark,integer;
floatfraction;
s[i]=='
//剔除空格
mark=1;
-'
){mark=-1;
i++;
for(integer=0;
s[i]>
0'
&
s[i]<
9'
integer=10*integer+s[i]-'
mark*integer);
例2、字符数组转换为实数
123.45"
=》123.45
123.45asd"
-123.45a22"
=》-234.45
inti,mark,integer,frac_len;
integer=10*integer+s[i]-'
if(s[i]!
.'
)
//没有小数部分
else//考虑小数部分
{i++;
fraction=0;
frac_len=0;
for(;
i++,frac_len++)
fraction=fraction*10+s[i]-'
frac_len;
i++)fraction=fraction/10;
%f\n"
mark*(integer+fraction));
例3、将整数转换为10进制的字符数组
思路:
依次提取个位、十位、百位、千位、万位。
个位=x%10x=x/10循环,始终提取个位
符号位的处理
main()
{intnum=-1023;
inti,mark=1;
if(num<
0){num=-num;
mark=-1;
i=0;
do
{s[i++]=num%10+'
num=num/10;
}while(num>
0);
if(mark<
0)s[i++]='
s[i]='
...逆序字符串s...
将整数转换为K进制的字符数组?
将实数转换为字符数组?
7.5排序程序
例1、字符串数组的冒泡排序(从小到大)
#defineN5
{charx[N][20]={"
bb"
"
dd"
cc"
aa"
ee"
chartmp[20];
j++)
if(strcmp(x[j-1],x[j])>
0)
{strcpy(tmp,x[j-1]);
strcpy(x[j-1],x[j]);
strcpy(x[j],tmp);
i++)puts(x[i]);
例2、整数数组的直接插入排序(从小到大)
第7趟
共N-1趟:
i∈[1,N-1]
第i趟:
插入x[i]
j∈[0,i-1]
第i张牌如何插入:
移位
{intx[N]={7,8,5,6,3,4,1,2};
inti,j,k,tmp;
for(i=1;
{tmp=x[i];
//让位
for(j=i-1;
=0&
x[j]>
tmp;
j--)//移位
x[j+1]=x[j];
x[j+1]=tmp;
//归位
%d"
例3、字符数组的直接插入排序(从小到大)
{charx[N][10]={"
inti,j,k;
chartmp[10];
{strcpy(tmp,x[i]);
strcmp(x[j],tmp)>
0;
j--)//移位
strcpy(x[j+1],x[j]);
strcpy(x[j+1],tmp);
例4、整数数组的简单选择排序(从小到大)
共n-1趟:
i∈[0,N-2]
j∈[i,N-1]
找到第i小的数,交换到x[i]的位置上
inti,j,min_i,tmp;
N-1;
{min_i=i;
//假设
for(j=i+1;
j++)//比较
if(x[j]<
x[min_i])min_i=j;
if(min_i!
=i)//交换
{tmp=x[min_i];
x[min_i]=x[i];
x[i]=tmp;
例5、字符串数组的简单选择排序(从小到大)
inti,j,min_i;
{min_i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 07 数组