前言:这又是一个新坑,算上之前的4个坑这是第五个坑(1、C/C++的讲解,2、C语言小游戏,3、大学生活,4、假哲家因为某些原因没GS),这个就是发一些自己在刷题的过程中遇到自己感觉还不错的习题进行分享讲解,这将是一个非常长的合集起码最近几年不大会断更。每次的更新就会在最后留有时间戳,相当是自己一个做题的记录吧。这是我自己根据自身实力来选题,希望能帮助到你。(目前一个妥妥的菜鸟入门级别)
方法论
怎么写代码?
1、人不是生下来就能写代码的,是要练习的;
2、自信点,智商是没问题的,题目是不算难,
想不到的原因:是不熟悉,不会把实际问题转化成代码的方式来解决!编程思维(需要练习)
3、计算机都是人发明的,计算机的技术难道学不会?——能学会!
怎么提升编程思维?
1、找练习题、找答案,看,看懂,分析,别人为什么这么写的?
2.放开被人的代码,按照自己的理解,去尝试写,写出来就好了,如果写不出来,卡在哪里了? 再去看被人的代码;
3、顺一下思路,再去写;(去模仿)
4、重复上述过程。
2023.12.07
代码隐藏
一、形成 .lib文件
1、先将代码分开书写(在创建 头文件.h 与 .c文件选择相对应的类型);
2、图解步骤:
完成上述操作以后就会在文件夹中生成此文件;注意目录
二、在其他项目中使用
1、在该项目中把 .lib文件与头文件放在该目录下;
2、在 vs中调用该函数就行;
注意:头文件的添加与声明,同时,在调用 .lib 文件时要加 #pragma comment(lib,”lib文件”),文件名一定要相同。
此次文件的封装操作前前后后一共操作了6次,很是不爽翻过来覆过去的查找问题进行修改,但是这将来就是常态,所以要习惯!
2024.01.02
第一次刷题 2023.12.18
1、在for语句中,循环次数只由变量来控制的.说法是否正确?不正确
还有break也可以控制。
2、一个C语言的执行时是从本程序的主函数开始,到本程序的主函数结束。
3、1.234e0.4不能作为C语言的合法常量因为
C语言中整数常量的指数是合法的,而小数指数不是C语言标准所定义的合法常量范围内
4、若二维数组a有m列,则在a[i][j]前的元素个数为(i*m)+j
因为列与行是从0 0 开始进行计数的
#include int main(){int m = 3; // 假设有3列int a[2][3] = { {1, 2, 3}, {4, 5, 6} };int i = 1; // 第2行int j = 2; // 第3列// 计算在a[i][j]前的元素个数int X = (i * m) + j;printf("在a[%d][%d]前的元素个数: %d\n", i, j, X);return 0;}
5、不合法的C语言用户自定义标识符是什么?
在C语言中,用户自定义的标识符(Identifier)必须遵循一定的命名规则。以下是一些不合法的C语言用户自定义标识符的情况:
1.包含空格的标识符: 标识符不能包含空格,因为空格在C语言中用于分隔各个标记。
2.以数字开头的标识符: 标识符不能以数字开头,它们必须以字母(包括下划线)开头。
3.包含特殊字符的标识符: 标识符只能包含字母、数字和下划线,不能包含其他特殊字符。
4.C语言关键字作为标识符: 不能使用C语言中的关键字(reserved keywords)作为标识符,因为这些关键字具有特殊含义。
5.超过标识符长度限制: 标识符的长度在C语言中是有限制的,不同编译器可能有不同的限制。
// 不合法的标识符(假设长度超过编译器限制)
int thisIsAReallyLongIdentifier; // 过长的标识符
总体而言,合法的C语言标识符应该以字母(包括下划线)开头,后面可以跟随字母、数字和下划线的组合,且长度不能超过编译器规定的限制。
6、exce((v1,v2),(v3,v4,v5),v6);这个函数调用语句中实参的个数是 3个
括号表达式表示的是一个值
7、设有指针变量为 double *p,则在32位机器上p+1是将指针p的指向向后移动8个字节。正确
double 不论是在32位还是64位平台下,都是8个字节。指针加一,加的是其所指的类型的大小,所以无论是32位还是64位编译器,都是移动8个字节。并不是其类型空间,其类型空间没有变,只会 根据机器位数而发生变化。
8、预定义的标识符不是c语言的关键字。正确
C语言的字有关键字和标识符两大类,而标识符又分为预定义标识符(如 printf )和用户标识(如 a)。预定义的标识符可以作为用户标识符使用,只是这样会失去系统规定的原意,使用不当还会使程序出错。
9、一个C语言程序在一台32位机器上运行。程序中定义了三个变量x 、y和z,其中x和z为int型,y为short型。当x=127,y=-9时,执行赋值句z=x+y后,x、y和z的值分别是 x=0000007FH,y=FFF7H,z=00000076H
C语言中的整型数据为补码形式,int为32位,short为16位,故x、y转换成十六进制为0000007FH、FFF7H。执行z=x+y时,由于x是int型,y为short型,需将短字长数据转换成长字长数据,称之为“符号扩展”(整形提升)。由于y的符号位为1,故在y的前面添加16个1,即可将y上升为int型,其十六进制形式为FFFFFFF7H。最后执行加法,即0000007FH+FFFFFFF7H=00000076H,其中最高位的进位1自然丢弃。
第二次刷题 2024.01.21
1、关键字的理解:C语言中有一些关键字,它们具有特殊的含义,不能用作标识符(变量名、函数名等)。
以下是C语言中的一些关键字
1.auto: 声明自动变量。
2.break: 用于跳出循环或switch语句。
3.case: 在switch语句中标记不同的情况。
4.char: 声明字符型变量或函数返回值类型。
5.const: 声明只读变量。
6.continue: 结束当前循环的迭代,继续下一次迭代。
7.default: 在switch语句中指定默认情况。
8.do: 开始do-while循环。
9.double: 声明双精度浮点型变量或函数返回值类型。
10.else: 在条件语句中指定一个块,该块在条件为false时执行。
11.enum: 声明枚举类型。
12.extern: 声明一个变量或函数是由外部文件定义的。
13.float: 声明浮点型变量或函数返回值类型。
14.for: 开始for循环。
15.goto: 将控制转移到程序中的标签。
16.if: 条件语句的开始。
17.int: 声明整型变量或函数返回值类型。
18.long: 声明长整型变量或函数返回值类型。
19.register: 声明寄存器变量。
20.return: 从函数中返回值。
21.short: 声明短整型变量或函数返回值类型。
22.signed: 声明有符号类型。
23.sizeof: 返回对象或类型的大小(以字节为单位)。
24.static: 声明静态变量或函数。
25.struct: 定义结构体。
26.switch: 开始switch语句。
27.typedef: 为数据类型定义一个新的名字。
28.union: 声明联合体。
29.unsigned: 声明无符号类型。
30.void: 声明函数无返回值或指针不指向任何类型。
31.volatile: 指示变量可以被意外更改,防止编译器优化。
32.while: 开始while循环。
这些是C语言中的一些关键字,它们在编程中有特殊用途,不能被用作标识符。
2、有关字符的ASCII编码注意的三个点:
A.小写字母的ASCII码值 – 32就能得到对应的大写字母的ASCII码值(小写字母的ASCII码值比对应的大写字母的ASCII码值更大的。)
B.ASCII码值从0~31 这32个字符是非打印控制字符,在界面上不显示任何东西,比如:蜂鸣、回车、换行;
C.48~57为数字,48是0,57是9;
65是大写字母A,90是大写字母Z;
97是小写字母a,122是小写字母z。
参考A概念文章
3、转义字符的使用
#includeint main(){printf("\'");return 0;}
参考A概念文章
4、关于if语句说法正确是:( C)
A.if语句后面只能跟一条语句(可以多条用花括号括起来)
B.if语句中0表示假,1表示真(非0表示真)
C.if语句是一种分支语句,可以实现单分支,也可以实现多分支
D.else语句总是和它的对齐的if语句匹配(不一定对齐但是一定要有对应匹配的if)
5、计算表达式
#include int main(){int a, b, c;a = 5;c = ++a;b = ++c, c++, ++a, a++;b += a++ + c;printf("a = %d b = %d c = %d\n:", a, b, c);return 0;}
注意:计算完成后字母的值并不是就不管了而是数值在发生变化,这里是赋值操作并不是等于。
#include int main(){int a, b, c;a = 5;c = ++a;// ++a:加给a+1,结果为6,用加完之后的结果给c赋值,因此:a = 6c = 6b = ++c, c++, ++a, a++; // 逗号表达式的优先级,最低,这里先算b=++c, b得到的是++c后的结果,b是7 // b=++c 和后边的构成逗号表达式,依次从左向右计算的。 // 表达式结束时,c++和,++a,a++会给a+2,给c加1,此时c:8,a:8,b:7b += a++ + c; // a先和c加,结果为16,在加上b的值7,比的结果为23,最后给a加1,a的值为9printf("a = %d b = %d c = %d\n:", a, b, c); // a:9, b:23, c:8return 0;}
6、EOF 指代的是 文件的结尾;
7、vs是一个强大的文本编辑器,不是集成开发环境;
Visual Studio (VS) 既可以指 Visual Studio 编程集成开发环境 (IDE),也可以指 Visual Studio Code 文本编辑器。
8、#pragmaonce 其作用是防止头文件重复引用;
9、strlen 功能是用来求字符串中字符的个数找,单个字符不包含\0,且个数不包含\0;
10、scanf() 处理数值占位符时,会⾃动过滤空白字符,包括空格、制表符、换行符等。除了 %c 以外,都会自动忽略起首的空⽩字符。如果要强制跳过字符前的空⽩字符,可以写成scanf(” %c”, &ch) ,即 %c 前加上⼀个空格,表示跳过零个或多个空⽩字符。
11、ctrl + z 可以终止多次循环输入;
while ( (语句)!= EOF) {//语句}
12、if 语句后只能执行一句语句,想要执行多条就应该用花括号括起来:
第三次刷题 2024.01.22
1、switch 语句时多分支的选择语句,如果case子项后没有跟 break 语句,则继续往下执行其他语句;
2、两个字符串是否相等不能使用 == ,应该使用 strcmp 函数;
3、做在线 oj 输出内容时可以 复制粘贴 严格防止机器判断错误;
4、进制显示前导标识符 八进制 0、十六进制 0x,有两种方式,printf 可以使用使用格式控制串“%o”、“%X”分别输出八进制整数和十六进制整数,并使用修饰符“#”控制前导显示;
int main(){//1、直接在占位符前加相对应的前导标识符printf("0%o 0X%X\n", 1234, 1234);//2、在占位符中加#printf("%#o %#X", 1234, 1234);return 0;}
5、逆置数字:利用循环拿出最后一位,并且消掉一位,然后整体输出;
int main(){int n = 0;//输入数据scanf("%d", &n);//获取每一位while (n){printf("%d", n % 10);n /= 10;//n = n / 10;}return 0;}
6、大小写转换:实现字母的大写转换为小写,多组输入输出;
注意:“ 回车 ”也是字母,所以要 “ 吸收 ” ( getchar ( ) ) 掉该字母。
int main(){int ch = 0;//循环数据输入while ((ch = getchar()) != EOF){//大写转换为小写printf("%c\n", (ch + 32));//处理多余的 \n字符getchar();}return 0;}
1、多组数据输入的问题:循环 EOF 指代文件结尾;
2、getchar 获取字符函数 要清理缓冲区的问题,所以再次调用吸收掉多余的字符;
3、getchar 返回的是ASCII码值是 int 类型,并且不需要使用输入函数。
8、乘法口诀表
9、整数的最大值
//问题:求10 个整数中最大值//思路:创建数组、遍历数组、输入整数、比较大小、进行输出int main(){int arr[10] = { 0 };for (int i = 0; i < 10; i++){scanf("%d", &arr[i]);//单个%d后不能加空格会存在缓冲区的问题造成多输入一个值}int max = arr[0];//假设arr[0]为最大值与其他剩下的进行比较for (int i = 1; i max) {max = arr[i];}}printf("max = %d\n", max);return 0;}
10、计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 – 1/100 的值,打印出结果
//问题:计算1 / 1 - 1 / 2 + 1 / 3 - 1 / 4 + 1 / 5 …… + 1 / 99 - 1 / 100 的值,打印出结果//思路:循环分数、进行求和、判断正负int main(){double sum = 0;//注意类型int flg = 1;for (int i = 1; i <= 100; i++){sum = sum + ((1.0 / i) * flg);//设计函数flg = -flg;//改正负}printf("%lf ", sum);//注意打印格式return 0;}
11、1到 100 的所有整数中出现多少个数字9(有多少个9的整数)
//问题:编写程序数一下 1到 100 的所有整数中出现多少个数字9//思路:遍历数字、取模判断9、出去一位判断9、计数int main(){int count = 0;for (int i = 1; i <= 100; i++){if (i % 10 == 9){count++;}else//这里的选择表示会出现多少个包含9的整数{ if (i / 10 == 9){count++;}}}printf("%d ", count);return 0;}
第四次刷题 2024.01.23
1、最大公约、最小公倍数;
2、数组元素一般都是下标由小到大储存,地址由低到高
3、strlen求的是字符串长度,从首元素开始计算,遇见‘\0’停止,由于数组没有’\0‘,所以数组的strlen 的结果是个随机值,但是个数可以计算为7个元素;
char acY[] = { 'a','b','c','d','e','f','g'};
4、变长数组:就是数组长度只有运行时才能确定,所以变长数组不能初始化程序可以在运行时为数组分配精确的度,因为它的⻓度取决于变量 n 的值,编译器没法事先确定,只有运⾏时才能知道 n 是多少。
5、printf
a. 返回值:输出的字符数(不包括字符串的终止符 \0);
b. %02d 格式控制符:输出数值时指定左面不使用的空位置自动填0;
scnaf
a. 多读取数字;
scanf("%d", &arr[i]);//单个%d后不能加空格会存在缓冲区的问题造成多输入一个值
7、通过移位运算实现2的n次方计算:<<(左移操作符的使用,左移一位有乘2的效果)
//针对每组输入输出对应的2的n次方的结果#include int main(){int n = 0;while (scanf("%d", &n) != EOF){printf("%d\n", 1 << n);}return 0;}
第五次刷题 2024.01.24