C++ 语法笔记

1 输入输出

1.1 注意事项

  • 一个.cpp文件,最好不要 printf 和 cout 交杂,要么全用C,要么全用C++
  • 除了string的输入用cin外,其余任何都用scanf、printf
  • 涉及浮点数,都用double

1.2 输入:c

#include<cstdio>

输入 停止符(不能读) 可读 输出 举例
scanf 空格、/n 当读入%c,可读空白(空格、/n、/t) printf
getchar 读一个字符【任何】 putchar char ch;
ch = getchar();
putchar(ch);
gets \n 读一行char数组【可读 空格,不读 \n】 puts char chs[10];
gets(chs);
puts(chs);
// 用getchar 输入字符串数组
char str[20];
for(int i=0;i<5;i++){
	str[i] = getchar();
}
str[5] = '\0';  		// 关键

1.3 输入:c ++

#include<iostream>

输入 停止符(不能读) 可读 输出 举例
cin>>xxx>>… 空格、/n cout<<xxx<<…
getline /n 读一行char数组 或 string【可读 空格,不读 \n】 char chs[10]; string str;
cin.getline(chs,10);
getline(cin, str);
int a;
char b[20];
double db;
string str;
cin>>a>>b>>db>>str;
cout<<a<<endl<<b<<endl<<setiosflags(ios::fixed)<<setprecision(2)<<db<<endl<<str<<endl;
//
cin.getline(b,5); //只能读4个+\0
cout<<b<<endl;
getline(cin,str);
cout<<str<<endl;

1.4 scanf / printf

#include<cstdio>
#include<iostream>
#include<cmath>

using namespace std;

const double PI = acos(-1.0);
const int INF = 0x3fffffff;     //无穷大, 7个f

int main(){
	int a;
	scanf("%d",&a);
	printf("%d",a);
	printf("%6d",a);        // 右对齐,不足6位的补空格
	printf("%06d",a);       // 右对齐,不足6位的补0

	long long b;
	scanf("%lld",&b);
	printf("%lld",b);       // 保留小数

	char c;
	scanf("%c",&c); 	    // 可读空白(空格、/n、/t)
	printf("%c",c);

	double d;
	scanf("%lf",&d);	    // %lf
	printf("%f",d);
	printf("%.2f",d);


	char s[20];
	scanf("%s",s);          // 没有 &
	printf("%s",s);


	string str;
	cin>>str;
	printf("%s",str.c_str());

	return 0;
}

2 条件、数组

2.1 if

if(n){		// n != 0
	... 
} 
If(!n){		// n == 0
	... 
}

2.2 switch

int a = 1 , b=1;
int c = 5;
switch(c){
	case 2:
	case 3:
	case 4:
		printf("%d",a+b);       //c=2 || c=3 || c=4
		break;
	case 5:
		printf("%d",a-b);
		break;
	default:
		printf("end");
}

2.3 数组

二维初始化:

int arr[3][6] = {{1,2,3},{},{4,5}};

当数组较大(10610^6)时, 设置全局变量


3 指针

unsigned类型的整数

3.1 指针变量

搞懂以下代码

int a;
int *b = &a;	            // b指向a,*b = a的值(内容),b = a的地址
a = 111;
printf("%d %d\n",*b,b);
//
*b = 222;                   // 改变a
printf("%d %d\n",*b,a);
//
b ++;                       // 跨越了一个int存储单元(4B)
printf("%d\n",b);

3.2 指针数组

int a[5];
for(int i=0; i<5; i++){
	scanf("%d",a+i);            // 相当于 scanf("%d", &a[i]);
}
for(int i=0;i<5;i++){
	printf("%d ",*(a+i));       // 相当于 printf("%d ",a[i]);
}
//
int *p;
p = a;			                //相当于 p = &a[0];
for(; p<a+5; p++){
	scanf("%d", p);
}
for(p=a; p<a+5; p++){
	printf("%d ",*p);
}


4 函数

4.1 传递参数:变量

一共有5种情形,对应如下5个swap函数

// 不改变main中变量(函数中的变量是main中的副本)
void swap1(int a, int b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

//引用:改变main中的变量(函数中的变量是main中的别名)
void swap2(int &a, int &b){
	int temp;
	temp = a;
	a = b;
	b = temp;
}

// 地址传值/指针传值:改变main中的变量
void swap3(int * a, int * b){
	int temp;			// int *temp;
	temp = *a;			// *temp = *a;  运行错误,理由:temp未初始化,存放随机
	*a = *b;
	*b = temp;
}

// 不改变main中变量
void swap4(int * a, int * b){	
	int *temp;
	temp = p;
	p = q;
	q = temp;
}

// 指针引用:不改变main中变量
void swap5(int * &p, int * &q){	
	int *temp;
	temp = p;
	p = q;
	q = temp;
}

int main(){
	int a=1, b=2;
	swap1(a, b);
	swap2(a, b);		// 交换
	swap3(&a, &b);		// 交换
	swap4(&a, &b);	
	int *p = &a, *q = &b;
	swap5(p, q);
	return 0;
}

4.2 传递参数:数组

void fun(int a[], int b[][3]){
	...
}

int main(){
	int a[10];
	int b[5][3];
	fun(a, b);
	return 0;
}

5 其他

5.1 int / long long(空间大小)、OJ最大运算次数(时间大小)

一般比赛平台,最大运算次数:10710^7

类型 位数 可表示范围
int 32 231-2^{31}2109-2*10^9) ~~~ 23112^{31}-121092*10^9
long long 64 263-2^{63}91018-9*10^{18}) ~~~ 26312^{63}-1910189*10^{18}

总结:

  • x <= 10910^9 或 32位,用int
  • x <= 101810^{18} 或 64位,用long long

5.2 ASCII码

小写 = 大写 + 32

字符 ASCII码
‘0’ 48
‘A’ 65
‘a’ 97
char c = 117;
printf("%c",c);
char c = '9';
printf("%d",c);

5.3 数据类型的转换

  1. char*(字符串数组)<——> int、double、 char*(字符串数组)
    sscanf()和sprintf()
    详情见:此文章:3 cstring

  2. char*(字符串数组) <——> string
    详情见:此文章:2 string

  3. int <——> double
    int a; double db; a = (int)db; db = (double)a;

5.4 逻辑运算符

类型 代码
&&
||
!
位与 a & b
位或 a | b
位异或 a ^ b
取反 ~ a

1左移8位:
1<<8 = 282^{8}

5. 5 条件运算符

int max(int a, int b){
	return a>b?a:b ;
}

5.6 typedef

当复杂数据类型出现太多,起别名

typedef 数据类型 别名
如:typedef long long LL;

#include<cstdio>
using namespace std;

typedef long long LL;  

int main(){
	LL a = 23LL;
	printf("%lld",a);
	return 0;
}

5.7 浮点数的比较

#include<cstdio>
#include<cmath>

using namespace std;

const double eps = 1e-8;                            // 1*10^(-8)

// define中定义的函数:变量带(),返回bool
#define Equ(a,b) ( (fabs((a)-(b))) < (eps))         // a==b:  b-eps< a <b+eps
#define More(a,b) ( ((a)-(b)) > (eps))              // a>b:   a > b+eps
#define Less(a,b) ( ((a)-(b)) < (-eps))             // a<b:   a < b-eps
#define MoreEqu(a,b) ( ((a)-(b)) > (-eps))          // a>=b:  a > b-eps
#define LessEqu(a,b) ( ((a)-(b)) > (eps))           // a<=b:  a < b+eps

int main(){
	double db1 = 4 * asin(sqrt(2.0)/2);      // 4 * pi/4
	double db2 = 3 * asin(sqrt(3.0)/2);	     // 3 * pi/3
	// 浮点数的比较
	printf("%d\n",db1==db2);                // 不精确
	printf("%d\n",Equ(db1,db2));            // 精确

	// 修正
	double res = -0.00;                     //某个结果
    printf("%f\n",res+eps);                 // 修正

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章