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

在这里插入图片描述

☘前言☘

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

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

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



🍭1.基础知识点

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

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


🥝1.1基础知识介绍

先来举个栗子🌰

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

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

  • 头文件
    这个示例程序中对应的部分就是#include<stdio.h>,主要是包含了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
布尔型bool0(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<stdio.h>
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<stido.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stdio.h>
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<stido.h>
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<stido.h>
#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<stdio.h>
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 && bab都真返回真
其他返回假
||a || bab都为假返回假
其他返回真
!!aa为真就返回假 a是假就返回真
🎲4.条件运算符

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

#include<stdio.h>
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 & ba 和b按二进制对齐进行按位与运算(除了同1 为1 其他都是0)
|位或a | ba和b按二进制对齐进行按位或运算(除了同0为0 其他都是1)
^异或a ^ ba 和b按二进制对齐,按位进行异或运算(同0异1)
~取反~a将a的二进制每一位进行翻转

🎱1.3 顺序结构

⚔️1.3.1 赋值表达式

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

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

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

#include<stdio.h>
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%dscanf("%d",&n);
unsigned int%uscanf("%u",&n);
long long%lldscanf("%lld",&n);
float%fscanf("%f",&fl);
double%lfscanf("%lf,&db);
char%cscanf("%c",&c);
字符串(char 数组)%sscanf("%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<stdio.h>
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<stdio.h>
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<cstdio>
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<math.h>

函数使用作用
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

  • 22
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

XingleiGao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值