一、选择题
1.下列程序执行后,输出结果为()
#include <stdio.h> int cnt=0; int fib(int n){ cnt++; if(n==0) return 1; else if(n==1) return 2; else return fib(n-1)+fib(n-2); } void main() { fib(8); printf("%d",cnt); }
A.41 B.67
C.109 D.177
【解析】:D
传进去一个数字8,只要n>=2,cnt就++一次,进入下面的return fib(n - 1) + fib(n - 2)会产生两种结果,分别是7和6,再继续递归时会7又会产生6和5,6产生5和4,一次下去,直到所有递归都结束。.
2.在上下文和头文件均正常的情况下,以下程序的输出结果是()
int x = 1; do{ printf("%2d", x++); } while (x--);
A.1 B.无任何输出
C.2 D.陷入死循环
【解析】D
初始化x=1,进入do...while语句,输出x++,x=2出来到while语句中执行x--(先用x=2判断是否为真,再自减),因为x=2为真,所以进行进入do语句,此时x=1,跟刚开始一样一直循环,陷入死循环。
3.下面的代码中,执行之后i和j的值是什么()
int i = 1; int j; j = i++;
A.1,1 B.1,2
C.2 ,1 D.2,2
【解析】C
初始化i=1,将i++(先赋值再自增)赋给j,所以j=1,i=2。
4.以下程序的k最终值是()
int i = 10; int j = 20; int k = 3; k *= i + j;
A.90 B.50
C.70 D.30
【解析】A
初始化i=10、j=20、k=3,而表达式k *= i + j等效于k = k * (i + j),所以k=3*(10+20)=90。
5.以下C程序的最终输出结果是()
#include<stdio.h> #include<stdlib.h> int a = 1; void test() { int a = 2; a += 1; } int main() { test(); printf("%d", a); return 0; }
A.1 B.2
C.3 D.4
【解析】A
这里test()函数内a为局部变量,局部的a只能在test函数内使用,又初始化全局变量a=1,所以结果输出1。
6.下列描述中正确的是()
A:表示m>n为ture或者m<n为ture的表达式为m>n&&m<n
B:switch语句结构中必须有default语句
C:如果至少有一个操作数为ture,则包含“||”运算符的表达式ture
D:if语句结果中必须有else语句
【解析】C
A选项是m>n || m<n
B选项可以无default语句
D选项也可以为if和else if语句或者只有if语句
7.C语言规定,在一个源程序中,main函数的位置 ()
A:必须在最开始
B:必须在系统调用的库函数的后面
C:可以任意
D:必须在最后
【解析】C
C程序中main函数的位置任意
8.以下叙述不正确的是()
A:一个源程序可由一个或多个函数组成
B:一个源程序必须包含一个main函数
C:c程序的基本组成单位是函数
D:在c程序中,注释说明只能位于一条语句的后面
【解析】D
选项D注释可以随处良好的注释说明,一般建议是写在语句的上面。
9.以下叙述正确的是()
A:在c程序中,main函数必须位于程序的最前面
B:c程序的每行中只能写一条语句
C:C语言本身没有输入输出语句
D:在对一个c程序进行编译的过程中,可发现注释中的拼写错误
【解析】C
选项A中C程序中main函数的位置任意
选项B你可以写一个语句,也可以写多个语句。
选项D中C程序进行编译的过程中,是不可以发现注释中粗祥的拼写错误的。注释中的拼写错误只可能通过人工检查发现。
10.在上下文及头文件均正常的情况下,执行如下代码,c的值是()
int a = 0; int c = 0; do { --c; a = a - 1; }while (a > 0);
A.0 B.1
C.-1 D.死循环
【解析】C
初始化a=0、c=0,进入do...while循环,先计算c--得到c=-1,赋值a=a - 1得到a=-1,执行while语句中的a>0为假跳出循环,此时c=1。
11.假定x和y为double类型,则执行x=2;y=x+3/2;后y的值为()
A.3.500000 B.3
C.2.000000 D.3.000000
【解析】D
3/2是两个整数相处,得到的结果是1,x+3/2=3,又y为double类型,所以结果为3.000000
12.以下for循环执行的次数是()
for (x = 0, y = 0; (y = 123) && (x < 4); x++);
A.是无限循环 B.循环次数不定
C.4 D.3
【解析】C
第一次循环:x=0、y=0进来,判断(y = 123) && (x < 4)为真,x自增1;
第二次循环:x=1、y=123进来,判断(y = 123) && (x < 4)为真,x自增1;
第三次循环:x=2、y=123进来,判断(y = 123) && (x < 4)为真,x自增1;
第四次循环:x=3、y=123进来,判断(y = 123) && (x < 4)为真,x自增1;
第五次循环:x=4、y=123进来,判断(y = 123) && (x < 4)为假跳出循环。
所以总共四次循环。
13.若有定义语句,int year=100,*p=&year;以下语句不能使变量year中的值增至1010的语句是()
A.p+=1; B.(*p)++;
C.++(*p); D.*p++
【解析】D
++的优先级比*高,所以D中p++先执行,p指向的地址改变了,所以year的大小没有变化。
14.选择表达式11|10的结果(本题数值均为十进制)()
A.11 B.10
C.8 D.2
【解析】A
11补码:1011
10补码:1010
1011(11)
15.
char a;int b;float c;double d;
则表达式a*b+d-c值的类型为()
A.float B.int
C.char D.double
【解析】D
a(char) * b(int) + d(double) - c(float)
根据整型提升,所以表达式变为:a(int) * b(int) + d(double) - c(float)
根据算术转换,所以表达式变为:a(double * b(double) + d(double) - c(double)
所以表达式结果为double类型
二、编程题
题目1:求最小公倍数,正整数a和正整数b的最小公倍数是指能被a和b整除的最小的正数值,设计一个算法,求a和b的最小公倍数
输入描述:输入两个整数a和b
输出描述:输出a和b 的最小公倍数
示例:
输入:5 7
输出:35
【解析一】
先找出a和b中的最大数赋值给max,然后用 if 判断最大数max是否能同时%a和b等于零那么它就是最小公倍数如果不行那最大数max++
代码示例:
#include<stdio.h> int main() { int a = 0, b = 0; scanf("%d %d", &a, &b); int m = a < b ? a : b; while (m) { if (m % a == 0 && m % b == 0) { printf("%d\n", m); break; } m++; } return 0; }
运行结果:
【解析二】
先用辗转相除法求出最大公约数,然后a*b/最大公约数=最小公倍
代码示例:
#include<stdio.h> int main() { int a = 0, b = 0; scanf("%d %d", &a, &b); int n = a * b; int m = 0; while (m = a % b) { a = b; b = m; } printf("%d\n", n / b); }
运行结果:
【解析三】
创建个 while 循环 if 判断 a * i % b == 0,看 a 乘于 i 得出的数看能不能被 b 整除如果可以那么它就是最小公倍数
代码示例:
#include<stdio.h> int main() { int a = 0, b = 0; scanf("%d %d", &a, &b); int i = 1; while ((a * i) % b != 0) { i++; } printf("%d\n", i * a); return 0; }
运行结果:
题目2:将一句话的单词进行倒置,标点不倒置。比如I like beijing.经过函数后变为beijing. like I
输入描述:
将一句话的单词倒置,标点不倒置。比如 I like Beijing.经过函数后变为 bejing .like i
输出描述:
每个测试输入包含1个测试用例,输入长度不超过100个单词
示例:
输入:I like beijing.
输出:beijing. like I
【解析】
第一步:字符串整体逆置,得到:.gnijieb ekil I
第二步:将字符串中每一个单词逆置,得到:beijing. like I
这里字符串操作的实现非常关键,故单独实现一个函数进行字符串的逆置,由于每个单词的长度不一,因此通过指针来实现字符串的逆置可以对代码进行简化
代码示例:
#include <stdio.h> #include <string.h> void ReverseString(char* left, char* right)//反转字符串 { while(left <= right) { char tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char str[100] = "0"; gets(str); int length = strlen(str); //将字符串整体翻转 ReverseString(str, str + length - 1); char* start = str; //将字符串中的每个单词翻转 while(*start) { char* end = start; while(*end != ' ' && *end)//寻找空格或‘\0’ { end++; } ReverseString(start, end - 1); if(*end == ' ') { start = end + 1; } else { start = end; } printf("%s",str); return 0; } }
代码结果:
这片代码是输入字符串 需要注意的是最后要将最后一个字符补为'\0' 因为getchar()可以接收回车符
今天讲的C语言初阶完结练习题就到这里了,小伙伴们好好做哈~~