试题5760Word格式.docx

上传人:b****8 文档编号:22926008 上传时间:2023-02-06 格式:DOCX 页数:20 大小:21.29KB
下载 相关 举报
试题5760Word格式.docx_第1页
第1页 / 共20页
试题5760Word格式.docx_第2页
第2页 / 共20页
试题5760Word格式.docx_第3页
第3页 / 共20页
试题5760Word格式.docx_第4页
第4页 / 共20页
试题5760Word格式.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

试题5760Word格式.docx

《试题5760Word格式.docx》由会员分享,可在线阅读,更多相关《试题5760Word格式.docx(20页珍藏版)》请在冰豆网上搜索。

试题5760Word格式.docx

\n"

);

gets(str);

\n***originalstring***\n"

puts(str);

\nInputacharactor:

scanf("

%c"

&

ch);

fun(str,ch);

\n***newstring***\n"

【1】i++【2】s[j++]=s[i]【3】s[j]='

\0'

【解析】填空1:

如果当前字符比指定字符小,则什么都不做,通过i++访问下一个字符。

填空2:

如果当前字符大于等于指定字符,则将它保存在字符数组s中。

填空3:

通过保存比指定字符大或相等的字符,来实现删除比指定字符小的字符。

处理结束后,在字符串s最后要加上结束标记符′\0′。

2.改错题

下列给定程序中fun()函数的功能是:

将n个无序整数从小到大排序。

请改正程序中的错误,使它能得出正确的结果。

不要改动main函数,不得增行或删行,也不得更改程序的结构。

conio.h>

stdlib.h>

fun(intn,int*a)

{inti,j,p,t;

for(j=0;

j<

n-1;

j++)

{p=j;

/**********************found***********************/

for(i=j+1;

i<

i++)

if(a[p]>

a[i])

t=i;

if(p!

=j)

{t=a[j];

a[j]=a[p];

a[p]=t;

putarr(intn,int*z)

{inti;

for(i=1;

=n;

i++,z++)

{printf("

%4d"

*z);

if(!

(i%10))printf("

}printf("

{intaa[20]={9,3,0,4,1,2,5,6,8,10,7},n=11;

\n\nBeforesorting%dnumbers:

n);

putarr(n,aa);

fun(n,aa);

\nAftersorting%dnumbers:

putarr(n,aa);

(1)错误:

for(i=j+1;

正确:

n;

(2)错误:

t=i;

p=i;

【解析】该程序是对n个数实现从小到大的排序,该题中先是找出输入整数的最小项,置于指针第1个元素的位置;

再找出第2个元素至尾元素的最小项,置于第2个元素的位置;

之后顺次处理后读元素。

 

3.编程题

请编写函数fun(),它的功能是:

求出ss所指字符串中指定字符的个数,并返回此值。

例如,若输入字符串123412132,输入字符1,则输出3。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

#defineM81

intfun(char*ss,charc)

{chara[M],ch;

clrscr();

printf("

\nPleaseenterastring:

"

gets(a);

\nPleaseenterachar:

ch=getchar();

\nThenumberofthecharis:

%d\n"

fun(a,ch));

【解析】从字符串ss中找出子字符串的方法是:

从第1个字符开始,对字符串进行遍历;

若ss串的当前字符等于t串的第1个字符,两字符串的指针自动加1,继续比较下一个字符;

若比较至字符串的结尾,则跳出循环;

若ss串的字符和c串的字符不对应相同,则继续对ss串的下一个字符进行处理。

本程序是采用逐一比较的方式找出出现的次数。

循环的作用是在串中从左到右逐一走动,if()的作用是进行判断是否相同,若与c相同则表示又出现一次。

inti=0;

for(;

*ss!

='

;

ss++)

if(*ss==c)

i++;

/*求出ss所指字符串中指定字符的个数*/

returni;

第58套

交换数组aa中最大和最小两个元素的位置,结果依然保存在原数组中,其它元素位置不变。

注意数组aa中没有相同元素。

33,67,42,58,25,76,85,16,41,56"

,则输出"

33,67,42,58,25,76,16,85,41,56"

#defineN10

voidfun(intaa[])

inti,j,t;

intmax=0,min=0;

for(i=0;

i<

N;

i++)

if(【1】)

max=i;

if(【2】)

min=i;

t=aa[max];

aa[min]=t;

inti;

intaa[N]={33,67,42,58,25,76,85,16,

41,56};

clrscr();

printf("

\n***originallist***\n"

aa[i]);

fun(aa);

\n***newlist***\n"

【1】aa[max]<

aa[i]【2】aa[min]>

aa[i]【3】aa[max]=aa[min]

先假设aa[0]最大,如果找到更大的元素,则将这个元素的下标赋给max。

同理,先假设aa[0]最小,如果找到更小的元素,则将这个元素的下标赋给min。

找到最大值和最小值之后,借助第三个变量t交换这两个元素。

N个有序整数数列已放在一维数组中,给定下列程序中,函数fun()的功能是:

利用折半查找算法查找整数m在数组中的位置。

若找到,则返回其下标值;

反之,则返回-1。

折半查找的基本算法是:

每次查找前先确定数组中待查的范围:

low和high(low<

high),然后把m与中间位置(mid)中元素的值进行比较。

如果m的值大于中间位置元素中的值,则下一次的查找范围放在中间位置之后的元素中;

反之,下次查找范围落在中间位置之前的元素中。

直到low>

high,查找结束。

voidfun(inta[],intm)

{intlow=0,high=N-1,mid;

while(low<

=high)

{mid=(low+high)/2;

if(m<

a[mid])

high=mid-1;

elseif(m>

=a[mid])

low=mid+1;

elsereturn(mid);

return(-1);

{inti,a[N]={-3,4,7,9,13,24,67,89,100,180},k,m;

a数组中的数据如下:

"

i++)printf("

%d"

a[i]);

Enterm:

&

m);

k=fun(a,m);

if(k>

=0)printf("

m=%d,index=%d\n"

m,k);

elseprintf("

Notbefound!

intfun(inta[],intm)

elseif(m>

【解析】fun(inta[],intm)函数的返回值为int类型,所以定义函数时,函数的返回类型不能是void,而是int类型。

=a[mid]中的m>

a[mid]与m=a[mid]两个条件段的结果不一样,所以要分开考虑。

请编写函数fun(),该函数的功能是:

移动一维数组中的内容,若数组中有n个整数,要求把下标从0到p(p≤n-1)的数组元素平移到数组的最后。

例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为3。

移动后,一维数组中的内容应为5,6,7,8,9,10,11,12,13,14,15,1,2,3,4。

voidfun(int*w,intp,intn)

inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

inti,p,n=15;

Theoriginaldata:

i++)

%3d"

\n\nEnterp:

p);

fun(a,p,n);

\nThedataaftermoving:

\n\n"

【解析】本题采用"

循环左移"

的算法(关于"

,我们在后面的试题中有详细的解释)。

和我们在前面分析的稍有不同的是,一个是整型数组,一个是字符型数组。

inti,j,t;

=p;

i++)/*循环左移p+1次*/

{t=w[0];

for(j=1;

j++)/*实现循环左移*/

w[j-1]=w[j];

w[j-1]=t;

第59套

请补充main函数,该函数的功能是:

把字符串str中的字符向前移动一位,原来的第一个字符移动到字符串尾,结果仍然保存在原字符串中。

howdoyoudo?

owdoyoudo?

h"

请勿改动主函数main和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。

charstr[N],ch;

ch=str[0];

【1】;

str[i]=str[i+1];

【2】;

\n***newstring***\n"

【1】str[i+1]【2】str[i]=ch

for循环的条件是要移动的字符不为′\0′,即还没有到字符串的最后一个字符。

ch中保存了字符串的第一个字符,按题目要求移动到字符串尾,而str[i]是′\0′的前一个字符,也就是字符串尾,故将ch赋给str[i]。

下列给定程序中,函数fun()的功能是:

根据形参m的值(2≤m≤9),在m行m列的二维数组中存放如下所示的数据,由main()函数输出。

例如,若输入2,则输出12

24

输入4,则输出1234

2468

36912

481216

#defineM10

inta[M][M]={0};

fun(int**a,intm)

{intj,k;

for(j=0;

m;

for(k=0;

k<

k++)

a[j][k]=k*j;

{inti,j,n;

Entern\n"

n);

fun(a,n);

{for(j=0;

%4d"

a[i][j]);

\n"

voidfun(int(*a)[M],intm)

a[j][k]=k*j;

a[j][k]=(k+1)*(j+1);

【解析】对于二维数组,应该理解成为是由几个一维数组作元素组成的一维数组,或者说,二维数组实际是一个一维数组,只不过它的每个数组元素又都是一个一维数组。

我们先来看看指针数组的表示形式:

(1)p+i和a+i均表示a[i]的地址,或者讲,它们均指向数组第i号元素,即指向a[i]。

(2)*(p+i)和*(a+i)都表示p+i和a+i所指对象的内容,即为a[i]。

(3)指向数组元素的指针,也可以表示成数组的形式,也就是说,它允许指针变量带下标,如p[i]与*(p+i)等价。

因此,二维数组元素a[i][j]可表示成*(a[i]+j)或*(*(a+i)+j),它们都与a[i][j]等价,或者还可写成(*(a+i))[j]。

了解了以上这些内容后本题就好解决了。

移动字符串中的内容,移动的规则是把第1到第m个字符,平移到字符串的最后,把第m+1到最后的字符移到字符串的前部。

例如,字符串中原有的内容为ABCDEFGHIJK,m的值为3,移动后,字符串中的内容应该是DEFGHIJKABC。

#include<

string.h>

voidfun(char*w,intm)

chara[N]="

ABCDEFGHIJK"

intm;

Theoriginastring:

puts(a);

\n\nEnterm:

fun(a,m);

\nThestringaftermoving:

【解析】我们在学习C语言的时候,应该广泛地应用到循环的方法,本题应采用"

的算法。

即从第2个字符开始以后的每个字符都依次前移一个字符,而原来的第1个字符放在串中的最后一个字符。

当要平移m个字符时,则要进行m次的循环左移。

内嵌的循环的作用是完成从第2个字符开始以后的每个字符都依次前移一个字符,w[j-1]=t的作用是将第1个字符放到最后一个字符中。

inti,j;

chart;

for(i=1;

=m;

i++)/*进行m次的循环左移*/

w[j]!

j++)/*从第2个字符开始以后的每个字符都依次前移一个字符*/

/*将第1个字符放到最后一个字符中*/

第60套

把ASCII码为奇数的字符从字符串str中删除,结果仍然保存在字符串str中。

字符串str从键盘输入,其长度作为参数传入函数fun()。

abcdef"

,输出"

bdf"

voidfun(chars[],intn)

inti,j;

j=0;

s[j++]=s[i];

inti=0,strlen=0;

charstr[N];

\nInputastring:

while(str[i]!

strlen++;

i++;

fun(str,strlen);

\n***displaystring***\n"

【1】i<

n【2】s[i]%2==0【3】s[j]=′\0′

变量n为字符串的长度,所以字符数组的下标的取值范围是从0到n-1。

如果当前字符的ASCII码对2取余等于0,就说明这个字符的ASCII码为偶数,故不能删除,而是将它存于字符串s中。

通过保留ASCII码为偶数的字符的方法,来实现删除ASCII码为奇数的字符的目的。

处理结束后,还要在字符串s的最后加上结束标记符′\0′。

下列给定的程序中,函数fun()的功能是:

为一个偶数寻找两个素数,这两个素数之和等于该偶数,并将这两个素数通过形参指针传回主函数。

请改正函数fun()中的错误,使它能得出正确的结果。

math.h>

voidfun(inta,int*b,int*c)

{inti,j,d,y;

for(i=3;

=a/2;

i=i+2)

{y=0;

for(j=2;

=sqrt((double)i);

if(i%j==0)y=0;

if(y==1)

{d=i-a;

=sqrt((double)d);

if(d%j==0)y=0;

{*b=i;

*c=d;

{inta,b,c;

do

\nInputa:

a);

while(a%2);

fun(a,&

b,&

c);

\n\n%d=%d+%d\n"

a,b,c);

y=0;

y=1;

d=i-a;

d=a-i;

【解析】这道题是历年的考题经典。

也就是验证哥德巴赫猜想之变体,原来的思路是(任意一个大于等于6的偶数都可以分解为两个素数之和)n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。

如n1不是素数,就不必再检查n2是否素数。

先从n1=3开始,检验n1和n2(n2=N-n1)是否素数。

然后使n1+2再检验n1,n2是否素数,…直到n1=n/2为止。

该题思路是与"

经典猜想"

是相同的。

请编写一个函数voidfun(char*ss),其功能是:

将字符串ss中所有下标为偶数位置上的字母转化为大写(若该位置上不是字母,则不转换)。

例如,若输入abc4Efg,则应输出AbC4EfG。

#

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

当前位置:首页 > 外语学习 > 日语学习

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

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