一:基础知识
-
整型
(1) int: 4字节,32位,绝对值在 1 0 9 10^9 109范围以内的整数都可以。
(2) long long int: 8字节,绝对值在 1 0 10 10^{10} 1010或者 1 0 18 10^{18} 1018范围以内的整数都可以。
(如果long long型赋大于 2 31 2^{31} 231-1的初值,则需要在初值后面加上LL,否则会编译错误)
(3) 10的10次方为 1e10 也可写成1e+10(如果是负10次方可以写成1e-10) -
字符型
显示字符 : 0 ~ 9 , A ~ Z , a ~ z
ASCII码 :48 ~ 57,65 ~ 90 ,97 ~ 122
小写字母的ASCII码值比大写字母的ASCII码值大32。
字符常量用单引号标注。 -
数组
数组大小较大(大概 1 0 6 10^6 106j级别)则需要将其定义在主函数外面,否则会使程序异常退出,原因是函数内部申请的局部变量来自系统栈,允许申请的空间较小;而函数外部申请的全部变量来自静态存储区,允许申请的空间较大。 -
C 库函数 double exp(double x) 返回 e 的 x 次幂的值。
double类型的输入格式是%lf,输出格式是%f. -
true为1,false为 0;
-
break; 从switch语句或者包含它的最内层循环语句中跳出。
-
continue; 使控制转移到包含它的最内层循环语句的末尾,然后重新开始下一轮循环。
\n 代表换行
\0 代表空字符NULL,其ASCII码为0,请注意\0不是空格
/*
*字符串常量可以作为初值赋给字符数组,并使用%s的格式输出
*/
#include<stdio.h>
int main()
{
char a[25]="Wo ai de ren bu ai wo";
printf("%s",a);
return 0 ;
}
//Wo ai de ren bu ai wo
/*
*布尔型:整型常量在赋值给布尔型变量时会自动转换为true(1)或者false(0)
*/
#include<stdio.h>
int main()
{
bool flag1 = 0, flag2 = true;
int a = 1, b = 1;
printf("%d %d %d\n",flag1, flag2, a==b);
return 0 ;
}
// 0 1 1
/*
*强制类型转换
*/
#include<stdio.h>
int main()
{
double r = 12.56;
int a = 3, b = 5;
printf("%d\n", (int)r);
printf("%d\n", a / b);
printf("%.1f", (double)a / (double)b);
return 0;
}
12
0
0.6
/*
*符号常量(用一个标识符来替换常量)
*/
#include<stdio.h>
#define pi1 3.14
const double pi = 3.14;
int main()
{
double r =3;
printf("%.2f\n", pi*r*r);
return 0;
}
28.26
/*
*条件运算符:三目运算符
*/
#include<stdio.h>
#define ADD(x) (x*2+1)
int main()
{
int a=3,b=5;
int c = a>b? 7:11;//a>b成立时取7,不成立时取11
printf("%d\n", c);
return 0;
}+
11
/*
*无穷大定义
*/
const int INF = (1<<30)-1;
const int INF = 0x3fffffff;
/*
*字符数组使用%s读入的时候读入结束的标志:空格和换行
*/
#include<stdio.h>
int main()
{
char str[10];
scanf("%s",str);
printf("%s",str);
return 0;
}
abcd efg
abcd
/*
*scanf的%c格式是可以读入空格和换行的
*/
#include<stdio.h>
int main()
{
int a;
char c,str[10];
scanf("%d%c%s",&a,&c,str);
printf("a=%d,c=%c,str=%s",a,c,str);
return 0;
}
1 a bcd
a=1,c= ,str=a
/*
*三种实用的输出格式
*/
#include<stdio.h>
int main()
{
int a = 123, b = 1234567;
//%md可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐;如果变量本身超过m位,则保持原样
printf("%5d\n",a);
printf("%5d\n",b);
//%05d 以0作为补充元素
printf("%05d\n",a);
printf("%05d\n",b);
//%.mf浮点数保留m位小数输出
double d1 = 12.3456;
printf("%.1f",d1);
return 0;
}
/*
* 123
*12345
*00234
*12345
*12.3
*/
/*
*getchar(): 输入单个字符
*putchar(): 输出单个字符
*/
#include<stdio.h>
int main()
{
char c1,c2,c3;
c1 = getchar();//getchar()可识别换行符
getchar();
c2 = getchar();
c3 = getchar();
putchar(c1);
putchar(c2);
putchar(c3);
return 0;
}
/*
*abcd
*acd
*/
/*
typedef:起别名
*/
#include<stdio.h>
typedef long long LL;//将给long long起个别名LL
int main()
{
LL a = 123456789012345, b = 234567890123456;
printf("%lld\n",a+b);
return 0;
}
/*
358024679135801
*/
/*
常用math函数
*/
#include<stdio.h>
#include<math.h>//头文件
typedef long long LL;
const double pi = acos(-1.0);//因为cos(pi)=-1;
int main()
{
double db = -12.56;
printf("%.2f\n",fabs(db));//取绝对值
printf("%.0f %.0f\n", floor(db), ceil(db));//floor()向下取整,ceil向上取整
printf("%f\n",pow(2.0,3.0));//次幂
printf("%f\n",sqrt(2.0));//算术平方根
printf("%f\n",log(1.0));//以e为底的对数(无对任意底数求对数的函数,需要使用换底公式)
double a = sin(pi*45/180);//参数为弧度制 180度=3.14(弧度) ==sin(45)度
double b = cos(pi*45/180);
double c = tan(pi*45/180);
printf("%.2f %.2f %.2f\n",a,b,c);
a = asin(1.0);//反正弦值
b = acos(-1.0);
c = atan(0);
printf("%.2f %.2f %.2f\n",a,b,c);
a = round(3.40);//round进行四舍五入
b = round(3.5);
c = round(3.6);
printf("%d %d %d\n",(int)a,(int)b,(int)c);
return 0;
}
/*
12.56
-13 -12
8.000000
1.414214
0.000000
0.71 0.71 1.00
1.57 3.14 0.00
3 4 4
*/
if(n!=0)可以写成if(n)
if(n==0)可以写成if(!n)
/*
switch
*/
#include<stdio.h>
#include<math.h>
int main()
{
int a = 1, b = 2;
switch(a+b){
case 2: printf("%d\n", a);break;
case 3: printf("%d\n", b);break;
case 4: printf("%d\n", a+b);break;
default:printf("sad strory\n");
return 0;
}
}
//continue段后皆不执行。
//冒泡排序
#include<stdio.h>
#include<math.h>
int main()
{
int a[10]={3,1,4,5,2};
for(int i=0;i<5;i++)
{
for(int j=0; j<4-i; j++){
if(a[j] < a[j + 1]){//降序
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
for(int i=0;i<5;i++)
{
printf("%d\n",a[i]);
}
}
/*
memset-对数组中每一个元素赋相同的值
因memset按字节赋值,建议赋值0或者-1
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
int a[5] = {1,2,3,4,5};
memset(a, -1, sizeof(a));
for(int i=0;i<5;i++)
printf("%d ",a[i]);
}
/*
memset-对数组中每一个元素赋相同的值
因memset按字节赋值,建议赋值0或者-1
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
int a[5] = {1,2,3,4,5};
memset(a, -1, sizeof(a));
for(int i=0;i<5;i++)
printf("%d ",a[i]);
}
/*
gets输入:以\n作为输入结束
puts输出
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
char str1[20];
char str2[5][10];
gets(str1);
for(int i=0;i<3;i++)
gets(str2[i]);
puts(str1);
for(int i=0; i<3; i++)
puts(str2[i]);
return 0;
}
/*
空字符串\0:表示存放的字符串的结尾
在使用gets或者scanf输入字符串时会自动添加在输入的字符串后面,并占用一个字符位,而puts与printf可以通过识别\0作为字符串的结尾来输出。
getchar输入时要手动在字符串后加入"\0"
*/
#include<stdio.h>
#include<string.h>//memset的头文件
int main()
{
char str1[15];
for(int i=0; i<3; i++){
str1[i] = getchar();
//printf("%d : %c\n",i,str1[i]);
}
str1[3] = '\0';
puts(str1);
return 0;
}
/*
string.h头文件:包含了许多用于字符数组的函数
strlen() 可以得到字符数组中第一个\0前的字符的个数。
strcmp(str1, str2) 返回两个字符串大小的比较结果,比较原则是按字典序。
strcpy(str1, str2) 将字符串str2复制给str1,这里的“复制”包括了结束符\0.
strcat(str1, str2)将字符数组2接到字符数组1后面。
*/
#include<stdio.h>
#include<string.h>
int main()
{
/*char str[10];
gets(str);
int len = strlen(str);
printf("%d\n",len);
*/
char str1[50], str2[50];
gets(str1);
gets(str2);
int cmp = strcmp(str1, str2);
if(cmp < 0) printf("str1 < str2\n");
else if(cmp > 0) printf("str1 > str2\n");
else printf("str1 == str2\n");
strcpy(str1, str2);
strcat(str1, str2);
puts(str1);
return 0;
}
/*头文件 stdio.h
sscanf(str, "%d", &n) string + scanf将字符数组str中的内容以"%d"的格式写到n中(从左到右)
sprintf(str, "%d", n) string + printf 把n以"%d"格式写到str字符数组中(从右向左)
*/
#include<stdio.h>
int main()
{
int n,m;
char str[100] = "123:456";
sscanf(str, "%d:%d", &n,&m);
printf("%d %d\n", n, m);
n = 23;
double t =3.44;
sprintf(str, "%d%lf", n,t);
printf("%s\n", str);
return 0;
}
/*
指针是一个unsigned类型的整数
数组名称也可作为数组的首地址使用
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int a=1;
printf("%d %d\n", &a, a);
int* p = &a;//int* 是指针变量的类型,p才是变量名,用来存储地址,因此地址&a是赋值给p而不是*p的
//星号的类型的一部分就记错
p = &a;
a = 233;
printf("%d\n", *p);
int b[10] = {1};
p = b;
printf("%d\n", *p);//其实输出的为a[0]
for(int i=0; i<10; i++){
scanf("%d",b+i);
}
for(int i=0; i<10; i++){
printf("%d ", *(b+i));
}
return 0;
}
/*
指针变量用于枚举数组中的元素
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
int main()
{
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(int *p = a; p < a + 10; p++){
printf("%d ", *p);
}
printf("\n");
int* p =a;
int* q = &a[5];
printf("q = %d\n", q);
printf("p = %d\n", p);
printf("q - p = %d\n", q-p);
return 0;
}
/*
1 2 3 4 5 6 7 8 9 10
q = 2686720
p = 2686700
q - p = 5//两个int型的指针相减,等价于在求两个指针之间相差了几个int
*/
/*
指针变量作为函数参数
视为把变量的地址传入函数,如果在函数中对这个地址中的元素进行改变,原来的数据就会确实地被改变
*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
void change(int* p)
{
*p = 233;
}
int main()
{
int a = 1;
int* p = &a;
change(p);//地址传递
printf("%d\n", a);
return 0;
}
/*
指针的引用:试图通过将传入的地址交换来达到交换两个变量的效果
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void swap(int* &a, int* &b)
{
int *temp = a;
a = b;
b = temp;
}
int main()
{
int a = 1, b = 2;
int *p1 = &a, *p2 = &b;
swap(p1, p2);
printf("a = %d, b = %d\n", *p1, *p2);
return 0;
}
/*
*/
/*
浮点数的比较
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const double eps = 1e-8;
#define Equ(a, b) ((fabs((a)-(b)))<(eps)) //两个浮点数是否相等
#define More(a, b) (((a)-(b)>(eps)) //a > b?
#define Less(a, b) (((a)-(b)<(-eps)) //a < b?
#define MoreEqu(a, b) (((a)-(b)>(-eps))// >= a > b-eps
#define LessEqu(a, b) (((a)-(b)<(eps))// a < b + eps
//圆周率
const double pi = acos(-1.0);//cos(pi) = -1;
int main()
{
double a = 1.23;
if(Equ(a, 1.23)){
printf("true\n");
}
else{
printf("false\n");
}
return 0;
}
二: 算法笔记课后习题
/*
题目描述
从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。
末尾输出换行。
*/
#include<stdio.h>
#include<math.h>
int main()
{
double a, b,c,t;
scanf("%lf %lf %lf",&a,&b,&c);
if(a>b)
{
t = a;
a= b;
b = t;
}
if(a>c)
{
t = a;
a = c;
c = t;
}
if(b>c)
{
t=b;
b=c;
c=t;
}
printf("%.2f %.2f %.2f\n",a, b, c);
return 0;
}