- 求阶乘的时候 可以专门设置一个函数fact(n)
- 固定用const, 比如 const int maxn = 35;
- 考虑测试点时考虑全面,处理sample外,还有最大最小值,0,奇数偶数,有效范围两端的数据之类的。
- 字符型常量 char a = ‘a’, '9’之类的
- ch = getchar() 可以从键盘输入一个字符
- putchar(ch) 输出存放在变量ch中的字符,只能输出一个字符
- goto语句: goto out;…out:(跳到out所在位置)
- 绝对值: fabs(double n) abs(int n)
- numerator 分子 denumerator 分母
- 小套路:临时变量temp
- prime 素数(只能被1和自身整除的正整数,1不是prime 2是素数)
- 猜数游戏需要随机产生1个数
#include<stdlib.h>
#include<time.h>
srand(time(0));
int mynumber = rand()%100+1 //计算机随机产生1个1——100之间的被猜数
-
void f(void) 表示函数不接受任何参数
-
void f() 表示函数参数未知,不表示无参数
-
每个函数都有自己的变量空间,参数也位于这个独立空间中,和其他函数无关
-
写程序要先写主函数,剩下的函数在主函数后面写,不过主函数前面要先申明
-
有两段及以上差不多的代码是程序员代码质量不良的表现
-
void sum(int a, int b)
void的意思就是没有,即这个函数不能用return返回任何东西,只能直接printf -
写代码用模块化设计,遵循模块独立原则,一个模块只能完成一个功能,模块之间只能通过参数进行调用,一个模块只有一个入口和一个出口,模块内慎用全局变量
-判断两个浮点数相等的办法fabs(f1 - f2) < le-12
-
无特殊需要只用double ; 0!=1;
-
sizeof(yi==一种静态运算符,给出某个类型 / 变量在内存中所占的内存数) sizeof(int) 和 sizeof(i);sizeof的结果在编译时就已经决定了,所以在sizeof内做运算无意义;
-
scanf两个数据之间有没有空格是不一样的,scanf("%d %d"),空格ASCII码为32,%d后若没有空格表示只读到整数结束为止,若有空格,读完整数还要把空格都读掉.
-
unsigned int 表示不带符号的整数,即0和正数,
-
科学计数法:6.026*10的-27次方可以表示为 6.026E-27或者60.26e-28,602.6e-29
-
%d %o %x 分别表示int 的十进制,八进制,十六进制
printf (double) | %e 以科学计数法输出 |
---|---|
scanf (double) | 以小数或者指数的形式输入 |
字符转换 若 char c 的值是‘a’——‘z’ ; 则ch - ‘a’ + 'A’把小写字母转化为大写字母;若char c的值是‘0’ 到‘9’, 运算ch - '0’把数字字符转化为数字, 若int val 属于0到9 ,则val + ‘0’把数字转化为数字字符
-
运算符优先级 !> 算术运算符 > 关系运算符 >&& || > ?: >赋值运算符 >逗号
-
数组不能互相赋值,只能使用遍历
-
int search(int key, int a[], int length)
数组作为函数参数时, 往往需要用另一个参数表示数组长度传入函数参数;且不能再[]中给出数组大小 -
segmatation fault 数组越界
-
对数组要主动初始化为0;
-
int a[][5]= {{1,2,3},{4,5,6},}//二维数组列数必须写,最后个逗号是为了补0
-
int a[] = {1,2,3,4} a的长度表示为 length = sizeof(a)
-
sizeof(a[0]) 给出的是数组单个元素大小,即a[0], 占4个字节
-
int main() 实际上是 int main(int argc, char const *argv[])
字符串
-
char str[80] 一维字符数组用于存放字符型数据
-
使用gets(str) 前面必须有getchar();
-
字符串常量就是一对双引号括起来的字符序列“Happy” 由六个字符组成,前五个是有效字符,‘\0’是字符串结束符
-
char s[6] = “Happy” 等价于 char s[6] = {“Happy”} 等价于 char s[6] = {‘H’, ‘a’, ‘p’, ‘p’, ‘y’, ‘\0’};
-
字符串必须以数组或是指针的形式访问
-
char *str = “Hello” 等价于char word[] = “Hello”;
-
常见套路 输入一个以回车符作为结束标志的字符串
while( (str[i] = getchar()) != '\n') i ++;
str[i] = '\0'; //将结束符存入
- %7s 表示最多读七个
- 字符串输入输出
char string[8];
scanf("%s", string);
printf("%s", string);
常用的字符串处理函数<string.h>
- strcpy(s1, s2) 把字符串s2复制到s1,s1中内容被覆盖,要求数组s1长度足够长
- strcat(s1, s2) 将字符串s2接到s1后面;要求数组s1长度足够长
- strcmp(s1, s2) 若 s1 == s2 返回0 若s1 > s2 返回正数,若s1 < s2 返回负数
- strlen(s1) 返回字符串s1的有效字符个数;
指针
- 指针就是保存地址的变量
- int *p,q;(p是指针,q是普通类型变量)
- 当把一个指针作为参数时,
void f(int *p)
, 当调用f函数时必须交给它一个地址int i= 0; f(&i)
; 在函数内部可以通过这个指针访问外面的 i; - p指向地址,*是钥匙,*p就是地址内部的值
- int *p = &i;
- 最常见的错误就是定义了指针变量,却没有指向任何地址;
- 数组名本身是一个地址即指针,数组名是一个特殊的固定地址,可以把它看做是指针常量
int *p;
int a[100];
p = a;与p = &a[0]等价//数组单元的表达变量需用&
p = a + 1 与 p = &a[1];等价
//函数参数传递中的数组实际上也为指针
void(int a[], int len, int key)
等价于
void(int *a, int len, int key)
//以下四种等价
int sum(int *arr, int n)
int sum(int arr[], int n)
int sum(int *, int n);
int sum(int [], int n);
//数组变量是const指针,不能赋值
int b[] 相当于 int *const b;
int *q = a;可以 而 int b[] = a;不可以
结构
- 结构类型允许程序员把一些数据分量聚合成一个整体的数据类型(就和 int 一样),一个结构中包含的每个数据分量都有名字,这些数据分量称为结构成员或者结构分量.
struct student{
int num;
char name[10];
double average;
};
int main(){
struct student s1,max;
s1.num;s1.name;
}
相当于
struct student{
int num;
double average
char name[10]
}s1,s2;
结构数组
程序结构
- 返回指针的函数最好的做法是返回传入的指针。尽量避免使用全局变量
- #include:预处理命令,作用是把那个文件的全部文本内容原封不动地插入到它所在之地
- <stdio.h>和“max.h”是两种不同表示方法
- <>要求编译器只在 指定目录 。""要求编译器首先在当前目录寻找这个文件
- 宏定义 #define
- #define flag 1
- 程序文件模块——主函数代码太长分为几个函数,同理一个源代码文件太长适合分为几个文件——由于两个独立的源代码文件不能编译成一个单元(一个.c文件是一个编译单元)——建立一个project把所有文件放进去 ,然后编译链接
- 同一个单元里,同名的结构不能被重复申明