好文档 - 专业文书写作范文服务资料分享网站

2014年三月全国计算机二级C语言上机考试题库

天下 分享 时间: 加入收藏 我要投稿 点赞

printf(\data after deleted :\\n\

for(i=0;i

解题思路:

本题是删除已排序过数组中的相同数。

1. 取出数组中的第1个数存放在临时变量k中,再利用for循环来依次判断所有的数。

2. 如果取出的数和k相比,如果不相同,则仍存放在原数组中,其中存放的位置由j来控制, 接着把这个数重新存入k。如果相同,则取下一数。 参考答案:

int fun(int a[], int n) {

int i, j = 1, k = a[0] ; for(i = 1 ; i < n ; i++) if(k != a[i]) { a[j++]=a[i] ; k = a[i] ; }

a[j] = 0 ; return j ; }

※※※※※※※※※※※※※※※※※※※※※※※※※ 第06套:

给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时, 程序输出: x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include double f1(double x) { return x*x; }

double f2(double x, double y) { return x*y; }

__1__ fun(int i, double x, double y) { if (i==1)

return __2__(x); else

return __3__(x, y); }

main()

{ double x1=5, x2=3, r; r = fun(1, x1, x2);

r += fun(2, x1, x2); printf(\x2=%f, x1*x1+x1*x2=%f\\n\\n\ }

解题思路:

本题是根据给定的公式来计算函数的值。 第一处:程序中使用双精度double类型进行计算,所以函数的返回值类型也为double,所以应填:double。

第二处:当i等于1时,则返回f1函数的值,所以应填:f1。

第三处:如果i不等于1,则返回f2函数的值,所以应填:f2。 ***************************************************

给定程序MODI1.C中函数fun的功能是: 比较两个字符串,将长的那个字符串的首地址作为函数值返回。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

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

给定源程序: #include

char fun(char *s, char *t) { int sl=0,tl=0; char *ss, *tt; ss=s; tt=t; while(*ss) { sl++; (*ss)++; }

while(*tt) { tl++; (*tt)++; }

if(tl>sl) return t; else return s; }

main()

{ char a[80],b[80],*p,*q; int i;

printf(\ printf(\a string again : \gets(b); printf(\longer is :\\n\\n\\\ }

解题思路:

第一处: 试题要求返回字符串的首地址,所以应改为:char *fun(char *s,char *t)

第二处: 取字符串指针ss的下一个位置,所以应改为:ss++;。 第三处:取字符串指针tt的下一个位置,所以应改为:tt++;。 ****************************

***********************

请编写函数fun,函数的功能是: 移动字符串中的内容,移动的规则如下: 把第1到第m个字符, 平移到字符串的最后, 把第m+1到最后的字符移到字符串的前部。 例如, 字符串中原有的内容为: ABCDEFGHIJK, m的值为3, 则移动后, 字符串中的内容应该是: DEFGHIJKABC。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容, 仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include #include #define N 80

void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */ {

int i; char t; t=w[0];

for(i=0;i

void fun(char *w, int m) /* 可调用fun1函数左移字符 */ { }

main()

{ char a[N]= \ int m; printf(\original string:\\n\ printf(\m: \ fun(a,m); printf(\string after moving:\\n\ printf(\ NONO(); }

解题思路:

本题是考察字符串的操作。 1. 由于函数fun1是将字符串中字符循环左移一个位置,并通过实参w返回循环左移一个位置的字符串。

2. 利用循环for语句来操作多少个字符(m)需要循环左移。 参考答案:

void fun1(char *w) /* 本函数的功能是将字符串中字符循环左移一个位置 */

{

int i; char t; t=w[0];

for(i=0;i

void fun(char *w, int m) /* 可调用fun1函数左移字符 */ { int i;

for(i = 0 ; i < m ; i++) fun1(w); }

※※※※※※※※※※※※※※※※※※※※※※※※※ 第07套:

程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。函数fun的功能是输出这位学生的信息。

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include typedef struct { int num; char name[9]; char sex;

struct { int year,month,day ;} birthday;

float score[3]; }STU;

void show(STU ___1___) { int i;

printf(\%s %c %d-%d-%d\tt.num, tt.name, tt.sex,

tt.birthday.year, tt.birthday.month, tt.birthday.day); for(i=0; i<3; i++)

printf(\ printf(\ }

main( ) { STU std={ 1,\76.5,78.0,82.0 };

printf(\ show(___3___); }

解题思路:

本题是利用结构体变量存储了一名学生的信息。 第一处:tt变量在函数体fun已经使用,所以应填:tt。

第二处:利用循环分别输出学生的成绩数据,所以应填:tt.score[i]。 第三处:函数的调用,所以应填:std。

***************************************************

给定程序MODI1.C中函数 fun 的功能是:求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。请改正程序中的错误,使它能得出正确的结果。

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

给定源程序: #include #define N 20

int fun ( int * a, int n ) { int i, m, t, k ; for(i=0;i<2;i++) { m=0;

for(k=i+1;ka[m]) k=m; t=a[i];a[i]=a[m];a[m]=t; } }

main( ) { int x, b[N]={11,5,12,0,3,6,9,7,10,8}, n=10, i;

for ( i=0; i

printf(\ fun ( b, n );

for ( i=0; i

printf(\ }

解题思路:

第一处:外循环每循环一次,把当前位置i赋值给m,所以应改为:m=i;。

第二处:通过内循环来找出最大的一个数的位置k,所以应改为:if(a[k]>a[m]) m=k;。

***************************************************

请编写一个函数 unsigned fun ( unsigned w ),w 是一个大于10的无符 号整数,若 w 是 n (n ≥ 2)位的整数,函数求出w的低 n-1位的数作为函数值返回。

例如:w 值为 5923,则函数返回 923; w 值为 923 则函数返回 23。

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include

unsigned fun ( unsigned w ) { }

main( )

{ unsigned x;

printf ( \a unsigned integer number : \ printf ( \original data is : %u\\n\

if ( x < 10 ) printf (\ else printf ( \result : %u\\n\fun ( x ) ); NONO( ); }

解题思路:

本题是考察考生怎样获取一个符合要求的无符号整数。本题是应用if条件语句首先判断给出的数是几位数,再模相应的值,最后得出的余数就是结果。 参考答案:

unsigned fun ( unsigned w ) {

if(w>10000) w %= 10000 ; else if(w>1000) w %= 1000 ; else if(w>100) w %= 100 ; else if(w>10) w %=10 ; return w ; }

※※※※※※※※※※※※※※※※※※※※※※※※※ 第08套:

给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。函数fun的功能是将该学生的各科成绩都乘以一个系数a。请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include typedef struct { int num; char name[9]; float score[3]; }STU;

void show(STU tt) { int i;

printf(\

for(i=0; i<3; i++)

printf(\ printf(\ }

void modify(___1___ *ss,float a) { int i;

for(i=0; i<3; i++) ss->___2___ *=a; }

main( ) { STU std={ 1,\};

float a;

printf(\original number and name and scores :\\n\ show(std);

printf(\a number : \scanf(\ modify(___3___,a); printf(\result of modifying :\\n\ show(std); }

解题思路:

本题是利用结构体存储学生记录并由实参ss返回。 第一处:实参ss是一个结构型指针变量,所以应填:STU。

第二处:该学生的各科成绩都乘以一个系数a,所以应填:score[i]。 第三处:函数的调用,由于函数定义时使用的指针结构型变量,所以应填:&std。

***************************************************

给定程序MODI1.C中函数fun的功能是:求k!(k<13),所求阶乘的值作为函数值返回。例如:若k = 10,则应输出:3628800。

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

注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include long fun ( int k) {

if k > 0

return (k*fun(k-1));

else if ( k=0 ) return 1L; }

main()

{ int k = 10 ;

printf(\ }

解题思路:

第一处:条件判断缺少圆括号。 第二处:判断相等的符号是==。 ***************************************************

程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数 fun(int a[][N], int n),函数的功能是:使数组左下三角元素中的值乘以n 。

例如:若n的值为3,a 数组中的值为 | 1 9 7 | | 3 9 7 |

a = | 2 3 8 | 则返回主程序后a数组中的值应为 | 6 9 8 | | 4 5 6 | | 12 15 18|

注意: 部分源程序存在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include #include #define N 5

int fun ( int a[][N], int n ) { }

main ( )

{ int a[N][N], n, i, j;

printf(\ for ( i =0; i

{ a[i][j] = rand(); printf( \a[i][j] ); } printf(\ }

do n = rand() ; while ( n >=3 ); printf(\ fun ( a, n );

printf (\THE RESULT *****\\n\

for ( i =0; i

{ for ( j =0; j

NONO( ); }

解题思路:

本题是利用两重循环给二维数组左下三角元素中的值乘以n。 参考答案:

int fun ( int a[][N], int n ) {

int i, j;

for(i = 0 ; i < N ; i++) for(j = 0 ; j <= i; j++) a[i][j] *= n ; }

※※※※※※※※※※※※※※※※※※※※※※※※※ 第09套:

给定程序中,函数fun的功能是将不带头节点的单向链表结点数据域中的数据从小到大排序。即若原链表结点数据域从头至尾的数据为:10、4、2、8、6,排序后链表结点数据域从头至尾的数据为:2、4、6、8、10。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 6

typedef struct node { int data;

struct node *next; } NODE;

void fun(NODE *h) { NODE *p, *q; int t; p = h;

while (p) { q = __1__ ; while (__2__)

{ if (p->data > q->data)

{ t = p->data; p->data = q->data; q->data = t; } q = q->next; }

p = __3__ ; } }

NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h=NULL;

for(i=0; idata=a[i]; q->next = NULL;

if (h == NULL) h = p = q; else { p->next = q; p = q; } }

return h; }

void outlist(NODE *h) { NODE *p; p=h;

if (p==NULL) printf(\list is NULL!\\n\ else

{ printf(\ do

{ printf(\p->data); p=p->next; }

while(p!=NULL); printf(\ } }

main()

{ NODE *head;

int a[N]= {0, 10, 4, 2, 8, 6 }; head=creatlist(a);

printf(\ outlist(head); fun(head); printf(\list after inverting :\\n\ outlist(head); }

解题思路:

本题是考察使用链表方法,使用两重while循环语句,对链表的结点数据进行升序排列。

第一处:由于外循环变量使用p指针,内循环变量使用q指针,所以q指向必须指向p的next

指针,因此应填写:p.next。 第二处:判断内循环q指针是否结束,所以应填:q。

第三处:外循环控制变量p指向自己的next指针,所以应填:p.next。 ***************************************************

给定程序MODI1.C中函数fun的功能是: 将s所指字符串中的字母转换为按字母

序列的后续字母(但Z转换为A, z转换为a),其它字符不变。

请改正函数fun中指定部位的错误, 使它能得出正确的结果。

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

给定源程序: #include #include void fun (char *s) {

while(*s!='@')

{ if(*s>='A' & *s<='Z' || *s>='a' && *s<='z')

{ if(*s=='Z') *s='A'; else if(*s=='z') *s='a'; else *s += 1; }

(*s)++; } }

main()

{ char s[80];

printf(\

< 80. :\\n\\n \

printf(\The string : \\n\\n \puts(s); fun ( s );

printf (\The Cords :\\n\\n \puts(s); }

解题思路:

第一处: 使用while循环来判断字符串指针s是否结束,所以应改为:while(*s)。

第二处: 取字符串指针s的下一个位置,所以应改为:s++;。 ***************************************************

请编写函数fun, 函数的功能是: 移动一维数组中的内容; 若数组中有n个整数, 要求把下标从0到p(含p,p小于等于n-1)的数组元素平移到数组的最后。

例如, 一维数组中的原始内容为: 1,2,3,4,5,6,7,8,9,10; p的值为3。移动

后, 一维数组中的内容应为: 5,6,7,8,9,10,1,2,3,4。

注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include #define N 80

void fun(int *w, int p, int n) { }

main() { int a[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; int i,p,n=15;

printf(\ for(i=0; i

解题思路:

本题是考察一维数组的操作。 1. 定义一维数组中间变量b,把n值后面数组中的内容存入b中。 2. 再把m前的数组中的内容存入

b中。

3. 最后把数组b的内容依次存放到w中。 参考答案:

void fun(int *w, int p, int n) {

int i, j = 0, b[N] ;

for(i = p + 1 ; i < n ; i++) b[j++] = w[i] ;

for(i = 0 ; i <= p ; i++) b[j++] = w[i] ;

for(i = 0 ; i < n ; i++) w[i]= b[i] ; }

※※※※※※※※※※※※※※※※※※※※※※※※※ 第10套:

给定程序中,函数fun的功能是:判定形参a所指的N×N(规定N为奇数)的矩阵是否是\幻方\,若是,函数返回值为1; 不是,函数返回值为0。\幻方\的判定条件是:矩阵每行、每列、主对角线及反对角线上元素之和都相等。 例如,以下3×3的矩阵就是一个\幻方\: 4 9 2 3 5 7 8 1 6

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include #define N 3

int fun(int (*a)[N])

{ int i,j,m1,m2,row,colum; m1=m2=0;

for(i=0; i

if(m1!=m2) return 0; for(i=0; i

{ row+=a[i][j]; colum+=a[j][i]; } if( (row!=colum) __2__ (row!=m1) ) return 0; }

return __3__; }

main()

{ int x[N][N],i,j;

printf(\for(i=0; i

scanf(\ printf(\ for(i=0; i

if(fun(x)) printf(\Array is a magic square.\\n\

else printf(\square.\\n\ }

解题思路:

第一处:行列变量row和colum的值初始化为0。

第二处:两个条件只要有一个不满足就返回0,所以应填:||。 第三处:如果矩阵是“幻方”,则返回1。

***************************************************

给定程序MODI1.C中fun函数的功能是: 根据整型形参m,计算如下公式的值。

1 1 1 t = 1 - ----- - ----- - …… - -----

2 3 m 例如,若主函数中输入5,则应输出 -0.283333。

请改正函数fun中的错误或在横线处填上适当的内容并把横线删除, 使它能计算出正确的结果。 注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构! 给定源程序: #include double fun( int m ) {

double t = 1.0; int i;

for( i = 2; i <= m; i++ ) t = 1.0-1 /i; _______; }

main() {

int m ;

printf( \enter 1 integer numbers:\\n\ scanf( \

printf( \result is %lf\\n\fun( m ) ); }

解题思路:

第一处:在除法运算中,如果除数和被除数都是整数,所么所除结果也是整数,因此应改为t-=1./i。

第二处:应是返回公式的值,函数中公式的值是存放在临时变量t中,所以应填return t;。

***************************************************

请编写一个函数,函数的功能是删除字符串中的所有空格。 例如, 主函数中输入\af aa z67\则输出为 \。 注意:部分源程序在文件PROG1.C中。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。 给定源程序: #include #include int fun(char *str) { }

main() {

char str[81]; int n;

printf(\ gets(str); puts(str); fun(str);

printf(\ NONO(); }

解题思路:

本题是考察考生怎样利用字符串指针来删除字符串的空格字符。在函数开始处把指针p先指

向字符串str以及位置变量i置0,然后采用while循环和字符串指针p来处理的,每循环一次来判断指针p所指的字符是否为空格,如果不是空格,则把该字符写到str字符串中,位置由i来控制,如果是空格,则不处理,继续取下一字符,直至字符串结束为止,最后再把字符串结束符写到

位置为i的str上,再通过形参str返回。

参考答案: int fun(char *str) {

char *p = str ; int i = 0 ; while(*p) {

if(*p != ' ') str[i++] = *p ; p++ ; }

str[i] = 0 ; }

※※※※※※※※※※※※※※

※※※※※※※※※※※ 第11套:

给定程序中,函数fun的功能是将带头结点的单向链表逆置。即若原链表中从头至尾结点数据域依次为:2、4、6、8、10,逆置后,从头至尾结点数据域依次为: 10、8、6、4、2。

请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

注意:源程序存放在考生文件夹下的BLANK1.C中。

不得增行或删行,也不得更改程序的结构! 给定源程序: #include #include #define N 5

typedef struct node { int data;

struct node *next; } NODE;

void fun(NODE *h) { NODE *p, *q, *r; /

p = h->__1__; /

if (p==__2__) return; q = p->next;

p->next = NULL; while (q)

{ r = q->next; q->next = p; p = q; q = __3__; }

h->next = p; }

NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h = (NODE *)malloc(sizeof(NODE)); h->next = NULL; for(i=0; idata=a[i]; q->next = NULL;

if (h->next == NULL) h->next = p = q;

else { p->next = q; p = q; } }

return h; }

void outlist(NODE *h) { NODE *p; p = h->next;

if (p==NULL) printf(\list is NULL!\\n\ else

{ printf(\

48d6g8mkin1x2cx44eay
领取福利

微信扫码领取福利

微信扫码分享