二级C语言编程模拟题02

引言

小伙伴们好~~因博主的大学所在地出现了疫情,现阶段都已转成网课教学,一天天课贼满= =,抱歉延迟了这么多天才发,愿大家多多理解,也祝大家考试顺利!

*注:本人思路与答案在文章末尾,建议先做做再进行比较;本人能力有限,如有更优解或不懂的地方可私信。

---程序填空题

下列给定程序中,函数fun的功能是 : 把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符将绕回放到第一个奇数位置,下标为偶数的字符不动(注:字符串的长度大于等于2)。
例如,形参s所指字符串为"abcdefgh",执行结果为"ahcbedgf"。
请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。
注意:部分源程序在文件BLANK1.C中。不得增行或删行,也不得更改程序的结构!

#include     <stdio.h>
void fun(char  *s)
{  int  i, n, k;    char c;
   n=0;
   for(i=0; s[i]!='\0'; i++)  n++;
/**********found**********/
   if(n%2==0) k=n-___1___ ;
   else       k=n-2;
/**********found**********/
   c=___2___ ;
   for(i=k-2; i>=1; i=i-2)  s[i+2]=s[i];
/**********found**********/
   s[1]=___3___ ;
}
main()
{  char  s[80]="abcdefgh";
   printf("\nThe original string is :  %s\n",s);
   fun(s);
   printf("\nThe result is :  %s\n",s);
}

---程序修改题

下列给定程序中fun函数的功能是:求表达式
S=aa... aa-""" -aaa-aa-a
(此处aa... aa表示n个a,a和n的值在1至9之间)例如,a=3,n=6,则以上表达式为;
s=333333-33333-3333-333-33-3  其值是 296298。
a和n是fun函数的形参,表达式的值作为函数值传回main函数。
请改正程序中的错误,使它能计算出正确的结果。
注意:部分源程序在文件MOD11.C中,不得增行或删行,也不得更改程序的结构!

#include <stdio.h>

long fun (int a, int n)
{  int  j ;
/**************found**************/
   long  s = 0,  t = 1 ;
   for ( j = 0 ; j < n ; j++)
      t = t * 10 + a ;
   s = t ;
   for ( j = 1 ; j < n ; j++) {
/**************found**************/
     t = t % 10 ;
     s = s - t ;
   }
   return(s) ;
}

main( )
{  int  a, n ;
   printf( "\nPlease enter a and n:") ;
   scanf(  "%d%d", &a, &n ) ;
   printf( "The value of  function is: %ld\n", fun ( a, n ) );
}

---程序设计题

编写函数void fun(char *tt, int pp[),统计在tt所指的字符串中 ' a ' 到 ' z ' 26个小写字母各自出现的次数,并依次放在pp所指的数组中。
例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是:
3 3 3 2 2 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
注意:部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
 

#include <stdio.h>
#include <string.h>

void fun(char *tt, int pp[])
{
    
}

main( )
{  char aa[1000] ;
   int  bb[26], k ;
   void NONO (  );

   printf( "\nPlease enter  a char string:" ) ; scanf("%s", aa) ;
   fun(aa, bb ) ;
   for ( k = 0 ; k < 26 ; k++ ) printf ("%d ", bb[k]) ;
   printf( "\n" ) ;
   NONO ( ) ;
}

void NONO ( )
{/* 本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/
  char aa[1000] ;
  int bb[26], k, i ;
  FILE *rf, *wf ;

  rf = fopen("in.dat","r") ;
  wf = fopen("out.dat","w") ;
  for(i = 0 ; i < 10 ; i++) {
    fscanf(rf, "%s", aa) ;
    fun(aa, bb) ;
    for ( k = 0 ; k < 26 ; k++ ) fprintf (wf, "%d ", bb[k]) ;
    fprintf(wf, "\n" ) ;
  }
  fclose(rf) ;
  fclose(wf) ;
}

解析

程序填空题: 

第一空中,k为最后一个位置的奇数下标,n为字符串长度;即判断n在不同情况下k的下标。
第二空中,c为字符类型,前面的k中又求出了奇数下标的最后一个位置,再结合题目来理解。
第三空中,s[1]是第一个奇数下标,应填最右边被移出字符串的字符。

        1.   1                2.   s[k]              3.   c

程序修改题:

第一处错误:t=1;若t=1,那么数字中最大位上的数便都是1,与题目不相符。
                    (起初我认为t=a,但这样就会多*10一次,也不能改其他位置的代码,害)
第二处错误:t%10;若t%10,得到的都是个位数上的值,运算符错误。

        1.   t=0             2.   t/10

程序设计题:

才看这题原本想用俩for循环写的,在数组每个元素中查是26个字母中的哪一个,再让它们进行相加,但这样会很浪费时间空间,不太可取。

例子中给出的没有字母出现时为0,而主函数并没有赋值,所以要先进行赋值操作;
代码中导入了string.h头文件,显然是要用的(题目所给代码中并没有用,于是博主去网上找了下,发现并没有找到有返回子串在字符串中出现次数的函数= =);
因为是查找小写字母出现次数,a 的ASCII码为97,那么当任意一个字母减去97得到的0-25之间的数,再以这个数为下标使pp数组中对应位置的数值+1即可。

void fun(char *tt, int pp[])
{
	int i;
	
	for(i=0;i<26;i++) pp[i]=0; 
	
	for(i=0;i<strlen(tt);i++) pp[(tt[i]-97)]++;

}

大家可以将对题目的看法私信或写到评论区吼,我会回复大家,一起学习进步🥰 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Emo怀秋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值