自己的碎碎念集合

自己的碎碎念集合


2023-09-22 VS程序输出窗口显示运行结果不完整的解决办法

看到一个问题, VS循环打印, 只有数十行结果, 搜了一下:
VS程序输出窗口显示运行结果不完整的解决办法

2023-09-11 C语言定义 int *p,q; p, q类型是否一样

这是一种典型的容易引起混淆的问题, int*是一个类型, int是一个类型,

而如此声明, 初学者可能误认为 p,q 都是指针, 但很遗憾, p 是指针, 但 q 不是,

这在clang-tidy中有会有提示:

Multiple declarations in a single statement reduces readability

单个语句中的多个声明会降低可读性, 人为给自己挖坑的典型.

    int *p;
    int q;

这才是正确的代码规范.

如果非要偷懒, 那只能事先规定类型

    typedef int *intPtr;
    intPtr r, s;

2023-09-07 c++叠加三目运算符闰年计算法

原文连接:

c++叠加三目运算符怎么看

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
   
    int x;
    cin>>x;
    cout<<(x%400==0?"YES":(x%4==0?(x%100!=0?"YES":"NO"):"No"));
    return 0;
}

2023-08-13 一个小题目 A+B problem

一个小算法问题, 记录一下

一、问题及解答

A+B problem( A+B problem )
描述
小明有一个很大的数字,现在他想要在这个数字中间插入一个+号,来求出这个数的结果,并且他还想知道,这些数中哪个数末尾0最多。
输入
第一行一个整数T(t<=100)表示数据组数
接下来有T行,每行一个数字字符(长度在10^5,最高位不为0)
输出
T行,每行一个整数,表示0最多有多少个

输入
2
2017
44445555

输出
0
3

关碍

条件是数字字符长度在10^5, 内置int类型不可能满足, 意味着可能用到高精度, 但本题不用.

因为只是求末尾0, 意味着算法简单很多.

如果最后一个字符数字是x, 只需在数字串中的其它部分找到的10-x, 如果x为0, 只需找到其它的0的个数即可.

#include <iostream>
#include <string>

auto getLastChar(char num) -> char
{
   
    char res = static_cast<char>('9' + '1' - num);
    return (res == '9' + 1) ? '0' : res;
}

auto countZero(const std::string &str) -> int
{
   
    char chr = getLastChar(str.back());
    int cnt = 0;
    for (const auto &i : str)
    {
   
        if (i == chr)
        {
   
            cnt++;
        }
    }
    return (chr == '5' || chr == '0') ? cnt - 1 : cnt;
}

auto main() -> int
{
   
    int T = 0;
    std::cin >> T;

    std::vector<std::string> vecStr;
    vecStr.reserve(T);

    std::string str;

    for (int i = 0; i != T; ++i)
    {
   
        std::cin >> str;
        vecStr.push_back(str);
    }

    for (int i = 0; i != T; ++i)
    {
   
        std::cout << countZero(vecStr[i]) << '\n';
    }

    return 0;
}


总结

算法不难, 但需要绕个小弯儿.

2023-07-26 C的2至36进制转换函数

有一些C语言初学者学语言的时候比较囫囵吞枣, 最简单的整数转2至36进制函数, 根本没听说过, 还有自己造轮子, 关键还写不对, 其实多看看书, 多查查资料, 有时候可以省很多时间.


一、itoa()函数的示例代码

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

char digStr[64];

int main()
{
   
    SetConsoleOutputCP(65001);

    int number = 123456;
    itoa(number, digStr, 2);
    printf("数字:%d 转换后的字符串为:%s\n", number, digStr);

    number = -123456;
    itoa(number, digStr, 2);
    printf("数字:%d 转换后的字符串为:%s\n", number, digStr);
    return 0;
}

总结

代码简单, 函数语义清晰, 简单记录一下.

2023-07-19 平面坐标下判断三角形以及输出周长和面积

平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识.


一. 基本知识

在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形.

三角型
我们发现, 只有一种情况三角形不能成立, 就是从原点出发的两个向量在一条直线上
向量方向一致或相反
我们可以简单的用向量叉乘判断三角型是否成立, 同时, 向量叉乘的结果是向量形成的平行四边形面积
向量叉乘
平行四边形面积的一半就是三角形面积

而三角型的周长, 可以根据勾股定理得出三条边的长度, 相加得出.

以下是代码:

#include <math.h>
#include <stdio.h>
 
// 定义向量结构体
typedef struct
{
   
    double x;
    double y;
} Vector;
 
// 计算向量的差
Vector sub(Vector vecA, Vector vecB)
{
   
    return (Vector){
   vecA.x - vecB.x, vecA.y - vecB.y};
}
 
// 计算向量的叉积
double cross(Vector vecA, Vector vecB)
{
   
    return vecA.x * vecB.y - vecA.y * vecB.x;
}
 
// 计算两点之间的距离
double distance(Vector pointA, Vector pointB)
{
   
    Vector subAB = sub(pointA, pointB);
    return sqrt(subAB.x * subAB.x + subAB.y * subAB.y);
}
 
// 计算三角形的周长
double triPer(Vector pointA, Vector pointB, Vector pointC)
{
   
    return distance(pointB, pointC) + distance(pointA, pointC) +
           distance(pointA, pointB);
}
 
// 返回三角形面积, 向量叉积的二分之一的绝对值
double triArea(Vector vecA, Vector vecB, Vector vecC)
{
   
    return fabs(cross(sub(vecB, vecA), sub(vecC, vecA))) / 2.0;
}
 
int main()
{
   
    Vector pointA;
    Vector pointB;
    Vector pointC;
 
    scanf("%lf %lf %lf %lf %lf %lf", &pointA.x, &pointA.y, &pointB.x, &pointB.y,
          &pointC.x, &pointC.y);
 
    double rest = triArea(pointA, pointB, pointC);
 
    // 判断平面三点是否可构成三角形, 即叉积不为零
    if (rest)
    {
   
        printf("L = %.2lf, A = %.2lf", triPer(pointA, pointB, pointC), rest);
    }
    else
    {
   
        printf("Impossible");
    }
 
    return 0;
}

总结

近期在学OpenGL, 顺便学点图形学, 顺便也就学点线性代数, 这就是另外一个世界了.

2023-06-25 达芬奇去除白背景水印

录视频不小心整了个水印, 当时想了几个方法, 重录, ffmpeg命令搞一下, 一张一张幻灯片导成PNG然后一张一张换, 实在是太费劲了.

于是想到这点小玩意达芬奇这么专业的软件一定有办法, 试了试, 还真行


一、具体步骤

  1. 进入调色界面
  2. 将所有片段选中, 鼠标右键, 添加到当前群组
  3. 在节点区域, 选择片段前群组
  4. 在下方的调整区, 选择窗口, 四边形, 调整大小和位置, 将水印覆盖
  5. 调色区选一级校色条, 亮部的亮度拉满, 水印消失

具体步骤


总结

没有用到收费的功能, 但只能用于白底或黑底之上的水印, 不是智能去除.

2023-06-20 将Libreoffice PPT 文档转换为txt文字

有时候需要把ppt的文字内容抓出来, 想了一些办法, 没有成功, 后来发现直接用软件的内置功能即可:

文件: 在浏览器中预览

2023-05-19 C语言非流输入

一个有意思的问题c语言的输入输出问题, 网上很多答案, 总结一下.


一、windows平台

vs需要将getch()更改为_getch()

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

char chrArr[32];

int main()
{
   
    int i = 0;
    while ((chrArr[i] = getch()) && (chrArr[i] != '\r'))
    {
   
        ++i;
    }
    char *num;
    int lhs = strtol(chrArr, &num, 10);
    int rhs = atoi(num);

    printf("%d %d %d", lhs, rhs, lhs + rhs);
}

二、linux平台

#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
#include <stdbool.h>

int getch(void)
{
   
    return getchar();
}

void setio(bool bl)
{
   
    static struct termios tm, tm_old;
    if (bl)
    {
   
        tcgetattr(0, &tm);

        tm_old = tm;
        cfmakeraw(&tm); // 更改终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理
        tcsetattr(0, TCSANOW, &tm);
    }
    else
    {
   
        tcsetattr(0, TCSANOW, &tm_old);
    }
}

char chrArr[32];

int main()
{
   
    setio(true);
    int i = 0;
    while ((chrArr[i] = getch()) && (chrArr[i] != '\r'))
    {
   
        ++i;
    }
    setio(false);
    char *num;
    int lhs = strtol(chrArr, &num, 10);
    int rhs = atoi(num);

    printf("%d %d %d\n", lhs, rhs, lhs + rhs);
}


总结

vs要用 _getch(), mingw和clang用getch(), linux平台需要自己实现, 这不是标准库中的东西, 所以不可移植…

2023-05-11 字符与数组的运用小练习_C语言

一个问答题: 字符与数组的运用 , 考察知识点: scanf的使用, 字符串数组, 字符在C语言本质是整数, 循环, 分支.


一、代码

一道小题目, 考的知识点包括了C语言输入输出, 字符类的本质, 循环, 分支, 挺好的.

#include <stdio.h>
#include <string.h>

char strArr[100][100];

void encrypted(char *chr);

int main()
{
   
    int index = 0;

    // INT DOUBLE FOR WHILE
    // RETURN
    while (scanf("%s", strArr[index]) != EOF)
    {
   
        for (int i = 0; i != strlen(strArr[index]); i++)
        {
   
            encrypted(strArr[index] + i);
        }
        index++;
    }

    for (int i = 0; i != index; i++)
    {
   
        printf("%s\n", strArr[i]);
    }

    return 0;
}

void encrypted(char *chr)
{
   
    switch (*chr)
    {
   
    case 'A':
        *chr = 'N';
        break;
    case 'B':
        *chr = 'O';
        break;
    case 'C':
        *chr = 'P';
        break;
    case 'D':
        *chr = 'Q';
        break;
    case 'E':
        *chr = 'R';
        break;
    case 'F':
        *chr = 'S';
        break;
    case 'G':
        *chr = 'T';
        break;
    case 'H':
        *chr = 'U';
        break;
    case 'I':
        *chr = 'V';
        break;
    case 'J':
        *chr = 'W';
        break;
    case 'K':
        *chr = 'X';
        break;
    case 'L':
        *chr = 'Y';
        break;
    case 'M':
        *chr = 'Z';
        break;
    case 'N':
        *chr = 'A';
        break;
    case 'O':
        *chr = 'B';
        break;
    case 'P':
        *chr = 'C';
        break;
    case 'Q':
        *chr = 'D';
        break;
    case 'R':
        *chr = 'E';
        break;
    case 'S':
        *chr = 'F';
        break;
    case 'T':
        *chr = 'G';
        break;
    case 'U':
        *chr = 'H';
        break;
    case 'V':
        *chr = 'I';
        break;
    case 'W':
        *chr = 'J';
        break;
    case 'X':
        *chr = 'K';
        break;
    case 'Y':
        *chr = 'L';
        break;
    case 'Z':
        *chr = 'M';
        break;
    }
}


总结

出这道题的老师挺有水平.


2023-04-29 C语言二进制读写库

压缩算法需要二进制读写库, 根据算法第四版重构C语言版. 可进行逐位读写, 主要用于数据压缩.


一、代码

#ifndef BINSTDIO
#define BINSTDIO

#include <assert.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN64
#include <fcntl.h>
#include <io.h>
#endif

// 读流到缓冲区
void binIO_fillBuffer();

// 比特流是否为空
bool binIO_isEmpty();

// 读取1位数据并返回一个bool值
bool binIO_readBool(bool *bit);

// 读取8位数据并返回一个char值
bool binIO_readChar(unsigned char *chr);

// 读取r(1~8)位数据并返回一个char值
bool binIO_readCharBit(unsigned char *chr, int bitSize);

// 读取int16值
bool binIO_readShort(uint16_t *num);

// 读取r(1~BUFSIZE_X_2)位数据并返回一个int16值
bool binIO_readShortBit(uint16_t *num, int bitSize);

// 读取int值
bool binIO_readInt(uint32_t *num);

// 读取r(1~32)位数据并返回一个int值
bool binIO_readIntBit(uint32_t *num, int bitSize);

// 读取int64
bool binIO_readInt64(uint64_t *num);

// 读取r(1~32)位数据并返回一个int值
bool binIO_readInt64Bit(uint64_t *num, int bitSize);

// 关闭比特流
void binIO_close();

// 恢复流状态
void binIO_clear();

// 写入指定的比特
void binIO_writeBool(bool bit);

// 写入指定的8位字符
void binIO_writeChar(unsigned char chr);

// 写入指定字符的r(1~8)位
void binIO_writeCharBit(unsigned char chr, int bitSize);

// 写入int16值
void binIO_writeShort(uint16_t num);

// 写入 int16 值, bitSize 在范围 [1, BUFSIZE_X_2]
void binIO_writeShortBit(uint16_t num, int bitSize);

// 写入int值
void binIO_writeInt(uint32_t num);

// 写入指定 int 的 bitSize [1, 32] 位
void binIO_writeIntBit(uint32_t num, int bitSize);

// 写入int64类型值
void binIO_writeInt64(uint64_t num);

// 写入指定 int64 的 bitSize [1, 64] 位
void binIO_writeInt64Bit(uint64_t num, int bitSize);

void binIO_clearBuffer();

// 关闭比特流, 刷新缓冲流
void binIO_closeAndFlush();

#ifdef _WIN64
void binIO_setStdinStdoutToBinaryMode()
{
   
    _setmode(_fileno(stdin), _O_BINARY);
    _setmode(_fileno(stdout), _O_BINARY);
}

void binIO_setStdinStdoutToTextMode()
{
   
    _setmode(_fileno(stdin), _O_TEXT);
    _setmode(_fileno(stdout), _O_TEXT)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不停感叹的老林_<C 语言编程核心突破>

不打赏的人, 看完也学不会.

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

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

打赏作者

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

抵扣说明:

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

余额充值