当前位置: 首页 > news >正文

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;elsereturn fib(n - 1) + fib(n - 2);
}
void main()
{fib(8);printf("%d", cnt);
}

【解答】:67

函数递归的问题:进入一次fib函数,cnt++,要算cnt的值也就是算进入了多少次fib函数,那就列树状图:直到列到1和0就不会再进入fib函数为止,然后列出来的每一个数都会进入函数使cnt++,算一共列有多少数,对于的也就是cnt的值:1+2+4+8+16+22+12+2=67


2.以下程序k的最终值是()

    int i = 10;int j = 20;int k = 3;k *= i + j;

【解答】:90

本题考察的是操作符优先级的问题

赋值操作符(*=,/=,+=,-=)的优先级很低,所以肯定是i+j先算,然后再*k,也就是k*=30,也就是90


3.判断正误:C语言本身没有输入输出语句

【解答】:正确

C语言是给定了语法,输入输出是库函数提供的

C语言约定了一些函数,规定了函数的名字,功能,参数,返回类型

这些规定的函数是由编译器的厂商实现的,msvc,gcc,clang的厂商在实现编译器的时候提供实现的,这些函数是放在标准库中,称为库函数


 4.若有定义语句int year=1009,*p=&year,以下不能使变量year中的值增至1010的语句是()

A.*p+=1                         B.(*p)++                                C.++(*p)                  D.*p++

【解答】:D

其实上面的代码就相当于int year=1009;int *p=&year

A.*(解引用操作符)的优先级高于+=(赋值操作符),p解引用指向year,然后year++

B.有括号先算*p,然后year++

C.也有括号,只要对(*p)也就是year++就可以

D.*p++,++优先级高于*,++先执行,p++后置++,值先为p,然后p++,这里就是地址++,而不是地址指向的元素++


5.char a;int b;float c;double d;

则表达式a*b+d-c值的类型为

【解答】:double类型

首先a*b(char*int),char类型整形提升变成int类型,int *int类型结果是int类型

然后int+double类型,这个时候int类型就算术转化为double类型,double+double类型结果是double类型

最后double-float类型,这个时候float类型就算术转化为double类型,double-double类型结果是double类型

【注意】:这个过程发生了整形提升和算术转化,是先变类型再进行运算

二、编程题

1.求最小公倍数

【题目】:

 【题解1】:常规做法

最小公倍数一定是大于等于输入的两个数的,所以可以从两个数的较大数开始加,看加到哪个数可以同时将两个数整除

#include <stdio.h>
int main() 
{int a=0;int b=0;//输入scanf("%d %d",&a,&b);//求较大值int m=a>b?a:b;//从较大者开始求最小公倍数while(1){if(m%a==0&&m%b==0)break;m++;}//输出printf("%d\n",m);return 0;
}

【题解2】:最小公倍数=输入的两个数的积 / 最大公约数(辗转相除法)

#include <stdio.h>
int main() 
{int a=0;int b=0;int c=0;//输入scanf("%d %d",&a,&b);int n=a*b;//求最大公约数while(c=a%b){a=b;b=c;}//输出printf("%d\n",n/b);return 0;
}

【题解3】:效率最高

假设m是a和b的最小公倍数,那么m既能被a整除,又能被b整除,m/a=i,m/b=j,那么我们就看a*i能否将b整除,eg:求3和5的最小公倍数,首先看3*1能否整除5,再看3*2是否能整除5,以此类推,直到找到3*i可以整除5,那么这时3*i就是最小公倍数

#include <stdio.h>
int main() 
{int a=0;int b=0;//输入scanf("%d %d",&a,&b);int i=1;while(a*i%b){i++;}//输出printf("%d\n",a*i);return 0;
}

【注意】:我们最好把int类型都写成long long类型,因为a和b最大可以到达100000,他们相乘是很大的,long long类型的输入输出都是%lld

2.字符串的倒置 

【题目】:

【题解】:

思路:逆序整个字符串,再逆序每个单词(或者先逆序每个单词,再逆序整个字符串)

#include <stdio.h>
#include<string.h>
void reverse(char* left, char* right) 
{while (left < right) {char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
int main() 
{char arr[101] = {0};gets(arr);int len=strlen(arr);//1.逆序整个字符串reverse(arr,arr+len-1);//2.逆序每个单词char*cur=arr;while(*cur!='\0'){char*start=cur;while(*cur!=' '&&*cur!='\0'){cur++;}char*end=cur-1;reverse(start,end);if(*cur==' ')cur++;}printf("%s\n",arr);return 0;
}

【注意事项】:

(1)输入字符串:不能正常用scanf函数输入,因为它一遇到空格就停止读取了,gets(arr)

要用也得这样写scanf("%[^\n]s",arr);意思就是scanf函数直到读到\n才停止

也可以用getchar:

int ch=0;

int i=0;

while(   (ch=getchar(  ) )!='\n')

{
    arr[i++]=ch;
}

(2)逆序整个字符串:思路是将左右字符一个一个交换,直到 left>right停止交换

还有就是reverse自定义函数传参的时候最后字符的地址怎么传:首字符地址+字符串的长度-1

 (3)逆序输出:首先定义一个cur指针指向字符串的最前面,然后开始遍历,以一个单词为一个循环,当指针指向的不是空格或者\0时cur继续向下遍历,直到遇到了,就倒置这个单词,我们就用start和end指针分别来指向一个单词的首尾,然后单词也可以当字符串倒置

当一个单词结束,就需要进入下一个单词,这个时候就要将cur++,但是如果这是最后一个单词,就不需要cur++,因为再++就会造成数组越界

这次内容就到此啦,有什么问题欢迎评论区或者私信交流,觉得笔者写的还可以,或者自己有些许收获的,麻烦铁汁们动动小手,给俺来个一键三连,万分感谢 !

 

http://www.lryc.cn/news/109385.html

相关文章:

  • java工厂设计模式
  • idea运行web老项目
  • JS进阶-Day3
  • springboot后端用WebSocket每秒向前端传递数据,python接收数据
  • 记录uniapp 滚动后溢出显示空白的办法
  • 设计原则学习之里氏替换原则
  • 排序进行曲-v4.0
  • Flink 系列四 Flink 运行时架构
  • 14-3_Qt 5.9 C++开发指南_QUdpSocket实现 UDP 通信_UDP 单播和广播
  • 【知识图谱】图数据库Neo4jDesktop的安装图文详解(小白适用)
  • kafka中幂等性producer和事务性producer
  • 静态路由 (华为设备)
  • Django学习笔记-默认的用户认证系统(auth)
  • [SQL挖掘机] - 存储过程
  • MySQL8.0.32详细安装教程(奶妈级手把手教你安装)
  • glut太阳系源码修改和对cpu占用观察
  • 掌握NLTK:Python自然语言处理库中级教程
  • Go语言的崛起:探究越来越多公司选择Go语言的原因和优势
  • MongoDB 6.0.8 安装配置
  • 无涯教程-Lua - nested语句函数
  • 如何使用vue ui创建一个项目?
  • STM32——LED内容补充(寄存器点灯及反转的原理)
  • 使用Spring Boot和EasyExcel的导入导出
  • 【H5移动端】常用的移动端方案合集-键盘呼起、全面屏适配、图片大小显示、300ms点击延迟、首屏优化(不定期补充~)
  • 迭代器模式——遍历聚合对象中的元素
  • 亿赛通电子文档安全管理系统远程命令执行
  • 多雷达探测论文阅读笔记:雷达学报 2023, 多雷达协同探测技术研究进展:认知跟踪与资源调度算法
  • 【Redis】——AOF持久化
  • Keil MDK环境下FreeModebus移植踩坑记录
  • 计算机视觉的延伸整理