上机题解3.docx

上传人:b****3 文档编号:27203872 上传时间:2023-06-28 格式:DOCX 页数:33 大小:25.52KB
下载 相关 举报
上机题解3.docx_第1页
第1页 / 共33页
上机题解3.docx_第2页
第2页 / 共33页
上机题解3.docx_第3页
第3页 / 共33页
上机题解3.docx_第4页
第4页 / 共33页
上机题解3.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

上机题解3.docx

《上机题解3.docx》由会员分享,可在线阅读,更多相关《上机题解3.docx(33页珍藏版)》请在冰豆网上搜索。

上机题解3.docx

上机题解3

3-1.编程,任意输入10个整数,按从小到大的顺序输出。

结果:

输入:

9、7、8、6、7、5,

输出:

5、6、7、7、8、9。

分析:

用选择法排序。

main()/*sj1-3-1*/

{intj,k,e,t,a[10];

for(j=0;j<10;j++)scanf("%d",&a[j]);

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t]>a[k])t=k;

e=a[t];a[t]=a[j];a[j]=e;}

for(k=0;k<10;k++)

printf("%5d",a[k]);

printf("\n");

}

3-2.编程,任意输入10个人的成绩,按从大到小的顺序排列。

运行程序时,只要输入名次,计算机就能输出该名次对应的成绩。

结果:

输入:

4、7、3、6、1、5,12,0,23,-1

输入:

4

输出:

The4this6

分析:

用选择法排序。

第n名是a[n-1]。

main()/*sj1-3-2*/

{intj,k,e,t,n,a[10];

for(j=0;j<10;j++)scanf("%d",&a[j]);

printf(“nputanumber:

\n”);

scanf(“%d”,&n);

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t]>a[k])t=k;

e=a[t];a[t]=a[j];a[j]=e;}

printf(“The%dthis%d\n”,n,a[n-1]);

for(k=0;k<10;k++)

printf("%5d",a[k]);

printf("\n");

}

3-3.编程,输入10个人的序号和成绩,对成绩从小到大排序,输出排序后的序号和成绩。

结果:

输入:

1,102,93,84,75,66,77,88,99,1210,0

输出:

10:

0

5:

6

4:

7

6:

7

3:

8

7:

8

2:

9

8:

9

1:

10

9:

12。

分析:

用选择法排序。

a[j][0]--序号,a[j][1]--成绩。

main()/*sj1-3-3*/

{intj,k,e,t,a[10][2];

for(j=0;j<10;j++)scanf("%d,%d",&a[j][0],&a[j][1]);

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t][1]>a[k][1])t=k;

e=a[t][0];a[t][0]=a[j][0];a[j][0]=e;

e=a[t][1];a[t][1]=a[j][1];a[j][1]=e;

}

for(k=0;k<10;k++)

printf("%5d:

%5d\n",a[k][0],a[k][1]);

printf("\n");

}

3-4.编程,输入10个人的序号和成绩,对成绩从从大到小进行排序,输出排序后的序号和成绩。

结果:

输入:

1,102,93,84,75,66,77,88,99,1210,0

输出:

9:

12。

1:

10

8:

9

2:

9

7:

8

3:

8

6:

7

4:

7

5:

6

10:

0

分析:

用选择法排序。

a[j][0]--序号,a[j][1]--成绩。

main()/*sj1-3-4*/

{intj,k,e,t,a[10][2];

for(j=0;j<10;j++)scanf("%d,%d",&a[j][0],&a[j][1]);

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t][1]

e=a[t][0];a[t][0]=a[j][0];a[j][0]=e;

e=a[t][1];a[t][1]=a[j][1];a[j][1]=e;

}

for(k=0;k<10;k++)

printf("%5d:

%5d\n",a[k][0],a[k][1]);

printf("\n");

}

3-5.编程,输入10个整数及其序号,求出10个整数的最大值、次大值、最小值和次小值,并输出它们原来输入时的序号。

结果:

输入:

1,152.113,04,75,16,57,78,409,210,23

输出:

8:

4010:

23

3:

05:

1

分析:

用选择法排序。

a[j][0]--序号,a[j][1]--成绩。

交换时a[j][0]、a[j][1]一起交换。

main()/*sj1-3-5*/

{intj,k,e,t,a[10][2];

for(j=0;j<10;j++)scanf("%d,%d",&a[j][0],&a[j][1]);

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t][1]

e=a[t][0];a[t][0]=a[j][0];a[j][0]=e;

e=a[t][1];a[t][1]=a[j][1];a[j][1]=e;

}

printf("%5d:

%5d%5d:

%5d\n",a[0][0],a[0][1],a[1][0],a[1][1]);

printf("%5d:

%5d%5d:

%5d\n",a[9][0],a[9][1],a[8][0],a[8][1]);

}

3-6.编程,输入10个整数,然后进行查找。

输入要查找的整数,若找到,则输出该数在数组中的下标位置,否则输出“cannotfound!

”。

结果:

输入:

12234321567943367(a数组的内容)

56(要找的数)

输出:

56=a[4]

65(要找的数)

输出:

65cannotfound!

分析:

用数组存放10个整数,对10个整数循环,输出找到的整数及其在数组中的下标。

main()/*sj1-3-6*/

{intj,n,a[10];

for(j=0;j<10;j++)scanf("%d",&a[j]);

printf(“nputanumber:

\n”);

scanf(“%d”,&n);

for(j=0;j<10;j++)

if(n==a[j]){printf(“%d=a[%d]\n”,n,j);break;}

if(j>=10)printf(“%dcannotfound!

\n”,n);

}

3-7.编程,输入一个字符串并删除其中的指定字符。

例如,对于字符串abcdcf,指定删除c,则结果为:

abdf。

结果:

输入:

abcdcf和c

输出:

abdf

分析:

输入一个字符串s和要删除的字符ch,从字符串首开始逐个字符检查,每遇ch则将后面的字符向前移动一个位置覆盖要删字符ch.

#include"string.h"

#include"stdio.h"

main()/*sj1-3-7*/

{intj,k;

chara[80],ch;

gets(a);

printf("inputacharacter:

\n");

scanf("%c",&ch);

j=0;

while(a[j]!

='\0')

{if(ch==a[j])

for(k=j;a[k]!

='\0';k++)

a[k]=a[k+1];

j++;

}

puts(a);

}

3-8.编程,输入一行字符,将其反序后再输出。

结果:

输入abcdefg,输出:

gfedcba

分析:

输入n个字符到a数组,a[j]与a[n-j-1]互换(j=0,1,2,…,n/2-1)。

#include"string.h"

#include"stdio.h"

main()/*sj1-3-8*/

{intj,k,n;

chara[80],ch;

gets(a);

n=strlen(a);

for(j=0;j

{ch=a[j];

a[j]=a[n-1-j];

a[n-1-j]=ch;

}

puts(a);

}

3-9.编程,输入一行字符,将其中的每个字符从小到大排列后输出。

结果:

输入:

china输出:

achin

分析:

用选择法对字符数组进行排序。

#include"stdio.h"

#include"string.h"

main()/*sj1-3-9*/

{intj,k,t,n;chara[80],e;

printf("nputastring:

\n");scanf("%s",a);

n=strlen(a);

for(j=0;j

{t=j;

for(k=j+1;ka[k])t=k;

e=a[t];a[t]=a[j];a[j]=e;}

printf("%s\n",a);

}

3-10.编程,输入一行字符,将其中的每个字符从大到小排列后输出。

结果:

输入:

china输出:

nihca

分析:

用选择法对字符数组进行排序。

#include"stdio.h"

#include"string.h"

main()/*sj1-3-10*/

{intj,k,t,n;chara[80],e;

printf("inputastring:

\n");scanf("%s",a);

n=strlen(a);

for(j=0;j

{t=j;

for(k=j+1;k

e=a[t];a[t]=a[j];a[j]=e;}

printf("%s\n",a);

}

3-11.编程,找出一个二维数组中的鞍点,即该位置上的元素是该行上的最大值,是该列上的最小值。

二维数组也可能没有鞍点。

结果:

⑴输入n=4,m=4

1234

5555

5555

5555

输出:

鞍点为a[0][3]=4。

(2)输入n=4,m=4

5555

5555

5555

0321

输出:

鞍点为a[3][1]=3。

分析:

找出i行最大值所在的列号k(i=0,1,…,n),若a[i][k]是k列最小,则a[i][k]是鞍点。

也可能没有鞍点。

main()/*sj1-3-11*/

{inti,j,l,n,m,k,a[20][20];

printf("Pleaseentern,m=");

scanf("%d,%d",&n,&m);/*输入数组的行数n和列数m*/

for(i=0;i

for(j=0;j

{printf("a[%d][%d]=",i,j);

scanf("%d",&a[i][j]);}

for(i=0;i

{for(j=0;j

printf("%6d",a[i][j]);

printf("\n");}

for(i=0;i

{for(j=0,k=0;j

if(a[i][j]>a[i][k])k=j;*找出i行最大值所在的列号k*/

for(l=0;l

if(a[l][k]

if(l>=n)/*没有比a[i][k]小的数*/

printf("Point:

a[%d][%d]==%d",i,k,a[i][k]);

}

}_

3-12.编程,按学生的序号输入10名学生的成绩,按照分数由高到低的顺序输出学生的名次、序号和成绩,要求成绩相同的学生具有相同的名次。

结果:

输入:

2468923432194

输出:

1:

743

2:

623

3:

821

4:

59

4:

99

5:

48

6:

36

7:

24

7:

104

8:

12

分析:

用选择法排序。

a[j][0]--序号,a[j][1]—名次。

a[j][2]--成绩

main()/*sj1-3-12*/

{intj,k,e,t,a[10][3];

for(j=0;j<10;j++)

{scanf("%d",&a[j][2]);a[j][0]=a[j][1]=j+1;}

for(j=0;j<9;j++)

{t=j;

for(k=j+1;k<10;k++)if(a[t][2]

e=a[t][0];a[t][0]=a[j][0];a[j][0]=e;

e=a[t][2];a[t][2]=a[j][2];a[j][2]=e;

a[j][1]=j+1;/*置名次*/

}

t=a[0][1];

for(k=1;k<10;k++)/*相同成绩,名次也一样*/

if(a[k-1][2]==a[k][2])a[k][1]=t;

elsea[k][1]=++t;

for(k=0;k<10;k++)

printf("%5d:

%5d%5d\n",a[k][1],a[k][0],a[k][2]);

}

3-13.编程,输出所有不超过n(取n<256)的、其平方具有对称性质的正整数(也称为回文数)。

结果:

1*1=1

2*2=4

3*3=9

11*11=121

22*22=484

26*26=676

101*101=10201

111*111=12321

121*121=14641

202*202=40804

212*212=44944

分析:

对j循环(j=1~255),将j*j的各位数字放入数组,输出具有对称性质的j.

main()/*sj1-3-13*/

{inte,f,c,t,n=0,a[10];

longj,k;

for(j=1;j<256;j++)

{k=j*j;

t=0;

while(k>0){a[t++]=k%10;k=k/10;}

for(c=0,e=t-1;c

if(a[c]!

=a[e])break;

if(c>=e){printf("%d:

%ld*%ld=%ld\n",++n,j,j,j*j);}

}

}

3-14.编程,输入两个已经按从小到大顺序排列好的字符串,将两个字符串合并为一个新的从小到大排列字符串并输出。

结果:

输入:

13579

24acf

输出:

1234579acf

分析1:

先将两个字符串合并成一个字符串,然后按从小到大排序。

#include"string.h"

#include"stdio.h"

main()/*sj1-3-14*/

{chara[80],b[80];

inti,j=0,k,t;

gets(a);gets(b);

printf(“a=%s,b=%s\n”a,b);

while(a[j]!

=’\0’)j++;/*找a串尾*/

i=0;

while(b[i]!

=’\0’)a[j++]=b[i++];/*b串接在a串尾*/

k=strlen(a);

for(i=0;i

{t=i;

for(j=i+1;j

if(a[t]>a[j])t=j;

p=a[i];a[i]=a[t];a[t]=p;

}

printf(“a=a+b=%s\n”,a);

}

分析2:

对b串的每个字符b[i]在a串中找插入位置j,将a[j],a[j+1],a[j+2],…均向后移动1个位置,然后将b[i]存入a[j].直到b串的每个字符均插入完毕为止。

#include"string.h"

#include"stdio.h"

main()/*sj1-3-14*/

{chara[80],b[80];

inti,j,k;

gets(a);gets(b);

for(i=0;b[i]!

='\0';i++)/*a,b合并到a*/

{j=0;

while(b[i]>=a[j]&&a[j]!

='\0')j++;/*找b[i]在a中的插入位置j*/

if(a[j]=='\0'){a[j]=b[i];a[j+1]='\0';}

else{for(k=strlen(a)+1;k>j;k--)

a[k]=a[k-1];/*将a[k]向后移1个位置*/

a[j]=b[i];/*将b[i]存入a[j]*/

}

}

puts(a);

}

3-15.编程,输入两个已经按从小到大顺序排列好的字符串,合并两个字符串,使合并后的字符串中字符从大到小排列并输出。

结果:

输入:

13579

24acf

输出:

fca9754321

分析:

先将两个字符串合并成一个字符串,然后按从大到小排序。

#include"string.h"

#include"stdio.h"

main()/*sj1-3-15*/

{chara[80],b[80];

inti,j,k,t,p;

gets(a);gets(b);

printf("a=%s,b=%s\n",a,b);

strcat(a,b);/*b串接在a串尾*/

k=strlen(a);

for(i=0;i

{t=i;

for(j=i+1;j

if(a[t]

p=a[i];a[i]=a[t];a[t]=p;

}

printf("a=a+b=%s\n",a);

}

3-16.编程,输入两个字符串s1和s2,在s1中删除任何s2中有的字符。

例如,s1:

“abc123ad”,s2:

“a1”,则输出“bc23d”。

结果:

输入:

abc123ad

a1

输出:

bc23d

分析:

对s2中每个字符s2[i]到s1中寻找它,将s1中出现的所有s2[i]均删除。

若s1[j]应删除,则用s1[j]后面的字符向前移动的方法覆盖s1[j],达到删除s1[j]的目的。

#include"string.h"

#include"stdio.h"

main()/*sj1-3-16*/

{chars1[80],s2[80];

inti,j,k;

gets(s1);gets(s2);

for(i=0;s2[i]!

='\0';i++)/*删除s1中的与s2[i]相同的字符*/

{j=0;

while(s1[j]!

='\0')/*在s1中找s2[i]并删除*/

{if(s2[i]==s1[j])/*找到s1[j],用向前移动的方法覆盖s1[j]*/

for(k=j;k

s1[k]=s1[k+1];/*将s1[j+1]~s1尾('\0')向前移1个位置,删除s1[j]*/

j++;

}

}

puts(s1);

}

3-17.编程,输入一行文字,判断该行文字是否是回文。

  例如,读入:

MADAMIMADAM输出:

YES

读入:

ABCDBA.输出:

NO

结果:

输入:

MADAMIMADAM

输出:

MADAMIMADAMYES

输入:

ABCDBA

输出:

ABCDBANO

分析:

对字符串S,若s[i]==s[n-i-1](i=0,1,…,n/2)),则为回文。

#include"stdio.h"

main()/*sj1-3-17*/

{chars[80];

intp,n;

gets(s);

p=0;

n=strlen(s);

while(p

if(s[p]!

=s[n-p-1])/*比较对称的两个字符*/

{printf("%sNO\n",s);break;}

elsep++;

if(p>=n/2)

printf("%sYES\n",s);

}

3-18.编程,输入若干个字符串,当输入字符串的长度为0时停止输入。

输出最长的字符串。

结果:

输入:

china

Beijing

Chongqing

Shanhai

输出:

max=Chongqing

分析:

用循环输入各字符串并求其长度,找最大长度并输出相应字符串。

输入空串(长度为0)时结束循环。

#include"stdio.h"

#include"string.h"

main()/*sj1-3-18*/

{inti,k,m;

chars[80],max[80];

i=1;gets(s);m=0;

while((k=strlen(s))!

=0)/*输入空串时结束循环*/

{if(k>m){m=k;strcpy(max,s);}/*比较并记录最长字符串*/

gets(s);

}

printf("max=%s\n",max);

}

3-19.编程,输入若干个字符串,当输入字符串的长度为0时停止输入,输出最大字符串。

结果:

输入:

China

Beijing

Chongqing

Shanhai

输出:

max=Shanhai

分析:

用循环输入各字符串并求其长度,找最大字符串并输出。

输入空串(长度为0)时结束循环。

#include"stdio.h"

#include"string.h"

main()/*sj1-3-19*/

{inti,k,m;

chars[80],max[80];

i=1;gets(s);strcpy(max,s);

while((k=strlen(s))!

=0)/*输入空串时结束循环*/

{if(strcmp(max,s)<0)strcpy(max,s);/*比较并记录最大字符串*/

gets(s);

}

printf("max=%s\n",max);

}

3-20.“1898─要发就发”。

将不超过2004的所有素数从小到大排成第一行,第二行上的每个数都等于它“右肩”上的素数与“左肩”上的素数之差。

编程,输出第二行数中满足下列条件的整数:

第二行数中若干个连续整数的和恰好是1898。

第一行:

2357111317.....199719992003

    第二行:

12242

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

当前位置:首页 > 小学教育 > 语文

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

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