《算法笔记知识点记录》第二章——快速入门1[数据类型和顺序结构]

☘前言☘

今天是我开坑的第一天,不知道今天会有多少人陪我一起233。
今天会介绍很多基础知识,信息量会有亿点点大,所以如果我有哪些没有讲清楚的,欢迎大家联系我,你提出的问题是我修改完善的基础,万分感谢。

  • 欢迎大家加入我的打卡队列,如果你刷完了对你有帮助请你评论一个打卡。
  • 如果你觉得这本书有用的话还希望多多支持作者。
    欢迎大家一键三连0.0

作者简介:一个从工业设计改行学嵌入式的年轻人
✨联系方式:2201891280(QQ)
源码地址:https://gitee.com/xingleigao/algorithm-notes
全文大约阅读时间: 120min


主要目录

  • ☘前言☘
  • 1.基础知识点
    • 1.1基础知识介绍
    • 1.2 基本数据类型
      • 1.2.1 变量定义
      • 1.2.2变量类型范围
        • 1.整型
        • 2.浮点数
        • 3.字符型
        • 2.转义字符
        • 3.字符串常量
        • 4. 布尔型
      • 1.2.3 强制类型转换
      • ⚽️1.2.4符号常量和const常量
      • 1.2.5运算符
        • 1.算数运算符
        • 2.关系运算符
        • 3.三种逻辑运算符
        • 4.条件运算符
        • ✈️5.位运算符
    • 1.3 顺序结构
      • ⚔️1.3.1 赋值表达式
      • 1.3.2使用scanf和printf进行输入输出
        • ⌨️1.scanf函数的使用
        • 2.printf函数的使用
      • 1.3.3 使用getchar和putchar输入/输出字符
      • ⚖️1.3.4 注释
      • 1.3.5 typedef
      • 1.3.6常用math函数
  • 课后习题
  • ❤️写在最后


1.基础知识点

  • 这部分主要是给没有学习过c语言或者c语言相对薄弱的人查缺补漏用的,大家如果觉得已经熟悉了相关内容可以进行跳过。
  • 这部分主要以c语言为基础,用到了一点c++的语法,在机试中c语法用的还是非常多的,c++虽然有很多好的特性,但是cin和cout的输入输出实在不适合用来写机试程序,如果大家有c++基础转变也是非常小的。

那我们废话不多说,开始今天的学习吧。


1.1基础知识介绍

先来举个栗子

#include 
int main(){
    int a, b;
    scanf("%d%d", &a, &b);
    printf("%d", a + b);
    return 0;
}

可以看到主要包含几个部分

  • 头文件
    这个示例程序中对应的部分就是#include,主要是包含了stdio(标准输入输出),这里面定义了scanfprintf等函数,在用到对应函数的时候一定要注意头文件的包含。
  • 主函数 也就是int main(){...return 0;},每个程序都有且只有一个主函数,在程序开始的时候就会执行对应的主函数。

之后所有的文件请保存为.cpp,选择提交的语言选择C++、G++,反正C++兼容C,为了不必要的麻烦,请通通选择使用c++提交!!!

1.2 基本数据类型

1.2.1 变量定义

主要运用的格式如下

变量类型 变量名 = 初始值;

其中变量名不能随意选取,有以下规则

  1. 不能是C语言标识符(for、if、or),并且也不能是已经定义的函数名称(printf、scanf)等。建议选择有实际意义便于理解的名称。
  2. 第一个字符必须是字母或者下划线,所以abc、_abc是合法的,但是6abc编译器会报错。
  3. 变量是区分大小写的,ZUIzUI是两个不同的变量名。

1.2.2变量类型范围

四中基本数据类型

类型 取值范围 大致范围
整型 int -2147483638~2147483647
(即-2^31~+(2^31-1))
-2x10^9~2x10^9
long long -2^63~+(2^63 - 1) -9x10^18~9x10^18
浮点型 float -2^128~+2^128
(精度6~7位)
实际精度6~7位
double -2^1024~+2^1024
(精度15~16位)
实际精度15~16位
字符型 char -128~+127 -128~+127
布尔型 bool 0(false) 1(true) 0 or 1

1.整型

整型一般分为三种类型 短整型(short)、整型(int)、长整型(long long),由于短整型基本不用所以就不介绍了,下面主要介绍下整型和长整型。

1.1 整型int

一个整型占用32bit(32位),也即4Byte(4字节),取值范围是-231~+(231 -1)。这个范围记住也没啥感觉,所以绝对值在109范围内的整数都可以定义为int型。

int num;
int num = 10;

1.2长整型 long long

一个长整型来说,一个整数占用64bit,也即8Byte(8字节),取值范围一般是-263~(263-1),如果题目要求取值范围超过2147483647(231-1),就需要long long来存储。

long long bignum;
long long bignum = 1234567890123456LL;

如果long long赋值初始大于231-1需要在后面加LL,否则编译器报错。

上面说的每个整型变量都可以在前面加unsigned前缀修饰,占用的位数相同,但是正数的表示范围扩大了一倍。
下面给出一个栗子

#include
int mian(){
	int a = 1, b = 2;
	printf("%d",a + b);
	return 0;
}

这段程序初始化了a、b两个整型变量并给出了初始值,结果就是3,就是打印出了a+b的值,关于%d会在后面进行更详细的介绍,现有个印象就好了。
最后,整型就是看到109以内或者32位整数就用int,否则用long long。

2.浮点数

简单来说,所谓的浮点数就是小数,一般分为单精度(float)和双精度(double)。

1.单精度float

一个浮点数占用32bit,其中1bit符号位,8bit指数位,23位尾数。可以存放浮点数的范围是-2128~ 2128,但是有效精度只有6 ~ 7位,所以用的不多其实。

float f1;
float f1 = 3.14;

2.双精度double

一个浮点数占用64bit,其中1bit作为符号位,11位指数位,52bit作为尾数,可以存放的范围是-21024~ 21024,比float运用广泛很多,有效精度是15~16位

double db;
double db = 3.1415926536;

一个栗子

#include
int mian{
	double a = 3.14, b = 0.12;
	double c = a + b;
	printf("%f",c);
	return 0;
}

不要使用float,遇到浮点数都使用double。

3.字符型

1.字符变量和字符常量

char c;
char c = 'e';

其中'e'就叫做字符常量,如何理解呢?我们整数赋值时候int c = 5;,其中的5就是个常量,而这里也是这样可以认为他就是一个固定的值,其实事实也是它确实是一个计算机内定义好的一个值。如果感兴趣的可以查看一下ASCII码表,里面有所有的char类型对应的值和字符,其中有一部分可以显示出来的叫做显示字符,无法显示出来的是作为控制字符使用。

  1. 要记住的就是小写字母比大写字母的ASCII值大32即可,其中' '对应的ASCII码刚好就是32(你说你看不见?就是空格嘛0.0)
  2. 字符常量在使用的时候一定要用''引号引起来,不然的话就会解释为一个变量名。

一起看个栗子

#include
int main{
	char c1 = 'z', c2 = 'j', c3 = 117;
	printf("%c%c%c",c1 , c2  ,c3);
	return 0
}

最终的输出就是zju,'u'对应的ASCII码值就是117,是不是很有趣。

2.转义字符

上面提到有些字符是非显示字符,称为控制字符。
我们需要掌握的两个最重要的字符是:

  • \n代表了换行,就是我们平常使用的回车就会输入这个。
  • \0代表了空字符,这个一般用来当做字符串的末尾,一般是0,但是也看机器的定义。(注意这不是空格!!!)

举个栗子

#include
int main(){
	int num1 = 1,num2 = 2;
	printf("%d\n\n%d", num1, num2);
	printf("%c", 7);
	return 0;
}

输出结果就是
1


2
其中7并没有打印任何信息,其实是一个控制播放声音的,所以电脑会响一下吧?是吧是吧?

3.字符串常量

C语言内并没有对应的字符串,所谓的字符串就是若干字符组成的串,所以做法就是用多个字符来保存字符串。上面提到的字符常量是''来引用,那么字符串常量就是""来引用的。有没有发现printf里面的那一串其实就是一个字符串0.0。字符串常量可以作为初始值赋给字符数组,用%s输出
举个栗子

#include
int main(){
	char str1[25] = "wo ai de ren bu ai wo";
	char str2[25] = "so sad a story it is";
	printf("%s, %s", str1, str2);
	return 0;
}

输出结果:wo ai de ren bu ai wo, so sad a story it is.
其实上面的char组成的集合就称为字符串数组,可以直接%s输出。
不能吧字符串常量赋值给字符串变量。(类型不一致)

4. 布尔型

在C++中布尔类型可以直接使用,但是**在C语言中,必须添加stdbool.h头文件才能使用。整型常量赋值给布尔型时会自动转化为true(非零),false(零)
特别注意这里是非零 正数负数都会转化为true!!!
看个栗子

#include
int main(){
	bool falg1 = 0, flag2 = true;
	int a = 1, b = 1;
	printf("%d %d %d\n", flag1, flag2, a==b);
	return 0;
}

结果就是:0 1 1
前两个很好理解,后面就是判断a是否和b相等,相等就是true否则是false。

1.2.3 强制类型转换

有时候需要把一种数据类型转换成另外一种数据类型。
(新类型名)变量名
这样就完成了一次强制类型转换。
举个栗子

#include
int main(){
	double r = 12.56;
	int a = 3, b = 5;
	printf("%d\n", (int)r);
	printf("%d\n", a / b);
	printf("%.1f", (double)a / (double)b;
	return 0;
}

输出结果:12 0 0.6
可以看到整除就是整数,而转化为浮点数就能得到浮点的结果0.0

⚽️1.2.4符号常量和const常量

符号常量

符号常量通俗的讲,就是替换,即用一个标识符来代替常量,又称为宏定义或者宏替换,基本的格式如下:
#define 标识符 常量
例如:

#include
#define pi 3.14
int main(){
	double r = 3;
	printf("%.2f\n", pi * r * r);
	return 0;
}

执行结果就是28.26。这里就是把pi替换为了3.14

const常量

const定义的常量是只读,这片区域定义的值不允许修改。基本格式如下:
const 数据类型 变量名 = 常量;
一个栗子

#include
const pi = 3.14;
int main(){
	double r = 3;
	printf("%.2f\n", 2 * pi * r);
	return 0;
}

输出结果18.84

这两个写法都是对的,但是一般更推荐用const的写法,因为define可以定义很多神奇的表达式,它本质就是替换而已,可能会引起错误!!

1.2.5运算符

1.算数运算符

运算符 功能
+ 加法运算符 返回前后两个数字相加
- 减法运算符 返回前后两个数字相减
* 乘法运算符 返回前后两个数字相乘
/ 除法运算符 返回前后两个数字相除(注意数据类型)
% 取模运算符 返回前一个数字除以后面数字的余数
++ 自增运算符 另一个变量增加1
- - 自减运算符 另一个变量减少1

自增和自减有++ii++的区别,我们只要记住,谁在前面谁先参与运算就好了++i中++在前面 所以先++,而i++中i在前面 所以i会返回值是i。

2.关系运算符

运算符 含义 语法
< 小于 a < b
> 大于 a > b
<= 小于等于 a <= b
>= 大于等于 a >= b
== 等于 a == b
!= 不等于 a != b

以上运算符都是成立的时候返回true,不成立返回false

3.三种逻辑运算符

运算符 含义 语法 返回值
&& a && b ab都真返回真
其他返回假
|| a || b ab都为假返回假
其他返回真
! !a a为真就返回假 a是假就返回真

4.条件运算符

条件运算符是c于艳丽唯一的三目运算符。
A ? B : C;含义就是当A为真的时候执行并返回B 否则,执行并返回C
举个栗子

#include
int main(){
	int a = 3, b = 5;
	int c = a > b ? 7 : 11;
	printf("%d\n",c);
	return 0;

返回结果就是11。因为a>b为假 所以返回后面那个值。
这个最常见的应用是求最大值a > b ? a : b;返回的值就是a、b中较大的那一个。

✈️5.位运算符

运算符 含义 语法 效果
<< 左移 a << x 整数a按二进制位左移x位
>> 右移 a >> x 整数a按二进制位右移x位
& 位与 a & b a 和b按二进制对齐进行按位与运算(除了同1 为1 其他都是0)
| 位或 a | b a和b按二进制对齐进行按位或运算(除了同0为0 其他都是1)
^ 异或 a ^ b a 和b按二进制对齐,按位进行异或运算(同0异1)
~ 取反 ~a 将a的二进制每一位进行翻转

1.3 顺序结构

⚔️1.3.1 赋值表达式

在C语言可以使用=实现赋值操作

int n = 5;
n = 6;
n = m = 5;

赋值运算符可以通过将其他运算符放在前面实现赋值操作的简化。
注意一个点:赋值符号是从后往前看的,比如最后一个就是把5赋值给m,然后再把m的值赋给n。
最后一个栗子结束

#include
int main(){
	int n = 12, m = 3;
	n /= m + 1;	//与n = n / (m + 1) 一样
	m %= 2;	//与m = m % 2一样
	printf("%d %d\n", n , m);
	return 0;
}

输出结果:3 1

1.3.2使用scanf和printf进行输入输出

⌨️1.scanf函数的使用

scanf是输入函数,格式为:scanf("格式控制",变量地址);
举个栗子:scanf("%d",&n);
%d(格式符号)代表读入一个整数,然后将这个整数保存到n里面。(&为取值符号),这里记住scanf需要的是一个地址就好,之后在指针的时候我会再说这里。
那么常见的格式符号还有哪些呢?

数据类型 格式符 举例
int %d scanf("%d",&n);
unsigned int %u scanf("%u",&n);
long long %lld scanf("%lld",&n);
float %f scanf("%f",&fl);
double %lf scanf("%lf,&db);
char %c scanf("%c",&c);
字符串(char 数组) %s scanf("%s",str);

可以发现字符串没有取址,是因为数组本来就是一个首地址0.0(看不懂先有个印象吧,还会讲)

其实如果需要读入16:20:20这种形式的数据怎么办呢?
scanf("%d:%d:%d",&a,&b,&c)就好了,其实就是去对比原本的输入,读到对应的数据就进行拆分。
另外,scanf读入整型和浮点型都是以空格或者回车作为结束符的。
但是%c是可以读入空格和回车的,所以读入的时候需要注意。后面再说

2.printf函数的使用

printf的基础格式为printf("格式控制",变量名称);
其实和scanf的运用很类似,需要注意的有两个点

  1. double的输出格式为%f, 输入格式位%lf。
  2. printf给出的是变量的名称,不需要给出地址 不需要&!!!

三种实用的输出格式
%md

主要用于整数的输出,当不足m位的时候右对齐输出,高位补空格。
eg.printf("%2d",n);

%0md

主要用于整数的输出,这次不足的时候使用0进行高位的填充。
eg.printf("%05d",n);

%.mf

保留xx位小数,就是这个的功能。
eg.printf("%.5f",fl);

1.3.3 使用getchar和putchar输入/输出字符

直接看一个例子吧

#include
int main(){
	char c1, c2, c3;
	c1 = getchar();
	getchar();
	c2 = getchar();
	c3 = getchar();
	putchar(c1);
	putchar(c2);
	putchar(c3);
	return 0;

输入数据:abcd,输出数据:acd
是不是很简单,但是要注意getchar可以接收空格和回车,偶尔比scanf好用一些。

⚖️1.3.4 注释

1.使用/**/注释

这两个符号之间的都会被注释掉。

#include
int main(){
	int a, b;
	scanf("%d%d",&a,&b);
	/*a++;
	b++;
	a = a * 2; */
	printf("%d %d",a,b);
	return 0;
}

2.使用//注释

这个符号的作用只能注释掉一行,很常用,就不举例了0.0

1.3.5 typedef

typedef是一个很有用的小零件。基本语法:typedef 任意量 一个名字
主要作用就是重命名。最常见的运用在结构体,因为结构体的名字太长了不好写,233
举个

#include
typedef long long LL;
int main(){
	LL a = 123456789012345LL, b = 1234567890123456LL;
	printf("%lld",a+b);
	return 0;
}

其中数字后面的LL只是代表这个是个长整型常量,不记得往上翻0.0.

1.3.6常用math函数

有些函数是已经有库的,我们没必要再自己写,我这里记录一部分,需要用到这些,一定要记得引用math库#include

函数使用 作用
fab(double x) 返回一个数的绝对值(返回类型为浮点数)
floor(double x) ceil(double x) 分别对应向上取整和向下取整
sqrt(double x) 返回算数平方根(浮点数)
log(double x) 返回ln(x)的值(浮点数)
sin(double x) cos(double x) tan(double x) 返回对应的三角函数值
asin(double x) acos(double x) atan(double x) 返回对应的反三角函数
round(double x) 用于四舍五入 返回的是double

课后习题

等下要去试试一个竞赛,所以先放题,晚上我放题解,太多了,,失策了-.-大家写完还希望给个打卡0.0

题目
http://codeup.hustoj.com/contest.php?cid=100000566

题解在这里:https://blog.csdn.net/qq_17593855/article/details/121881267


❤️写在最后

我发现一天完不成一章的任务,只能慢慢写了,这本书估计要刷两个月,希望大家能跟我一起呀0.0
如果觉得有用还请给个三连,更有写的动力0.0

你可能感兴趣的:(《算法笔记》记录,算法,c语言,开发语言)