二级C语言编程模拟题01

引言

小伙伴们好啊。第一次发博,也挺纠结写什么。博主目前上大学,距离考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';
}

大家可以将对题目的见解写到评论区哈,我会回复大家,一起学习进步🥰

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Emo怀秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值