计算机二级C语言上机真题(10)【附详解】
【真题1】 给定程序中,函数fun 的功能是:求出形参ss 所指字符串数组中最长字
符串的长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。字符串数组
中共有M 个字符串,且串长< N。 请在程序的下划线处填入正确的内容并把下划线
删除,使程序得出正确的结果。不得增行或删行,也不得更改程序的结构!
#include < stdio.h >
#include < string.h >
#define M 5
#define N 20
void fun(char (*ss)[N])
{ int i, j, k=0, n, m, len;
for(i=0; i< M; i++)
{ len=strlen(ss[i]);
if(i==0) n=len;
if(len >n) {
/**********found**********/
n=len; ___1___=i;
}
}
for(i=0; i< M; i++)
if (i!=k)
{ m=n;
len=strlen(ss[i]);
/**********found**********/
for(j=___2___; j >=0; j--)
ss[i][m--]=ss[i][j];
for(j=0; j< n-len; j++)
/**********found**********/
___3___='*';
}}
main()
{ char
ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchon
gqing"};
int i;
printf("\nThe original strings are :\n");
for(i=0; i< M; i++) printf("%s\n",ss[i]);
printf("\n");
fun(ss);
printf("\nThe result:\n");
for(i=0; i< M; i++) printf("%s\n",ss[i]);
}
(2011年2月)
解析: 本题考查的是字符串中字符的插入。
在fun 函数中,第一个for 循环的作用是求出所有字符串中,长度最长的字符
串的长度n,并记下此字符串在数组中的下标k,故第一空应填k。在第二个
for 循环中,如果当前字符串不是最长字符串,则计算其长度len,并将从下标
0 到len 的字符向右移动n-len 位,故第二空为len;最后,再通过一个for 循
环语句在当前字符串前面补充len-n 个'*',故第三空应为ss[i][j]或其等效形
式。
答案:【1】“rb” 【2】s[j].sno 【3】fwrite
【真题2】 给定程序modi.c 中,函数fun 的功能是:利用插入排序法对字符串中
的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元
素进行排序。然后把第三个字符插入到前两个字符中,插入后前三个字符依然有序;
再把第四个字符插入到前三个字符中,……。待排序的字符串已在主函数中赋予。 请
改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数,
#define N 80
#include "stdio.h"
#include "string.h"
void insert(char *aa)
{int i,j,n; char ch;
/************found************/
n=stlen(aa);
for(i=1;i< n;i++)
/************found************/
{c=aa[i];
j=i-1;
while ((j >=0)&&(ch< aa[j]))
{ aa[j+1]=aa[j];
j--;
}
aa[j+1]=ch;
}
}
main()
{ char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";
int i;
printf("The original string : %s\n",a);
insert(a);
printf("The string after sorting:%s\n\n",a);
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法以及字符串函数的使用。
由题意可知,需通过字符串函数求出字符串aa的长度,求字符串的函数为
strlen。程序中的函数使用错误,应将"n=stlen(aa);"改为"n=strlen(aa);"。
C 语言中规定,使用变量之前应先对变量进行定义。程序中变量c未定义,不可
在程序中使用。由题意可知,这里应为变量ch,故"c=aa[i];"改为
"ch=aa[i];"或相同作用的语句。
【真题3】 编写一个函数 void fun(char p1[], char p2[]), 它的功能是: 实现两
个字符串的连接(不使用库函数strcat)。 例如,输入下面两个字符串:
FirstString-- SecondString 程序输出: FirstString--SecondString 注意:部分
源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在
函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char p1[], char p2[])
{……}
main()
{ char s1[80], s2[40] ;
clrscr() ;
printf("Enter s1 and s2:\n") ;
scanf("%s%s", s1, s2) ;
printf("s1=%s\n", s1) ;
printf("s2=%s\n", s2) ;
printf("Invoke fun(s1,s2):\n") ;
fun(s1, s2) ;
printf("After invoking:\n") ;
printf("%s\n", s1) ;
}
(2011年2月)
解析: 本题的考核点是字符串的连接。
解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1 和
p2;
2、point1起始指向字符串p1 的第一个字符,通过循环,令其指向p1 串尾,
为未来的连接工作做好准备;
3、point2起始指向字符串p2 的第一个字符,通过循环,不断将指针指向p2
的下一个字符;
4、将point2 指向的字符通过指针point1 逐一连接在字符串p1 末尾;
5、连接完毕后,将指向字符串p1 末尾的指针point1 指向'0',以保证指针不
越界。
解法一:
void fun(char p1[], char p2[])
{ char *point1,*point2; /*定义两个字符型指针point1、point2*/
point1=p1; /*将字符型指针point1 指向字符串p1 的第一个字符*/
point2=p2; /*将字符型指针point2 指向字符串p2 的第一个字符*/
while(*point1!=NULL) point1++; /*通过循环,令point1 指向p1 串尾,
为未来的连接工作做好准备*/
/*通过循环将point2 指向的字符通过指针point1逐一连接在字符串p1 末尾
*/
while(*point2!=NULL){
*point1=*point2;
point1++;
point2++;
}
*point1=NULL; /*将指向字符串p1 末尾的指针point1 指向'0',以保证指针
不越界*/
}
解法二:
/* 注:第一个for()循环用于让i 成为第一个字符串的结束符的下标,要注意在
个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一
个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有
p1[i]='\0';来给字符串加上结束符*/
void fun(char p1[],char p2[])
{ int i,j;
for(i=0;p1[i];i++);
for(j=0;p2[j];j++)
p1[i++]=p2[j];
p1[i]='\0';
}
符串的长度,其余字符串左边用字符*补齐,使其与最长的字符串等长。字符串数组
中共有M 个字符串,且串长< N。 请在程序的下划线处填入正确的内容并把下划线
删除,使程序得出正确的结果。不得增行或删行,也不得更改程序的结构!
#include < stdio.h >
#include < string.h >
#define M 5
#define N 20
void fun(char (*ss)[N])
{ int i, j, k=0, n, m, len;
for(i=0; i< M; i++)
{ len=strlen(ss[i]);
if(i==0) n=len;
if(len >n) {
/**********found**********/
n=len; ___1___=i;
}
}
for(i=0; i< M; i++)
if (i!=k)
{ m=n;
len=strlen(ss[i]);
/**********found**********/
for(j=___2___; j >=0; j--)
ss[i][m--]=ss[i][j];
for(j=0; j< n-len; j++)
/**********found**********/
___3___='*';
}}
main()
{ char
ss[M][N]={"shanghai","guangzhou","beijing","tianjing","cchon
gqing"};
int i;
printf("\nThe original strings are :\n");
for(i=0; i< M; i++) printf("%s\n",ss[i]);
printf("\n");
fun(ss);
printf("\nThe result:\n");
for(i=0; i< M; i++) printf("%s\n",ss[i]);
}
(2011年2月)
解析: 本题考查的是字符串中字符的插入。
在fun 函数中,第一个for 循环的作用是求出所有字符串中,长度最长的字符
串的长度n,并记下此字符串在数组中的下标k,故第一空应填k。在第二个
for 循环中,如果当前字符串不是最长字符串,则计算其长度len,并将从下标
0 到len 的字符向右移动n-len 位,故第二空为len;最后,再通过一个for 循
环语句在当前字符串前面补充len-n 个'*',故第三空应为ss[i][j]或其等效形
式。
答案:【1】“rb” 【2】s[j].sno 【3】fwrite
【真题2】 给定程序modi.c 中,函数fun 的功能是:利用插入排序法对字符串中
的字符按从小到大的顺序进行排序。插入法的基本算法是:先对字符串中的头两个元
素进行排序。然后把第三个字符插入到前两个字符中,插入后前三个字符依然有序;
再把第四个字符插入到前三个字符中,……。待排序的字符串已在主函数中赋予。 请
改正程序中的错误,使它能得出正确的结果。 注意:不要改动main 函数,
#define N 80
#include "stdio.h"
#include "string.h"
void insert(char *aa)
{int i,j,n; char ch;
/************found************/
n=stlen(aa);
for(i=1;i< n;i++)
/************found************/
{c=aa[i];
j=i-1;
while ((j >=0)&&(ch< aa[j]))
{ aa[j+1]=aa[j];
j--;
}
aa[j+1]=ch;
}
}
main()
{ char a[N]="QWERTYUIOPASDFGHJKLMNBVCXZ";
int i;
printf("The original string : %s\n",a);
insert(a);
printf("The string after sorting:%s\n\n",a);
}
(2011年2月)
解析: 本题的考核点是C语言的一些基本用法以及字符串函数的使用。
由题意可知,需通过字符串函数求出字符串aa的长度,求字符串的函数为
strlen。程序中的函数使用错误,应将"n=stlen(aa);"改为"n=strlen(aa);"。
C 语言中规定,使用变量之前应先对变量进行定义。程序中变量c未定义,不可
在程序中使用。由题意可知,这里应为变量ch,故"c=aa[i];"改为
"ch=aa[i];"或相同作用的语句。
【真题3】 编写一个函数 void fun(char p1[], char p2[]), 它的功能是: 实现两
个字符串的连接(不使用库函数strcat)。 例如,输入下面两个字符串:
FirstString-- SecondString 程序输出: FirstString--SecondString 注意:部分
源程序存在文件prog.c 中。 请勿改动主函数main 和其它函数中的任何内容,仅在
函数fun 的花括号中填入你编写的若干语句。
#include < stdio.h >
#include < conio.h >
void fun(char p1[], char p2[])
{……}
main()
{ char s1[80], s2[40] ;
clrscr() ;
printf("Enter s1 and s2:\n") ;
scanf("%s%s", s1, s2) ;
printf("s1=%s\n", s1) ;
printf("s2=%s\n", s2) ;
printf("Invoke fun(s1,s2):\n") ;
fun(s1, s2) ;
printf("After invoking:\n") ;
printf("%s\n", s1) ;
}
(2011年2月)
解析: 本题的考核点是字符串的连接。
解题思路:1、定义两个字符型指针point1、point2,分别指向字符串p1 和
p2;
2、point1起始指向字符串p1 的第一个字符,通过循环,令其指向p1 串尾,
为未来的连接工作做好准备;
3、point2起始指向字符串p2 的第一个字符,通过循环,不断将指针指向p2
的下一个字符;
4、将point2 指向的字符通过指针point1 逐一连接在字符串p1 末尾;
5、连接完毕后,将指向字符串p1 末尾的指针point1 指向'0',以保证指针不
越界。
解法一:
void fun(char p1[], char p2[])
{ char *point1,*point2; /*定义两个字符型指针point1、point2*/
point1=p1; /*将字符型指针point1 指向字符串p1 的第一个字符*/
point2=p2; /*将字符型指针point2 指向字符串p2 的第一个字符*/
while(*point1!=NULL) point1++; /*通过循环,令point1 指向p1 串尾,
为未来的连接工作做好准备*/
/*通过循环将point2 指向的字符通过指针point1逐一连接在字符串p1 末尾
*/
while(*point2!=NULL){
*point1=*point2;
point1++;
point2++;
}
*point1=NULL; /*将指向字符串p1 末尾的指针point1 指向'0',以保证指针
不越界*/
}
解法二:
/* 注:第一个for()循环用于让i 成为第一个字符串的结束符的下标,要注意在
个for()后要有一个分号否则出错。第二个for()的作用是将第二个字符串一
个一个字符依次放到第一个字符串的未尾。此外,还要注意最后一定要有
p1[i]='\0';来给字符串加上结束符*/
void fun(char p1[],char p2[])
{ int i,j;
for(i=0;p1[i];i++);
for(j=0;p2[j];j++)
p1[i++]=p2[j];
p1[i]='\0';
}