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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 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,一次下去,直到所有递归都结束。.

d3d24611e5594110832c3854b48eafb5.png



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;
}

运行结果:

4c42c199df0643a6895351347da3dcc6.png



【解析二】


先用辗转相除法求出最大公约数,然后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);
}

运行结果:

f5394a939d15498b94240160513909a0.png



【解析三】


创建个 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;
}

运行结果:

4adcfa83e37b4b2fbf92f759fd79afc8.png


题目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;
    }
}

代码结果:

d4ca21b7afcc41a89f236456306042d9.png


这片代码是输入字符串  需要注意的是最后要将最后一个字符补为'\0'  因为getchar()可以接收回车符


今天讲的C语言初阶完结练习题就到这里了,小伙伴们好好做哈~~


b7e8addca60b45cdbce87cf06508f833.png

相关文章
|
12月前
|
C语言
【C语言】练习题整理:11
【C语言】练习题整理:11
124 1
|
C语言 CDN
C语言基础练习题(2)
C语言基础练习题(2)
122 1
|
12月前
|
存储 人工智能 编译器
【C语言】练习题整理:12
【C语言】练习题整理:12
108 0
|
C语言
C语言基础练习题(1)
C语言基础练习题(1)
60 0
|
30天前
|
机器学习/深度学习 存储 C语言
【C语言篇】C语言常考及易错题整理DAY1
swap函数调用时用的是全局变量,主函数中定义的变量只在主函数中有效,因为主函数也是一个函数,它与其他函数是平 行关系;输出语句这里,考虑局部优先的原则。
|
29天前
|
C语言
【C语言篇】C语言常考及易错题整理DAY3
基本数据类型的等级从低到高如下:char int long float double运算的时候是从低转到高的,表达式的类型会自动提升或者转换为参与表达式求值的最上级类型。
|
29天前
|
存储 人工智能 大数据
【C语言篇】C语言常考及易错题整理DAY2
p是一个指针数组,p[i] = &a[i*3]相当于是把数组a每3个一组分开并把每组的首地址存在p数组,此时p类似一个4行3列的二 维数组,p[3][2]就是4行第3个元素12。
|
1月前
|
存储 C语言
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
【C语言】鹏哥C语言刷题训练营——第5节内容笔记(含代码全面分析和改进,讲解)
|
12月前
|
存储 C语言
【C语言】练习题专栏(9)
【C语言】练习题专栏(9)
64 0
|
4月前
|
C语言
错误的集合(初阶C语言刷题)
错误的集合(初阶C语言刷题)