阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。 [函数2.1说明] 下面程序的功能是:将

题目

阅读下列函数说明和C函数,将应填入(n)处的字句写在对应栏内。

[函数2.1说明]

下面程序的功能是:将由键盘输入的某个十进制数转换成对应的R进制数并输出。这里R是 2到16的整数,由键盘输入。例如,输入n=128,base=13后的输出为9B。

[函数2.1]

include <stdio.h>

main()

{ char b[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

int c[64],n,i=0,base;

printf("Enter a number:");scaaf("%d",&n);

printf("Enter new base:");scanf("%d",&base);

do{c[i]=(1);

i++;

n=n/base;

}while((2));

printf("Transmit new base:");

for(- -i;i>=0;- -i)printf("%c",(3));

}

[函数2.2说明]

所谓回文字符中是指正序和逆序拼写相同的字符串,例如astrtsa,adgdtdgda等。下面函数int fun(char *str)的功能是判断字符串str是否是回文,当字符串是回文时,函数返回1,否则返回0。

[函数2.2]

int fun(char *str)

{ int i,j,l;

for(i=0;str[i]! ='\0';i++);

l=i/2;

for(j=0,i- -;j<=1;(4))

if((5)) return 0;

return 1;

}

参考答案和解析
正确答案:(1) n% base (2) n! =0 (3) b[c[i]] (4) j++ i-- (5) str[i]! =str[j]
(1) n% base (2) n! =0 (3) b[c[i]] (4) j++, i-- (5) str[i]! =str[j] 解析:(1)~(3)函数2.1的基本思想是“除base取余”,即从低位开始以n除以base的余数作为转化后的一位c[i],再以n除以base的商作为新的n,继续进行转化,直至除法商0为止。最后将所得的c[i]作为下标,从数组b中找出对应的数码表示,即b[c[i]]。
(4)~(5)此循环初始时,i和j充当str的头和尾指针,循环执行过程中,两指针同时以步长1向str的中间移动,比较所指字符是否相等,若不等则表明str不是回文字符串。
如果没有搜索结果或未解决您的问题,请直接 联系老师 获取答案。
相似问题和答案

第1题:

阅读下列程序说明和c代码,将应填入(n)处的字句写在对应栏内。

[说明]

下面的程序利用递归算法计算x和y的最大公约数。

[函数2.1]

main ( )

{ int x,y,k,t;

scanf(" % d% d" , &x, &y);

if(x>y) { t=x;x=y; y=t;}

(1);

while(k! =0){

y=x;

(2);

k=y%x;

}

prinff( "% d" ,x); }

[函数2.2说明]

函数fun(char *str,char *substr的功能是计算子串sugbstr在串str中出现的次数。

[函数2.2]

fun(ehar * str, char * substr)

{ int x,y,z;

(3);

for(x=0;str[ x] ! = '\O';x + + )

for(y=x,z=0;sabstr[z] = =str[y];(4),y+ +)

if((5)= ='\0') {

num + +;

break;

}

return(num);

}


正确答案:(1)k=y%x (2)x=k (3)int num=0 (4)z++ (5)substr[z+1]
(1)k=y%x (2)x=k (3)int num=0 (4)z++ (5)substr[z+1] 解析:(1)~(2)使用递归算法计算x和y的最大公约数时,不妨令yx,如果y除x余数得。则x即为所求;否则令y←x,x←余数,继续上述判断。
(3)此处应声明变量num并初始化;
(4)次循环的功能是从str的第y个位置起与substr做比较,循环过程中y和z应同时增1;
(5)若上面的循环重复执行,直到到达substr结束,则表示substr在str中出现一次。

第2题:

阅读以下说明,以及用C++在开发过程中所编写的程序代码,将应填入(n)处的字句写在对应栏内。

【说明】

在下面函数横线处填上适当的字句,使其输出结果为:

构造函数.

构造函数.

1,2

5,6

析构函数

析构函数.

【C++代码】

include "iostream.h"

class AA

{ public;

AA(int i,int j)

{A=i; B=j;

cout<<"构造函数.\n";

}

~AA(){(1);}

void print();

private:

int A, B;

};

void AA∷print()

{cout<<A<<","<<B<<endl;}

void main()

{

AA *a1, *a2;

(2)=new AA(1, 2);

a2=new AA(5, 6);

(3);

a2->print();

(4) a1;

(5) a2;

}


正确答案:(1)cout"析构函数.\n" (2)a1 (3)a1—>print() (4)delete (5)delete
(1)cout"析构函数.\n" (2)a1 (3)a1—>print() (4)delete (5)delete 解析:本题考查用C++语言对输出的实现。
题目中没有什么条件,只给出了输出结构,要求程序能实现这个输出。下面来具体分析代码。
第(1)空很明显是类AA的析构函数的函数体,类的析构函数一般在撤销一个对象时调用,根据题目的要求,要输出析构函数这样的结果,而在程序中没有与此相关的操作,那么此空应该是用来实现这个功能的,借鉴构造函数中的内容,我们很容易就得出此空答案为cout"析构函数.\n"。
第(2)空在主函数中,很明显此空所在的语句是创建一个AA类的对象,并让一个AA型的指针变量指向这个对象。在函数开始的时候声明了两个AA型的指针变量a1和a2,而a2在下面已经有了值,那么这里只有用变量a1,因此此空答案为a1。
第(3)空是在创建了两个对象后执行的语句,根据程序不难推断出,这里应该要实现对象a1的数据输出,那么就要调用函数print(),因此此空答案为a1->print()。
第(4)空所在的语句是在实现了构造函数与数据输出后执行的语句,从题目要求来分析,这里应该要调用对象的析构函数来输出“析构函数”这样一个结果,上面我们已经分析到了对象的析构函数一般在撤销对象时调用。从对象的执行过程来分析,在对象的所有处理完成后也应该撤销对象来释放所占的资源,那么此空的任务应该是用来撤销a1对象,在C++中一般用关键字delete,因此此空答案为delete。
第(5)空和第(4)空的情况一样,因此此空答案为delete。

第3题:

●试题四

阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】

函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

【函数】

void QuickSort(int A[],int s,int t)

{int i=s,j=t+1,temp;

int x=A[s];

do{

do i++;while (1) ;

do j--;while(A[j]>x);

if(i<j){temp=A[i]; (2) ; (3) ;}

}while(i<j);

A[a]=A[j];A[j]=x;

if(s<i-1) (4) ;

if(j+1<t) (5) ;

}


正确答案:

●试题四

【答案】(1)Ai<x(2)Ai=Aj(3)Aj=temp(4)QuickSort(Asj-1)

(5)QuickSort(Aj+1t)

【解析】快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

 

第4题:

试题三(共 15 分)

阅读以下说明和 C 程序,将应填入 (n) 处的字句写在答题纸的对应栏内。


正确答案:

第5题:

阅读下列程序说明和C程序,将应填入(n)处的字句写在对应栏内。

[函数2.1说明]

下面程序的功能是计算x和y的最小公倍数。

[函数2.1]

main()

{ int m,n,d,r;

seanf("%d %d",&m,&n);

if(m<n) {r=m;m=n;n=r;}

(1);

while (d%n! =0) (2);

printf("%d\n",d);

}

[函数2.2说明]

下述程序接收键盘输入,直到句点“.”时结束。输入的字符被原样输出,但连续的空格输入将转换成一个空格。

[函数2.2]

include <stdio.h>

main()

{ char c,preChar='\0';

c = getchar();

while(c! = '.'){

if((3)) putchar(c);

else if(preChar! =' ') putchar(c);

(4);

c=(5);

}

}


正确答案:(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar()
(1)d=m (2) d+=m或d=d+m (3) c!=‘’ (4) preChar=c (5) getchar() 解析:(1)下文使用了变量d,因此需在此初始化,由下面循环的条件“d%n!=0”知初值不能是n,因此必为m;
(2)此处while循环生成最小公倍数d,其终止条件是n整除d,因此循环过程中需要保证m整除d并且d尽可能地小,于是d应以m为增量递增;
(3)当输入的字符非空格时,原样输出;
(4)程序中变量preChar用于记录上一次读入的字符,循环过程中应不断更新其值;
(5)接收下一个输入。

第6题:

阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。

【说明】

函数QuickSort是在一维数组A[n]上进行快速排序的递归算法。

【函数】

void QuickSort( int A[ ],int s,int t)

{ int i=s,j=t+1,temp;

int x=A[s];

do{

do i ++ ;while (1);

do j -- ;while(A[j]>x);

if(i<j){temp=A[i];(2);(3);}

}while(i<j);

A[a] =A[j];A[j] =x;

if(s<i-1) (4);

if(j+1<t) (5);

}


正确答案:(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(Asj-1) (5)QuickSort(Aj+1t);
(1)A[i]x (2)A[i]=A[j] 3)A[j]=temp (4)QuickSort(A,s,j-1) (5)QuickSort(A,j+1,t); 解析:快速排序的思想是:任取待排序序列中的某个元素作为基准(一般取第一个元素),通过一趟排序,将待排元素分为左右两个子序列,左子序列元素的排序码均小于或等于基准元素的排序码,右子序列的排序码则大于基准元素的排序码,然后分别对两个子序列继续进行排序,直至整个序列有序。快速排序是对冒泡排序的一种改进方法,算法中元素的比较和交换是从两端向中间进行的,排序码较大的元素一次就能够交换到后面单元,排序码较小的记录一次就能够交换到前面单元,记录每次移动的距离较远,因而总的比较和移动次数较少。

第7题:

阅读以下函数说明和C语言函数,将应填入(n)处的字句写在答题纸的对应栏内。

【函数2.1说明】

递归函数sum(int a[], int n)的返回值是数组a[]的前n个元素之和。

【函数2.1】

int sum (int a[],int n)

{

if(n>0) return (1);

else (2);

}

【函数2.2说明】

有3个整数,设计函数compare(int a,int b,int c)求其中最大的数。

【函数2.2】

int compare (int a, int b, int c )

{ int temp, max;

(3) a:b;

(4) temp:c;

}

【函数2.3说明】

递归函数dec(int a[],int n)判断数组a[]的前n个元素是否是不递增的。不递增返回 1,否则返回0。

【函数2.3】

int dec( int a[], int n )

{

if(n<=1) return 1;

if(a[0]<a[1]) return 0;

return (5);

}


正确答案:(1)a[n-1]+sum(an-1)或者a[0]+sum(a+1n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1n-1);
(1)a[n-1]+sum(a,n-1)或者a[0]+sum(a+1,n-1); (2)return 0; (3)temp=(a>b)? (4)max=(temp>c)? (5)dec(a+1,n-1); 解析:本题考查C语言函数和一些基本运算。
下面我们分别来分析这几个函数。在函数2.1中,题目要求用此递归函数求数组前 n个元素之和。递归函数的特点是在函数体中不停地调用函数本身,只是将其函数的参数范围改变。题目中要求我们求数组前n个元素之和,我们可以这样理解,即前n个元素之和等于第n个元素加上前n-1个元素之和,现在的问题转化成如何求前n-1个元素之和。同样的道理,可以将求前n-1个元素之和转化成求前n-2个元素之和,直到这个数小于0。从函数2.1的代码中可以知道,在计算以前,首先判断n与0的关系,如果n小于0,说明数组中无元素,因此,返回0值;如果n大于等于0,说明数组中有元素,应该返回的结果是第n个元素加上前n-1个元素之和,而前n-1个元素之和是调用函数本身来计算的。因此,第(1)空和第(2)空的答案分别是a[n-1)+sum(a,n-1),return()。
在函数2.2中,题目要求我们在三个数中取最大数,在数学中,我们从三个数中取最大数时,一般是首先拿其中两个数比较,取较大的数再与第三个数比较,再取其较大的数,这个数就是三个数中的最大数。从函数2.2的代码中知道,三个数a、b、c,两个整型变量temp与max。根据求三个数中最大数的数学过程和函数中已给出的代码可知,第(3)空处语句应该为temp=(a>b)?a:b,求得a、b中较大数并存放在变量temp中。第(4)空处语句为max=(temp>c)?temp:c。
在函数2.3中,题目要求判断数组a[]的前n个元素是否是不递增的。不递增返回1,否则返回0。要判断前n个元素是否是不递增的,需要判断前n-1个元素是否是不递增的,以及第n个元素与第n-1个元素的关系。此处与函数2.1一样,用的都是递归函数,只是出口不同,在函数2.1中,只要数组中没有元素了,递归结束,这里只要第n个元素大于第n-1个元素,则返回0,递归结束。又由if(a[0]a[1])语句可知,在每次调用函数时,都将其数组中的第一个元素与第二个元素比较来作为递归的出口,如果结果为假,就说明数组的前面两项的关系是不递增的,在下次调用中不用再考虑第一项。因此第(5)空应该是dec(a+1,n-1)。

第8题:

阅读下列程序说明和C代码,将应填入(n)处的字句写在对应栏内。

[说明]

函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。

[函数2.1]

void PrintPrime(int UpBound)

printf("2," );

for(i=3; i<UpBound; i+ =2) {

int k = sqrt(i);

for(j=3; j<= k;(1)) /*检查i是否有3到k以入的奇因数*/

if((2)) break;

fi((3)) printf("%d", i);

[函数2.2说明]

递归函数invert(int a[],int k),int k)的功能是将数组a中的前k个元素逆置。

[函数2.2]

void invert(int a[ ], int k)

{ int t;

if ((4)) {

invert((5));

t=a[0];

a[0] =a[k-1];

a[k-l]=t;

}

}


正确答案:(1)j+=2 (2)i%j==0 (3)j>k (4)k>1 (5)a+1k-2
(1)j+=2 (2)i%j==0 (3)j>k (4)k>1 (5)a+1,k-2 解析:(1)~(3)由于(1)处循环只检查i是否能被3到k以内的奇数所整除,因此循环增量应该是2。并且一旦i被某个3到k以内的奇数整除,那么内层for应当立即终止,此时j<=k。相反的,若内层for循环结束后j>k,则表明i没有3到k以内的奇因数,即i是一素数,应该输出;
(4)由于函数递归的终止条件是k不大于1,于是仅在 k>1时需要继续进行递归;
(5)为了将数组a的前k个元素a[0]、……、a[k-1]置逆,只需先将a[1]、……、a[k-2]这k-2个元素置逆,即调用invert(a+1,k-2),再交换a[0]和a[k-1]的值即可。

第9题:

●试题二

阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。

【说明】

该程序运行后,输出下面的数字金字塔

【程序】

include<stdio.h>

main ()

{char max,next;

int i;

for(max=′1′;max<=′9′;max++)

{for(i=1;i<=20- (1) ;++i)

printf(" ");

for(next= (2) ;next<= (3) ;next++)

printf("%c",next);

for(next= (4) ;next>= (5) ;next--)

printf("%c",next);

printf("\n");

}

}


正确答案:
●试题二【答案】(1)(max-′0′)(2)′1′(3)max(4)max-1(5)′1′【解析】该程序共有9行输出,即循环控制变量max的值是从1~9。每行输出分3部分,先用循环for语句输出左边空白,(1)空填"(max-′0′)";再用循环输出从1到max-′0′的显示数字,即(2)空和(3)空分别填1和max;最后输出从max-′1′~1的显示数字,即(4)空和(5)空分别填和max-1和′1′。

第10题:

()阅读下列说明和C语言程序,将应填入 (n)处的语句写在答题纸的对应栏内。[说明]下面程序是一个带参数的主函数,其功能是显示在命令行中输入的文本文件内容。[C语言函数]#include"stdio.h"main(argc,argv) int argc; char *argv[]; { (1) ; if((fp=fopen(argv[1],”r’’))== (2) ) { printf(”file not open!\n”);exit(0);} while( (3) ) putchar( (4) ); (5); }


正确答案:()
(1)FILE *fp; (2)NULL  (3)!feof(fp)  (4)fgetc(fp)   (5)fclose(fp)
从程序功能来看,程序中需要用到文件型指针变量中,而主函数体没有定义,所以(1)应该填写的是“FILE *fp;”。接下来的语句是标准的打开只读文本文件的语句,显示的是文件没打开,说明文件名不存在,也就是为“NULL”。接着的while循环语句中有两处空白。前一个空白是控制循环的条件,从程序功能来看,要将文本文件中的所有字符显示出来,这儿当然只能填写“不是文件尾则继续循环”,具体说,需要填写的是“!feof(fp)”。(4)出现在循环体中的语句中,该循环体的功能是从fp指向的文本文件中读取单个字符并显示在屏幕上,此处使用的是putchar函数,该函数的功能是将形参对应的字符显示在屏幕上,所以该处的空白就是要显示的字符,这个字符必须是从文本文件中读取的单个字符,完成这项工作的可以利用fgetc()函数,所以(4)填写的是“fgetc(fp)”。最后一句应当是关闭文件,所以(5)应填fclose(fp)。