引言
小伙伴们好~~又到考C2的日子咯!希望题目能帮助大家,祝大家考试顺利!
*注:本人思路与答案在文章末尾,建议先做做再进行比较;本人能力有限,如有更优解或不懂的地方可私信。
---程序填空题
下列给定程序中,函数 fun 的功能是:在形参 ss 所指字符串数组中,将所有串长超过k的字符串中后面的字符删除,只保留前面的 k 个字符。ss 所指字符串数组中共有 N 个字符串,且串长小于 M 。请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:源程序不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#include <string.h>
#define N 5
#define M 10
/**********found**********/
void fun(char (*ss) __1__, int k)
{ int i=0 ;
/**********found**********/
while(i< __2__) {
/**********found**********/
ss[i][k]=__3__; i++; }
}
main()
{ char x[N][M]={"Create","Modify","Sort","skip","Delete"};
int i;
printf("\nThe original string\n\n");
for(i=0;i<N;i++)puts(x[i]); printf("\n");
fun(x,4);
printf("\nThe string after deleted :\n\n");
for(i=0; i<N; i++) puts(x[i]); printf("\n");
}
---程序修改题
下列给定程序中函数 fun 的功能是:根据以下公式求 π 值,并作为函数值返回。
例如,当给指定精度的变量 eps 输入0.0005时,应输出Pi=3.140578。
注意:源程序不得增行或删行,也不得更改的程序的结构!
#include <math.h>
#include <stdio.h>
double fun(double eps)
{ double s,t; int n=1;
s=0.0;
/************found************/
t=0;
while( t>eps)
{ s+=t;
t=t * n/(2*n+1);
n++;
}
/************found************/
return(s);
}
main()
{ double x;
printf("\nPlease enter a precision: "); scanf("%lf",&x);
printf("\neps=%lf, Pi=%lf\n\n",x,fun(x));
}
---程序设计题
规定输入的字符串中只包含字母和 * 号。请编写函数 fun,其功能是:使字符串的前导 * 号不得多于 n 个,若多于 n 个,则删除多余的 * 号;若少于或等 n 个,则不做处理,字符串中间和尾部的 * 号不删除。
列如,字符串中的内容为:******A*BC*DEF*G****,若 n的值为 3,删除后,字符串中的内容应当是:***A*BC*DEF*G****,若n的值为8,则字符串中的内容仍为:******A*BC*DEF*G****。n的值在主函数中输入。
在编写函数时,不得使用 c 语言提供的字符串函数。
请勿改动主函数 main 和其他函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。
#include <stdio.h>
void fun( char *a, int n )
{
}
main()
{ char s[81]; int n;void NONO ();
printf("Enter a string:\n");gets(s);
printf("Enter n : ");scanf("%d",&n);
fun( s,n );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO ()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i, n ; char s[81] ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
fscanf(in, "%d", &n) ;
fun(s,n) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
解析
程序填空题:
第一空中主函数传来的实参是一个二维字符数组,题目也已给出(*ss),秉着二维 数组行数可不写,列必须写的概念;此处应该填二维数组的列数。
第二空的下一行代码中,i 作为 ss 数组中循环行数的变量,一定是小于最大行数的。
第三空为赋值操作,k 在这里表示的是已保留的字符串的下一个位置的下标;需要一个字符串结尾函数。
1. [M] 2.N 3.'\0'
程序修改题:
第一处错误中,t 在循环体中有乘除运算,所以不能赋值为0。
第二处错误中,由给出公式可以看出, π / 2 才等于我们所计算的结果。
1. t = 1 2. return ( s * 2 );
程序设计题:
题目很长,大致的意思为字符串前的 * 不能超过 n 个;超过了就只保留n个,没超过不做修改。
先统计字符串前的 * 的个数;超过 n 时,只保留n个,把第一个不是 * 号的字符及其之后的字符依次向前偏移,再用 ' \ 0 ' 结尾。没超过n时,不做修改。
void fun( char *a, int n )
{
int i=0,f=0;
while(a[i]=='*') i++; //判断n的个数
if (i>n) { //超过n的个数修改
while(a[f]!='\0'){ //遍历整个字符串
if(f<n) a[f]='*'; //重新定义整个字符串,前 n 个字符为 *
else a[f]=a[i++]; //把除开始的*后的字符串依次向前移
f++;
}
}
}
大家可以将对题目的看法私信或写到评论区吼,我会回复大家,一起学习进步🥰