一、程序填空题1. 请补充函数proc(),该函数的功能是:把一个字符串中的数字字符按从大到小的顺序排序,并把这个全部由数字组成的字符串保存在原串中,函数返回数字字符串的长度。
例如,若输入字符串为abc123def,如果为321,字符串长度为3。
注意:部分源程序如下。
请勿改动main()函数和其他函数中的任何内容,仅在函数proc()的横线上填入所编写的若干表达式或语句。
试题程序:
#include<stdlib.h>
#include<stdio.h>
#define M 20
int proc(char *str)
{
int i=0,j=0,k=0,m=0;
char t;
char *p=str;
while(*p)
{
if(*p>='0'&&*p<='9')
______;
p++;
}
*(str+i)='\0';
______;
while(*(p+j))
{
k=j;
______;
while(*(p+k))
{
if(*(p+k)>*(str+m))
{
t=*(str+m);
*(str+m)=*(p+k);
*(p+k)=t;
}
k++;
}
j++;
}
return i;
}
void main()
{
char str[81];
int n;
system("CLS");
printf("Input the original string");
gets(str);
printf("***The original string***\n");
puts(str);
printf("***The new string***\n");
n=proc(str);
puts(str);
printf("***The length of new string is:%d***
\n",n);
}
*(str+i++)=*p p=str m=j
[解析] 题目中要求将一个字符串的数字字符按从大到小的顺序进行排序。首先要将字符串中的所有数字字符选择出来放在原来的字符串中,因此,第1个空填“*(str+i++)=*p”;由程序可知,变量p指向新的字符串str,因此其初始值为字符串str的首地址,因此,第2个空填“p=str”;然后将得到的新的字符串排序,因此,第3个空填“m=j”。
二、程序改错题1. 下列给定程序中,函数proc()的功能是:求出以下分数序列的前m项之和。
2/1,3/2,5/3,8/5,13/8,21/13,…
和值通过函数值返回main()函数。
例如,若m=6,则应输出10.007051。
请修改程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
//****found****
proc(int n)
{
int a=2,b=1,c,k;
double s=0.0;
for(k=1;k<=n;k++)
{
s=s+1.0*a/b;
//****found****
c=a;a+=b;b+=c;
}
return(s);
}
void main()
{
int m=5;
system("CLS");
printf("\nThe Value of function is:
%1f\n",proc(m));}}
(1)错误:proc(int n)
正确:double proc(int n)
(2)错误:c=a;a+=b;b+=c;
正确:c=a;a+=b;b=c;
[解析] 由main()函数中的proc()函数调用可知,函数proc()的返回值为double型数据。因此,“proc(int n)”应改为“double proc(int n)”。根据数列的特点可知,下一项的分子是上一项的分子和分母之和,下一项的分母为上一项的分子。根据数列的这个特点,“c=a;a+=b;b+=c;”应改为“c=a;a+=b;b=c;”。
三、程序设计题1.
考生文件夹 函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的百位和个位上,b中的十位和个位数依次放在变量c的千位和十位上。
例如,当a=45,b=12。调用该函数后,c=1425。
注意:部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
给定源程序:
#include<stdio.h>
void fun(int a, int b, long *c)
{
}
main() /*主函数*/
{ int a, b; long c;
printf("Input a b:");
scanf("%d%",&a, &b);
fun(a, b, &c);
printf("The result is:%ld\n", c);
}
void fun(int a, int b, long *c)
{
*c=a%10+(b%10)*10+(a/10)*100+(b/10)*1000;
}
答案考生文件夹[解析] 本题的主要问题是如何取出a和b的个位数和十位数,取出后如何表示成c中相应的位数。由于a和b都是只有两位的整数,所以分别对它们除10可得到它们的十位数,分别用10对它们求余可得到它们的个位数。得到后对应乘以1000、100、10、1就可得到c的千位数、百位数、十位数和个位数。注意:使用c时要进行指针运算。