算法笔记刷题日记——Day1 C_C++在ACM中的常用语法

写在前面

这学期选了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();

常用函数

  • 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(数组名));
  • 头文件
  • 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'作为字符串的结尾输出

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 
#include 
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 
#include 
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系统的承受能力

你可能感兴趣的:(ACM算法笔记,算法,笔记,c语言)