南哪2022-1-types-io
题单介绍
各位好呀,这里是某CQ
今天给大家带来1-types-io的练习题单~
根据types-io的题目,我们可以看出,这章主要是考察各位同学对变量类型的把控并使用变量类型及四则运算以及math.h库中的一些函数来解决较为实际的问题,所以这次我们主要的关注点是变量类型以及一些要注意的点。
首先先来列一下常见的变量类型:
```c
int Num_int;
long long Num_long_long;
float Num_float;
double Num_double;
char ch;
bool flag;
//注意,这里是随便命名,并不是某种标准的命名法,请不要参考
```
int类型:
int类型被称为32为带符号整数,它是用32个二进制位来表示的整数,同时,它的最高位用来表示符号,如果该位是1则这个数是负数。所以int类型真正用来表示数据大小的只有31位,这也就直接决定了int类型能表示的范围是-2147483648~2147483647,也就是2的31次方减去1
不要问某CQ为什么负的会多一个,他至今没有去了解过为什么。
但他写到这里的时候确实去看了,原因很简单,但不在我们的讨论范围之内
如果你确定不会出现负数,而且你想追求更大一些的表示范围的话,你可以使用unsigned int来充分利用这32位,即使它不再能表示负数。
int类型在scanf和printf里面的表示是%d
unsigned int类型在scanf和printf里面的表示是%u
long long类型:
和int实际上一样,只不过人家是64位的,比int大得多。
也有unsigned long long,很好用
long long类型在scanf和printf里面的表示是%lld
unsigned long long在scanf和printf里面的表示是%llu
关于整型变量的补充:
其实在大部分情况下,大家需要用到的还是整型变量,所以在此某CQ希望给出更多的一些小技巧。
关于存储空间:
大家可能知道,也可能不知道,二进制的8个位成一个字节,也就是1Byte,或者1B,而1024B = 1KB,而1024KB = 1MB
当我们在做题的时候,会看到题目给定的时空限制。
当我们思考一道题如何去做的时候,也不要忘了去算一算自己到底用掉了多少空间,或者花去了多少的时间(以1亿次循环为标准,超出即危险),以避免空间超限和时间超限的问题。
当然,当你拿不到完全分的时候,使用超时的算法拿部分分未尝不可。
关于溢出:
整型变量的溢出实际上比较好控制,当你超过一个整形变量能够表示的范围时,它会从它能表示范围的另一端重新开始,比如一个int变量存了2147483647,加上1就变成了-2147483648
float类型:
float类型被称为单精度浮点数,能被用来表示小数,但是表示的精度有限。
float类型在scanf和printf里面的表示是%f
double类型:
double类型被称为双精度浮点数,是我们常用的小数变量类型,能表示更多的小数位。
double类型在scanf和printf里面的表示是%lf
一些注意点:
math.h库中的函数实际上大多数的实现都是基于double的,使用float可能会出现一些精度上的问题
printf输出的一些奇技淫巧在此并不赘述。
char类型:
char类型表示一个字符,ascii码里面实际上并没有多少东西,所以实际上一个char变量只有8位,也就是1个字节,最多只能表示到255,在答疑中发现有人尝试用字符存大于255的数字,这个是值得注意的。
char类型在scanf和printf里面的表示是%c
一些注意点:
可能不少同学去记'0'、'a'、'A'的ascii值,实际上是没有必要的,比如你可以使用'0'来直接表示字符0代表的值,C语言是认识这些东西的。
当你scanf一个字符的时候,它是紧接着向后读一个字符,没错,换行符和空格也包括在内。
bool类型:
bool类型只有两种状态:0或者1,需要用到stdbool.h的库
因为存储空间占用至少是1B,所以bool类型硬生生占了1B的内存,虽然它实际上只有1bit。
bool类型因为较int占用内存更加少而常被用在一些判断中。以及地图障碍的记录。
关于getchar()和putchar():
这俩货其实根本没必要知道,和scanf%c还有printf%c实际上是一样的,尽管这俩货可能稍微快那么一点点
关于enum:
某CQ:这玩意真烂,如果你不是分不清你变量到底哪个值想表示什么东西,还真没必要用。
关于math.h
常见的数学函数,比如开根sqrt,立方根cbrt,乘方pow,对数log,绝对值abs,这些,如果想用,除了自己写,就只能借助这个库了,当然,每个函数都有属于它自己的坑(比如pow难以接受负数),在使用之前,最好先查清楚怎么用。
写出更好看的代码格式(非常重要):
一种好的代码格式,能让你的程序看上去更加清晰,检查起来好检查,也许也可以让你更有耐心地去Debug,而且别人看了至少也会觉着蛮清爽的。
下面来举一个某CQ喜欢的代码格式:
```c
#include <stdio.h>
long long solve(long long year, long long month, long long day)
{
long long a = (14ll - month) / 12ll;
long long y = year + 4800ll - a;
long long m = month + 12ll * a - 3ll;
return day + ((153ll * m + 2ll) / 5ll) + 365ll * y + y / 4ll - y / 100ll + y / 400ll - 32045;
}
int main(int argc, char *argv[])
{
long long year = read(), month = read(), day = read();
scanf("%lld%lld%lld", year, month, day);
long long a = (14ll - month) / 12ll;
long long y = year + 4800ll - a;
long long m = month + 12ll * a - 3ll;
long long ans = day + ((153ll * m + 2ll) / 5ll) + 365ll * y + y / 4ll - y / 100ll + y / 400ll - 32045;//这里写这么长的式子并不推荐
printf("%lld\n", ans);
return 0;
}
```
写出这样的代码具体改变了什么呢?
1.控制好语句块的缩进
对于附属于某一语句(比如int main()、以及之后要学到的for、if等)的内容,我们需要相对于原来的语句额外缩进一个Tab,而不是和原来那句并排写,那样只会导致更大的混乱。
灵活运用Tab制表符来让你的程序变得更美观,比如:
```c
int numA,
numA;
char ch;
long long ans;
```
2.多加空格
大家可能会问:加空格干什么用呢?
空格能让你的不少算式看上去更加分散,易于分辨哪个是哪个,同时也可以使算式看上去更加易于理解。
比如说上面那个长式子,给大家拿出来对比一下:
```c
long long ans = day + ((153ll * m + 2ll) / 5ll) + 365ll * y + y / 4ll - y / 100ll + y / 400ll - 32045;
long long ans=day+((153ll*m+2ll)/5ll)+365ll*y+y/4ll-y/100ll+y/400ll-32045;
```
区别非常明显,某CQ表示第二行代码根本不想看。
另外某CQ想要提醒下各位同学,每道题有条件可把之前的代码清空了重写,这样可以更快地提高打字速度。
某CQ知道各位同学已经学过了if和for还有while,但某CQ还是建议同学们使用当周的知识点解决问题。
1-types-io就这些,其它内容个人根据需求自己看。