【C语言】初阶完结练习题

  •  🎈个人主页:库库的里昂
  •  🎐CSDN新晋作者
  •  🎉欢迎 👍点赞✍评论⭐收藏
  •  ✨收录专栏:C语言初阶
  •  ✨其他专栏:代码小游戏
  •  🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!🤗

【前言】

C语言初阶知识点已经全部更完,相信大家对C语言初阶已经有了一个整体的概念,但我们只知道一些理论上的知识还是没有用的,所以今天我在网上找了一些题目给大家练习巩固之前学的知识,这样能更好的帮助我们加深对其的理解。

一、选择题

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语言初阶完结练习题就到这里了,小伙伴们好好做哈~~

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

库库的里昂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值