【学习笔记】C语言基础知识大全,帮你快速过一遍C语言相关的知识(1)

本篇学习笔记是观看B站《郝斌C语言自学教程》课程做出的学习笔记。

课程评价:讲解细致、易懂,五星好评,哈哈哈哈

目录:(视频P1-P97) 一、C语言的简介、变量的类型 二、printf()和scanf() 三、运算符
四、流程控制(条件、循环)(if、while、switch) 五、break、continue 六、如何看懂一个程序 七、一些重要的例子

目前课程的收获:
(1)养成为程序添加时间、功能、输出结果的注释的习惯;
(2)很多程序我们需要把自己当成计算机进行试数,然后一步一步去理解这个程序;

一、C语言的简介、变量的类型
1.程序设计语言的发展:机器语言->汇编语言->高级语言(面向过程、面向对象)

C的特点
优点:速度快、功能强大
缺点:可移植性不强、开发周期长、危险性高

2.变量的数据类型:
整数:
int 整型
long int 长整型
short int 短整型

浮点数:
float 单精度浮点数
double 双精度浮点数

字符串:
char

复合类型:
结构体
枚举
共用体

变量:变量的本质就是内存中有一段存储空间

初始化:即给变量赋值

二、printf()和scanf()
1.printf() --将变量的内容输出到显示器上

1printf("字符串");2)printf("输出控制符",输出参数);3)printf("输出控制符1 输出控制符2",输出参数1,输出参数2;4)printf("输出控制符 非输出控制符",输出参数);

输出控制符有:

%d    --int(十进制输出)
%ld   --long int
%f    --float
%lf   --double
%c    --char
%x(或者%X或者%#X)  --int\long int\ short int(十六进制输出)
%o    --int\long int\ short int(八进制输出)
%s    --字符串

2.scanf() --通过键盘将数据输入到变量
(1)scanf(“输入控制符”,输入参数);
//sacnf("%d",&i); &i 表示i的地址 &取地址符
功能:将从键盘输入的字符转化为输入控制符所规定格式的数,然后存入以输入参数的值为地址的变量中
(2)scanf(" 非输入控制符 输入控制符",输入参数);
//scanf(“m%d”,&i); 一般不用
非输入控制符必须原样输入,这里必须先输入m然后才能输入数字
(3)scanf接受多个输入
scanf("%d %d",&i,&j);
sacnf("%d,%d",&i,&j); //这里输入数字的时候必须在输完第一个数字后加上一个逗号在输入第二个数字,即非输入控制符必须原样输入
/在scanf中非输入控制符尽能不用就不用,建议使用空格隔开/

三、运算符
1.算数运算符

 + - * /(除) %(取余)

PS:
(1)两个int相除,结果为int;
(2)除数与被除数任意一个或都为浮点数,结果为浮点数;
(3)%取余的运算结果,其余数的符号与被除数相同。(13%-3==1 -13%3==-1 -13%-23=-13)

2.关系运算符

> >= <= < ==(等于)!=(不等于)

3.逻辑运算符

!(非) &&(与) ||(或)

PS:
&&左边的表达式为假的时候,右边的表达式就不执行了;
||左边的表达式为真的时候,右边的表达式就不执行了。
 
4.赋值运算符

= += -= *= /=
a += 2 等价于 a = a + 2

优先级别:算数>关系>逻辑>赋值

小知识点:(了解即可)
1.自增[自减]:

前自增:  ++i
后自增:  i++
相同点:最终都使i的值加1
不同点:前自增整体表达式的值是i加1之后的值;
	   后自增整体表达式的值是i加1之前的值。

2.三目运算符

格式:
	A?B:C
	等价于
		if (A)
			B;
		else
			C;

3.逗号表达式

格式:
	(A,B,C,D)
功能:
	从左到右执行,最终表达式的值是最后一项的值。

PS:
(1)C语言对真假的处理:非零为真,零为假。(真用1表示,假用0表示)

四、流程控制(条件、循环)

分类:
1.顺序

2.选择:有选择的执行某些代码,有些代码可执行可不执行。

分类:

(1)if:

1.if最简单的用法:

格式:
	if (条件)
		语句;

知识点:如果条件为真,执行语句;否则不执行。

2.if的范围问题:

格式:
	if (条件)
		语句A;
		语句B;

知识点:if默认只能控制一条语句,即只能控制语句A的执行或不执行,而无法控制语句B。(最好把语句B跟if对齐)

格式:
	if (条件)
	{
		语句A;
		语句B;
	}

知识点:此时if可以控制语句A和语句B了

总结:if默认只能控制一条语句的执行,如果要控制多条语句,需要用{}括起来。

3.if…else…的用法

格式:
	if (条件)
		语句A;
	else
		语句B;

知识点:
(1)如果条件为真,执行if下的语句A;条件为假,执行else下的语句B;
(2)如果想要执行多条语句需要用{}来实现,即{}里的一起执行。

4.if…else if…else…的用法

格式:
	if (条件1)
		语句1;
	else if (条件2)
		语句2;
	esle
		语句3;

知识点:
(1)条件1成立,执行语句1;条件2成立,执行语句2;条件1、2都不成立执行语句3;
(2)想执行多条语句用{};
(3)esle if可以有任意多个;
(4)空语句

格式:
	if (条件);
	等价于		//这是空语句
	if (条件)
		;

(5)if、else if、…、或else有多个条件都成立时,只会执行最前面成立的那个。

重要例子:(涉及一丁点算法)
问题描述:输入三个数,让它们从大到小排序输出。
解题思路:先假设第一个变量是最大的然后拿它跟第二个变量比,把大的数放在第一个变量上,然后拿这个大的数跟第三个变量比,大的数赋值给第一个变量;最后比较余下两个的变量,大的数放在第二个变量上就可以了。

#include<stdio.h>
int main(void)
{
	int a,b,c,t;
	scanf("%d %d %d",&a,&b,&c);

	if (a < b)
	{
		t=a;a=b;b=t;	//a,b交换
	}

	if (a < c)
	{
		t=a;a=c;c=t;	//a,c交换
	}

	if (b < c)
	{
		t=b;b=c;c=b;	//b,c交换
	}
	printf("三个数从大到小排序为:%d %d %d\n",a,b,c);
	return 0;
}

(2)switch
格式:

switch (表达式)
{
	case 常量表达式1:	语句1;
	case 常量表达式2:	语句2;
	...
	default:	语句n;
	case 常量表达式3:	语句3;
}

case和default的顺序可以任意排列。

重点:switch语句是选择,而不是循环。break语句能够跳出switch语句。在switch中出现continue是错误的,除非switch本身就属于for或while循环的一部分。

case后面的常量表达式需要是:
(1)枚举元素
(2)数值常量
(3)字符常量
(4)常变量
(5)宏名中的一种

例子:

#include <stdio.h>
int main(void)
{
	int val;

	printf("请输入您要进入的楼层:");
	scanf("%d",&val);

	switch (val)
	{
	case 1:
		printf("1层开!\n");
		break;
	case 2:
		printf("2层开!\n");
		break;
	case 3:
		printf("3层开!\n");
		break;
	default:
		printf("没有盖到这一层\n");
		break;
	}

	return 0;
}

val的值跟1相等执行1下面的语句,与2相等执行2下面的语句,…
否则执行default下面的语句

重点:
当把case 1 下面的break注释掉,那么当val==1时,

输出是
1层开!
2层开!

原因:case和default相当于入口,当它找到入口后程序会从入口处开始往下执行,没有break语句的话它会从入口处把下面的程序全部执行一次。而这里的break语句能够跳出switch(不是跳出循环,switch语句是选择不是循环)。(if语句同理)

3.循环
(1)for

格式:
	for(1;2;3;)
		语句A;

执行次序:1->2->A->3->2->A->3…->3->2不满足条件跳出循环
先执行1,然后判断是否满足2,满足的话执行A,然后执行3,在判断2是否满足,然后继续…如果2不满足就直接跳出循环。
for(i=1;i<=100;++i)、for(i=1;i<=100;i=i+1)

(2)while

格式:
	while (条件)
		语句;

满足条件,执行语句。while默认控制一条语句,借助{}来控制多条语句。

(3)do…while();
主要用于人机交互
格式:

do
{
	语句;
}while (条件);		//这里的分号不要忘了

直接先执行一次语句,然后再判断条件,条件为真继续执行语句,直到条件为假跳出循环。

五、break和continue
(1)break
作用:终止循环(多层循环中只终止距离它最近的循环)、终止switch语句(多层switch中终止距离它最近的switch)

(2)continue
作用:用于跳过本次循环余下的语句,转去判断是否需要执行下次循环。(结束本次循环,判断是否进入下一次循环)

六、如何看懂一个程序
1.流程
2.每个语句的功能
3.试数

对于一些小算法的程序:尝试自己去编程解决,大部分人都无法在第一次接触时解决;如果解决不了,就去看答案,关键是要多花点时间去看懂答案。看懂之后尝试去修改程序,并且知道修改之后程序的不同输出结果的含义,然后照着答案敲代码,最后不看答案自己尝试去把代码敲出来。

七、一些重要的例子:
1.求1~100之间的奇数之和、偶数之和、奇数的个数、奇数的平均值。

#include <stdio.h>
int main(void)
{
	int i, sum1 = 0, sum2 = 0;//sum1-偶数之和 sum2-奇数之和
	int num=0;	//num-奇数个数
	double average;		//average-奇数的平均值
	for(i=1;i<=100;++i)
	{
		if(i%2 == 0)		//如果i为偶数
		{
			sum1 = sum1 + i;
		}
		esle 		//i为奇数
		{
			sum2 = sum2 + i;
			num = num + 1;
		}
	}
	average = 1.0*sum2 / num;	//1.0默认为double类型
	printf("奇数之和是:%d,偶数之和是:%d\n",sum1,sum2);
	printf("奇数的个数是:%d\n",num);
	printf("%lf\n",average);
return 0;
}

2.计算1+ 1/2 + 1/3 +…+ 1/100的和。

#include <stdio.h>
int main(void)
{
	int i;
	float sum=0;

	for(i=1;i<=100;++i)
	{
		sum = sum + 1.0/i; //推荐使用这个。或使用强制类型转换也可以实现:错误的写法:(float)(1/i) 正确的写法:1/(float)(i)
	}
	printf("sum = %f\n",sum);
	return 0;
}

注意:这里必须是1.0,如果使用1,相除后得到的结果是;零,最后全部加起来的结果是1。

知识点
(1)强制类型转化:
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型
例子:
(int)(4.5+2.2) 最终值为6
(float)(5) 最终值为5.000000

(2)浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数,它们存储的是一个近似值。(大部分数字可以,小部分不行)

举例:
1.有一个浮点型变量x,如何判断x的值是否为零?
if (x和一个非常小的值相减所得数字的绝对值接近零) //|x-0.000001| <= 0.000001
是零;
else
不是零;
2.循环中更新的变量的不能定义为浮点型

3.判断一个数是不是回文数(121、12321都是回文数,即数字反着写还是一样的)

#include<stdio.h>
int main(void)
{
	int val;	//存放待判断的数字
	int m;
	int sum = 0;

	printf("请输入您需要判断的数字: ");
	scanf("%d",&val);

	m = val;
	while (m)			//这里是关键代码,看不懂直接带入数字123来理解
	{
		sum = sum * 10 + m%10;
		m /= 10;
	}
	if (sum == val)
		printf("Yes!\n");
	else
		printf("No!\n");

	return 0;
}

4.输入一元二次方程的三个系数,求解一元二次方程

#include <stdio.h>
#include <math.h>
int main(void)
{
	//定义三个变量 
	double a, b, c;
	double delta;		   
	double x1,x2;		  //一元二次方程的两个解x1,x2 
	char ch;
			
	do
	{
		printf("请输入一元二次方程的三个系数:\n");
		printf("a =");
		scanf("%lf",&a); 
	
		printf("b =");
		scanf("%lf",&b);
	
		printf("c =");
		scanf("%lf",&c);
		
		delta = b*b - 4*a*c;
		
		if( delta > 0 )
		{
			x1 = (-b + sqrt(delta)) / (2*a);
			x2 = (-b - sqrt(delta)) / (2*a);
			printf("该一元二次方程的两个解x1=%lf,x2=%lf\n",x1,x2);
		}
		else if( 0 == delta)
		{
			x1 = (-b) / (2*a);
			x2 = x1;
			printf("有唯一解,x1=x2=%lf\n",x1);
		}
		else
		{
			printf("无实数解\n");
		}
		printf("您想继续么(Y/N):");
		scanf(" %c", &ch); 		//%c前面必须得加一个空格 
	}while('y' == ch || 'Y' == ch);
	
	return 0;
 } 

闲聊:这次是为了复习一遍C语言的知识点并把两年前没学好的C语言内容尤其是指针学号来,当时确实感觉特别的难,毕竟第一次接触到这个,然后自己又有点浑浑噩噩的混过去了,这次把握住机会好好学好来,加油,各位!!!
(这里我也添加了个我自己做的笔记的文档的下载)

发布了21 篇原创文章 · 获赞 1 · 访问量 649

猜你喜欢

转载自blog.csdn.net/weixin_43873121/article/details/105231732