用书:
《算法笔记》–胡凡 曾磊
轻便编译器:
Dev-C++ , C-Free , CodeBlocks
在线评测系统
C/C++快速入门
- 不要同时在一个程序中使用cout 和 printf,有时候会出现问题。
- 保存.cpp文件
- #include<string.h> 和#include< cstring>等价
变量
- 变量名第一个字符必须是字母或者下划线,除了第一个字符以外的其他字符必须是字母,数字或下划线。
- 32位整数, 整型int,10^9范围内整数均可以表示int型。
- 64位整数长整型long long ,10^18范围内。%lld
- 碰到浮点型均使用double存储。输出格式 %lf,%.1lf保留一位小数输出
- ASCII码:
0~ 9:48~57
A~Z:65 ~90
a~z:97 ~122,小写比大写大32。 - C语言只有字符数组,C++有string类型
运算符
- 条件运算符:A ?B:C;
- 位运算符,用的少。
输入输出
int a;
double b;
scanf("%d",&a);
scanf("%llf",&b);
printf("%f",b);
- 除了数组前面不加&(数组名本身表示数组第一个元素的地址),其他都要加。
- 字符数组使用**%s读入的时候以空格跟换行作为读入结束的标志。**
- %c是可以读入空格和换行的。
- double的输出和输入,一个是%f,一个是%lf。
- 想输出%或者\,printf("%%");或者printf("\");
- %md及%0md。
- %.mf,输出保留m位小数。
- getchar()可以识别换行符。
- gets用来输入一行字符串,识别换行符作为结束。
10.puts用来输出一行字符串,并紧跟一个换行。
typedef
typedef起别名:
例如:typedef long long LL;
LL a = 123456789012345;
math函数
- fabs(double x):取绝对值。
- floor(double x):向下取整。
- ceil(double x):向上取整。
- pow(double r,double p):返回r的p次方。
- sqrt(double x)。
- log(double x):底为e。
- sin(double x),cos(double x),tan(double x)。
- asin(double x),acos(double x),atan(double x);
- round(double x):四舍五入。
选择语句
- if(m)等价于 if(m!=0)
- if(!m)等价于if(m==0)
switch (表达式){
case 常量表达式1:
...
break;
case 常量表达式2:
...
break;
...
default:
...
}
数组
数组一开始没有赋值,数组中的每个元素可能是一个随机数,并不一定赋值为0;下面才是将每个元素赋值为0:
int a[10] = {0};
int a[10] = {};
memset--对数组中每个元素夫相同的初始值。
#include<string.h>
memset(数组名,值(建议0或者-1),sizeof(数组名));
数组如果较大,定义在主函数外面。
gets或者scanf输入一维数组的末尾都有一个空字符\0,它的ASCII码为0,即空字符NULL,占用一个字符位。因此,字符数组的长度要比实际存储字符串的长度至少多1.
冒泡排序思想
string.h头文件
- strlen():得到字符数组\0前的字符个数。
- strcmp(A,B):(比较A>B?)返回两个字符串大小比较结果。小于返回负整数,不一定为-1,等于返回0,大于反悔正整数,不一定1.
- strcpy(A,B):把一个字符串B复制给另一个字符串A。
- strcat(A,B):将B接到A后面。
sscanf与sprintf
- 均处于stdio.h头文件下面。
#inclcud<sdtio.h>
int main(){
int n;
char str[100] = "123";
sscanf(str,"%d",&n);//将字符数组str中的内容以%d的格式写到n中。
printf("%d\n",n); //输出123.
int m = 233;
char str1[100];
sprintf(str1,"%d",n);//将n以%d的格式写入str字符数组中
printf("%s\n",str1);
}
函数
- main函数返回0的意义在于告知系统程序正常终止。
- 数组作为函数参数:一维数组不需要填写长度,二位数组需要填写第二维长度。数组作为参数时,在汉书中对数组元素的修改等同于对原数组的修改。
- 数组不允许作为返回类型出现。
指针
int a;
&a:取整型变量a的地址。
指针变量:int *p = &a;用来存放指针。
int*为一种类型(*号是类型的一部分),&a赋给p,而*p可以得到变量a的值。
p+1:下一个int类型变量,跨越了整个int(4Byte).
int*只能表示存储int类型数据的地址。存放double型或者char型,需要使用double*或者char*。
int *p1,p2;其中p1存放指针,p2为int类型;
int *p1,*p2;均为指针类型
对于数组a[10];
a == &a[0];//true
scanf("%d",a+i);//a+i表示a[i]的地址,取数a[i] = *(a+i).
两个int型指针相减,等价于求两个指针之间差了几个int。
指针作为参数传递,内外变量值都会变。
C++中的引用
如下:
void change(int &x){
x = 1;//这里内外的x均变为1.
}
结构体
结构体里面不能定义本身,但可以定义自身类型的指针变量。
struct stuInfo{
int id;
char gender
stuInfo *next;
//构造函数初始化
stuInfo(int _id,char _gener){
id = _id;
gender = _gender;
}
//默认构造函数
stuinfo(){}
//或者简化构造函数为一行
stuInfo(int _id,char _gender):id(_id),gender(_gender){}
}stu,*p;
stu.id;
(*p).id;
p->id;
stuInfo stu = stuInfo(100,'M');
cin与cout
除了string类型,尽量使用printf以及scanf。
#include<iostream>
using namespace std;
int n;
cin>>n;//不需要指定格式
double x;
cin>>x;
char str[100];
cin.getline(str);//读入一整行
string str;
getline(cin,str);
cout<<n<<endl;//endl表示换行,“\n”也ok
浮点数比较——修正误差
const double eps = 1e-8;
double a,b;
//1-----相等
fabs(a-b)<eps;//区间内,表示两浮点数相等
//2-----大于
a-b > eps'
//3-----小于
a-b < -eps;
//4-----大于等于
a - b > -eps;
//5-----小于等于
a - b < eps;
const double Pi = acos(-1.0);//圆周率
单点测试及多点测试
单点测试:通过多少组数据,就得到多少分
多点测试:通过全部数据,才得分。
EOF表示end if file,表示-1;
while(scanf("%d",&n)!=EOF){
...
}
while(gets(str)!=NULL){
...
}