新开了个目录,因为发现其他的目录似乎不太合适。就当记录自己平时的一些笔记好了,现在看晴神宝典,据说是PAT神级书,希望我甲级考高分啦!下面就是简单的记录一些自己不太知道,或者容易忘记的东西,以后也都是这样。下面记的是一些基础知识。
变量型
- int: 一个整数占32bit,取值范围大致是-210^9~210^9(-2^31~2^31-1).
- long long: 一个整数占用64bit,取值-2^63~2^63-1
- 如果long long型赋大于2^31-1的初值,则需要在初值后面加上LL,否则会编译错误。
- 对于浮点型,以后都是用double来存储。
- 小写字母比大写字母的ASCII码大32。
C的字符串常量
1
2
3
4
5
6
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);
}整型常量在赋值给布尔型变量时会自动转换成true(非零)或者false(零)
常量定义
1
2
3
4// 宏定义,符号常量
// const 常量
const double pi = 3.14;scanf(“格式控制”, 变量地址); 如scanf(“%d”, &n); 另外要注意,数组名称本身代表了这个数组第一个元素的地址,所以不需要再加取地址运算符。在scanf中,除了char数组整个输入的情况不加&s之外,其他变量类型都需要加&。
1
2char str[23] = "23 sfs fsa";
scanf("%s", str);scanf对其他格式符(如%d)的输入是以空白符(空格、Tab)为结束判断标志;字符数组使用%s读入的时候以空格跟换行为读入结束标志。另外,scanf的%c格式是可以读入空格跟换行的。以下面为例子,c为空格:
1
2
3
4
5
6
7
8
9
int main(){
int a;
char c, str[10];
scanf("%d%d%s", &a, &c, str);
printf("a=%d,c=%c,str=%s", a, c, str);
}
//输入: 1 a bcd
//输出:a=1,c= ,str=a(在我的电脑上测试,str输出乱码)scanf的double类型变量为%lf,而在printf则为%f。
三种实用的输出格式
(1) %md
%md可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐;如果变量本身超过m位,则保持原样。实例:1
2
3
4
5
6
7
8
9
10
11
12
int main(){
int a = 123, b = 1234567;
printf("%5d\n", a);
printf("%5d\n", b);
return 0;
}
/*
输出:
123 //不足5位,前面自动用两个空格填充
1234567 //大于5位,直接输出
*/
(2)%0md
和%md唯一的不同点是,当变量不足m位时,将在前面补足够数量的0而不是空格。非常实用啊!以后就可以不用判断了,比如时间等。1
2
3
4
5
6
7
8
9
10
11
12
int main(){
int a = 123, b = 1234567;
printf("%05d\n", a);
printf("%05d\n", b);
return 0;
}
/*
输出:
00123
1234567
*/
(3)%.mf
保留m位小数。如保留1位: be accurate to 1 decimal place.
继续
- getchar用来输入单个字符,putchar用来输出单个字符。另外注意,getchar()可以用来识别换行符。gets用来输入一行字符串(识别\n换行符作为输入结束,因此scanf完一个整数后,如果要使用gets,需要先用getchar接收整数后的换行符)。
- fabs(double x)用来对double型变量取绝对值,abs用于整型。
- floor(double x)和ceil(double)分别用于double型变量的向下取整和向上取整。
sin(double x), cos(double x), tan(double x)参数要求是弧度制,示例:
1
double db1 = sin(pi*45/180);
asin(double x), acos(double x), atan(double x)。
- round(double x) 代表四舍五入取整。
- switch语句
1
2
3
4
5
6
7
8
9
10switch(表达式){
case 常量表达式1:
...
break;
case 常量表达式2:
...
break;
default:
...;
}
由于case本身默认把两个case之间的内容全部作为上一个case的内容,因此不需要加大括号。
- break可强制退出switch语句和循环;continue在需要的地方临时结束循环的当前轮回,然后进入下一个轮回。
- 对数组而言,如果不赋值,则系统会随机赋值;如果赋值但没有全部赋完,则没有赋值的位置一般为0。
- 特别提醒:如果数组大小较大(大概10^6级别),则需要将其定义在主函数外面,否则会使程序异常退出。原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全部变量来自静态存储区,允许申请的空间较大。
- memset(数组名, 值, sizeof(数组名)); 建议只能赋值0或-1,如果赋值其他值,使用fill,但速度慢。
冒泡排序
算法复杂度:O(n^2)1
2
3
4
5
6
7
8
9
10
11
12
13
int main(){
int a[10] = {3,1,4,5,2};
for(int i=1; i<=4; i++){ //进行n-1趟排序
for(int j=0; j<5-i; j++){ //这里之所以是5-i,是因为到后面只需要比较前面的元素
if(a[j] > a[j+1]){
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
}