计算机二级C语言上机真题(79)【附详解】
【真题1】 给定程序中,函数fun 的功能是:利用指针数组对形参ss 所指字符串数
组中的字符串按由长到短的顺序排序,并输出排序结果。ss 所指字符串数组中共有
N 个字符串,且串长小于M。
#include < stdio.h >#include < string.h >#define N 5
#define M 8
void fun(char (*ss)[M])
{ char *ps[N],*tp; int i,j,k;
for(i=0; i< N; i++) ps[i]=ss[i];
for(i=0; i< N-1; i++) {
/**********found**********/
k= __1__ ;
for(j=i+1; j< N; j++)
/**********found**********/
if(strlen(ps[k]) < strlen(__2__) ) k=j;
/**********found**********/
tp=ps[i]; ps[i]=ps[k]; ps[k]= __3__ ;
}
printf("\nThe string after sorting by length:\n\n");
for(i=0; i< N; i++) puts(ps[i]);
}
main()
{ char ch[N][M]={"red","green","blue","yellow","black"};
int i;
printf("\nThe original string\n\n");
for(i=0;i< N;i++)puts(ch[i]); printf("\n");
fun(ch);
}
(2011年2月)
解析: 本题的考核点是C语言中字符串数组和字符串指针变量的应用。
在fun 函数中通过字符串指针变量来访问字符串数组元素。首先利用for 循环
语句将二维数组中各元素的首地址赋给指针变量ps。变量k作为指针变量ps
的下标值,其值根据循环中变量i的值变化,所以第一个空填:i;内层循环判
断指针变量所指向的数组元素的长度,所以第二个空填:*(ps+j)或与此语句功
能相同的语句;题目要求将字符串按由长到短的顺序排序,所以第三个空填:
tp。
答案:【1】i 【2】*(ps+j) 【3】tp
【真题2】 给定程序modi.c 中函数fun的功能是:将长整型数中每一位上为奇数
的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s
中的数为:87653142 时,t 中的数为:7531。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >void fun (long s, long *t)
{ int d;
long sl=1;
/************found************/
t = 0;
while ( s > 0)
{ d = s%10;
/************found************/
if (d%2 == 0)
{ *t = d * sl + *t;
sl *= 10;
}
s /= 10;
}
}
main()
{ long s, t;
clrscr();
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中基本语法及一些简单算法的掌握情况。
首先,这里的t是指针,这里的语句t=0 错误,应该为*t=0,其次,if (d%2
== 0)语句在这里所起的作用是将每一位上的偶数取出而不是题目所要求的奇
数取出!这里的语句应改为if(d%2==1)或其等效语句。
【真题3】 请编写一个函数fun,它的功能是:删除字符串中的数字字符。例如输入
字符串:48CTYP9E6,则输出:CTYPE。
注意: 部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >void fun (char *s)
{……}
main( )
{ char item[100] ;
printf("\nEnter a string: ");
gets(item); fun(item);
printf("\nThe string:\"%s\"\n",item);
}
(2011年2月)
解析: 本题的考核点是指针、数组和循环语句。
解题思路:通过循环语句移动指针,并依次判断指针相应位上的值是否不为数
字字符,如果不为数字字符则将此值存放入另外一个字符数组中,最后返回此
数组。
#include < stdio.h >
void fun (char *s)
{ int i,j=0;
char str[100],*p;
p=s;
while(*p!='\0'){
if(*p< '0' || *p >'9') /*判断指针相应位上的值是否不为数字字符*/
str[j++]=*p; /*如果不为数字字符则将此值存放入数组str 中*/
p++;
}
str[j]='\0'; /*赋以字符串结束标志*/
p=s;
for(i=0;i< j;i++)
p[i]=str[i];
p[i]='\0';
}
组中的字符串按由长到短的顺序排序,并输出排序结果。ss 所指字符串数组中共有
N 个字符串,且串长小于M。
#include < stdio.h >#include < string.h >#define N 5
#define M 8
void fun(char (*ss)[M])
{ char *ps[N],*tp; int i,j,k;
for(i=0; i< N; i++) ps[i]=ss[i];
for(i=0; i< N-1; i++) {
/**********found**********/
k= __1__ ;
for(j=i+1; j< N; j++)
/**********found**********/
if(strlen(ps[k]) < strlen(__2__) ) k=j;
/**********found**********/
tp=ps[i]; ps[i]=ps[k]; ps[k]= __3__ ;
}
printf("\nThe string after sorting by length:\n\n");
for(i=0; i< N; i++) puts(ps[i]);
}
main()
{ char ch[N][M]={"red","green","blue","yellow","black"};
int i;
printf("\nThe original string\n\n");
for(i=0;i< N;i++)puts(ch[i]); printf("\n");
fun(ch);
}
(2011年2月)
解析: 本题的考核点是C语言中字符串数组和字符串指针变量的应用。
在fun 函数中通过字符串指针变量来访问字符串数组元素。首先利用for 循环
语句将二维数组中各元素的首地址赋给指针变量ps。变量k作为指针变量ps
的下标值,其值根据循环中变量i的值变化,所以第一个空填:i;内层循环判
断指针变量所指向的数组元素的长度,所以第二个空填:*(ps+j)或与此语句功
能相同的语句;题目要求将字符串按由长到短的顺序排序,所以第三个空填:
tp。
答案:【1】i 【2】*(ps+j) 【3】tp
【真题2】 给定程序modi.c 中函数fun的功能是:将长整型数中每一位上为奇数
的数依次取出,构成一个新数放在t中。高位仍在高位,低位仍在低位。 例如,当s
中的数为:87653142 时,t 中的数为:7531。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main 函数,
#include < conio.h >#include < stdio.h >void fun (long s, long *t)
{ int d;
long sl=1;
/************found************/
t = 0;
while ( s > 0)
{ d = s%10;
/************found************/
if (d%2 == 0)
{ *t = d * sl + *t;
sl *= 10;
}
s /= 10;
}
}
main()
{ long s, t;
clrscr();
printf("\nPlease enter s:"); scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ld\n", t);
}
(2011年2月)
解析: 本题着重考察考生对C 语言中基本语法及一些简单算法的掌握情况。
首先,这里的t是指针,这里的语句t=0 错误,应该为*t=0,其次,if (d%2
== 0)语句在这里所起的作用是将每一位上的偶数取出而不是题目所要求的奇
数取出!这里的语句应改为if(d%2==1)或其等效语句。
【真题3】 请编写一个函数fun,它的功能是:删除字符串中的数字字符。例如输入
字符串:48CTYP9E6,则输出:CTYPE。
注意: 部分源程序存在文件prog.c 中。
请勿改动主函数main 和其它函数中的任何内容,仅在函数fun 的花括号中填入你编
写的若干语句。
#include < stdio.h >void fun (char *s)
{……}
main( )
{ char item[100] ;
printf("\nEnter a string: ");
gets(item); fun(item);
printf("\nThe string:\"%s\"\n",item);
}
(2011年2月)
解析: 本题的考核点是指针、数组和循环语句。
解题思路:通过循环语句移动指针,并依次判断指针相应位上的值是否不为数
字字符,如果不为数字字符则将此值存放入另外一个字符数组中,最后返回此
数组。
#include < stdio.h >
void fun (char *s)
{ int i,j=0;
char str[100],*p;
p=s;
while(*p!='\0'){
if(*p< '0' || *p >'9') /*判断指针相应位上的值是否不为数字字符*/
str[j++]=*p; /*如果不为数字字符则将此值存放入数组str 中*/
p++;
}
str[j]='\0'; /*赋以字符串结束标志*/
p=s;
for(i=0;i< j;i++)
p[i]=str[i];
p[i]='\0';
}