翁恺C语言程序设计网课笔记合集 您所在的位置:网站首页 c语言翁恺课件pdf免费下载 翁恺C语言程序设计网课笔记合集

翁恺C语言程序设计网课笔记合集

2023-10-10 15:08| 来源: 网络整理| 查看: 265

@[toc]

0. 前言

是翁恺老师的132PC语言程序设计网课。链接:【C语言】翁恺C语言程序编程全系列是C语言入门的地方~还是希望多多指正!

1. 背景计算机和编程语言

学习目的:理解计算机是怎样工作的计算机是生活中的必需品。 如果我们想要自己设计一些功能和行为,让计算机按照自己的意图做事,就需要写程序了。本课程的主要目的是通过学习编程,来理解计算机是如何解决问题,计算机的能与不能,pros and cons.计算机怎样解决问题?把大问题拆分成小问题分步进行人:what to do。比如告诉同桌开一下灯,他去把灯打开。计算机:how to do。同桌不知道如何开灯,你要和他说:走到开关前,按下开关,走回来……程序是用特殊的编程语言写出来表达如何解决问题的。我们不是在用编程语言和计算机交谈,而是要求它如何做事情,向它描述做事情的过程和方法。

//例:hello world! #include int main() { printf("Hello World!\n");//输出“Hello World!(换行)”引号内的部分 return 0; } 普通人能读懂的东西→程序员能懂的东西→计算机能懂的东西计算机程序算法(算法:我们想让计算机做计算,先要写出计算的步骤,然后用编程语言写出来。计算机做的所有事情都是计算;计算的步骤就是算法。) 计算机的思维方式

例:解方程2x+6=20 , x∈(1,10)直接解方程对计算机来说太难理解了。计算机的思维:1) 枚举法代入x=1,不行;代入x=2,不行;代入……2) 二分法代入x=5,小了;代入x=7……

计算机执行程序有两种方案:1) 解释:借助一个程序,那个程序可以试图理解你的程序,然后按照你的要求执行2) 编译:借助一个程序把你的程序翻译成机器语言写的程序,然后计算机就可以直接执行了。

解释语言vs编译语言:语言本无解释与编译之分,只是常用的执行方式不同。解释型语言有特殊的计算能力;编译型语言有确定的运算性能。

为什么编程入门从C学起?

语言排行在这里插入图片描述

1) 在很多场合,C语言是唯一的选择2) 现代编程语言在语法上差异很小,基本都和C接近3) 语言的能力、适用领域主要是由 库 和 传统 决定的。

C的简单历史

1969诞生。FORTRAN→BCPL→B语言→C语言

*1967年,剑桥大学的 Martin Richards 对CPL语言进行了简化,于是产生了BCPL(Basic Combined Pogramming Language)语言。1970年,美国贝尔实验室的 Ken Thompson。以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。在1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了C语言。*因为B和BCPL都支持指针间接方式,所以C语言也支持了。C语言还受到了PL/I(和底层系统很接近,可以拿来做操作系统等)的影响,还和 PDP-II的机器语言有很大关系1973/3,第三版的Unix上出现了C语言的编译器1973/11,第四版的Unix完全用C语言重新写的。经典C,又叫K&R the C经典C,又叫K&R the C1989年,ANSI发布了一个标准:ANSI C1990年,ISO接受了ANSI的标准:C89C的标准在1995年和1999年两次更新:C95和C99。现在的编译器都基于C99了,因此本课程也是。

编程软件用什么

C语言的用途:写操作系统、嵌入式系统、驱动程序(用来驱动U盘)、底层驱动、图形引擎、图像处理、声音效果(直接给我们提供数据的代码不是用C语言写的)一些底层的东西。C语言是一种工业语言,由基础人员使用。所以:**开发效率>>学习过程开发效率>>开发乐趣**而在日常的应用中,很少直接用C语言编写。学习C的过程主要是写练习代码,而不是写真实软件。C语言需要被编译才能运行,所以需要:编辑器和编译器(或者IDE,Integrated Development Environment集成开发环境,一个顶俩)推荐的编程软件:Dev C++。免费,安装简单,还不用建工程。在这里插入图片描述

2. 入门:从Hello World开始第一个C程序

在Dev C++中:文件->新建->源代码

输入之前确保是英文输入!!!

#include int main() { printf("Hello World!\n"); return 0; }

梦开始的地方。可以先自己敲进去运行玩玩**上端显示星号,说明没有保存。Ctrl + S 保存并且记得选择.c格式。编译之后再运行。**运行后出现黑色的终端,上面显示了结果。

详解第一个C程序#include int main() { return 0; }

本课程中所有的程序都需要用到这一段框架(直到学函数之前)printf()会把" "内的内容(字符串)原封不动地输出,\n表示换行。如果出现编译错误,会在下面用红色的error显示出来,而具体错误原因在下方窗口里。

简单计算printf("%d",23+43);

%d是占位符,说明后面会有一个整数输出到这个位置上。

printf("23+43=%d",23+43);四则运算C符号意义++加--减×*乘÷/除 %取余( )( )括号3. 变量变量定义

找零钱问题:100-(用户输入)物品的价格=找你的钱我们需要:1) 有办法输入数字;2) 有地方放输入的数字;3) 输入的数字参与计算。

int price=0;//定义了整形变量price,类型是int,初始值=0 printf("请输入金额(元):"); int change=100-price; printf("找您%d元。\n",change);

变量是一个保存数据的地方。变量定义的一般形式就是: 变量的名字叫“标识符”,基本原则只能由字母、数字、下划线构成,数字不能出现在第一个位置上。C语言的关键字(又叫保留字)不可用作字符。如何输入:输入也在终端窗口中。输入以行为单位进行,敲下回车,行结束。(敲下回车之前,程序不会读到任何东西。)

变量赋值与初始化 int price=0;//其中=是赋值运算符,把右边的值赋给左边的变量。

和数学中不同,b=a和a=b在程序中有着相反的含义。当赋值发生在刚定义变量时,就叫程序的初始化。虽然C语言并没有强制要求所有的变量在被定义的地方做初始化,但所有变量在第一次被使用(出现在=等号右边)前都应该被赋值一次。如果没有初始化呢?就是使用这个变量在内存中的那个值。变量初始化: =也可以在组合变量定义中给单个变量单独赋初值,如

int a=0,b=1;

有运算符的式子就叫表达式(比如=是赋值运算符)C语言是有类型的语言,所有变量在使用前必须先定义或声明;所有变量必须有确定的数据类型(表示在变量中可以存放什么样的数据),变量中也只能存放指定类型的数据,程序运行过程中也不能改变变量的类型。int charge=100-price;比较C和ANSI C

//C语言 int price=0; printf("请输入金额(元):"); scanf("%d",&price); int change=100-price; printf("找您%d元。\n",change);//传统的ANSI C只能在开头的地方定义变量 int price=0; int change=0; printf("请输入金额(元):"); scanf("%d",&price); change=100-price; printf("找您%d元。\n",change);变量输入

scanf()函数,读到的结果赋值给后面的变量(注意变量前的&)如果输入非整数(比如找钱一例中:输入字母,找我100元)应该怎么处理?这种情况后面再说。

常量vs变量

固定不变的数,是常数。直接写在程序里的,叫直接量。

const int amount=100;

其中const是个修饰符,加在int前面,给这个变量加上一个const(不变的)属性,表示这个变量的值一旦初始化,就不能再更改了。 好处:1.便于理解2.修改的时候好找编译时会显示:read-only variable is not assignable(一般const的变量全大写)scanf的空格有讲究,以后再说。输入时如果要两个数,在中间、最后敲空格或回车,计算机读到两个数字时停止当scanf扫描数字时输入字母,可能会出来很多奇怪的数字。(应该是ASCII码吧?)后面再细说。

浮点数

C语言中两个整数做运算得到的结果也只能是个整数(去掉小数部分)。而10和10.0在c中是完全不同的两个数字,10.0是浮点数(浮点数指小数点时可以浮动的,是计算机中表示分数和无理数的一种方式。人们用浮点数来称呼有小数点的数)(其实还有定点数。但是在c语言中无)当浮点数和整数放在一起运算时,计算机会自动把整数转化为浮点数计算(如:

int a,b; printf("a/b*3");//改进为a/b*3.0

有一次尝试printf("%f",3/2);输出的是整数。应该是先进行整数运算再以%f形式输出,而不是以%f形式输出。所以应该改进为3/2.0

有单精度float(%f)和双精度double(%lf)(计算机里会有这种纯粹的整数,是因为运算快、占地小。而且日常生活中大多也是整数运算。)

表达式

一个表达式是一系列运算符和算子的结合,用来计算一个值运算符(operator)是指进行运算的动作,比如加/减法运算符+-算子(operand)是指参与运算的值,可能是常数/变量/一个方法的返回值在这里插入图片描述

计算时间差:这里只记录分钟错位的情况(1:40和2:10)方法:全部记为分钟(小时*60)

int hour1,min1; int hour2,min2; scanf("%d %d",&hour1,&min1); scanf("%d %d",&hour2,&min2); int t1=hour1*60+min1;//把小时转化为分钟单位 int t2=hour2*60+min2; int t=t2-t1; printf("时间差是%d小时%d分。“,t/60,t%60);//t/60是小时部分;t%60取余,是分钟部分运算符优先级

(double输入的时候用%lf,输出的时候用%f就行)运算符优先级

优先级运算符运算结合关系举例1+单目不变自右向左a*+b1-单目取负自右向左a*-b2*乘自左向右a*b2/除自左向右a/b2%取余自左向右a%b3+加自左向右a+b3-减自左向右a-b4=赋值自右向左a=b(a+b,a-b是双目;+a,-a是单目,相当于正负号) 赋值也是运算,也有结果。 a=6的结果就是a被赋予的值,也就是6 如 a=b=6:自右向左,a=(b=6)。

嵌入式赋值:int c=1+(b=a)缺点:不利于阅读;容易产生错误运算符的结合关系一般自左向右;单目+-和赋值=自右向左下面的式子过于复杂,不利于阅读和理解。

result=a=b=3+c; result=(result=result*2)*6*(result=3+result);

所以应该把它拆开来计算。(C语言没有幂次,所以只能一个个乘。)

交换变量

交换a和b的值(a=6,b=5)错误示例

a=b; b=a;

程序表达的是顺序执行的动作,而不是关系.所以这样做先把b赋给a,然后再把a赋给b,都是5.方法:再找一个变量c,c=a储存一下a的值,然后a=b,b=c

c=a; a=b; b=c;

断点

在这里插入图片描述

DEV C++中,在左边数字那里点击一下,然后程序运行时就会在这一行停止。在这里插入图片描述

运行也只能到这一行点下一行,就会运行到下一行。这样可以方便排bugC语言:使用Dev C++断点调试

复合赋值

a+=5表示a=a+5(注意两个运算符之间无空格)类似有-=,*=,/=(a*=b+5表示a=a*(b+5),如果想先算a=a*b记得加括号)INC递增、DEC递减运算符:++,--:单目运算符,只能有一个算子,这个算子还只能是变量(如a++后缀形式,++a前缀形式)让该变量+1/-1;a++运算式的值是a+1以前的值;++a运算式的值是a+1以后的值。无论哪个,a的值都+1了在这里插入图片描述

++和--可以单独使用,但不要把它组合进表达式,复杂。

4. 判断(选择结构)

if条件判断

if(条件){ 要执行的语句,只有条件成立时才会执行 }判断的条件

计算两个值之间的关系,叫做关系运算==判断相等!=不相等还有>;>=;0;先判断a是否>0,再把0/1的值赋给r==和!=优先级比其他的低连续的关系运算是从左到右进行的5>3==6>4→1==1成立6>5>4→1>4不成立

找零计算器flowchat st=>start: 开始 i1=>inputoutput: 输入购买的金额 i2=>inputoutput: 输入支付的票面 o1=>operation: 计算找零 c=>condition: 判断余额是否充足 o2=>inputoutput: 打印找零 o3=>inputoutput: 告知用户余额不足以购买 e=>end: 结束 st->i1->i2->o1->c c(yes)->o2->e c(no)->o3->e //初始化 int price=0; int bill=0; //读入金额和票面 printf("请输入金额:"); scanf("%d",&price); printf("请输入票面:"); scanf("%d",&bill); //计算找零

//是(单行)注释,把程序分成了三个部分:初始化,读入金额和票面,计算并打印找零;c99可以,ASCII不支持comment对程序的功能没有任何影响,但是往往能使程序更容易被人类读者理解。/* */中间可以有多行注释。

否则

比如刚刚的找零计算器:金额b)max=a; else max=b; printf("大的那个是%d\n",max);

方案二

int a,b; printf("请输入两个整数:"); scanf("%d %d",&a,&b); int max=b; if(a>b)max=a; printf("大的那个是%d\n",max);

可以对比两种方案,方案二绝绝子

没有大括号的if语句

if语句可以不加大括号

if(a>b) max=a;

If这行结束并没有语句结束的标志;而后面的赋值语句写在下一行且缩进了,结束时有“;”。这表明这条赋值语句是if语句的一部分,if语句拥有和控制这条赋值语句,决定他是否要被执行。就是说,没有大括号,后面一句话是有效的,也只能这一句是有效的(包含在if里)。

嵌套的if-else

找三个数中的最大数:先比较两个数谁更大,较大的再和c比较。

if(a>b) { if(a>c)max=a; else max=c; } else { if(b>c)max=b; else max=c; } 级联的if-else if

如分段函数。这时可以用级联的else if 表达多种情况每个else是前一个if的else,但是前面两个都不满足的话就只剩下第三个了

flowchat st=>start: 开始 i=>inputoutput: 输入 o=>inputoutput: 输出 c1=>condition: 是否满足条件1 c2=>condition: 是否满足条件2 o1=>inputoutput: 输出条件1 o2=>inputoutput: 输出条件2 o3=>inputoutput: 输出条件3 en=>end: 结束 st->i->c1 c1(yes)->o1->en c1(no)->c2 c2(yes)->o2->en c2(no)->o3->en

其实相当于:

else { if() else }

比较该分段函数的两种写法

if(x0),做while;else位数=1,单独列出x=0的情况。另一种调试方法:在适当的位置加上printf输出作用不只有输出数据。比如在while括号内加一个printf(“in loop”);证明程序到这个地方了,也就是进入while循环了(还可以看循环了几次)

循环计算

编程难在小问题。如:有的时候可能需要保存原始数据。求log2x:x/=2,计数(当x>1时)但是如果printf(“log2 of %d is %d.”,x,计数);最后输出的x总是1,因为循环算完的时候x总是1所以我们开始要把原始的x保存一下。又是一个小细节~诸如此类,还有很多。如:

While可以用do while吗?为什么计数从0开始,可以从1开始吗?为什么while判断条件是x>1?循环最后输出的是多少?#include int main() { int x,ret=0; scanf("%d",&x); int t=x; while(x>1){ x/=2; ret++; } printf("log2 of %d is %d.",t,ret); return 0; }

其实都是相互牵扯的。1、 当x=1的时候,结果是0.也就是说我们希望当x=1时不要进入这个循环。2、 计数ret是我们希望进入这个循环是最小的数。如果想改成while(x>2),那我们的计数ret就要相应改成初始值=1.但是x=1时条件不满足。为了兼顾两种情况,还得用上面的方法。也可以ret=-1,while(x>0)编程肯定会有很多不同的方法。对于很大次数的循环,我们可以模拟较少的循环次数,然后做出推断,解决上面提到的四个问题。因为很多小细节,要多加注意。

猜数游戏

计算机想一个数,用户来猜,猜不对的话告诉用户大了还是小了,最后猜中了告诉用户猜了多少次。

1) 因为要不断重复去猜,所以我们要用到循环2) 实际写出程序之前,我们可以先用文字描述出程序的思路。3) 核心重点是循环的条件。4) 人们往往会考虑循环终止的条件。

flowchat st=>start: 开始 i=>inputoutput: 用户输入猜的数 ocnt=>operation: count++ o=>operation: 计算机随机想一个数,记在number里 c=>condition: 判断a是否等于number e=>end: 结束 o2=>inputoutput: 告诉用户大了还是小了 oe=>operation: 输出cnt猜的次数 st->o->i->ocnt->c c(yes)->oe->e c(no)->o2(right)->i

循环的条件是a!=number用函数rand()召唤随机整数使用方法:

//先加入两个头文件#include和#include #include #include #include int main() { srand(time(0));//Main里加上srand(time(0)); 先不用管什么意思 int a=rand();//如果想要a是100以内的整数:用取余即可(a%=100) int number=rand()%100+1;//这样召唤出来的数范围是1~100 //不管怎样用户都要进入这个循环,输入至少一个数;所以应该用do-while循环。 }算平均数

读入一系列正整数,输入-1时终止。然后输出他们的平均数变量->算法->流程图->程序num:我们需要读到的那一个数。sum(总和):每读到一个数把他加到sum里就完事了另一个变量count记录累加的次数,最后算平均数÷count

flowchat st=>start: sum=0,cnt=0 i1=>inputoutput: 读num c=>condition: num!=-1? o=>operation: sum+=num, cnt++ op=>inputoutput: 计算和打印结果 e=>end: end st->i1->c c(yes)->o->i1 c(no,left)->op->e

注意转化成浮点数来求平均值。浮点数转化方法: 1.0*sum/count

整数逆序

整数分解方法:%10得到个位数,/10;再%10得到十位数……整数逆序问题注意结尾0的处理;如果不用考虑0的话,我们可以每得到一位就输出一位。%10一下输出一下,/10,再%10输出一下,很快啊考虑0:那就应该把逆序数算出来在输出了。搞一个ret=0,每次ret=ret*10+n%10;

for循环

阶乘n!=n*(n-1)*(n-2)*……*2*1程序:输入n,输出n!需要借助一个变量i从1~n.这里的循环,我们用for来处理。for循环像一个计数器。达到一个数之前一直进行循环,在过程中i++或i--for(int i=0;i



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有