翁恺老师全套C语言课程笔记(本菜鸟正在学习)

...

一些程序英语单词

void/ vɔɪd / n.空白        array / əˈreɪ / n.数组         string / strɪŋ / n.串

character n.字符         string n.字符串;线、细绳;

第一章 C语言预备知识

C++兼容大部分C语言的语法,而不兼容的语法,我们在日常的使用中,几乎是不会遇到的

使用C++源文件可以编译C语言代码

c语言关键字

printf函数

printf("占位1 占位2", 替换1, 替换2);

printf是一个变参函数,(参数个数和参数类型都是不确定的)

第一个参数必须是字符串,

第一个参数是需要输出的内容

第二级参数及后续参数将依次替换占位符

占位符的类型和数量需要和后续参数一一对应

输入输出缓存

输出函数有输出缓存,输入函数有输入缓存

我们往洗衣机里加衣服,往往时积攒一定数量后再扔洗衣桶里;缓存区相当于存放脏衣服的筒子,存放一定量的数据,在等待批量处理。

刷新缓存区:我们将1.数据发送到目的地,2.再清空缓存区,就是刷新缓存区。

输出缓存区

我们向控制台输出字符时,程序会先将打印的字符串,放到输出缓存区中,到特定时刻会一起显示到控制台上。

在计算机中需要将显示在屏幕上的数据发送到显卡,再由显卡进行显示。显然,累计一串字符再批量发送,比起一个一个发送更有效率。

输出缓存是系统行为,而不是函数特性

对于windows系统来说,数据一旦被写入到输出缓存区,就会立刻被刷新,然后显示

linix:数据中有换行符,立刻刷新缓存区,如果没有换行,直等到系统结束之后,才会刷新(行缓存:一行结束(换行符\n)之后必须刷新缓存)

#include <stdio.h>
#include <windows.h>
int main_h1()
{
	for (int i = 0; i < 10; i++)
	{
		printf("Hello world %d", i);
		Sleep(500);
	}
	return 0;
}

输入缓存区

输入函数属于阻塞函数

当输入缓存区没有内容时,程序将阻塞在输入函数中,等待用户从键盘输入字符,并按回车确认。

只有当我们按下回车键,也就是输入换行符\n,输入的字符串将进入输入缓存区。

接下来,输入函数将1.从输入缓存区中获取字符,2.删除缓存区中得到的字符,并3.解除阻塞状态,继续执行代码。

只有当输入缓存区没有字符时,输入函数才会进入阻塞状态

getchar:输入一个字符

scanf:输入一行字符串

#include <stdio.h>
//输入缓存区
int main_h2(){
	//输入helloworldhelloworld
	//--变量声明
	char str[20];
	int i = 0;
	//--数据处理--
	//循环之后i的值刚好是所输入字符的后一个
	while (i <= 18)
	{
		str[i++] =  getchar();
		if (str[i-1] == '\n') //看看在输入的字符是不是回车,是的话就跳出循环,不再输入字符。
		{
			break;
		}
	}
	str[i] = '\0'; //字符串结束的标志
	//--数据输出--
	printf( str);
	scanf("%s", str);
	printf(str);
	return 0;
}

getch函数,相当于无缓存的getchar

getche函数,会将输入的字符打印在控制台上,无需再次调用putchar打印

//不带缓存的输入函数
//getch函数,相当于无缓存的getchar
//getche函数,会将输入的字符打印在控制台上,无需再次调用putchar打印
int main_h3() {
	while (1)
	{
		char c;
		c = _getche(); //无需回车,没有缓存区,getch立刻获取对应字符
	//	putchar(c);
		if (c == 'q')
		{
			break;
		}
	}
	return 0;
}
//总结练习
int main() {
	char c ;
	c = getchar();
	putchar(c);
	c = _getch();
	putchar(c);
	c = getchar();
	putchar(c);
	return 0;
}

第二章 计算

1 关于sacnf

scanf

读入整数:scanf("%d", a);

输出整数:printf("%d", a);

读入浮点数:scanf("%lf", c);

输出浮点数:printf("%f", c);

scanf_s

scanf_s括号内有三个参数,最后一个是变量a所占据空间的大小(单位为字节),可以用sizeof函数表示。

scanf_s("%c %c", &a, sizeof(a), &b, sizeof(b)); // 可不要写成 scanf_s("%c%c",&a,&b,1,1); 这样会出错的

scanf_s("%d %d", &a, &b, sizeof(a),sizeof(b)); // 如果输入整型数据,sizeof()在所有取地址的后面;而和上面一样输入字符的话,每个取地址后面都要有

如果输入的字符个数>=数组元素个数,是不会打印数组中的元素的。(而scanf函数就会打印出)

2 表达式

运算符表示动作;

算子参与运算的东西;

四则运算

c语言:加 减 乘 除 括号 取余(取余数,如9%2=1)

计算时间差程序

3 运算符优先级

结合关系:单目和赋值运算符 自右向左 运算

单目:就是给一个数取相反数或者不变(如a*-b 就是a乘以b的相反数)

4 复合赋值

5个算数运算符(+ - * / %)可以和唯一一个赋值运算符结合起来,形成5个复合赋值运算符(+= 、-+ 、*= 、/=、%=)

算术运算符+赋值运算符=复合赋值运算符(注意不要有空格,如a += 5,就是a=a+5)

递增递减运算符:++ --,作用是加一或减一

a++ 就是 a = a+1 (a += 1)

  • 前缀与后缀,都是给a加了1
  • a++ 是以前的那个值
  • a-- 是以后的那个值

对于表达式,后缀是以前的值,前缀是以后的值

数据类型


第三章 判断与循环

循环条件必须以关系运算符来表示,满足则继续循环;不满足则结束循环。

for(1; 判断; 3);

do{}while(判断)

while(判断)

1 关系运算符

== 相等

!= 不相等

>大于

>= 大于或等于

< 小于

<= 小于或等于

关系运算的结果

成立 为 1

不成立为 0

优先级

赋值运算<关系运算<算数运算

如int r = a>0 把a>0的真假01值代入r中

连续的运算从左到右进行

2 否则的话,else

if( the condition ){ your function }

else{ your condition }

如果成立的话,运行后面

如果不成立的话,另一个运行

写代码有的时候是你能不能让更多的人读懂你的代码

3 判断与循环

if判断

if ( the formula ) //如果小括号里面的关系运算为1,则继续

{ } //如果为零,则跳过花括号继续运行


对所有循环:条件成立,继续循环;条件不成立,离开循环

while循环

1.一个数字有几位数?

2.数位数的算法

while循环:当条件满足时,就一直做这个循环

一定要有走出循环的条件

总结:if和while竟然只有一次和多次的区别

if是判断是不是,然后就走了

while除了要判断是不是,是的话增加条件继续循环,直到不是就走了(反之同理)

列出变量表格法是人脑模拟计算机的一种有效手段,特别是对于循环程序来说。

在程序中加上“//”使得这行程序失效

对于编程中的除法运算,对于/10,就是划掉最后一位

2.printf here或者printf 数值 可以起到标记的作用

dowhile循环

dowhile格式

do

{

} while()

dowhile循环和while循环的唯一区别就是while先判断条件,dowhile后判断条件

左边是dowhile循环, 右边是while循环

for循环

结构

for(初始条件;循环条件;每轮循环结束完要做的动作) {}

算法:阶乘

for 等于 对于

for(count=1;count>0;count--)

对于初始化的count=1,判断count是否大于0,如果是就执行循环体,执行完循环体一次后,再让count减1;重新判断count是否大于0,就这样循环,直到count<=0就退出循环

for 循环的循环次数

for(i=0;i<n;i++) 表示 1.循环n次 2.初始值i=0,循环结束以后i=n

for(i=1;i<=n;i++) 表示 1.循环n次 2.初始值i=1,循环结束以后i=n+1

for 与 while 的异同:for和while是等价的,总可以找到办法可以互换

//三种循环for、 while、 dowhile

//三种循环的使用条件

如果有固定次数 用for

如果必须执行一次 用do while

其他用 while


第四周 进一步的判断与循环

一、逻辑运算

  • 逻辑运算是对逻辑量进行的运算。结果只有0或1
  • 逻辑量是关系运算或逻辑运算的结果

! 逻辑 非 !a a是对的,结果就是错。a是错的结果就是对。

&& 逻辑 与 a&&b a,b都对结果是对,否则都是错

|| 逻辑 或 a||b 一个对,结果就是对

如何表达x在(4,6)?

错误示范:4<x<6的结果是一个逻辑值(0或1)

正确示范:4<x && x<6

!a<20 意思是 先计算“!”运算符,a如果为0,!a为1;a如果不为0,!a为0

优先级

短路

条件运算

三个例子

如第一个,如果m小于n的话,那么结果是x,否则是a+5

最好不用嵌套的条件表达式

逗号运算符

只在if中使用

//嵌套的if-else

  • 如果没有{}的话,else和最近的if匹配

建议

  1. if和else后面接{},即使只有一句话

代码:求三个数中最大的那个数

嵌套的if-else语句

//2级联的if else-if

分段函数的代码

这是一个递进的关系

单一出口:只有一个printf比较好

//多路分支 switch-case

惯例

switch(){}

switch(控制表达式只能是整数)

{

case 常量:

语句

...

case 常量:

语句

...

case 常量:

语句

...

default:

语句

...

}

case 1,2,3..像是一个位置点,一个路牌,不能阻止语句往后走,直到遇到一个break

只有当碰到break的时候离开

代码:成绩转换

利用除以十划去最后一位的性质

//循环计算

log2x的代码

小套路int t=x 最后输出t,就可以防止最后输出x

x>1等价于x>=2

第二个例子

模拟比较少的次数,做推断

如何判断一次循环完成? 可以在其中输出一个数,最终输出了几个数,就完成了几次循环

4.4.2 算正整数的平均数代码

4.4.3猜数代码

随机数每次召唤rand()就得到一个随机的整数

小套路:x%n的结果是[0,n-1]之间的一个整数,特别地,x%100的结果在[0,99]之间,相当于划掉除了最后两位的前面所有数,只保留最后两位数

另外,用二分法最多7次就能求出来结果

4.4.5 求一个整数的逆序

  • %10 得到个位数
  • /10 划去个位数
  • *10 往左移动一位

4.5 判断和循环常见的错误

永远在if和else后面加{}

一定不能在if()后加上;这样的意思是if语句在这里就结束了,后面的大括号也就是正常运行

初学者一开始就尊重warning

if和else后面加大括号{}

大括号内的内容增加一个缩进

第五章 循环控制

1 循环控制

素数:只能被1和自己整除 不包括1 5=1*5

如何判断一个自然数是不是素数,就看它能不能被1和它本身之间的数整除

break:跳出for{循环体},打破循环,出去

continue:跳过for循环在这一轮中剩下的语句,进入下一轮的for循环;剩下的不做了,回去做新一轮循环;

判断一个数是不是素数

2 多重循环

如何用1角、2角、5角的硬币凑出10元一下的金额呢?

break和continue只能对它所在的那层循环做

3 循环应用

求最大公约数

正序分解正整数

第六章 函数

1 初见函数

以下两个例子来说明函数的重要性与必要性!

素数求和

求和

2 函数的定义和调用

下图是函数的定义格式:

调用函数

格式:

函数名称 (参数列表);

参数列表中的参数会被按照顺序依次用来初始化函数中的参数

4 从函数中返回值

如果函数需要返回一个结果,那么需要用return把那个结果交给调用它的地方

return语句做两件事

1.停止函数执行

2.送回一个值

return两种写法

1.return;

2.return 表达式;

一个函数可以出现多个return,但是这样写错之后修改会很麻烦。

没有返回值的函数:void 函数名,可以没有return

如果函数有返回值,则必须使用带值得return

5 函数声明(也叫函数原型)

格式:

数据类型 函数名称(数据类型 数据名称, 数据类型 数据名称); //函数声明 也叫函数原型 (参数列表里的是形式参数)也可以不写形参,只写数据类型

...

数据类型 函数名称(数据类型 数据名称, 数据类型 数据名称) //函数定义

{

函数体

}

函数告诉编译器这个函数的三要素:

  • 21
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值