文章目录
答题格式注意:
乘号写成[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH1UTrdD-1666357177792)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017140713490.png)]这样子
程序填空有可能要打分号,注意题目
第1章 概述
c程序的基本单位是函数
c源程序必须且仅有一个main函数
c语言本身没有输入输出语句
第2章 算法
N-S流程图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpjWhJRp-1666357177794)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016220114804.png)]
第3章 数据类型、运算符与表达式
一、预备知识
1. 进制转换
2进制、10进制、8进制、16进制的相互转换
其中10->8应算10->2->8,这样比较方便
2. 字节和位
8bit位=1Byte字节(Byte简写成B)
单位从小到大有B、KB、MB、GB、TB 等比,q=1024=210
3. 原码、反码和补码
对于正数而言,原码、反码、补码都是一样的。
例如short b = 6; b 的原码、反码、补码就是0000 0000 0000 0110
1、负数的原码
将一个整数转换成二进制形式,就是其原码。
例如short a = -18; 此时 a 的原码就是1000 0000 0001 0010。
2、负数的反码
负数的反码是将原码中除符号位以外的所有位(数值位)取反,也就是 0 变成 1,1 变成 0。
例如short a = -18; 此时 a 的反码是1111 1111 1110 1101。
3、负数的补码
负数的补码是其反码加 1。
例如short a = -18; 此时 a 的补码是1111 1111 1110 1110。
二、数据类型
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VMHz5Wjs-1666357177795)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016220424577.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xUy7yoro-1666357177796)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016220435217.png)]
1. 标识符命名规范
标识符是用来标识变量名、常量名、函数名、数组名、类型名和文件名等的字符序列。
标识符的命名规范:
- 只能由字母、数字、下划线组成。且第一个字母不能是数字
- 大小写敏感
- 不能使用关键字
C语言总共有32个关键字:
auto break case
char const continue
default do double
else enum extern
float for goto
if int long
register return short
signed sizeof static
struct switch typedef
union unsigned void
volatile while
2. 常量
1)浮点数常量
1、十进制:
必须要有小数点:像.0和0.都是合法的
浮点数常量的类型默认是double型,在浮点数常量后加f或F才认为它是float型
2、指数形式:
e或E之前必须有数字;指数必须位整数。如12.3e3,123E2,1.23e4。
规范化形式:小数点前必须且只有一位非零数字
2)整型常量
三种形式:
-
十进制
-
八进制:由0开头,如0123、011
-
十六进制:由0x或0X开头,如0x123,0Xff
整型常量的类型:
- 根据值所在的范围自动确定类型:如30000为int,65536为long int
- 在整型常量后加l或L,让它成为long int型常量:如12为int,12L为long int
3)字符常量
用单引号括起来’x’
转义字符\代表的含义:
例:‘A’——‘\101’——‘\x41’——65
转义字符 | 含义 |
---|---|
\n | 换行 |
\t | 水平制表 |
\\ | 反斜线 |
\’ | 单引号 |
\" | 双引号 |
\ddd | 1~3位8进制代表的字符(‘\077’和’\77是一样的’) |
要背的:
‘A’——65
‘a’——97
‘0’——48
‘\n’——10
4)字符串常量
用双引号"xxx"括起来
"hello"在内存中是 hello\0 占6个字符
""在内存中是 \0 占1个字符
3. 变量
int a; // 定义完未赋值时,a的值是随机的
int a=b=c=5; // 不合法
int a,b,c;
a-b-c-5;// 合法
可用sizeof(类型名/变量名)
测量该类型/变量所占的字节数
4. 类型转换
1)自动转换
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6wwIMnGM-1666357177797)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016224342146.png)]
char c;
c=130;
printf(“%d”,c);// 输出:-126
int a;
a=65536;
printf(“%d”,a);// 输出:0
2)强制转换
// 注意:强制转换前一个括号不能省去
(double)(3/2) //这个的值为1.0
(double)3/2 // 这个的值为1.5
(int)3.6 // 值为3,精度损失
三、运算符和表达式
优先级 | 运算符 | 含义 | 要求的运算符分量个数(默认2) | 结合方向(默认→) |
---|---|---|---|---|
1 | () [] -> . | 圆括号 下标 指向结构体成员 结构体成员 | 无 | |
2 | ! ++ – - (类型) * & sizeof | 逻辑非 自增 自减 负号 类型转换 指针 地址 长度 | 1 | ← |
3 | * / % | 乘法 除法 取余 | ||
4 | + - | |||
6 | < <= > >= | |||
7 | == != | |||
11 | && | |||
12 | || | |||
13 | ? : | 3 | ← | |
14 | = +=、-=、*=、/= | ← | ||
15 | , | 逗号 | ||
/
两整数相除,结果为整数
%
%要求两侧均为整形数据,其运算结果的符号与被除数相同
++和–
int a=3,k,j;
k=(++a)+(++a);//5+5=10
a=3;
j=(++a)+(++a)+(++a);//5+5+6=16
+=和-=之类
a=12;
a+=a-=a*a;//最后a的值为-264
,逗号
方向:从左到右
整个逗号表达式的值等于最后一个表达式的值
a=15,a*4;//a=15,表达式的值为60
#include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
printf("x=%d\n",x); // 运行结果:x=3
}
==和<=之类
若a=0; b=0.5; x=0.3;
则 a<=x<=b的值为0
注意:应避免对实数作相等或不等的判断,如1.0/3.0*3.0==1.0
的结果为0
(false)
可改写为:fabs(1.0/3.0*3.0-1.0)<1e-6
这是头文件
<math.h>
里的函数fabs(x)
,意思是取绝对值|x|头文件
math.h
中只有俩考试会考:
sqrt(x)
表示 x \sqrt{x} xfabs(x)
表示|x|
!和&&和||
注意短路特性:
a=1;b=2;c=3;d=4;m=1;n=1;表达式(m=a>b)&&(n=c>d)的结果为m=0,n=1,因为短路了右边就没运行
xx ? a : b
条件运算符可嵌套,如 x>0?1:(x<0?-1:0)
结合方向:自右向左。如:a>b?a:c>d?c:d 《==》 a>b?a:(c>d?c:d)
三个表达式类型可不同,表达式值取下图中较高的类型
如 x>y?1:1.5 //x>y时值为1.0;x<y时值为1.5
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eoSV2hBu-1666357177798)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016224342146.png)]
第4章 输入与输出
c语言无输入输出语句,输入输出由函数实现:#include<stdio.h>
getchar()
char c;c=getchar();
putchar()
char a='B';putchar(a);
printf()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x4Cg5Ear-1666357177798)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016230748390.png)]
main() { unsigned int u=65535; printf(”u=%d\n",u); //输出结果:u=-1}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xg17fDgx-1666357177799)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221016231112718.png)]
scanf()
变量的地址,常用取地址运算符&
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUAZQfJT-1666357177800)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017083750356.png)]
scanf(""%3c%2c", &c1, &c2);
输入abcde回车,则c1=‘a’, c2=‘d’
scanf("%4d%2d%2d", &yy, &mm, &dd);
输入19991015回车,则yy=1999, mm=10, dd=15
分隔符:一般以空格、TAB或回车键作为分隔符。也可自定义其它字符做分隔符
scanf("%d%o:%x", $a, &b, &c);
输入123□123:123回车,则a=123, b=83, c=291
说明:
1)用“%c”时,空格和转义字符作为有效字符输入
2)输入数据时,遇以下情况认为该数据结束:
- 遇空格、TAB、回车
- 遇宽度结束
- 遇非法输入(如%d接收到字符)
3)输入函数留下的垃圾
int x;char ch;scanf("%d", &x);scanf("%c", &ch);输入123回车;得到x=123, ch=10;
第5章 选择结构
switch(表达式){ case E1: 语句组1; break; case E2: 语句组2; break; [default: 语句组; break;]}这里表达式只能为整型或字符型,不能是浮点数
第6章 循环结构
do{ ...}while(表达式);注意:do while语句中,最后的分号不要漏掉
第7章 数组
下标可以是常量或整型表达式:int a[1+1]
数组名为首个元素的地址常量,不能ch++,可以ch+1
所以scanf("%s", ch);
这里不用取地址符&
一、一维数组
int a[5]={1,2,3,4,5};
-
数组不初始化,其元素值为随机数
-
数组部分初始化时,剩余的为0(对于字符串,剩余的初始化为\0)
-
当给全部数组元素赋初值时,可不指定数组长度。如
int a[] = {1,2,3};
二、二维数组
- 分行初始化:
- 部分初始化,剩余的为0,如
int a[2][3]={{1,2},{4}}
得到{{1,2,0},{4,0,0}} - 第一维长度可省略初始化,如
int a[][3]={{1},{4,5}}
得到{{1,0,0},{4,5,0}}
- 部分初始化,剩余的为0,如
- 不分行初始化:
- 如
int a[2][3]={1,2,4};
(这个例子也是部分初始化)得到{{1,2,4},{0,0,0}} - 如
int a[][3]={1,2,3,4,5};
(这个例子也是第一位长度省略)得到{{1,2,3},{4,5,0}}
- 如
三、字符数组和字符串
char c="A"
写法错误
讲字符串长度时,不包含\0
用"%s"输出时,遇’\0’结束
字符串处理函数
包含在头文件
string.h
里
puts(str_arr)
输出字符串,输出完换行
gets(str_arr)
例 输入"How"回车
scanf("%s", a);
处理时,回车还留在缓冲区里。scanf遇到空格或回车停止gets(a);
处理时则没有。gets遇回车停止
1.2.两者都会在最后自动添加’‘\0’
strcat(stra_arr1, str_arr2 )
把str_arr2连到str_arr1后面
说明:
- str_arr1必须足够大
- 连接前,两串均以’‘\0’结束;连接后,str_arr1的’\0’取消,新串最后加’\0’
strcpy(str_arr1, str_arr2)
将str_arr2拷贝到str_arr1中去。
char a[10];a="china";//是错的// 应该用:strcpy("china", a);
strcmp(str_arr1, str_arr2)
字符串比较不饿能用==,必须用strcmp
strlen(str_arr)
计算字符串长度,不包括’\0’在内
char s[] = "\x69\072\n";
长度为3
char s[] = "\x69\082\n";
长度为1
第8章 函数
函数参数传入顺序:自右向左
int i=3;printf("%d,%d", i++, ++i);// 输出4,4
函数的返回值:
// 返回值类型未定义则默认为intmax(){ return 6.34f;}// 最后返回的是整型6
函数中可以无return,则到最后自动返回
当被调函数定义在主调函数后面时,应进行声明
不允许函数嵌套定义,但允许嵌套调用
递归调用——求最大公约数(辗转相除法):
int gcd(int a, int b){ int t; do{ t=a%b; a=b; b=t; }while(b!=0); return(a);}
最小公倍数=数1*数2/最大公约数
int lcm(int a, int b){ int t; t=a*b/gcd(a.b); return (t);}
数组名作函数参数是地址传递
变量的存储属性
变量的存储类型
- auto——自动型(默认)
- static——静态型
- extern——外部型
extern:
定义:在函数外定义,可为本文件所有函数共用
有效范围:从定义变量的位置开始到本源文件结束,及有extern说明的其它源文件
若外部变量与局部变量同名,则外部变量被屏蔽
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JcAJjp7Y-1666357177801)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017110418250.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1onMJq9j-1666357177801)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017110441899.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5f3Xl80r-1666357177802)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017110557048.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hvZ3AqVk-1666357177803)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017110740497.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6PtrDnk-1666357177803)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017110857638.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Clw6iXWf-1666357177804)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017111511252.png)]
第9章 预处理命令
#define
#define POWER(x) x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y; //答案为34一般写成:#define POWER(x) ((x)*(x))宏展开: z=((x+y)*(x+y)); // 答案为100
#include
第10章 指针
指针变量占2个字节
指针定义未赋值时,指针里的值为随即地址
指针p1+指针p2是错的
int a[11]={1,2,3};int *p=a;// a++不行,p++可以,a+1也可以如果p=&a[3]p[2]的值为a[5]
char *cp="Hello";(√)int *p={1,2,3};(×)//---------------------------char str[10], *cp;int a[10], *p;str = "Hello";(×)cp = "Hello";(√)a={1,2,3};(×)p={1,2,3};(×)
对于二维数组:
a[0][2]=*(a[0]+1)=*(*(a+0)+1)
第11章 结构体、共用体和枚举类型
一、结构体
struct xxxx{ xxx xx; xxx xx;};
结构体定义不分配内存,使用(有变量)才分配
引用方式:xxxx.xx
指针引用方式:p->xx
二、共用体
共用体变量任何时刻都只有一个成员存在
共用体长度=最长成员所占字节数
引用:
起作用的成员是最后一次存放的成员
不能再定义共用体变量时初始化
案例1
void main(){ union int_char{ int i; char ch[2]; }x; x.i=24897; printf("i=%o\n", x.i); printf("ch0=%o,ch1=%o\nch0=%c,ch1=%c\n", x.ch[0], x.ch[1], x.ch[0], x.ch[1]);}/*运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a*/
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gog5dvEK-1666357177805)(D:\Users\玄离\Pictures\Typora\c语言-大海\image-20221017130300258.png)]
案例2
#include<stdio.h>void main(){ union{ long b; char c[4]; }s; s.b=0xa0000L; s.c[0]+='A'; printf("%d%c\n", s.c[2],s.c[0]); //输出10A}
三、枚举类型
enum weekdays {Sun,Mon,Tue,Wed,Thu,Fri,Sat};
枚举元素作为常量是有值的──定义时的顺序号(从0开始),所以枚举元素可以进行比较,比较规则是:序号大者为大
枚举元素的值也是可以人为改变的:在定义时由程序指定。
例如,
enum weekdays {Sun=7, Mon=1 ,Tue, Wed, Thu, Fri, Sat};
则Sun=7,Mon=1,从Tue=2开始,依次增1。
第12章 文件
处理文件的函数有:打开fopen(),关闭fclose()。读写fputc()、fgetc()、fpinrtf()、fscanf()
只需注意fopen(“打开路径”,“打开模式”)的第二个参数:
r读 w写 a追加
rt和r是一样的
r+和r必须已存在该文件。w和a和w+和a+可以不存在该文件,不存在时会自动新建
r+与w+的区别:w+会先清空文件