【知识碎片】2024_05_06

C语言部分里有: 转义字符 宏定义 const 等相关的四道题

代码部分: 尼科彻斯定理 等差数列 数组在升序数组中出现的次数 计算日期到天数的转换


C语言

是转义字符

\ddd ddd表示1到3个八进制数 如:\130 转义为 字符X (因为八进制不会出现8,所以'\8'一定是错误的)

\xhh hh表示1到2位十六进制数 如:\x30 转义为 字符0

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

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

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

答案:A

\\表示'\'

\123 表示将123转为八进制后对应的字符

\t表示一个制表符


test.c 文件中包括如下语句,文件中定义的四个变量中,是指针类型的变量为【多选】( )

#define INT_PTR int*
typedef int* int_ptr;
INT_PTR a, b;
int_ptr c, d;

A: a B: b C: c D: d

答案:ACD

因为#define是宏定义,仅仅是直接替换,INT_PTR a, b; 进行宏替换后代码是这样的:int *a, b;这里的int *是a的类型,b的类型是int,故此次b只是int类型。而typedef是把该类型定义一个别名,别名是一个独立的类型了,使用这个类型创建的变量都是这个类型的。

(宏替换后的int * a, b  a是指针,b是int   直接定义的int * a,b  两个都是指针)


若给定条件表达式 (M)?(a++):(a--) ,则其中表达式 M ( )
A: 和(M==0)等价 B: 和(M==1)等价 C: 和(M!=0)等价 D: 和(M!=1)等价

答案:C

这个...下次应该不会错了吧(#^.^#)


下面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: 都一样

答案:A

const在*的左边,则指针指向的变量的值不可直接通过指针改变(可以通过其他途径改变);在*的右边,则指针的指向不可变。简记为"左定值,右定向"。


对于下面的说法,正确的是( )
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为数组首地址是常量不能改变。


代码

尼科彻斯定理

我的代码

#include <iostream>
using namespace std;

int main() {
    int m;
    while (cin >> m) {
        if(m % 2 == 0)
        {
            int i = (m*m + 1) - 2*(m/2);
            for(int j = 1; j < m; j++)
            {
                printf("%d+",i);
                i+=2;
            }
            printf("%d",i);
        }
        else{
            int i = m*m - 2*(m/2);
            for(int j = 1; j < m; j++)
            {
                printf("%d+",i);
                i+=2;
            }
            printf("%d",i);
        }
    }
}

另一版答案(sprintf还需要研究一下)

#include <stdio.h>
int 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);
} r
eturn 0;
}

 等差数列

就是求和,简单的

#include <iostream>
using namespace std;

int main() {
    int n;
    while (cin >> n) { 
        int last_num = 2 + 3*(n - 1);
        int ret = 0;
        ret = (2 + last_num)*n/2;
        cout << ret << endl;
    }
}

数字在升序数组中出现的次数 

用到了二分

int GetNumberOfK(int* nums, int numsLen, int k ) {
    if (numsLen == 0) return 0; 
    int left = 0;
    int right = numsLen - 1;
    int count = 0;
    int mid = (left + right)/2;
    while(left <= right)
    {
        if(nums[mid] > k)
            right = mid - 1;
        else if(nums[mid == k])
            break;
        else
            left = mid + 1;
        mid = (left + right)/2;
    }
    if(nums[mid] == k) 
    {
        count++;
        int left_ans = mid - 1;
        int right_ans = mid + 1;
        while(left_ans >=0 && nums[left_ans--] == k) ++count;
        while(right_ans < numsLen && nums[right_ans++] == k) ++count;
    }
    return count;
}

 计算日期到天数转换

计算某个日期是当年的第几天

#include <stdio.h>

int main() {
    int year, month, day;
    while (scanf("%d %d %d", &year, &month, &day) != EOF) { 
        //存储每个月的天数
        int month_day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
        //判断闰年
        if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) month_day[2] = 29;
        //加天数
        int days = 0;
        for(int i = 1; i < month; ++i) days += month_day[i];
        days += day;
        printf("%d",days);
    }
    return 0;
}

 -The End-

  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王_哈_哈 Jw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值