题目
1、以下程序段的输出结果是( )
#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A: 12 B: 13 C: 16 D: 以上都不对
2、若有以下程序,则运行后的输出结果是( )
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}
A: 4 B: 8 C: 9 D: 6
3、如下函数的 f(1) 的值为( )
int f(int n)
{
static int i = 1;
if(n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
A: 5 B: 6 C: 7 D: 8
4、下面3段程序代码的效果一样吗( )
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
5、对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof©
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = “Hello, world!”; 和char a[14]; a = “Hello, world!”;的效果相同
D: 以上说法都不对
6、验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
示例:
输入:6
输出:31+33+35+37+39+41
7、等差数列 2,5,8,11,14, ……(从 2 开始的 3 为公差的等差数列),求等差数列前 n 项和。0 =< n <=1000。
示例:
输入:2 输入:275
输出:7 输出:113575
说明:2+5=7 说明:2+5+…+821+824=113575
答案与解析
1、
正确答案:A
这里考查转义字符,注意:\ 表示字符’‘,\123表示字符’{',\t表示制表符,这些都是一个字符
int main()
{
char s[] = "\\123456\123456\t";
\\ '\\' 用于表示一个反斜杠,防止它被解释为一个转义序列符。
\\ '\ddd' ddd表示1~3个八进制的数字。 如: \130 X
\\ '\t' 水平制表符
printf("%d\n", strlen(s));
return 0;
}
2、
正确答案:B
宏只是替换,替换后NUM的样子是(2+1+1)*2+1/2,计算得8
3、
正确答案:C
此题注意静态局部变量的使用,static改变了i的生命周期,第一次调用函数:i初值是1,递归第二次调用函数时,i还是第一次那个变量,值已经变成了2,再一次调用函数时i就是3,依次类推
4、
正确答案:B
const在的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在的右边,则指针的指向不可变。简记为"左定值,右定向",(1)和(2)const都在的左边,(3)中const在的右边,所以应该选择B。
5、
正确答案:D
A选项,没有考虑内存对齐。B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,选择D
6、
解法一:
//m个连续奇数其实就是一个公差为2,共有m项的等差数列
//由等差数列前n项和公式:Sn=(n(a1+an))/2
// 第n项公式:an=a1+(n-1)d
//设m个连续奇数组成的等差数列的首项为i
//那么前m项和为:( m (i+ (i+2(m-1)) ) )/2
//即 m * i + m * (m - 1)
int main()
{
int m = 0;
scanf("%d", &m);
int i = 1;//奇数开头
int j = 0;
int count = m * m * m;//设m的立方为count
while (i > 0)
{
if (m * i + m * (m - 1) == count)//整数m的立方与m个连续奇数之和相等
{
for (j = 0; j < m; j++)//负责打印
{
if (j == m - 1)//最后一个数时不用打印 + 号
printf("%d", i);
else
{
printf("%d+", i);
}
i += 2;
}
break;
}
i += 2;//每次增加2,所得都为奇数
}
return 0;
}
解法2:
nt main()
{
int m;
while(~scanf("%d", &m)){
int start = m * (m - 1) + 1;//找到对应m^3的起始奇数
char buf[10240] = {0};
//sprintf(buf, format, ...) 与printf用法类似,格式化字符串但是不用于打印而是放到一个buf中
sprintf(buf, "%d", start);//先将起始奇数转换成为字符串存入buf中
for (int i = 1; i < m; i++) {
//然后将紧随随后的m-1个奇数数字转换为字符串,按照指定格式放入buf中
//%s+%d, 要求先有一个字符串,然后是+符号,然后是个数字的格式,对应是buf原先的数据,和奇数
sprintf(buf, "%s+%d", buf, start+=2);
}
printf("%s\n", buf);
}
return 0;
}
7、
解法1:文章来源:https://www.toymoban.com/news/detail-672366.html
int main()
{
int n = 0;
int i = 0;
int j = 2;
int count = 0;
scanf("%d", &n);
if (n >= 1 && n <= 1000)//判段n是否在正确范围
{
for (i = 0; i < n; i++)//前n项
{
count += j;
j += 3;//公差为3
}
}
printf("%d", count);
return 0;
}
解法2:文章来源地址https://www.toymoban.com/news/detail-672366.html
int main()
{
int n, a1 = 2;
while (scanf("%d", &n))
{
int an = a1 + (n - 1) * 3;//等差数列第n项计算
printf("%d\n", n * (a1 + an) / 2); //等差数列求和打印
}
return 0;
}
到了这里,关于C语言日常刷题 2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!