C语言复习资料和习题.docx
《C语言复习资料和习题.docx》由会员分享,可在线阅读,更多相关《C语言复习资料和习题.docx(22页珍藏版)》请在冰点文库上搜索。
![C语言复习资料和习题.docx](https://file1.bingdoc.com/fileroot1/2023-5/23/f3ba05c6-f117-432e-a093-71bd59ca09cc/f3ba05c6-f117-432e-a093-71bd59ca09cc1.gif)
C语言复习资料和习题
算法题
1.单词转换程序
#include
intmain()
{
chara;//初始化,如果需要转换很多个单词字母就可以定义一个数组a[n],n的大小就是你的单词字母数。
但是数组要用for循环进行输入
a=getchar();//单个字母输入
a+=4;//将字母转换为指定的Assica码值自己就要记住三个关键的阿斯克码规律
putchar(a);//输出转换后的字母,这里只进行转换了一个字母
return0;
}
2.九九乘法表
#include
intmain()
{
inti,j,k;
for(i=1;i<=9;i++)//双重循环
{
for(j=1;j<=i;j++)//最重要的一点~这里的j<=i
{
k=i*j;
printf("%d*%d=%d\t",i,j,k);
}
printf("\n");
}
}
3.水仙花数
#include
intmain()
{
intsum,i,m,p,n;
for(i=100;i<=999;i++)
{
m=i%10;//个位
n=i/10%10;//十位
p=i/100;//百位
sum=m*m*m+n*n*n+p*p*p;
if(sum==i)
printf("%d\t",i);
}
}
简便方法:
#include
intmain()
{
inta,b,c,m;
for(a=1;a<10;a++)
{
for(b=0;b<10;b++)
{
for(c=0;c<10;c++)
{
m=a*100+b*10+c;
if(m==a*a*a+b*b*b+c*c*c)
printf("%d\n",m);
}
}
}
return0;}
4.杨辉三角
#include
intmain()
{
inti=5,j,k;//定义一个5行的输出杨辉三角,可以自行定义
inta[20][20];
for(k=0;k<=5;k++)
{
for(j=0;j<=k;j++)//理解这里的循环条件
{
if(j==0||j==k)//这里是控制第一行和对角线(就是斜线一行)为1
{
printf("%-5d",a[k][j]=1);
}
if(k>=2&&j>0&&j{
a[k][j]=a[k-1][j-1]+a[k-1][j];//上面两个数相加
printf("%-5d",a[k][j]);
}
}
printf("\n");
}
}
5.菱形输出
#include
intmain()
{
intk,m,n;
inti=9;//定义一个长度为9行的菱形,自己决定,一般为奇数
for(k=1;k<=i/2+1;k++)//这是上半部分的菱形,记住循环条件为总数的一半加一
{
for(m=1;m<=i/2+1-k;m++)//记住循环条件,空格的条件
{
printf("");//输出空格
}
for(n=1;n<=2*k-1;n++)//记住循环条件,星号的条件
{
printf("*");//输出星号
}
printf("\n");
}
for(k=1;k<=i/2;k++)//这是下半部分的菱形,记住循环条件为总数的一半
{
for(m=1;m<=k;m++)//记住循环条件,空格的条件
{
printf("");
}
for(n=1;n<=i-2*k;n++)
{
if(n%2==0||n%3==0)//记住循环条件,星号的条件
{
printf("");
continue;
}
printf("*");
}
printf("\n");
}
}
6.检测素数法(求一段数据之间的素数值多少的,由此算法也可得知)
#include
intmain()
{
inti,n;
printf("输入一个大于3的数\n");//素数必须要大于3
scanf("%d",&n);
for(i=2;i{
if(n%i==0)break;
}
if(iprintf("%d不是素数\n",n);
elseif(i=n)
printf("%d是素数\n",n);
}
7.冒泡排序
#include
intmain()
{
intn,i,t=0,m;
inta[10];//数组的大小取决于你要排序的数有多少,自己可以随便设置
printf("请输入10个数字;\n");
for(n=0;n<10;n++)
{
scanf("%d",&a[n]);
}
for(i=0;i<9;i++)//要记住一定是要双重循环,要一一进行比较
{
for(n=0;n<9-i;n++)
{
if(a[n]>a[n+1])
{
t=a[n];//引入第三个变量,进行赋值
a[n]=a[n+1];//把大的数往后移
a[n+1]=t;
}
}
}
for(n=0;n<10;n++)
{
printf("%-5d",a[n]);
}
printf("\n");
}
选择题(带*号的是基础题)
*1、若有说明:
long*p,a;则不能通过scanf语句正确给输入项读入数据的程序段是______。
A:
scanf("%ld",p=&a);
B:
p=(long*)malloc(8);scanf("%ld",p);
C:
*p=&a;scanf("%ld",p);
D:
scanf("%ld",&a);
2、以下程序的输出结果是______。
main()
{inti,a[10];
for(i=9;i>=0;i--)a[i]=10-i;
printf("%d%d%d",a[2],a[5],a[8]);
}
A:
369
B:
741
C:
852
D:
258
3、以下程序的输出结果是______。
main()
{inta,b;
for(a=1,b=1;a<=100;a++)
{if(b>=10)break;
if(b%3==1)
{b+=3;continue;}
}
printf("%d\n",a);
}
A:
4
B:
6
C:
5
D:
101
*4、若变量均已正确定义并赋值,以下合法的C语言赋值语句是______。
A:
x=5=4+1;
B:
x+n=i;
C:
x=y==5;
D:
x=n%2.5;
*5、若有以下说明和定义:
typedefint*INTEGER;
INTEGERp,*q;
以下叙述正确的是______。
A:
q是基类型为int的指针变量
B:
p是int型变量
C:
程序中可用INTEGER代替int类型名
D:
p是基类型为int的指针变量
*6、以下定义语句中正确的是______。
A:
floata=1,*b=&a,*c=&b;
B:
charA=65+1,b='b';
C:
inta=b=0;
D:
doublea=0.0;b=1.1;
7、有以下程序
#include
structst
{intx,y;}data[2]={1,10,2,20};
main()
{structst*p=data;
printf("%d,",p->y);printf("%d\n",(++p)->x);
}
程序的运行结果是______。
A:
20,2
B:
20,1
C:
10,2
D:
10,1
*8、C语言中下列叙述正确的是______。
A:
do-while语句构成的循环,当while语句中的表达式值为零时结束循环
B:
do-while语句构成的循环,必须用break语句才能退出
C:
do-while语句构成的循环,当while语句中的表达式值为非零时结束循环
D:
不能使用do-while语句构成的循环
9、以下函数的功能是:
通过键盘输入数据,为数组中的所有元素赋值。
#defineN10
voidarrin(intx[N])
{inti=0;
while(iscanf("%d",______);}
在下划线处应填入的是______。
A:
x+(i++)
B:
&x[i+1]
C:
x+i
D:
&x[++i]
10、有如下程序
main()
{floatx=2.0,y;
if(x<0.0)y=0.0;
elseif(x<10.0)y=1.0/x;
elsey=1.0;
printf("%f\n",y);
}
该程序输出结果是______。
A:
0.500000
B:
0.250000
C:
0.000000
D:
1.000000
11、若有以下说明和语句
intc[4][5],(*p)[5];
p=c;
能够正确引用c数组元素的是______。
A:
p+1
B:
*(p+1)+3
C:
*(p+3)
D:
*(p[0]+2)
12、以下正确的字符串常量是______。
A:
"\\\"
B:
""
C:
OlympicGames
D:
'abc'
13、有以下程序段
intm=0,n=0;charc='a';
scanf("%d%c%d",&m,&c,&n);
printf("%d,%c,%d\n",m,c,n);
若从键盘上输入:
10A10↙,则输出结果是______。
A:
10,a,0
B:
10,a,10
C:
10,A,10
D:
10,A,0
14、设inta=12,则执行完语句a+=a-=a*a后,a的值是______。
A:
144
B:
-264
C:
264
D:
552
15、以下程序段中与语句k=a>b?
(b>c?
1:
0):
0;功能等价的是______。
A:
if((a>b)||(b>c))k=1;
elsek=0;
B:
if((a>b)&&(b>c))k=1;
elsek=0;
C:
if(a<=b)k=0;
elseif(b<=c)k=1;
D:
if(a>b)k=1;
elseif(b>c)k=1;
elsek=0;
16、以下选项中,与k=n++完全等价的表达式是_______。
A:
k=++n
B:
n=n+1,k=n
C:
k=n,n=n+1
D:
k+=n+1
*17、下列叙述错误的是______。
A:
C程序可以由一个或多个函数组成
B:
一个C语言程序只能实现一种算法
C:
一个C函数可以单独作为一个C程序文件存在
D:
C程序可以由多个程序文件组成
*18、以下程序的输出结果是______。
main()
{charst[20]="hello\0\t\\";
printf("%d%d\n",strlen(st),sizeof(st));
}
A:
2020
B:
520
C:
1320
D:
99
19、以下选项中不合法的标识符是______。
A:
_00
B:
FOR
C:
&a
D:
print
20、有以下程序
#defineP3
voidF(intx){return(P*x*x);}
main()
{printf("%d\n",F(3+5));}
程序运行后的输出结果是______。
A:
编译出错
B:
29
C:
25
D:
192
21、有以下程序:
main()
{intk=4,n=0;
for(;n{n++;
if(n%3!
=0)continue;
k--;}
printf("%d,%d\n",k,n);
}
程序运行后的输出结果是______。
A:
2,2
B:
1,1
C:
3,3
*22、按照C语言规定的用户标识符命名规则,不能出现在标识符中的是______。
A:
下划线
B:
连接符
C:
数字字符
D:
大写字母
*23、以下叙述中正确的是______。
A:
C语言中的每条可执行语句最终都将被转换成二进制的机器指令
B:
C语言中的函数不可以单独进行编译
C:
C语言的源程序不必通过编译就可以直接运行
D:
C语言程序经编译形成的二进制代码可以直接运行
*24、以下叙述中正确的是______。
A:
在C语言中,预处理命令行都以"#"开头
B:
C语言的预处理不能实现宏定义和条件编译的功能
C:
预处理命令行必须位于C源程序的起始位置
D:
每个C程序必须在开头包含预处理命令行:
#include
第1题答案:
C
评析:
本题的考查点是格式输入函数Scanf()的使用。
scanf函数输入形式为:
scanf(格式控制,地址表列);
选项B中,p=(long*)malloc(8)是分配8个字节的long型存储单元,所以能通过scanf语句正确给输入项读入数据;
选项A中,p=&a,求出变量a的内存地址并赋给p;
选项D中,能正确给输入项读入数据;
第2题答案:
C
评析:
本题是通过循环语句给数组元素赋值。
C语言中for循环语句的一般形式为:
for(表达式1;表达式2;表达式3)
{
语句部分;
}
第3题答案:
A
评析:
本题主要考查考生对C语言中的循环语句和程序的执行逻辑。
本题中for循环语句共执行3次,所以a的值累加3次,结果为4。
第4题答案:
C
评析:
本题的考查点是C语言赋值语句。
赋值语句是由赋值表达式再加上分号构成的表达式语句。
其一般形式为:
变量=表达式;由于在赋值符"="右边的表达式也可以又是一个赋值表达式,因此,形式"变量=(变量=表达式);"是成立的,从而形成嵌套的情形,故选项C是正确的;选项A看上去是嵌套形式,而实际上,并非是一个正确的赋值表达式,因为赋值表达式"="的左边只能是变量,不能为常量或表达式,所以"4+1"的值不能赋值给常量"5",所以选项A错误,选项B也是错误的;由于求余运算符"%"的两侧必须为整型数据,所以选项D错误。
第5题答案:
D
评析:
本题的考查点是别名。
p是基类型为int的指针变量;
*q是基类型为int的指针变量;
程序中可用*INTEGER代替int类型名。
第6题答案:
B
评析:
本题的考查点是数据类型、运算符与表达式。
C语言允许在定义变量的同时使变量初始化,当定义多个变量为同一类型时,各变量之间用逗号隔开,所以选项D错误;当定义多个变量赋同一个值时,不能用等式连写的方式,如选项C的"inta=b=0;"应写成"inta=0,b=0;"所以选项C错误;选项A中定义了一个浮点型变量a和两个指向浮点型数据的指针变量b和c,而&a表示的是取变量a的地址,所以将变量a的地址赋给指向浮点型数据的指针变量b是错误的。
选项B中将整数赋给字符变量,相当于将字符'B'赋给字符变量A,因为字符'B'的ASCII码是66。
所以选项B正确。
第7题答案:
C
评析:
本题的考查点是结构体数组。
本题定义了一个包含两个元素(data[0]、data[1])的结构体数组data,其中data[0].x=1;data[0].y=10;data[1].x=2;data[1].y=20。
在主函数中,定义了一个指向结构体数组的结构体指针变量p,使得p指向结构体数组的首地址,所以p->y访问的是第一个结构体数组元素的第二个值,即data[0].y;(++p)->x访问的是第二个结构体数组元素的第一个值,即data[1].x,所以程序输出结果为10,2。
第8题答案:
A
评析:
本题的考查点是do-while语句。
选项D是错误的,C语言支持do-while语句;选项C是错误的,do-while构成的循环,当while语句中的表达式值为零时结束循环,而不是非零;选项B也是错误的。
第9题答案:
A
评析:
本题的考查点是不同类型数据的输入输出。
使用scanf()函数可以输入任何类型的多个数据,一般形式为:
scanf(格式控制,地址表列)。
C语言规定,数组名代表数组的首地址,也就是第一个元素的地址,由于该题要求对数组中所有元素赋值,所以应该包含一个循环变量自加的过程,选项B、C明显不正确;对于选项D,++i是先自加后使用i,因此x[0]没有赋值,选项D也不符合题目要求。
第10题答案:
A
评析:
本题考查的是IF…ELSE语句的使用。
x=2.0,符合第二个IF语句的条件x<10.0,所以执行y=1.0/x语句,即y=1.0/2.0=0.500000。
第11题答案:
D
评析:
本题考查的是数组元素的引用。
如果定义一个指针指向二维数组的一行,则可以移动到下一行,这就是行指针。
行指针的定义格式为:
[存储类型]数据类型(*指针)[n]这里的n是一个整数,表示所指向的二维数组的列数。
(*p)[5]中p是指向一个包含5个元素的一维数组,p的值就是该一维数组的首地址。
所以当用行指针访问二维数组时,行指针每增加1,就移动一行,即指向二维数组的下一行,例如此题中的p+i将指向数组的第i行。
即选项A所指的意思是指向数组c的第1行,并不是引用c数组的元素;C答案中p+3是指向数组元素的第3行,*(p+3)是指第三行第零个元素的地址;选项B由对选项A,选项C的解释可知,它指的是第一行第3列元素的地址;选项D中p[0]+2是指第0行第2列元素的地址,再加个*就表示第0行第2列的元素,即c[0][2]。
第12题答案:
B
评析:
本题的考查点是字符串常量。
字符串常量是由一对双引号括起的字符序列。
例如:
"CHINA","Cprogram","$12.5"等都是合法的字符串常量。
选项A中双引号内使用了两个转义符,即后一个双引号也作为字符串的内容了,故此字符串中还缺少用于表示字符串结束的引号,所以选项A的表示法错误;选项C、D均没有用双引号括起来,所以并不是字符串;选项B表示空字符串,是正确的表示法。
第13题答案:
C
评析:
本题主要考查格式输入输出函数scanf()和printf()。
格式控制字符%d用来输入/输出十进制整数,%c用来输入/输出单个字符,在给出的程序中,整型变量m和n初始化为0,字符变量c初值为字符A,系统按照m、c、n所在的内存地址将输入的m、c、n的值存进去,即把10赋给m,字符A重新赋给字符变量c,10赋给n,所以打印结果是10,A,10。
第14题答案:
B
评析:
本题的考查点是赋值表达式的求解。
第一步:
a*a=144;(此时a=12)
第二步:
a-=144相当于a=a-144,a=a-144=-132;(此时a=-132)
第三步:
a+=a相当于a=a+a,a=a+a=-264;
所以该表达式最后的值应当为-264。
第15题答案:
B
评析:
条件表达式的一般形式为:
表达式1?
表达式2:
表达式3
1、条件运算符的执行顺序为:
先求解表达式1,若非0则求解表达式2,此时表达式2的值就是整个条件表达式的值,若表达式1的值为0,则求解表达式3,此时表达式3的值就是整个条件表达式的值。
2、条件运算符优先于赋值运算符。
3、条件运算符的结合方向为"自右至左"。
综上所述,本题是先比较a,b,如果a>b成立则执行(b>c?
1:
0),如果b>c成立则结果为1,其它情况则为0。
也就是说只有a>b与
b>c同时成立时k值才能为1。
第16题答案:
C
评析:
本题的考查点是自增及赋值运算。
n++是自增运算,是先使用,然后再使n加1,分开来写即为:
k=n,n=n+1。
第17题答案:
B
评析:
本题考查的是C程序的构成。
一个C语言程序可以实现多种算法。
一个C程序可以由一个或多个源程序文件组成,一个源程序文件由一个或多个函数组成,构成C语言程序的基本单位是函数,函数也是C程序中模块化程序设计的基础,C函数可分为标准库函数和用户定义函数两类。
第18题答案:
B
评析:
本题主要考查C语言的字符串与库函数。
C语言中字符串是以'\0'字符结束的,且strlen()函数计算的是'\0'字符前的所有字符的个数。
本题中strlen(st)应为5。
数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。
sizeof()函数是计算变量或数组的所分配到的内存空间的大小。
所以本题的sizeof(st)为20。
第19题答案:
C
评析:
本题的考查点是标识符的基本概念。
C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线,所以选项C不符合规定。
第20题答案:
A
评析:
本题考查的是宏定义。
return语句用于从被调函数带回一个函数值。
void关键字表示"无类型",即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。
第21题答案:
C
评析:
本题的考查点是循环和continue语句。
continue语句是结束本次循环。
n从0开始循环,判断n%3!
=0是否成立,为真,跳出循环,继续下一轮for循环条件的判断,为假,执行k--,并继续下一轮for循环条件的判断,当条件不满足时,则结束循环,输出k、n的值。
第22题答案:
B
评析:
本题考查的是标识符。
C语言规定标识符只能由字母、数字和下划线3种字符组成,且第一个字符必须为字母或下划线。
第23题答案:
A
评析:
用TurboC运行C程序的步骤先将TurboC装入磁盘。
1、调用TurboC程序;
2、编辑源文件。
根据需要修改输入或修改源程序;
3、编译源程序,编译时先生成一个汇编语言程序,然后由编译程序再将汇编语言程序翻译成机器指令程序,即目标程序。
4、执行程序。
第24题答案:
A
评析:
本题考查的是预处理命令。
选项B正确,原因是这部分语句与C程序其他部分的语句是有区别的,所以在每个预处理语句之前都有一个"#"符号以示区别。
C提供三种预处理语句:
(1)宏替换,
(2)文件包含,(3)条件编译。
如果一个文件中要引用另外一个文件时才需要在开头包含预处理命令行:
#include。