大学C语言学习中期测试总结,以及题解析

引言:

        近期我们学校组织了一次中期测试,可以说这套题还是比较简单的;但是,因为自己的粗心以及思路的不完备导致本应该满分的我硬生生搞的变低了不少;在这里,我将题分享出来,并进行解析,还有相关的我自己的经验与总结。那接下来,我们来看题吧!

(1)【单选题】

设有:int a=1, b=2, c=3, d=4, m=2, n=2; 执行 (m=a>b) &&(n=c>d)后n的值为 【正确答案: C】。

A.0

B.1                

C.2

D.3

【考点】:1.考查运算符顺序掌握;

                  2.“&&”运算符特点;

ps:这个我另一篇将注意都写了的,大家可以看看(哈哈哈)C语言运算符总结

【解析】:首先我们要记住看到“&&”要敏感,它只要左侧判定为“0”(错误),就不会进行右侧的代码;在这里(m = a > b)先判断(a > b),是错误的,然后再进行赋值,即m = 0;so,根据“&&”特点,右侧不执行了,n还是为初始值,也就是n  = 2;

(2)【单选题】关于switch语句的下列描述中正确的是 【正确答案: A】.
A switch语句中default子句可以省略
B switch语句中case子句必须包含break语句
C switch语句中case子句不能过多
D switch语句中case子句后面的表达式必须是整型

ps:后面有道填空题也是考switch运用的,我将其放在一起;

(3)【填空题】下面程序的输出结果是         【 正确答案: 45】。

#include <stdio.h>
int main(int argc, char *argv[])
{
  int k=2;
  switch(k)
 {
     case 1: printf("%d", k+1);       break;
     case 2: printf("%d", k+2);
     case 3: printf("%d", k+3);      break;
     case 4: printf("%d", k+4);
     default: printf("Full!");
  }
}

【考点】:1.switch语句运用以及理解;

                   2.break理解;

【解析(2)题】:B.break在switch中意思是跳出switch语句块,但并不是必要的;

C.你有多少种情况就可以加多少种情况,没有限制哦!

D.这个最容易错选,因为case后面还可以接上ASC||码,列如:case ‘A’这样类似的;

【解析(3)题】:这里因为break是作为一个跳出switch的作用,所以只要没遇到break,他的后面语句就要连贯执行:

case 2: printf("%d", k+2);
case 3: printf("%d", k+3);      break;

这里他判断为case 2后执行后面的输出 k + 2的值,也就是输出了4;但因为没有加break,所以会向下继续执行;

(4)【单选题】以下程序的输出结果是 【正确答案: C】.

​
int main(int argc, char *argv[] ) 
{  
    float x=2.0, y;
     if(x<0.0) y=0.0;
     else if(x<5.0) y=1.0/x;
     else if(x<10.0) y=1.0/(x+2.0);
     else y=1.0;
     printf(“%f\n”,y);

}

​

A 0.000000
B 0.250000
C 0.500000
D 1.000000

【考点】:1.if()else 语句的掌握与理解;

                  2.“/”的运算特点;

【解析】:总的来说他就是给的这段代码,我们要进行一定的梳理,这样才不容易出错;

if(x < 0.0) y = 0.0;
else
   {
     if (x < 5.0) y = 1.0 / x;
     else 
           {
            if (x < 10.0) y = 1.0 / (x + 2.0);
            else
              y = 1.0;
           }
  
   }

可以发现它 是一个嵌套,在判断到(x < 5.0)就结束了;就输出y =  1.0 /2.0 = 0.5;这里有关与“/”号 有个特点就是  就是他如果左右都是整型,它的运算结果就是0;也就是1 / 2 =0;要注意;

(5)【填空题】下面程序的输出结果是          【 正确答案: 4,4 或 4, 4】。
 

int main(int argc, char *argv[])
{  
    int k=2, i=2, m;
    m = (k += i);
    printf(“%d, %d\n”, m, k);
    return 0;
}

【考点】:1.简单运算符掌握;

【解析】:m = (k += i)就等价为 m  = ( k = k + i);很简单!送分题(感谢老师可怜我们)哈哈哈哈;

(6)【填空题】十六进制数0X3A对应的十进制数是     58      【 正确答案: 58】。

【考点】:1.进制的表示符掌握;

                  2.进制之间的转化;

【解析】:在这里,我们来看一看常用各个进制的表示符:

十进制
十六进制0X
八进制0

so,这里直接就是简单的计算;就不写了;

【延伸】:我以前见过一道比较考查这个的东西;

例:【单选题】下面程序段执行后的输出结果是()

int m = 0256 , n = 256;

printf(“%o %o”, m, n);

A.0256 0400;

B.0256 256;

C.256 400;

D.400 400;

//  显而易见m 为八进制,而n为十进制,所以n要转化为八进制再输出;也就是选 C;

接下来就是编程题了

第一题很简单:

1.

计算两个整数的商

【问题描述】输入任意两个整数A和B,通过程序计算A/B,并直接输出计算结果。
【输入形式】键盘输入两个整数,以回车分隔。
【输出形式】输出计算结果,如果能整除,直接输出结果;如果不能整除,则保留两位小数。
【样例输入】

3

2
【样例输出】1.50

#include <stdio.h>

int main ()
{   double a, b;
    scanf("%lf %lf",&a, &b);
	if ((int)(a) % (int)b ==0)
	{ 
	  printf ("%.0f\n",a / b);
	}
	else 
	{ 
	  printf("%.2f\n",a / b);
	}

	return 0;
}

【解析】:因为要输出浮点数,根据“/”的特点所以要进行double 定义;

2.

整数逆置

【问题描述】将一个非负整数逆置并输出。例如整数2543,逆置后的整数为3452。

【输入形式】输入一个非负整数

【输出形式】逆置后的整数

【样例输入】2543

【样例输出】3452

然后是最后一题:这题是最让我可惜的,在考试刚刚结束的那一刻我刚刚写好(好惨ing)都没提交,呜呜呜,25就没了;心疼;

因为我的思路太复杂了,导致调试半天,可以说这道题让我发现有句话说的真对:“思路决定出路!”看了答案的代码,更是有这种感受!接下来看看我自己做的(回忆版):

#include <stdio.h>
int main()
{
	int a, b[10], i = 0, j, k;
	scanf("%d", &a);
	for (j = 10; j <= a * 10; j *= 10) //循环 10 ,100 ,1000等等;
	{
		b[i] = a % j;                  //对应取出后面一位,两位等等;
		if (i >= 1)
		{
			b[i] = b[i] / (j / 10);    //十位过后取第一位;
		}
		i++;
	}
	for (k = 0; k < i; k++)
	{
		printf("%d", b[k]);           //输出;
	}
	return 0;
}

​

【画外音】别看它这么短,当时我调试了半天,呜呜呜。等会儿与标准答案一对比就会发现我的思路复杂很多,同样也不得不感叹算法的奇妙!

【解析】:之所以定义b[10],是因为可以满足10位数的逆置换;(我认为够了大部分情况);

这里我以2543为例子;

         首先对于第一个循环:for (j = 10; j <= a * 10; j *= 10)就是为了结合后面的if()将他所有位取出来;

就是:当 j  = 10;时  b[0] = 2543 %10 = 3;好最低位出来了;然后 i = 1, j = 100;

          当 j = 100;时 b[1] = 2543 %100 =43;好后面两位出来了;然后if(i >= 1)所以b[1 ] = 43 /(100 / 10) = 4;第二低位就出来了;然后i ++,i = 2; j =1000;

          当 j = 1000 ;时 b[2] = 2543 %1000 =543;好后面三位出来了;然后if(i >= 1)所以b[2 ] = 543 /(1000 / 10) = 5;第三低位就出来了;然后i ++,i = 3; j =10000;

         当 j = 10000 ;时 b[2] = 2543 %10000 =2543;然后if(i >= 1)所以b[3] = 2543 /(10000 / 10) = 2;最高位就出来了;然后i ++,i = 4; j =100000 > 25430;结束循环;

           最后面这个循环输出,就不多说,应该都会;

好了,来到标准答案:

【画外音】:emmm,这个老师给的答案,简直是让我有了醍醐灌顶之感,简直妙到家了,爱了!!!

#include <stdio.h>

int main(int argc, char *argv[])
{
	int n, a, m = 0;

	scanf("%d", &n);

	while(n > 0){
		m = m*10 + n%10;
		n /= 10;
	} 

	printf("%d\n", m);

	return 0;
}

【解析】:来看看while里面的

m = m * 10 + n % 10;
n /= 10;

还是以2543为例:

       先是:m  =  0 * 10 + 2543 %10 = 3;将最低位取了出来;

      然后将2543的最低位砍掉,不要了!!!妙啊!我已经取出来的就不用了,直接砍掉。

然后n = 254;while判断,再执行;

     m = 3 * 10 + 254 % 10 = 34;

这里也是将已经取到的直接进高位;把低位让出来,给新取出来的位置;

直到所有位取完,n就变为0;

输出;

结束;

【总结】:“思路决定出路”!

##到这里就结束了,谢谢大家观看,有什么错欢迎指正!!!

##这里,我写了个关于编程题的解题步骤分享:欢迎大家阅读,或许有帮助哦!解题思路分享

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值