数组习题课.docx

上传人:b****7 文档编号:9296421 上传时间:2023-02-04 格式:DOCX 页数:16 大小:19.35KB
下载 相关 举报
数组习题课.docx_第1页
第1页 / 共16页
数组习题课.docx_第2页
第2页 / 共16页
数组习题课.docx_第3页
第3页 / 共16页
数组习题课.docx_第4页
第4页 / 共16页
数组习题课.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

数组习题课.docx

《数组习题课.docx》由会员分享,可在线阅读,更多相关《数组习题课.docx(16页珍藏版)》请在冰豆网上搜索。

数组习题课.docx

数组习题课

第六章数组习题课内容

回顾:

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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1