是typora的文件哦
C语言基础
C语言程序中的绝大部分内容都应该记录在以.c为扩展名的文件里,这个文件叫做C语言的源文件
C语言还可以包括以.h为扩展名的文件,叫头文件
C语言程序里每个计算步骤都必须用分号结束,每个用分号结束的计算步骤都叫一条语句
C语言程序必须包括一个叫main的函数,这个函数叫做主函数
整个程序必须从主函数第一条语句开始执行,当主函数最后一条语句结束程序也就结束了
几种常见的存储单位
1K可以存储256个int(4个字节)
进制
二进制书写时在前面加0b
八进制书写时在前面加0
十六进制书写时在前面加0x 用%X打印(有大小写区别)
int a = 12; //十进制 int b = 0b1001; //二进制 int c = 023; //八进制 int d = 0xAF; //十六进制字母大小写不影响 printf("%d\n",d);//输出d的值 十进制表示 printf("%x\n",d);//输出af printf("%X\n",d);//输出AF
十进制转二进制
二进制转十进制
十进制转八进制
十进制小数转换为八进制小数 方法:“乘8取整”
0.71875)10 =(0.56)8
0.71875*8=5.75 取整5
0.75*8=6.0 取整6
即0.56
八进制转十进制
十六进制转十进制
(1)原理:整数部分操作以及运算不变,小数部分同以上操作类似,将进制数换成16即可 (2)具体方法步骤如下:
例题:(1A6.3B8) H= __ D
计算结果为: 1A6.3B8=1* 16^2+A* 16 ^1+6* 16 ^0 +3* 16 ^(-1)+B* 16 ^(-2)+8* 16 ^(-3) =422.232422
十进制转十六进制
(1)原理:十进制小数转换成十六进制小数采用 “乘16取整,顺序输出”
注:这里用首字母D表示十进制,H表示十六进制 例题: 25.68D = __ H(精确到小数点后3位)
整数部分除以16取余数,直到无法整除。小数部分0.68乘以16,取整,然后再将小数乘以16,继续取整,直到结果为0或者达到题目要求精度终止。得到结果:19.ae1H. (1) 整数部分 25/16=1 -->9 1/16=0 -->1 倒序输出为:19 (2) 小数部分 0.68* 16=10.88 -->a(即十进制中的10) 0.88* 16=14.08 -->e 0.08* 16=1.28 -->1 已经达到了要求的精度,顺序输出为:ae1 最终结果为:25.68D = 19.ae1 H
八进制、十六进制转换成二进制
1、八进制数转换成二进制 原理:八进制数的一位是二进制数的三位
2、十六进制数转换成二进制 原理:十六进制数的一位是二进制数的四位
二进制转换成八进制数、十六进制数
1、二进制转换成八进制 原理:“三合一” 取二进制数中的三位合为八进制数的一位
2、二进制转换成十六进制 原理:“四合一” 取二进制数中的四位合为十六进制数的一位
原码、反码和补码
计算机只能识别0和1,所以计算机中存储的数据都是以0和1的形式存储的
数据在计算机内部是以补码的形式储存的,所有数据的运算都是以补码进行的
如果是有符号数,那么最高位称之为符号位,最高位是0代表是一个正数,最高位是1代表是一个负数
原码
二进制最高位为符号位 1表示负数 0表示负数
0000 0000 0000 0000 0000 0000 0000 0001 //1 原码
1000 0000 0000 0000 0000 0000 0000 0001 //-1 原码
反码
正数反码和原码一致
负数反码是原码符号位不变,其他的逐位取反
0000 0000 0000 0000 0000 0000 0000 0001 //1 反码
1111 1111 1111 1111 1111 1111 1111 1110 //-1 反码
加法是将数字转换为反码再相加 在将反码转变为原码为最终结果
eg: 1+(-1)
0000 0000 0000 0000 0000 0000 0000 0001 //1 反码
+
1111 1111 1111 1111 1111 1111 1111 1110 //-1 反码
=
1111 1111 1111 1111 1111 1111 1111 1111 // 反码
1000 0000 0000 0000 0000 0000 0000 0000 // 原码
补码
正数补码和原码一致
负数补码是反码加一
0000 0000 0000 0000 0000 0000 0000 0001 //1 补码
1111 1111 1111 1111 1111 1111 1111 1111 //-1 补码
1 0000 0000 0000 0000 0000 0000 0000 0000
1 溢出放不下 最高符号位就还是0
无符号数
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。在整形前加unsigned, 即为无符号数。 %u打印
例如:
unsigned char a; unsigned short b; unsigned int c; unsigned long d; unsigned long long e;
因为无符号数最高位是数的一部分,因此相同类型的无符号数表示数字的范围是有符号数表示数字的范围的2 倍。
有符号数
有符号数是最高位为符号位,0代表正数,1代表负数。 在计算机中,相同的二进制数据所表示的无符号数字和有符号数字可能不同。
例如: 1000 1001 0100 1111 0101 1101 1010 0010
main函数
C语言程序里的函数可以在结束后有一个数字表示它的工作结果,这个数字叫做函数的返回值
主函数应该有一个返回值,如果主函数返回值为0,表示程序希望计算机认为它正常结束了,否则表示出错
C语言程序里通常包含预处理指令
预处理指令以(#)开头,不是以( ;)结尾
#include 就是一个预处理指令,他可以把一个头文件的内容包含到当前文件里
#include<> c语言自带的一些文件 只会在系统安装里面查找
#include ’‘ ’‘ 自定义的一些文件,先从当前文件目录下查找再在系统里面查找
标识符 字母、下划线、 数字 组成,第一个字符必须是字母和下划线(区分大小写),不能是关键字
main函数分析
需要用win+r输入cmd后在里面输入代码的路径来实现
动态内存分配
mallco 动态分配
free 释放
//malloc分配20个空间存放1-20 #include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int* age = NULL;//定义一个空指针来代表数组的首地址 int n = 0; printf("请输入人数:"); scanf("%d",&n); age = (int*)malloc(n * sizeof(int));//malloc动态内存分配 if (age == NULL) { printf("失败"); return -1; } memset(age, 0, n * sizeof(int));//初始化 for (int i = 0; i < n ; i++)//遍历打印 { age[i] = i + 1; printf("%3d",age[i]); } free(age);//释放 return 0; }
//malloc随机生成七个数放在一个数组里面 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h> int * creat(int n)//存储数据 { /*srand(time(NULL));*/ int* p = (int*)malloc(n * sizeof(int));//分配内存 if (p) { for (int i = 0; i < n; i++) { p[i] = rand() % 20 + 1; /* *(p + i) = rand() % 20 + 1;*/ } return p; } } int main() { srand(time(NULL)); int n = 7; int* age = NULL; age = creat(n); if (age) { for (int i = 0; i < n; i++) { printf("%3d", age[i]); /*printf("%3d", *(age + i ));*/ } printf("\n"); } free(age); age = NULL; return 0; }
printf
()函数
可以把( ‘’ ‘’)中的内容显示在终端窗口里面 输出函数
printf("变量是%d\n",&a);
浮点数输出想去掉多余的零可以使用printf
函数的%.nf
格式,其中n
是你想要保留的小数位数
printf("%.2f\n", num);
输出两位小数
sizeof
() 函数
求变量的长度(字节数) sizeof
(变量/常量/数据类型)
byte(1) short(2) int(4) long(4) long long(8) unsigned long (8)
float(4) double(8) unsigned int (4) short int (2)
char(1)
printf ("sizeof(int)= %d\n",sizeof(int));
一个字节八个bit
scanf
()函数
变量的输入 从键盘中输入
格式: scanf(
‘’ 占位符”,&变量名) 占位符后面不要加\n
前面也不要加东西
scanf("%d",&a);
scanf("%d%d",&a,&b);
scanf("%d,%d",&a,&b);
输入时用(,)隔开 (格式得一样 中文输入对应中文输入)
如果系统报错让使用 scanf_s
就在代码最上端添加:
#define_CRT_SECURE_NO_WARNINGS
或者:
右键解决方案 找到属性右键 在配置属性中c/c++ 常规里面的SDL检查 关闭即可
//在类型符前面添加常量。表示最多接收几个数字 scanf("%4s",a);//最多接收4个数字 //遇到空格和\0自动跳出
清空缓冲区
setbuf
()函数
setbuf(stdin,NULL);
清空缓冲区
在输入时避免输错 只读取第一次输入的值 后面的清空
-
stdin 代表键盘输入
-
NULL 表示空(把键盘输入清空)
scanf("%d",&num1); printf("num1=%d\n",num1); setbuf(stdin,NULL); //放在两次输入之间 scanf("%d",&num2); printf("num2=%d\n",num2);
利用正则表达式清空缓冲区
格式 scanf("%*[^\n]%*c");
-
scanf("%*[^\n]");
把输入缓冲区里第一个换行字符(\n)前所有的内容删除 -
scanf("%*c");
丢掉\n
system("CLS");//清屏函数
数据类型 打印(输出)
占位符和数据类型不匹配就是乱码(有误)
如果字符类型char用%d输出就是ASCLII码
%d 占位符 整形 int 整形 short短整 long 长整形
%f 小数 float 单精度浮点数 double 双精度浮点数
%c 字符 char字符类型
%g 删除多余的零 %lg %lf double类型使用
%x 打印十六进制
%u 打印无符号
%p 地址
%s 字符串
unsigned 无符号 只表示正数 只能用在整形
%g 删除多余的零
char 赋值用单引号 只能字符(一般一个字符)
输出字符的两种方式
getchar( )
括号里不放参数
putchar
和getchar
可以一起用
char b; b=getchar(); //在键盘输入一个字符给b putchar(b); //输出b(也就是输出从键盘获取 的字符)
常用运算符
算术运算符
取余 %d %% %d
printf("c=%d\n:",c=b--);//此时C的值是b的值
printf("c=%d\n:",c=--b);//此时C的值是b--后的值
赋值运算符
运算符之间不要有空格
比较运算符
0假1真
逻辑运算符
逗号运算符
位运算符
按位与
相同为一
按位或
有一为一
按位异或
相同为0
//用异或来交换二个数的值 a= a ^ b; b= b ^ a; // b= b ^ b ^ a 相同的数异或二次是0 a= a ^ b; // a= a ^ a ^ b
按位取反
#include <stdio.h> int main () { printf("%d\n",~9); //按位取反 return 0; }