写在前面
这学期选了ACM课,但平时缺乏练习,不怎么刷题,因此期末考试成绩并不理想。考虑到之后的考研复试中包含机试,且计试可以算是非常重要的印象分,因此我打算寒假刷一下算法笔记,备战3月初的PAT甲级和3月末的CCF CSP认证考试,为后续考研复习数据结构等也算是打下一个良好的基础。
学习进度记录
今日学习了算法笔记的章节2 C/C++快速入门与章节3 入门------简单模拟(1)的部分内容,本来打算略过章节2的部分,但是想到ACM课考试的时候,就曾经有一道题因缺乏对基础C语言知识的了解做不出来,觉得还是有必要学习一下。
章节3的内容今日还未完结,打算明天刷完之后再发完整的刷题日记。
C/C++ 查漏补缺笔记
定义变量
1.int a,b=-1
是正确的语法
int与long long
- int的数据在10^9以内
- long long的数据范围在2147483647内,一般超过10^10就需要long long类型
对于浮点型,记住一点,不要使用float,都用double存储
char类型的数据
- 小写字母的ASCII码值比大写字母的ASCII码值大32
强制类型转换(新类型名)变量名
宏定义的格式
#define pi 3.14
scanf
-
格式
scanf("格式控制",变量地址);
| int | %d |
| --- | --- |
| long long | %lld |
| double | %lf |
| char | %c |
| 字符串(char数组) | %s |
-
除了%c,scanf对其他格式符的输入是以空白符(即空格、换行等)为结束判断标志
-
%c可以读入空格和换行
-
%s读入以空格和换行为读入结束的标志
printf
-
格式
printf("格式控制",变量名称);
| int | %d |
| --- | --- |
| long long | %lld |
| double | %f |
| char | %c |
| 字符串(char数组) | %s |
-
实用的输出格式
- %md,int型变量m位右对齐输出,高位空格补齐
- %0md,高位0补齐
- %.mf,浮点数保留m位小数输出
getchar putchar
-
getchar输入单个字符,putchar输出单个字符
-
getchar可以接收换行符和空白符
c1=getchar();
getchar();
常用<math.h>函数
- fabs
- floor向下取整 ceil向上取整
- sqrt取平方根
- pow(r,p),返回r^p
- round用于将double型变量四舍五入,round原型
return (int)(x+0.5)
,浮点数四舍五入需先*10/100/1000再round再/10/100/1000
数组
- 如果数组大小较大,如10^6级别,需要在主函数外定义,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小,而函数外部申请的全局变量来自静态存储区,允许申请的空间较大。
memset
- 格式
memset(数组名,值,sizeof(数组名));
- 头文件
<string.h>
- memset按字节赋值,对每个字节赋一样的值,因此一般赋值0或-1
!!字符数组
1.字符数组的初始化
- 初始化方式一:
char arr[2]={'h','e'};
- 初始化方式二:
char arr[]="hello";
,但以字符串方式赋值数组仅限于初始化 - 比较两种方式:初始化方式一的数组长度是2,初始化方式二的数组长度是6,字符串的结尾用
'\0'
作为结束符,占用1 bit
2.字符数组的输入输出
- 方式一:scanf输入,printf输出
scanf("%s",str[i]);
printf("%s",str[i]);
- scanf方式输入的时候会自动在数组中加入
'\0'
作为字符串的结束标记,并占用一个字符位 - printf通过识别
'\0'
作为字符串的结尾输出
- 方式二:getchar输入,putchar输出
- 方式三:gets输入,puts输出
- gets用于输入字符数组
- 需要注意的是gets识别换行符号,但可以接收空白符
- 如果用gets接收数组前有输入换行符,需要先使用getchar
- gets方式会自动在数组中加入
'\0'
作为字符串的结束标记,并占用一个字符位
- puts用于输出字符数组,并同时输出换行符
- puts通过识别
'\0'
作为字符串的结尾输出
- gets用于输入字符数组
3.特别提醒,如果不是使用scanf或gets方式输入数组,需要在每个字符串输入后,手动加入'\0'
,使得printf和puts能够正确识别字符串末尾,防止输出乱码
sscanf与sprintf string+scanf/printf
1.sscanf格式sscanf(str,"%d",&n)
,和scanf一样,从左往右传递元素
2.sprintf格式sprintf(str,"%d",n)
,和printf一样,从右往左传递元素
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char str[50];
cin.getline(str,50);
int a,b,c;
if(sscanf(str,"%d is greater than %d",&a,&b)==2){
if(a>b) printf("Yes");
else printf("No");
}else{
if(sscanf(str,"%d is equal to %d plus %d",&a,&b,&c)==3){
if(a==(b+c)) printf("Yes");
else printf("No");
}else{
printf("???");
}
}
return 0;
}
#include <iostream>
#include <string.h>
using namespace std;
int main(){
char str[50];
int a,b,c,d,e,f;
scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
sprintf(str,"%04d-%02d-%02d %02d:%02d:%02d",a,b,c,d,e,f);
puts(str);
return 0;
}
指针 引用
1.指针指向变量所在的位置
2.指针的定义int *p1,*p2;``int *p1,p2;
前者定义2个指针,后者定义1个指针
3.指针赋值int* a=&b;
,指针作为函数参数fun(int* a)
4.C++中的引用func(int &a)
结构体
1.结构体的定义与结构体变量的定义
-
需要注意的是结构体变量的定义,可以在结构体的定义之后,也可以单独采用
结构体名 变量名
的方式定义 -
结构体内不能定义自己,但可以定义自己的指针,下面是典型的结构体代码示例。
struct student{
int age;
student* stu;
}Alice,Bob,stuList[100];
student Alice;
2.结构体的访问
student Alice;
student* Bob;
Alice.age;
Bob->age;/(*Bob).age
cin与cout
1.cin与cout在考试中并不推荐,容易超时,只有在必要的时候才会使用,如对于string的处理
2.读入一整行,针对char str[50]
数组,采用cin.getline(str,50)
;针对string
容器,采用getline(cin,str)
,getline可以读入空格,但是不读入空行,且属于自动忽略的类型,且它会自动忽略行尾的空格
== eps取1e-8
(fabs((a-b))<1e-8)
判断相等
复杂度
1.O(n^2)
的算法当n为100000的时候,会超出OJ系统的承受能力