马上c语言考试了,写一篇博客根据考试范围对应了一下之前微信里老师发过的习题(考试会有很多原题),把题目整理一下,也帮助一下身边的小伙伴。欢迎评论交流。

一、考试范围

二、各章微信习题整理

第一章习题与知识点
1.一个c语言的执行总是从main函数开始,也从main函数结束。✔

2.c语言本身没有输入输出语句。✔
(c语言的输出输出是调用库函数中提供的函数,例如printf和scanf两个函数.)

3.在c程序中,注释说明只能位于一条语句的后面。✖
(c语言中注释可以随处)

第二章习题与知识点
1.合法标识符*:
①由字母、数字和下划线组成的字符序列,其中第一个字符不能是数字。
②自定义标识符不能用关键字(如:int,char,if…)和预定义标识符(如:scanf,printf,define…),且区分大小写。

2.c语言中,不能表示整数常量的数制是二进制
(在C语言中,只支持8进制,10进制,16进制。除了这三种外,其它进制均是不支持的)

3.表达式1/2的值是0;表达式1.0/2的值是0.5
前者是整数除法,后者是浮点数除法)

4.c语言的基本数据类型有字符型,整型,实型(浮点型)。并没有数组类型。

5.正确定义和赋值练习:

(1)写出代码为n1赋值10,为n2也赋值10
int n1=10,n2=10;(看清逗号和分号的位置,不能连等)

(2)给定代码段: int a,b=0;则a的初始值是0?✖
只是将b的初始值设置为0,a的值不能确定。

(3)有语句scanf(“a=%d,b=%d”,&a,&b),从键盘输入数据的正确形式应该是什么?
答:a=1,b=2 scanf语句引号内除了要输入的变量,其他要原样输出。

6.现有以下语句

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d %d",a,b);
    return 0;
 }

用户从键盘输入3 5后,程序的结果是_____。
答:程序将崩溃。
(因为scanf语句中忘记了写入取地址符&,会导致程序崩溃)

第三章习题与知识点
1.写出程序运行结果

#include<stdio.h>
int main()
{
	int a,b,s;
	scanf("%2d%2d",&a,&b);
	s=a/b;
	printf("s=%d",s); 
    return 0;
 }

运行:

运行结果为s=1。这是因为%2d限制了a和b只读取了两位数,即输入54321后a的值为54,而b的值为32,s=54/32,由于是整数除法,结果为1。

2写出程序的运行结果

#include<stdio.h>
int main()
{
	int a=1234;
	printf("%2d\n",a);
    return 0;
 }

运行:

运行结果为输出1234。为什么1234没有被截断为12呢?
这是因为如果数据的实际位宽<域宽修饰符的位宽输出就会被添上空格填满域宽区域,这些数值是右对齐的。
如果数据的实际位宽>=域宽修饰符的位宽输出就忽略宽度修饰符,如实地输出a。

3.写出程序的运行结果

#include<stdio.h>
int main()
{
	char c1='a',c2='b',c3='c';
	printf("a%cb%cc%cabc\n",c1,c2,c3);
    return 0;
 }

运行:

运行结果为:aabbccabc。
三个%c依次被写入c1→%c,c2→%c,c3→%c。printf语句内除了三个%c外的其他字符原样输出为a_b_c_abc。三个_上依次为c1,c2,c3。

4.写出程序的运行结果

#include<stdio.h>
int main()
{
	int a=2,c=5;
	printf("a=%%d,b=%%d\n",a,c);
    return 0;
 }

运行:

运行结果为:a=%d,b=%d
在此说明一下c语言中%%d的含义:%%d 在c语言中会被拆成两部分看待,“%%”就是输出一个“%”,而是“d”就是一个普通字符,所以当“%%d”在一起时,其含义就是输出“%d”这两个字符。

第四章习题与知识点
1.以下语句是否可以通过编译:if(i<=n<=10);
答:不能。
编程语句不能连写。if(1<=n<=10)执行过程是这样的:先判断 1<=n ,判断结果为0或1,然后再判断(1<=n)的整体值(0或1)是否小于等于10,结果为1。这并不能表示n介于1到10之间的判断。如果要执行n介于1到10之间的判断,应表示为:if( n>=1 && n<=10 ) ;。

2.判断:if语句中,if后面的表达式可以是关系表达式与逻辑表达式,而不能是算术表达式。✖
if语句中,if语句后的表达式不限于逻辑或关系表达式,可以是任意的数值类型。即可以使任意的算术表达式。

3.写出程序的运行结果

#include<stdio.h>
int main()
{
	int i,j,k;
	i=5,j=10;k=1;
	printf("%d",k>i<j);
    return 0;
 }

运行:

运行结果为:1。
printf("%d",k>i<j);的执行过程是这样的:相当于printf(“%d”,1>5<10),对于1>5<10中,先计算1>5,结果为false(0),再计算0<10,结果为ture(1)。所以式子1>5<10的值为1。

4.写出程序的运行结果

#include<stdio.h>
int main()
{
	int i,j,k;
	i=2;j=3;
	k=i*j==6;
	printf("%d\n",k);
    return 0;
 }

运行:

运行结果为:1。
k=i*j==6;的执行过程是这样的:赋值运算符的优先级低于比较运算符,所以首先计算i*j==6,结果为ture(1),再进行赋值运算k=1。因此最终输出k的值为1。

5.写出程序的运行结果:

#include<stdio.h>
int main()
{
	int a=56;
	if(a>50) printf("A");
	if(a>40) printf("B");	
	if(a>30) printf("C");	
    return 0;
 }

运行:

运行结果为:ABC。
很显然,56>50,56>40,56>30都成立。所以三个结果都输出。

6.写出表达式判断ch是大写或者小写英文字母

	ch>='A' && ch<='Z' || ch>='a' && ch<='z'

7.下列符合语句能否实现两数交换

 {
 	a=b;
 	b=a;
 }

答:不能,这样的赋值运算会使得a和b的最终值都为b。

第五章习题与知识点

1.switch语句后的括号内表达式为___类型。
答:整型,字符型或枚举型。
2.判断:同一个switch语句中各个常量表达式的值必须互不相等,且只能是常量。✔
switch()语句的括号内的表达式要与case 里的值相呼应,因而各个常量表达式的值必须互不相等。
3.写出程序的运行结果

#include<stdio.h>
int main()
{
	int i=1;
	switch(i%3)
	{
		case 0:printf("zero");
		case 1:printf("one");
		case 2:printf("two");
	}
    return 0;
 }
 

运行:

运行结果为:onetwo。
首先计算i%3的值为1,接下来运行对应的case 1,输出one,由于没有break,所以会依次运行case 2,输出two。

第六章习题与知识点
1.以下四条循环中哪一条与其它三条不等价(假设循环体都是一样的)

A.for(i=0;i<10;i++){...}
B.for(i=0;i<10;++i){...}
C.for(i=0;i++<10;){...}
D.for(i=0;i<=9;i++){...}

答:B。其它三条语句的循环次数都为9,而B中++i表明计数是从0+1开始,到9结束,循环次数为8。

2.判断:while循环的条件满足时循环继续,而do-while的条件满足时循环就结束了。✖
后半句话不对,do-while语句构成的循环只有在while后的表达式为零时结束循环。

3.写出程序的运行结果:

#include<stdio.h>
int main()
{
	int i=10;
	while(i>0)
	{
		i/=2;
	}
	printf("%d",i);
    return 0;
 }

运行:

运行结果为:0。
while循环体的执行过程是这样的:10/2=5,5/2=2,2/2=1,1/2=0。最终结果为0,(所有计算都为整数除法)

4.写出程序运行结果:

#include<stdio.h>
int main()
{
	int i;
	for(i=10;i>1;i/=2)
	{
		printf("%d",i++);
	}
    return 0;
 }

运行:

运行结果为:10532。
for循环的执行过程是这样的:10>1,输出10。(10+1)/2值为5,5>1,输出5。(5+1)/2值为6,6>1,输出3。(3+1)/2值为2,2>1,输出2。所以依次连起来就是10532。

5.写出程序运行结果:

#include<stdio.h>
int main()
{
	int sum=0;
	int i=0;
	for(i=0;i<10;i++)
	{
		if(i%2) continue;
		sum+=i;
	}
	printf("%d\n",sum);
    return 0;
 }

运行:

运行结果为:20。
语句if(i%2) continue;的意思是当if后括号内的表达式值为ture(非0),则continue(跳过)该次for循环,强制进行下一次循环。也就是说当表达式的值非0时,全部跳过。
则for循环的10次执行是这样的:
0%2=0 ✔
1%2=1 continue
2%2=0 ✔
3%2=1 continue
4%2=0 ✔
5%2=1 continue
6%2=0 ✔
7%2=1 continue
8%2=0 ✔
9%2=1 continue
所有执行的语句后打✔,则相应的i值为0,2,4,6,8。总和sum的值为0+2+4+6+8,等于20。

三、编程题整理
1.分段函数

代码如下:

#include<stdio.h>//s所有结果都保留了两位小数 
int main()
{
	double x;//由于结果有小数,这里用double类型 
	scanf("%lf",&x);	
	if(x<0)//x<0 
		printf("f(x)=%.2lf",2*x-1);
	else if(x>=0 && x<3)//0<=x<3
		printf("f(x)=%.2lf",3*x+5);
	else if(x>=3 && x<10)//3<=x<10
		printf("f(x)=%.2lf",5*x-3);
	else if(x>=10)//x>=100
		printf("f(x)=%.2lf",7*x+2);	
	return 0;
 } 

2.循环编程计算i*(i+1)*(i+2)的值
代码如下:

#include<stdio.h>
int main()
{
	int i=1,sum=1,p;
	scanf("%d",&i);//输入i的值 
	p=i+2; 
	while(i<=p)//循环三次 
	{
		sum*=i;
		i++;			
	}
	printf("%d",sum);
    return 0;
 }

输入1,计算1乘2乘3的值,输出结果为:6

3.函数编程画三角形(此处假设为直角三角形且直角在左下角)
代码如下:

#include<stdio.h>
void f(int n);
int main()
{
	int n;
	scanf("%d",&n);
	f(n);
    return 0;
 }
 void f(int n) 
 {
 	int i,j;
    for(i=1; i<=n; i++)
	{
        for(j=1; j<=i; j++)
        {
   	     	printf("* ");     	
		}
        printf( "\n" );
    }      		
 }

输入3,输出边长为3的直角三角形:

4.数组编程统计操行分


代码如下

#include<stdio.h>
#define N 51//班级50人,定义N为50+1 
int main()
{
	int i=1,a[N]={0},fen; 
	do{
		printf("请输入学号和操行分:");
		scanf("%d %d",&i,&fen); 
		a[i]+=fen;//将学号为i的分数累加到对应的a[i]中 
	}while(i>0&&i<=50);// 循环继续条件为0<i<=50 
	printf("学号	操行总分\n");
	for(i=1;i<51;i++)
	{
		printf(" %d     %d\n",i,a[i]);
	 } 
	return 0;
}

输出结果:

5.最后一道编程题。
定义函数根据输入的字符输出对应的文字,如下所示
A.安全
D.约会
M.美丽
G.歌剧

代码如下:

#include<stdio.h>
void f(char c)
{	
	if(c=='A') printf("安全\n"); 
	if(c=='D') printf("约会\n"); 
	if(c=='M') printf("美丽\n"); 
	if(c=='G') printf("歌剧\n"); 	
}
int main()
{
	char c;
	while(scanf("%s",&c)!=EOF)
	f(c);
	return 0; 
}