导图社区 C语言
涵盖了从C语言基础组成、算法结构到循环、选择语句,以及数组、函数和指针的使用等关键内容,适合用于编程学习的知识总结和复习。
编辑于2025-05-26 12:12:57中心主题
第一章
c语言的组成
函数
主要组成部分
是基本单位
函数的构造
首部和函数体
声明部分和执行部分
一个程序
有一个源程序
里面就包括很多的函数
每一个程序都是从main函数开始执行的
有若干个源程序
程序的执行流程
预编译处理
正式编译处理
把源程序转换为二进制来处理
与函数库连接
运行程序
第二章
算法的特性
有穷性
确定性
有零个或者多个输入
有一个或者多个输出
有效性
三种基本结构
顺序结构
选择结构
if,else if 语句 适合用于一个范围的值
switch(a),break语句适合特定的值
循环语句
当型循环
先判断条件是否成立,再来执行循环
while循环、for循环
直到型循环
until型
这个是先执行循环,再来判断条件
条件成立,跳出循环
条件不成立,继续循环
这个和do while循环有相似之处
先执行循环,再来判断条件
不同之处:条件成立,继续循环;不成立,跳出循环
第三章-顺序结构循环
常量和变量
常量
整型常量
实型常量
小数形式
指数形式
以e或者E来表示10为底的指数,e/E前后必须有数字,并且为整数
字符常量
' '的形式
普通字符
转义字符——要独立打出一个符号前面一定要加\
eg:单引号printf("\'")
字符串常量
" "的形式
符号常量
用定义的方法#define PI 3.14
变量
先定义再使用
常变量
两种定义方法
#define PI 3.14(符号常量)
const float PI =3.14(常变量)
标识符
对象的名字
字母、数字、下划线
第一个不可以是数字!!!
数据类型
整型
%d 十进制,%o八进制,%x十六进制
要注意取值范围-2^(8*n-1)~2^(8*n-1) -1这个是signed的情况下的
如果是unsigned的,就是0~2^(8*n) -1 %u的形式输出
int 4个字节
short 2个字节
long 4个字节
long long 8个字节
原码和补码的情况
整型再存储单元中的方式为补码!
求补码的方法
正整数:补码=原码=二进制
负整数
求|负整数|的原码→取反码→再加1
求出原码→最高位不变,取反码→再加1
字符型%c
char型 1个字节 用' '
浮点型 %f %lf
float型 4个字节 小数点后6位
double型 8个字节 小数点后15位
注意事项
int型在做除法的时候只保留整数部分,这是一大特性
浮点型%m.nf表示占m列,保留n位小数
自增自减运算a++,a--
逻辑运算:与或非&&,||,!
逻辑运算值:0为假,1为真/非0为真
=是赋值,==是判断是两个数是否相等!
按照优先级来运算
顺序是! 算术运算 关系运算 && || 赋值运算
前置运算++a,是先做a=a+1,再来用a的值
后置运算a++,是用a的值来判断,再做a=a+1
结果的数据类型往精度高的靠拢
char和int的结果是double型的
计算
函数的使用
scanf输入
对计算机而言:putchar输出字符
getchar()输入字符
数据值向左对齐%-m.nf
第四章-选择结构语句
if语句
嵌套式的if语句
更适合用于一个范围内部的
switch语句
更适合用于给定某个特定的值这样子的
有点像菜单栏的功能
实型变量之间不要直接对比,不要等于0这类条件出现,
看它是不是小于某个数
两个量之间相减看是不是足够小这样是可以的
逻辑之间的计算
0和非0的比较
指针
通过指针引用字符串
定义一个字符型指针变量
是把字符数组的首元素地址给到这个变量
%s输出时,会自动读取整个数组的地址,直到\0就不再输入
可以不在定义的时候赋值,可以任意改变值
例子:??
复制字符串的时候
while(*from!='\0') *to=*from; from++; to++;
后面要接一个*to=\0表示终止
%s的输出方式,就不会输出原来的多余字符
函数
函数的定义
有参函数
有形参变量的
int +函数名(数据类型!!)一定要
int sum(int a,int b)
float ddt(float a,float b)
函数类型决定返回值类型
eg int sum(int a,int,b)
float c;
return c;
最后返回的数据类型是int
无参函数
void +函数名( )没有形参变量
return;
函数的声明
注意要加一个;
函数的调用
不要加数据类型!!
sum(a,b)就可以了
主函数main里面调用其他函数
定义函数里面的形参的内存是临时被赋予的
在执行完该函数后就被释放
故定义函数与主函数的值没有关系!
函数的嵌套调用
调用的a函数里面包含b函数
函数的递归调用
自己调用自己
回溯
递推
一般会用if语句来限制回溯的步骤
会用兔子数列等
数组作为函数参数
void bubblesort (int arr[],int n)
这里是空函数,没有返回值,只是对数列中的数据进行排列
int arr[10]
bubblesort和arr的地址内存一模一样的
所以作为形参的bubblesort对于实参arr是有影响的
以前都是有返回值类型的,所以函数的功能能实现;现在是无返回值类型,却依然能够实现把变量传回给原函数,这就是地址传递的魔力!!!
相当于对同一地址的内容进行额外的操作
相当关于指针变量,不是值传递,是地址传递
数组的地址就是arr[0]
数组的使用
注意事项
索引是从0开始的
数组的数据类型不要忽视了
和排序有关的
冒泡数组
int temp;
temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp
注意这里的循环是内外层两层循环
int i,j;
for(i=0;i<len-1;i++)
10个数字只需要比较9次就可以 这里表示的是要经历几次相邻属于之间的比较的循环
for(j=0;j<len-1-i;j++)
打擂台数组
int temp=0;
if(arr[j]>temp) temp=arr[j]
字符数组
char arr[ ]={'a','b','c','d'};
未定义的字符为‘\0’表示就是空字符
空格是' '注意中间要有空间
字符串
用字符数组来定义
易错点char arr[ ]={"i love you"}
总共有11个字符,系统在最后会自动补充\0
字符串结束的标志就是\0,不打印的
char arr[ 11]√
char arr[ 10]×
两者之间的区别
要打印同样的一句话“i love you”
字符串:printf("%s\n",c);一次性打印
字符数组:for(i=0;i<11;i++) printf("%c\n",arr[i]);要使用循环
字符数组的输入输出
注意输入时,系统将空格识别为字符串之间的分隔符,自动分配的
例如:scanf("how are you");char str[13];str[13]={'how'}
相关的函数
puts (arr)输出
gets (arr)输入
连接两个字符串的strcat(str1,str2)
复制字符串的strcpy(str1,str2)
字符串长度的比较的strcmp,这个结果要以数的形式呈现出来
strcmp(str1,str2)>0,表示是大于的
<0就表示是小于的
strlwr表示全部小写
strupr表示全部大写
strlen表示字符串的长度不包括\0
如果要输入不同的字符串
定义二维数组,每一行一个字符串
int main(void) { char arr[5][20]; int i; for (i = 0;i < 5;i++) { 如果要用这个函数,就需要规定长度 scanf_s("%s", arr[i], 20); } for (i = 0;i < 5;i++) { printf("%s", arr[i]); } return 0; }
输入每一行就可以,这里是不需要用&因为代表的就是每一行的地址,就是arr[i][0]
这边是以字符串的方式输入的
第五章-循环结构语句
while循环
水仙花数的例子
int i = 100; while (i < 1000) { int a = i / 100; int b = i / 10 % 10; int c = i % 10; if (i == a * a * a + b * b * b + c * c * c) { printf("水仙花数为:%d\n", i); } i++; }
先判断后执行
dowhile循环
先执行后判断
for循环
九九乘法表
其实就是找行和列之间的关系,空格也是通过循环的数量来控制的
int i, j; for (i = 1;i < 10;i++)//(完整版) { for (j = 1;j < 10;j++) { printf("%d*%d=%2d ", i, j, i * j); } printf("\n"); } printf("\n"); for (i = 1;i < 10;i++)//(左下角三角) { for (j = 1;j <= i;j++) { printf("%d*%d=%d ", i, j, i * j); } printf("\n"); } printf("\n"); for (i = 1;i < 10;i++)//(左下角三角形) { for (j = i;j <10;j++) { printf("%d*%d=%2d ", i, j, i * j); } printf("\n"); } printf("\n"); for (i = 1;i < 10;i++)//(右上角三角) { for (j = 1;j < i;j++) { printf(" "); } for (j=i;j<10;j++) { printf("%d*%d=%2d ", i, j, i * j); } printf("\n"); } printf("\n"); for (i = 1;i < 10;i++)//(右下角三角) { for (j = 1;j <10-i;j++) { printf(" "); } for (j =1;j <=i;j++) { printf("%d*%d=%2d ", i, j, i * j); } printf("\n"); } return 0;
他在这一步里面有两个循环,一定要第一个执行完 之后才能执行第二个;在执行过程中就是在打印空格 所以可以用包含两个循环的循环来打印有规律的图案
冒泡数组
打擂台的数组,求出最值的
外层控制行,内层控制列
是控制有几行几列,而不是第几行第几列
两个语句
break语句
直接跳出循环,结束整个程序
continue循环
跳过本次循环,开始下一次的,可以节省很多时间