数组习题课.docx
《数组习题课.docx》由会员分享,可在线阅读,更多相关《数组习题课.docx(16页珍藏版)》请在冰豆网上搜索。
![数组习题课.docx](https://file1.bdocx.com/fileroot1/2023-2/2/67037f1d-a636-45e0-88c9-08d33c35c8c0/67037f1d-a636-45e0-88c9-08d33c35c8c01.gif)
数组习题课
第六章数组习题课内容
回顾:
1、数组定义:
类型标识符数组名[整型常量表达式];
类型标识符数组名[整型常量表达式][整型常量表达式];
如:
inta[10],b[3][4];
doublef[10];
2、数组初始化
intx[10]={1,2,3,4,5,6,7,8,9,10};
floatscore[5]={89.5,90.8,67.8,65,88};
3、数组的引用
使用下标变量与普通变量的使用一样。
4、字符数组
charstr[6]={“hello”};
charstr1[6]={‘h’,’e’,’l’,’l’,’o’,’\0’}
chars1[3][10]={{‘h’,’e’,’l’,’l’,’o’},
{‘c’,’h’,’i’,’n’,’a’},
{‘w’,’o’,’r’,’l’,’d’}};
chars2[3][10]={“hello”,”china”,”world”};
5、字符串处理函数
Chars1[20]={“hello”};
strcat(s1,”world”);helloworld
strcpy(s1,”china234234llo”);
strcmp(字符串1,字符串2);结果:
1,0,-1
strlen(字符串);
#include
1、例6.5:
将矩阵的行和列互换。
A矩阵:
123B矩阵:
14
45625
36
关键算法:
b[j][i]=a[i][j]
主要流程:
(1)用双重循环实现数据的输入;
(2)用双重循环实现矩阵转置;
(3)用双重循环实现A矩阵数据的输出;
(4)用双重循环实现B矩阵数据的输出;
#include
voidmain()
{
inta[2][3],b[3][2],i,j;
printf(“pleaseinput6integers:
\n”);
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
scanf("%d",&a[i][j]);//输入一个2×3的矩阵存入数组a
for(i=0;i<=1;i++)
for(j=0;j<=2;j++)
b[j][i]=a[i][j];//将数组a中矩阵转置后存入数组b
printf(“\nmatrixais:
\n”);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
printf("%4d",a[i][j]);
printf("\n");//输出数组a中的2×3矩阵
}
printf(“\nmatrixbis:
\n”);
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
printf("%4d",b[i][j]);
printf("\n");//输出数组b中的3×2矩阵
}
}
2、例6.6:
求N行N列正方阵的两条对角线元素之和(每个元素不得重复加)。
3*3矩阵:
1234*4矩阵:
1234
4565678
7899101112
13141516
关键算法:
(1)sum=sum+a[i][i]+a[i][N-i-1]
(2)sum=sum-a[N/2][N/2](当N为奇数时)
主要流程:
(1)用双重循环实现N*N方阵元素数据的输入;
(2)用双重循环实现N*N方阵元素的输出;
(3)用单循环实现N*N方阵两对角线元素的累加;
(4)根据判断方阵行(列)是否奇数,和值减去中心元素。
#include
#defineN3
voidmain()
{
inta[N][N]={{1,2,3},{4,5,6},{7,8,9}};
inti,j,sum=0;
//用双重循环实现N*N方阵元素数据的输入
printf("\nPleaseinput%d×%dmatrix:
\n",N,N);
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
//用双重循环实现N*N方阵元素的输出
printf("\nThe%d×%dmatrix:
\n",N,N);
for(i=0;i{
for(j=0;jprintf("%4d",a[i][j]);
printf("\n");
}
//用单循环实现N*N方阵两对角线元素的累加
for(i=0;isum+=a[i][i]+a[i][N-i-1];
//根据判断方阵行(列)是否奇数,和值减去中心元素
if(N%2!
=0)sum-=a[N/2][N/2];//判断N是不是奇数
printf("\nThesumofallelementson2diagnalis%d.\n",sum);
}
3、例6.11:
输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。
例如,输入:
thisisacprogram.
输出:
5
关键算法:
(1)单词开始标志的清零与置位。
(2)字符串结束标志的判断。
主要流程:
(1)从第0个字符开始,依次与空格字符比较,如果是空格,标志word=0;如果是非空格,若word==0,则新单词开始,置标志位word=1,累计单词个数;否则,继续读下一个字符。
(2)输出单词数。
#include"stdio.h"
voidmain()
{
charstring[81];
inti,num=0,word=0;
charc;
gets(string);
for(i=0;(c=string[i])!
='\0';i++)
if(c=='')
word=0;//连续空格时word重复赋0
elseif(word==0)//新的单词开始了
{
word=1;
num++;
}printf("Thereare%dwordsintheline.\n",num);
}
4、类似例6.11
例6.13:
输入一个字符串到str字符数组,将该字符串中除了下标为偶数、同时ASCII值也为偶数的字符外,其余的全部删除;串中剩余字符所形成的一个新串放在s字符数组中。
例如,输入:
0123456789
输出:
02468
关键算法:
(1)求余。
(2)在新串s末尾加上字符串结束标记’\0’。
主要流程:
(1)对字符串str中的字符逐个判断,若某个字符的下标为偶数、同时ASCII值也为偶数,则将该字符存入s字符数组中。
(2)输出新字符串s。
#include
#include
voidmain()
{
charstr[100],s[100];
inti,j=0,n;
//scanf("%s",str);
gets(str);
n=strlen(str);//取字符串str长度
for(i=0;iif(i%2==0&&str[i]%2==0)//判断字符i是否符合条件
{
s[j]=str[i];//将偶数下标及偶数ASCII码的字符放入新串
j++;//新串长度加1
}
s[j]='\0';//新串添加结束符
printf("\nTheresultis:
%s\n",s);
}
5、例6.14:
输入一个字符串,然后逆置。
例如,输入:
ABCDE
输出:
EDCBA
关键算法:
借助第三方变量交换数据。
ch=s[i];s[i]=s[j];s[j]=ch;
主要流程:
(1)读入一个字符串;
(2)用单循环实现前后数据的交换;
(2)输出逆置后的新字符串s。
#include
#include
#defineM60
voidmain()
{
chars[M],ch;
intj,m;
printf("Inputastring:
");
gets(s);
m=strlen(s)-1;//m=4
for(j=0;j{
ch=s[j];
s[j]=s[m];
s[m]=ch;
}
printf("Thereversalstring:
%s\n",s);
}
6、例6.15:
编写程序,将一个数字字符串转换为一个整数,不得使用c语言提供的转换函数(atoi(“123”)itoa(1234))。
例如,输入:
”123”
输出:
123
关键算法:
(1)数字字符的ASCII码减去’0’(或0x30或48),即得0-9的数值。
(2)不断进行高位乘10运算,再累加。
(3)考虑负号。
主要流程:
(1)读入一个字符串;
(2)判断第0个字符是否为’-‘号;是,即从第1个字符开始转换,否则从第0个字符开始转换。
(2)用循环实现每个数字字符到对应数值的转换、累加;
(3)输出转换后的数值。
#include
#include
voidmain()
{charstr[80];
longx=0;
inti=0,n;
printf("pleaseinputastring:
\n");
gets(str);
printf("\nstringis:
\"%s\"\n",str);
n=strlen(str);
if(str[0]=='-')i++;
for(;ix=x*10+str[i]-'0';
if(str[0]=='-')x=-x;
printf("\nvalue=%d\n\n",x);
}
7、习题3.1:
用“两路合并法”,把两个已按升序排列的数组合并成一个升序数组。
例如,输入a:
891011
输入b:
1232556778
输出c:
121532344855677898
关键算法:
(1)a、b数组中两个元素大小比较
(2)a、b、c三个数组下标控制。
主要流程:
(1)用循环读入两个数组的元素(也可以使用初始化元素);
(2)循环比较a、b两个数组中的元素,把小的元素放入c中,注意下标控制。
(3)用循环实现把a数组中剩余元素移入c中;
(4)用循环实现把b数组中剩余元素移入c中;
(5)用循环输出排序后的数组。
#include
#defineM4
#defineN5
voidmain()
{inta[M]={15,34,48,98};
intb[N]={12,32,55,67,78};
intc[M+N+1];
inti,j,k;
i=j=k=0;
//用循环实现两个数组元素的输入
printf("\nPleaseinputarraya[%d]:
\n",M);
for(i=0;iscanf("%d",&a[i]);
printf("\nPleaseinputarrayb[%d]:
\n",N);
for(i=0;iscanf("%d",&b[i]);
//循环比较a、b两个数组中的元素,把小的元素放入c中,注意下标控制。
i=j=0;
while(iif(a[i]
{
c[k]=a[i];
k++;
i++;
}
else
{
c[k]=b[j];
k++;
j++;
}
//用循环实现把a数组中剩余元素移入c中;
while(i{
c[k]=a[i];
i++;
k++;
}
//用循环实现把b数组中剩余元素移入c中;
while(j{
c[k]=b[j];
k++;
j++;
}
//用循环输出排序后的数组c。
printf("\nresult:
\n");
for(i=0;iprintf("%5d",c[i]);
printf("\n");
}
8、习题3.2:
求能整除k且是偶数的数,把这些数保存在数组中,并按从大到小输出。
例如,输入k:
100
输出:
50201042
关键算法:
(1)求余运算。
(2)从大到小输出的方法。
主要流程:
(1)用循环从1到k,逐个求余,把满足条件的数存入数组中;
(2)用循环输出数组元素。
#include
#include
main()
{inti,j=0,k,a[100];
scanf("%d",&k);
for(i=1;i<=k;i++)
if(k%i==0&&i%2==0)
a[j++]=i;
printf("\n\n");
for(i=j-1;i>=0;i--)
printf("%d",a[i]);
}
8、习题3.3:
把一个整数转换成字符串,并倒序保存在字符数组a中。
例如,输入n:
123
输出s:
“321”
关键算法:
(1)求余、整除运算。
(2)数值转换为ASCII码字符方法:
+’0’;
(3)添加字符串结束标志’\0’。
主要流程:
(1)对数值n,循环和10求余后,+’0’后存入数组中,并对数值n整除10,数组下标增1。
(2)添加字符串结束标志’\0’。
(3)输出字符串。
#include
#include
#defineM80
voidmain()
{longintn=1234567;
chars[M];
intj=0;
printf("pleaseinputn:
\n");
scanf("%d",&n);
while(n>0)
{
s[j]=n%10+0x30;
n/=10;
j++;
}
s[j]='\0';
printf("\nReverseorderresult:
%s\n\n",s);
}
9、习题4.2:
利用“插入排序法”对一个字符串中的字符按照从小到大顺序排序。
例如,输入s:
china
输出str:
achin
关键算法:
(1)先对字符串中序;
(2)把第三个字符顺序插入到前两个字符中;
(3)把第四个字符顺序插入到前三个字符中;。
主要流程:
(1)输入一个字符串。
(2)从第1个字符开始到n-1循环处理每一个字符。
(3)把前两个字符排序。
(4)依次把后面的字符顺序插入到前面的字符中。
#include
#include
#defineN100
voidmain()
{
inti,j;
charstr[N]="asdfsdfsdf",ch;
for(i=1;i{
ch=str[i];//待排序字符ch
j=i-1;//待排序字符下标的前一个下标
while((j>=0)&&(ch{
str[j+1]=str[j];//当字符ch小于str[j],依次向后移动一个字符
j--;
}
str[j+1]=ch;//把ch插入到排序的位置
}
printf("Thestringaftersorting:
%s\n\n",str);
}
10、习题4.3:
计算一个字符串中包含子字符串的数目。
例如,输入字符串s1:
thisisacprogram
子字符串s:
is
输出:
2
关键算法:
(1)字符串结束标志’\0’;
主要流程:
(1)输入一个字符串和一个子串。
(2)从字符串的第0个字符开始,直到结束标志’\0’为止;
(3)依次和子串的第一个字符比较,从相等的字符开始,直到子串结束,包含子串的数目加1。
(4)循环进行步骤(3),直到字符串结束为止。
#include
#include
#defineM80
voidmain()
{
chars1[M],s2[M];
intnum,i,j=0;
printf("pleaseinputastrings1:
\n");
gets(s1);//输入字符串
printf("pleaseinputsubstrings2:
\n");
gets(s2);//输入子字符串
num=0;
for(i=0;s1[i]!
='\0';i++)//依次取母串的下一个字符,直到结束
{
if(s2[j]==s1[i])//比较子串与母串的各个字符是否相等
{
j++;//取子串的下一个字符
if(s2[j]=='\0')//直到子串结束
{
num++;//包含子串数目加1
j=0;//子串下标清零,为找下一个子串做准备
}
}
}
printf("\nTheresultis:
num=%d\n",num);
}