C语言基础
1.#include <stdio.h> (standard input & output) 包括 printf 和scanf函数
2. C++ 需要加上“using namespace std;”
3. C语言中的数据类型:
分类 | 名称 | 在内存中占的字节数 |
---|---|---|
字符 | char | 1 |
短整型 | short | 2 |
整型 | int | 4 |
长整型 | long long | 8 |
单精度浮点数 | float(6~7位) | 4 |
双精度浮点数 | double(15~16位) | 8 |
%d是int类型的输出格式
%lld是long long 类型的输出格式
%c是char类型的输出格式
%f是float类型的输出格式
%s是字符串常量的输出格式
- 局部变量分配在内存的“栈”中,存取速度比较快,空间较少,无默认值
- 全局变量分配在内存的“堆”中,存取速度比较慢,空间较多,有默认值
- 静态变量在定义是也有默认初始值
- 数组的定义 int a[10] = {1,1};
- while(scanf("&d,&d",&a,&b)!=EOF) (End Of File)
gets输入字符串就不需要考虑EOF
scanf和gets函数混用时,注意回车键问题 - 输出格式中的“%.1f”是指保留一位小数输出
- 符号常量和const常量 #define pi 3.14 等价于const double pi = 3.14
- 运算符 取模运算符的优先级和除法运算符相同
- 无穷大 const int INF = (1<<30)-1 等价于 const int INF = 0x3fffffff
- 在scanf中,除了char数组整个输入的 情况不加&之外,其他都需要加&
- scanf对其他格式符(如%d)的输入是以空白符(即空格、换行等)为结束判断标志的,因此除非使用%c把空格按字符读入,其他情况都会自动跳过空格
- 字符数组使用%s,读入的时候以空格跟换行为读入结束的标志
- double类型的变量,其输出格式变成了%f,而在scanf中却是%lf
- 三种使用的输出格式
项目 | 解释 |
---|---|
%md | 可以使不足m位的int型变量以m位进行右对齐输出,其中高位用空格补齐 |
%0md | 可以使不足m位的int型变量以m位进行右对齐输出,其中高位用0补齐 |
%.mf | 可以让浮点数保留m为小数输出,这个“保留”使用的是精度的“四舍六入五成双” |
- getchar和putchar用来处理单个字符 (用多一个getchar吸收掉换行符)
- gets和puts输入输出一行字符串
- typedef给复杂的数据起一个别名 typedef long long LL;
- math函数
函数名 | 解释 |
---|---|
fabs(double x) | 对double 型变量取绝对值 |
floor(double x) | 对double 型变量向下取整 |
ceil(double x) | 对double 型变量向上取整 |
pow(double r,double p) | r的p次方 |
sqrt(double x) | 算术平方根 |
log(double x) | 以自然数为底的对数 |
sin/cos/tan/asin/acos/atan(double x) | 三角函数 |
round(double x) | 四舍五入 |
注:abs(int a) 是使用#include <stdlib.h>的头文件
21. 如果表达式是“!=0”,则可以省略“!=0”
如果表达式为“==0”,则可以省略“==0”,并在表达式前添加非运算符
22. do…while会先执行循环体一次,然后才去判断循环条件是否为真,这就使得do…while语句的实用性远不如while
23. 在C语言中不允许在for语句的表达式A里定义变量,但是在C++中可以
24. memset对数组中每一个元素赋相同的值 memset(数组名,值,sizeof(数组名))
例如:menset(a,0,sizeof(a)) 需要string.h
memset使用按直接赋值,即对每个直接赋同样的值,建议赋0或-1
25. \0的ASCII码是0 ,空格的ASCII码是32
26. 如果不是使用gets和scanf函数的%s,一定要再输入的每个字符串后加入"\0
27. string.h头文件
函数名 | 解释 |
---|---|
strlen() | 得到字符数组中第一个\0前的字符的个数 |
strcmp() | 返回两个字符串大小的比较结果,比较原则是按字典序 |
strcpy() | 把一个字符串2复制给另一个字符串1 |
strcat() | 把一个字符串2接到另一个字符串1后面 |
- sscanf函数和sprintf函数
sscanf(str,"%d",&n) 把字符串数组str中的内容以“%d”的格式写到n中
sprintf(str,"%d",n)把n以%d的格式写到str中 - 数组作为函数的参数。第一维不需要填写长度,第二维需要填写长度
在函数中对数组元素的修改就等同于是对原数组元素的修改(与局部变量不同) - 只要在变量前面加上&,就表示变量的地址。指针是一个unsigned类型的整数
- 指针变量支持自增和自减操作。跨越一整个int型
- swap函数对地址本身进行修改并不能对main函数里的地址修改,能够使main函数里的数据发生变化的只能是swap函数中对地址指向的数据进行的修改。
- 引用不产生副本。对引用变量的操作就是对原变量的操作。常量不可用使用引用(由于是C++语法,因此文件必须保存为.cpp类型)
- 结构体定义
struct studentInfo{
int id;
char gender; // "F"/"M"
char name[20];
studentInfo *next;
}stu,*p;
结构体黎明能定义除了自己本身之外的任何数据类型。不过虽然不能定义本身,但可以定义自身类型的指针变量
访问stu中的变量
stu.id;
stu.name;
stu.next;
访问指针变量p中元素
(*p).id
(*p).name
(*p).next
p->id
p->name
p->next
#include <iostream> using namespace std;
c++的输入与输出c++的输入与输出
cin>> 输入不指定格式,也不需要加取地址运算符&,直接写变量名
想读入一整行,则需要使用getline函数 cin.getline(str,100);
cout<< 输出时中间没有加空格。
想要控制double 型的精度,例如输出小数点后两位,那么加上
#include <iomanip>
cout<<setiosflags(ios::fixed)<<setprecision(2)<<123.4567<<endl
- #include MoreEqu(a,b) (((a)-(b))<(eps))
- 黑盒测试:系统后台会准备若干组输入数据,然后让提交的程序去运行这些数据,如果输出的结果与正确答案完全相同,则通过测试。
- 单点测试:系统会判断每组数据的输出结果是否正确
- 多点测试:要求程序能一次运行所有数据
(1)while…EOF型 在黑框输出不会触发EOF状态,可以用Ctrl+z
(2)while…break
(3)while(T–)型 - 结构体中字符串数组赋值用 strcpy函数赋值。在string.h头文件下
- C语言中有可以产生随机数据的函数,需要添加stdlib.h头文件与time.h头文件
rand()%(b-a+1)+a