网站建设一般都有什么项目,网络软文是什么意思,网站建设自主开发的三种方式,网站外链建设原则【前言】#xff1a;本部分是C语言初阶学完阶段性测试题#xff0c;最后一道编程题有一定的难度#xff0c;需要多去揣摩#xff0c;代码敲多了#xff0c;自然就感觉不难了#xff0c;加油#xff0c;铁汁们#xff01;#xff01;#xff01;
一、选择题
1.下面程…【前言】本部分是C语言初阶学完阶段性测试题最后一道编程题有一定的难度需要多去揣摩代码敲多了自然就感觉不难了加油铁汁们
一、选择题
1.下面程序执行后输出的结果为
#includestdio.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的值1248162212267 2.以下程序k的最终值是 int i 10;int j 20;int k 3;k * i j;
【解答】90
本题考察的是操作符优先级的问题
赋值操作符*/-的优先级很低所以肯定是ij先算然后再*k也就是k*30也就是90 3.判断正误:C语言本身没有输入输出语句
【解答】正确 C语言是给定了语法输入输出是库函数提供的 C语言约定了一些函数规定了函数的名字功能参数返回类型 这些规定的函数是由编译器的厂商实现的msvcgccclang的厂商在实现编译器的时候提供实现的这些函数是放在标准库中称为库函数 4.若有定义语句int year1009*pyear以下不能使变量year中的值增至1010的语句是
A.*p1 B.(*p) C.*p) D.*p
【解答】D
其实上面的代码就相当于int year1009int *pyear
A.*解引用操作符的优先级高于赋值操作符p解引用指向year然后year
B.有括号先算*p然后year
C.也有括号只要对*p也就是year就可以
D.*p优先级高于*先执行p后置值先为p然后p这里就是地址而不是地址指向的元素 5.char aint bfloat cdouble d
则表达式a*bd-c值的类型为
【解答】double类型
首先a*bchar*intchar类型整形提升变成int类型int *int类型结果是int类型
然后intdouble类型这个时候int类型就算术转化为double类型doubledouble类型结果是double类型
最后double-float类型这个时候float类型就算术转化为double类型double-double类型结果是double类型
【注意】这个过程发生了整形提升和算术转化是先变类型再进行运算
二、编程题
1.求最小公倍数
【题目】 【题解1】常规做法
最小公倍数一定是大于等于输入的两个数的所以可以从两个数的较大数开始加看加到哪个数可以同时将两个数整除
#include stdio.h
int main()
{int a0;int b0;//输入scanf(%d %d,a,b);//求较大值int mab?a:b;//从较大者开始求最小公倍数while(1){if(m%a0m%b0)break;m;}//输出printf(%d\n,m);return 0;
}
【题解2】最小公倍数输入的两个数的积 / 最大公约数辗转相除法
#include stdio.h
int main()
{int a0;int b0;int c0;//输入scanf(%d %d,a,b);int na*b;//求最大公约数while(ca%b){ab;bc;}//输出printf(%d\n,n/b);return 0;
}
【题解3】效率最高
假设m是a和b的最小公倍数那么m既能被a整除又能被b整除m/aim/bj那么我们就看a*i能否将b整除eg求3和5的最小公倍数首先看3*1能否整除5再看3*2是否能整除5以此类推直到找到3*i可以整除5那么这时3*i就是最小公倍数
#include stdio.h
int main()
{int a0;int b0;//输入scanf(%d %d,a,b);int i1;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
#includestring.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 lenstrlen(arr);//1.逆序整个字符串reverse(arr,arrlen-1);//2.逆序每个单词char*curarr;while(*cur!\0){char*startcur;while(*cur! *cur!\0){cur;}char*endcur-1;reverse(start,end);if(*cur )cur;}printf(%s\n,arr);return 0;
}
【注意事项】
(1)输入字符串不能正常用scanf函数输入因为它一遇到空格就停止读取了getsarr)
要用也得这样写scanf%[^\n]s,arr)意思就是scanf函数直到读到\n才停止
也可以用getchar: int ch0 int i0 while (chgetchar( ) )!\n) { arr[i]ch; } (2)逆序整个字符串:思路是将左右字符一个一个交换直到 leftright停止交换
还有就是reverse自定义函数传参的时候最后字符的地址怎么传首字符地址字符串的长度-1 (3)逆序输出:首先定义一个cur指针指向字符串的最前面然后开始遍历以一个单词为一个循环当指针指向的不是空格或者\0时cur继续向下遍历直到遇到了就倒置这个单词我们就用start和end指针分别来指向一个单词的首尾然后单词也可以当字符串倒置
当一个单词结束就需要进入下一个单词这个时候就要将cur但是如果这是最后一个单词就不需要cur因为再就会造成数组越界 这次内容就到此啦有什么问题欢迎评论区或者私信交流觉得笔者写的还可以或者自己有些许收获的麻烦铁汁们动动小手给俺来个一键三连万分感谢 !