0


c语言每日一练(2)

前言:
每日一练系列,每一期都包含5道选择题,2道编程题,博主会尽可能详细地进行讲解,令初学者也能听的清晰。每日一练系列会持续更新,暑假时三天之内必有一更,到了开学之后,将看学业情况更新。

5道选择题:

1、以下程序段的输出结果是()

#include<stdio.h>
#include<string.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}

A.12 B.13 C.16 D.以上都不对

解析:根据题目分析可知,**这串代码的作用是用来计算字符串s的长度的 **strlen函数的特性则是在遇到\0的时候会停止访问,而字符串末尾都会有\0,虽然你看不到。关于strlen博主之前也写过一篇博客介绍,对strlen函数不是很理解的朋友们可以去看看。手把手教你玩转常用字符串函数(包含模拟实现)_大海里的番茄的博客-CSDN博客

既然是计算字符串的长度,那么我们要做的就是**数一数s这个字符串有多长 **\是一种转义字符,\修饰\的意思是,转义第二个\使第二个\就是一个普通的字符,因此,这两个\加在一起才是1个字符 123456,有6个字符,6+1就是7个字符。

接着走,又遇到\了,**\后面带数字,代表着后面的数是八进制的数,且最多为三位 **因此把\123看作一个整体,视为一个字符,7+1现在有8个字符,456三个字符,8+3有11个字符,最后的\t看作一个字符,故最后有12个字符,答案选A

很多小伙伴会忘记转义字符的具体内容,这里博主把之前整理的内容给大家。

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

解析:宏定义就是在进行操作之前先将对应的代码替换成对应的宏。这串代码想要打印NUM,而NUM有宏定义,所以在操作之前先将NUM替换成对应的宏,替换结果为(M+1)*M/2,M有宏定义,继续替换,替换结果为(N+1+1)*N+1/2,注意,只是替换,不要画蛇添足加什么括号,根据宏定义来,它怎么定义的你就怎么替换。N有宏定义,替换结果为(2+1+1)*2+1/2,计算结果为8.5,但printf准备打印整型数据,那么就会导致数据丢失,打印出8

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

解析:根据题意可知,我们的目标是f(1),调用int f(int n)函数时传1时f的返回值就是我们的答案。走进函数将n看作1,**首先函数定义了一个静态变量i,并初始化为1,静态变量的意义就是不会随着函数调用的结束而销毁,它只会在程序结束之后销毁,同样它也只会创建一次,也就是说static int i=1只会走一次 **if(n>=5)就是说当n>=5时才会触发,先跳过,n=n+i,那么此时n=2,继续走,i++,i为2,返回f(2),继续进入f()函数,但这次传的是2,i也是2,那么n最后会是4,i会是3,继续递归,n还是没>=5,n=n+i使n为7,i++使i为4,继续递归,这次n为7,n>=5了,中止函数,返回7。故答案选C

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.都一样

解析:*const修饰指针变量的效果,是根据const和之间的相对位置来决定的 *const放在的左边意味着对应的指针不能被修改,放在的右边意味着指针所指向的内容不能被修改。那么观察题目我们只需要找相对位置一样的即可,不难发现,(1)和(2)const和的相对位置都是const在的右边,故效果一样,而(3)的const放在的右侧,效果不一样。故选B

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.以上说法均不对

解析:结构体的大小是需要通过对齐实现的,A选项的X的大小是这样计算的,short型,占两个字节,偏移量为0和1的位置被占据,int型占4个字节,因此得对齐到偏移量为4的倍数的位置,因此,偏移量为4,5,6,7被占据,而偏移量为1,2,3的空间被浪费,char型占1个字节,它不用对齐,所以偏移量为8的位置被占据,大小为9,再根据内存对齐的规则,要对齐到最大对齐数的倍数,也就是4的倍数,10,11被浪费,最后的结构体计算结果为12和2+4+1=8是有所不同的。

对于结构体对齐内容不理解的朋友可以去看下博主之前写的自定义类型详解,里面有关于这一问题的详细叙述

自定义类型详解_大海里的番茄的博客-CSDN博客

B选项,考察double类型的比较,由于浮点数存在误差,不能直接判断两个数是否相等,通常采用比较两数之差的绝对值是否小于一个很小的数字(具体的可自己设定这样一个数,作为误差)来确定是否相等。C选项,a为数组首地址是常量不能改变,所以A,B,C都是错的,故答案为D

编程题1:

P5717 【深基3.习8】三角形分类 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

唯一需要注意的就是锐角和钝角的判断,因为很多人都把它们的判断方法忘记了

两条较短边的平方和大于最长边的平方,此三角形就是锐角三角形

两条较短边的平方和小于最长边的平方,此三角形就是钝角三角形

#include<stdio.h>
int main()
{
    int a=0;int b=0;int c=0;
    //代表着三角形的三边
    scanf("%d %d %d",&a,&b,&c);
    int max=a>b?a:b;
    max=max>c?max:c;
    //计算出三边的最大边
    int min=a>b?b:a;
    min=a>min?min:a;
    //计算出三边的最小边 
    int sum=a+b+c;
    //三边总和
    a=max;
    //令a为最大边
    b=sum-min-max;
    //令b为中间边
    c=min;
    //令c为最小边
    if(b+c<=a)
    //三角形成立条件,两边之和大于第三边,不满足肯定不是三角形
    //拿较小的两条边来比较,如果较小的两边之和都能大于第三边就一定是三角形
    {
        printf("Not triangle");
    }
    else//是三角形才能进行后面的判断
    {
        if(b*b+c*c==a*a)
        //勾股定理判直角
        {
            printf("Right triangle\n");
        }
        else if(b*b+c*c>a*a)
        {
            printf("Acute triangle\n");
        }
        else if(b*b+c*c<a*a)
        {
            printf("Obtuse triangle\n");
        }
        if(a==b||b==c||c==a)
        //等腰三角形判断
        {
            printf("Isosceles triangle\n");
            if(a==b&&b==c)
            //先是等腰才是等边
           {
            printf("Equilateral triangle\n");
           }
        }
    }
}

编程题2:

等差数列_牛客题霸_牛客网

根据等差数列的公式 首末相加*项数/2即是答案,那么计算首末端即可

#include <stdio.h>
int main() {
int head=0;
int end=0;
int n=0;
scanf("%d",&n);
head=2;
end=2+(n-1)*3;
printf("%d",(head+end)*n/2);
}

好了,今天的练习到这里就结束了,感谢各位友友的来访,祝各位友友前程似锦O(∩_∩)O


本文转载自: https://blog.csdn.net/fq157856469/article/details/132130135
版权归原作者 大海里的番茄 所有, 如有侵权,请联系我们删除。

“c语言每日一练(2)”的评论:

还没有评论