数组习题课.docx
- 文档编号:9296421
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:16
- 大小:19.35KB
数组习题课.docx
《数组习题课.docx》由会员分享,可在线阅读,更多相关《数组习题课.docx(16页珍藏版)》请在冰豆网上搜索。
数组习题课
第六章数组习题课内容
回顾:
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;i for(j=0;j scanf("%d",&a[i][j]); //用双重循环实现N*N方阵元素的输出 printf("\nThe%d×%dmatrix: \n",N,N); for(i=0;i { for(j=0;j printf("%4d",a[i][j]); printf("\n"); } //用单循环实现N*N方阵两对角线元素的累加 for(i=0;i sum+=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;i if(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(;i x=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;i scanf("%d",&a[i]); printf("\nPleaseinputarrayb[%d]: \n",N); for(i=0;i scanf("%d",&b[i]); //循环比较a、b两个数组中的元素,把小的元素放入c中,注意下标控制。 i=j=0; while(i if(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;i printf("%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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数组 习题