1.、以下程序段的输出结果是( )
#include
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
A: 12 B: 13 C: 16 D: 以上都不对
答案:A
答题思路:本题主要考察了转义字符以及strlen函数。关于转义字符,详细可见博客链接: 转义字符
这里,我们主要使用了以上三种转义字符!
同样,我们也需要了解strlen函数
,该函数用于求字符串的长度,遇到'\0'
即停止。
在上述字符串中,✅答案中的12个字符分别是'\\' '1' '2' '3' '4' '5' '6' '\123' '4' '5' '6' '\t'
.
通过程序运行,我们也能得到这样的结果:
2.若有以下程序,则运行后的输出结果是( )
#include
#define N 2
#define M N+1
#define NUM (M+1)*M/2
int main()
{
printf("%d\n", NUM);
return 0;
}
A: 4 B: 8C: 9 D: 6
答案:B
答题思路:#define
是一种宏,一般会用在预处理阶段,在预处理阶段,define只会替换
,不会做任何的算计逻辑等处理。那么NUM就应该等于(2+1+1)*2+1/2=8
.
3.如下函数的 f(1) 的值为( )
#include
int f(int n)
{
static int i = 1;
if (n >= 5)
return n;
n = n + i;
i++;
return f(n);
}
int main()
{
printf("%d\n", f(1));
return 0;
}
A: 5 B: 6 C: 7 D: 8
答案:C
答题思路:本题主要的就是需要了解清楚static这个关键字的用法,关于关键字的详解可以跳转至博客链接: 关键字。
本题的解题流程如下:
4.下面3段程序代码的效果一样吗( )
int b;
const int* a = &b;
int const* a = &b;
int* const a = &b;
A: (2)=(3) B: (1)=(2) C: 都不一样 D: 都一样
答案:B
答题思路:const
在*
左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变); 在*
的右边,则指针的指向不可变。简记为“左定值,右定向”.题目中(1)和(2)const
都在*
左边,(3)在*
的右边,所以选择B.
5.5、对于下面的说法,正确的是( )
A: 对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)
B: 对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零
C: 初始化方式 char a[14] = “Hello, world!”; 和char a[14]; a = “Hello, world!”;的效果相同
D: 以上说法都不对
答案:D
答题思路:A 选项,没有考虑内存对齐。 B 选项,考察 double 类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C 选项, a为数组首地址是常量不能改变,所以A,B,C 都是错的,选择 D
结构体和最大的类型对齐:一个格子代表一个字节,那么sizeof(X)的值应当为12
,而sizeof(s) + sizeof(i) + sizeof(c)
的值为7
.
我们也可以编译运行得到该结果:
#include
struct X
{
short s;
int i;
char c;
};
int main()
{
struct X x;
printf("%d\n", sizeof(x));
printf("%d", sizeof(x.s) + sizeof(x.i) + sizeof(x.c));
return 0;
}
1.验证尼科彻斯定理,即:任何一个整数 m 的立方都可以写成 m 个连续奇数之和。例如:
13=1
23=3+5
33=7+9+11
43=13+15+17+19
输入一个正整数 m(m≤100) ,将 m 的立方写成 m 个连续奇数之和的形式输出。 注意:本题含有多组输入数据。数据范围:1≤m≤100
OJ链接【牛客网题号: HJ76 尼科彻斯定理】【难度:简单】
答题思路:
我们可以发现,第一个奇数即为n2-(n-1),那么当我们知道了第一个奇数,后面的奇数我们可以采用for循环
来表示出来!对于n2我们可以用库函数pow
来实现。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
int n = 0;
scanf("%d", &n);
int first = pow(n, 2) - (n - 1);
int i = 0;
for (i = 0; i < n; i++)
{
printf("%d",first);
first += 2;
if (i < n - 1)
{
printf("+");
}
}
return 0;
}
✅自测运行:
2、等差数列 2,5,8,11,14, … 。(从 2 开始的 3 为公差的等差数列),求等差数列前 n 项和。
注意:本题有多组输入
输入描述:输入一个正整数 n 。
输出描述:输出一个相加后的整数。
数据范围: 1≤n≤1000
OJ链接【牛客网题号: HJ100 等差数列】【难度:简单】
答题思路:定义一个变量,通过
for循环
来表示以2为首项,3为公差的每一项。同时,还需要定义一个变量通过for循环
来计算前n项的和。
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
int main()
{
int n = 0;
scanf("%d", &n);
int i = 0;
int ret = 2;
int sum = 0;
for (i = 0; i < n; i++)
{
sum += ret;
ret += 3;
}
printf("%d\n", sum);
return 0;
}
好啦,第二天的练习到这里就结束啦!后期会继续更新C语言的小练笔,欢迎大家持续关注、点赞和评论!❤️❤️❤️