引言
小伙伴们好啊。第一次发博,也挺纠结写什么。博主目前上大学,距离考C2就剩一个月了。在网上也找过很多资料,但大多都是以各种方式圈小钱钱= =。与其就发点干货,祝大家考试顺利。
*注:本人思路与答案在文章末尾,建议先做做再进行比较;本人能力有限,如有更优解或不懂的地方可私信。
---程序填空题
下列给定程序中,函数fun的功能是:将NxN矩阵主对角线元素的值与反向对角线对应位置上元素的值进行交换。
如N=3,有以下矩阵:
1 2 3
4 5 6
7 8 9
交换后:
3 2 1
4 5 6
9 8 7
请在程序的下画线处填入正确的内容并将下画线册除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!
#include <stdio.h>
#define N 4
/**********found**********/
void fun(int ___1___ , int n)
{ int i,s;
/**********found**********/
for(___2___; i++)
{ s=t[i][i];
t[i][i]=t[i][n-i-1];
/**********found**********/
t[i][n-1-i]=___3___;
}
}
main()
{ int t[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10}, i, j;
printf("\nThe original array:\n");
for(i=0; i<N; i++)
{ for(j=0; j<N; j++) printf("%d ",t[i][j]);
printf("\n");
}
fun(t,N);
printf("\nThe result is:\n");
for(i=0; i<N; i++)
{ for(j=0; j<N; j++) printf("%d ",t[i][j]);
printf("\n");
}
}
---程序修改题
由N个有序整数组成的数列已放在一维数组中,下列给定程序中函数fun的功能是。利用折半查找法查找整数m在数组中的位置。若找到,返回其下标值,否则,返回-1。
折半查找的基本算法是:每次查找前先确定数组中特查的范围 low 和 high (low<high) 。然后用a与中间位置上元素的值进行比较。如果r的值大于中间位置元素(mid)的值,则下一次的查找范围落在中间位置之后的元素中﹔反之,下一次的查找范围落在中间位置之前的元素中。直到low > high,查找结束。
请改正程序中的错误,使它能得出正确的结果。
注意。部分源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
#include <stdio.h>
#define N 10
/************found************/
void fun(int a[], int m )
{ int low=0,high=N-1,mid;
while(low<=high)
{ mid=(low+high)/2;
if(m<a[mid])
high=mid-1;
/************found************/
else If(m > a[mid])
low=mid+1;
else return(mid);
}
return(-1);
}
main()
{ int i,a[N]={-3,4,7,9,13,45,67,89,100,180 },k,m;
printf("a数组中的数据如下:");
for(i=0;i<N;i++) printf("%d ", a[i]);
printf("Enter m: "); scanf("%d",&m);
k=fun(a,m);
if(k>=0) printf("m=%d,index=%d\n",m,k);
else printf("Not be found!\n");
}
---程序设计题
假定输入的字符串中只包含字母和*号。请编写函数fun。其功能是:除了尾数的*号之外,将数字中的其它的*号全部去除。t 指向字符串中最后的一个字母。在编写函数时,不得使用C语言提供的字符串函数。
例如,字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容应当是ABCDEFG*******。注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
void fun( char *a, char *p )
{
}
main()
{ char s[81],*t;
void NONO ( );
printf("Enter a string:\n");gets(s);
t=s;
while(*t)t++;
t--;
while(*t=='*')t--;
fun( s , t );
printf("The string after deleted:\n");puts(s);
NONO();
}
void NONO()
{/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */
FILE *in, *out ;
int i ; char s[81],*t ;
in = fopen("in.dat","r") ;
out = fopen("out.dat","w") ;
for(i = 0 ; i < 10 ; i++) {
fscanf(in, "%s", s) ;
t=s;
while(*t)t++;
t--;
while(*t=='*')t--;
fun(s,t) ;
fprintf(out, "%s\n", s) ;
}
fclose(in) ;
fclose(out) ;
}
解析
程序填空题:
由题目可以找出规律:第一行第一个数与第一行倒数第一个数交换; 第二行第二个数与第二行倒数第二个数交换.....由于是填空题,可直接找答案。
第一空写形参,可在函数体中找未被定义的变量进行填写;
第二空填条件,也就是循环次数,此处用了一个for循环,根据题目交叉对角线交换数据来看,循环次数与行数有关,注意:变量i未被初始化。
第三空可根据前两行代码可知,为两个变量交换数据的格式。
1. t[][N] 2. i=0;i<n 3. s
程序修改题:
题目中的折半查找,也叫做二分法查找,此查找有前提条件:数组中的值必须是升序或降序。
第一处错误:在给定的函数体中,函数是有返回值的,void表示无返回值。
第二处错误:关键字拼写错误。
1. void 改为 int 2. If 改为 if
程序设计题:
这类题比较灵活,才写的时候很懵,要最后一个字母有什么用?输入的字符串有多长?还不能用String.h函数?
首先要确定输入的字符串长度;接着开始判断到最后一个字母之前的所有字符是不是 * ,如果不是,则把字符保存到新字符串中;最后把末尾的 * 添加进新字符串中,让新字符串代替旧字符串即可。
void fun( char *a, char *p )
{
int n,i,m=0,j=0;
char *t;
t=a;
while(a[j]){
if(a[j]==*p) n=j;
j++;
}
for(i=0;i<j;i++){
if((a[i]!='*'&&i<=n)||i>n) t[m++]=a[i];
}
t[m]='\0';
}
大家可以将对题目的见解写到评论区哈,我会回复大家,一起学习进步🥰