第一周:程序设计与C语言
1.编程:是告诉计算机去做什么,用编程语言写出来如何去解决问题,而不是去用编程语言和计算机交流,而是描述要求它如何做事情的过程和方法
2.解释和编译的区别:
解释:是用一种软件去帮你执行你的高级语言,例如python,与编译不同,它有执行的动作,帮你去执行了
编译:是将你写的高级语言程序用一种编译器,变成计算机能理解的二进制代码——机器语言,而没有去执行这串二进制代码,需要进一步的去执行
(注:C语言需要被编译才能运行,所以需要编辑器、编译器或者IDE集成开发环境)
gcc是一个编译工具,常被集合在相应的开放软件中,也可单独在终端调用,只要设置好环境变量
3.区分计算机、程序、算法
第二周:计算
注:直到学函数之前,我们的所有代码都是在这个框架中间
2.0 printf("23+43=%d\n",23+43);
%d是将后面的那个整数要输出到%d这个位置上
2.1浮点数的运算:
只要有一个是浮点数就可以实现带小数点的运算,当浮点数和整数放到一起运算时,C会将整数转换成浮点数,然后进行浮点数的运算
2.2数据类型:
3.1整数
int
printf("%d",...);
scanf("%d",&...);
3.2带小数点的数
double
printf("%f",...);
scanf("%lf",&...); //获取带小数点的数,即输出浮点数,这里后面是lf,与输出printf后面不一样
程序表达的是顺序执行的结果!
2.3 const int NUM=100; //在C语言中定义一个静态变量,这个变量在程序中不允许被修改,变量名通常用大写来表示静态变量
断点:是表示当前语句还没有执行,将要执行,只执行完了上一句
调试时蓝色框框表示当前执行到的语句
第三周:
3.0编程练习解析:
看样例数据和看题目一样重要。
例如题目要求输入5 3
则程序中就必须是scanf("%d %d",&a,&b); //%d %d中间的空格不能省略,不然在输入的时候程序就会出错,它要你输入的是空格,必须要你输入空格才能得到它想要的东西。
(注意:你在输入时的内容必须要严格对应scanf中字符串的格式和内容,不然scanf就会出错)
不要看交互的输出,即不需要“请输入XX”这样的printf
程序不能编译时,在工具是设置一下后,如果还不行,重要的以管理员身份打开DevC++
严格村收输出的格式
时间划分:
十进制的1120,如何得到前两位的11和后两位的20呢?
用1120/100就得到了整数11,用1120%100取余就得到了整数20(不超过除数100)
在编程时例如在DevC++中
这三个字符分别是小写的o、数字0、大写的o,即在编程语言中数字0中间会有一个小斜杠
变量名不可以是数字开头,由下划线、数字、字母组成
3.1判断
比较运算符的结果只有0和1,例如输出语句printf("%d",5>=3);也只是输出1,没有其他结果
算数运算符>关系运算符>赋值运算符,例如int a=2>1; 此时a=1。
单行的注释//和多行的注释/* */
当if语句后面没有大括号时,则只将if语句后面的下一句作为执行语句,同时要注意if后面有没有分号,可能执行语句为空,此时不执行任何动作
3.2分支
计算机最不会做的就是一眼看出来结果,它只会一步一步的做某件事
在没有大括号限制时,else总是和最近的那个if相匹配
3.2.1级联的if —else—if
适用于分段函数
if常见易错点:
1.忘了大括号
2.if后面的圆括号后面加分号
3.错误使用==和=
例如
if(a=b)
/*假设此时a=5,b=6。if只要求括号里的内容是0或非0,在这段代码中if语句括号中的内容为b的值,为真,并且执行动作将b的值赋值给了a */
{
printf("%d",a); //此时a=6
}
注:warning和error
warning:是一个警告,系统不确定程序是否有错,而且仍会帮你执行这个程序
error:是一个错误,系统这段代码确定出错,且不会帮你执行这个程序
3.2.2多路分支switch-case
switch(控制表达式) //控制表达式只能是一个整数型的结果
{
case 常量: 语句 //常量可以是常数,也可以是常数计算的表达式
case 常量: 语句
default:语句 //默认语句,除非前面提前用break语句跳出
}
case不是划分一段一段的标志,只是一个入口,遇到符合条件的就进去,在执行完分支里的最后一条语句时,如果没有遇到break,就会一直执行,进入其它case里的语句,直到遇到一个break,或者switch结束(case不能阻止语句往下面执行,只有break可以)
注意:if语句不是判断关系,而是描述执行的步骤
即if...else if...else不等于if...if...if
因为前者只会执行一个分支,前者是描述执行的步骤,而后者当多个条件都满足时,会执行多个分支,后者是判断关系
当判断大于等于时,要从高出往下走
当判断小于等于时,要从低处往上走
第四周:循环
4.1循环
4.1.1如何得到一个整数的位数(位数很大,例如123456789)
可以将这个数一直反复除以10,,第一次会得到12345678,少了一位,同时i++,循环下去,每次少末尾一位,直到商为0,最后i就是这个数的位数
while循环:当条件满足时,不断的重复循环体内的语句
循环体中要有改变条件的机会,不然就会出不来,陷入死循环,像这种情况,pat裁断系统会给出“超时”
在程序适当的地方插入printf来输出变量的内容,也可以跟踪程序的运行,这样可以不用debug调试
还可以在循环的入口的第一行加printf(“in loop”)来看程序是否进入了循环体
算法的描述是先运算第3、4步,再判断,进行第五步,如果程序中去掉去掉开头的n++;x /=10;(为了边界数字0)就是先运行了算法中的第五步,应该将算法中的第五步移到第三步的前面去
那有没有可以更好的算法呢?先做事情,再来看条件呢,引入do-while循环
do-while和while唯一的区别就是do-while至少会执行一次循环,再来判断是否满足条件
注意:do-while循环后面要加分号,否则编译会出错
4.2循环应用
小套路1:计算之前,先int t=x,用t保存原始的x值,后面可能会用到x的值
小套路2:如果要模拟运行一个次数很大的循环,可以模拟较小的循环次数,然后做出推断
计算读取的多个数的平均数
如果将第13行的scanf去掉,则会出现死循环,没有改变循环的条件
乘以1.0可以将最后的结果呈现出小数点
整数的分解:x%10得到末位,循环下去,可得到每一位
思考:如何得到一个整数的逆序数呢?
第三种循环:for循环,像一个计数循环
小套路:做求和的程序时,记录结果的变量应该初始化为0,做求积的程序时,记录结果的变量应该初始化为1
在for循环里声明初始变量,只能在支持C99格式的编译器里使用,例如不能for(int i=0;;),否则就在前面提前声明
任何一个for循环都可以被改写为while循环,反之也一样
while和do-while循环就是一个先判断,一个后判断的区别,其他也是等价的
什么时候用for循环、while循环、do-while循环?
break的作用是跳出循环,可以用在任何循环当中,例如switch、for,while、do-while,都可以用break语句跳出循环(打破这个循环,要出去)
continue跳过循环这一轮剩下的语句,进入下一轮循环,不是跳出循环(continue是把这一轮没做的东西放弃了,去做下一轮)
问题:如何判断一个数是不是素数(质数)?
如果一个数只能被1和n它本身整除,则是素数,若能被1~n之间的任何一个整数整除,则不是素数
1.肯定是用循环来执行程序,用哪种循环呢?因为边界2~n-1很好判断,所以直接用for循环即可;
2.如何判断整数呢?用 n%i 是否为0来判断整数,若为0,则不是素数,若每次取余都不为0,则是素数。
问题:如何输出100以内的所有素数?
问题:如何输入从1 开始的前50个素数?
循环里的嵌套:注意每一层的循环,变量应该设置成不一样的,否则容易出错
凑硬币问题:如何用一角、两角、五角的硬币凑出10元以下的某个金额呢?
计算机最擅长的事情:枚举。
在多层嵌套循环时,break只是跳出当前层(即它所在的那一层) 的循环,不能跳出更外层循环
在这种情况下,如何跳出外层的所有循环呢?用接力break或者goto语句
goto语句非常适合多层循环(多层嵌套)下,要跳出外层的所有循环时,跳到最外面时去使用的
第六周:数据类型
问题:如何实现1-1/2+1/3-1/4+1/5....呢?
因为循环的开头和末尾1、n很好确定,所以用for循环即可,正负的翻转怎么实现呢?
int sign=1;
在循环体内,每次sign= -sign;//即可实现正负的交替;
问题:如何正序分解正整数?
例如输入123456,输出 1 2 3 4 5 6 ;输入70000.输出 7 0 0 0 0
问题:如何计算两个数的最大公约数?(既能被a整除,又能被b整数的最大整数就是最大公约数)
算法一:枚举法(重点)
算法二:辗转相除法计(不用了解原理)算最大公约数
水仙花数:
问题:约分最简分式
本质就是求分子和分母的最大公约数,然后分子分母同时除以这个最大公约数,求得到约分后的结果
6.0编程练习解析,多动手实践下
6.1数据类型
注意区别:
指针是C语言类型的一种
不同类型的变量在内存中的表现形式是不一样的,整数在内存中是自然二进制码或二进制补码形式,而浮点型数字在内存中是一种编码形式,不是自然二进制数,编码形式是不能拿来直接做二进制层面的自然运算的,而两个整数可以在加法器中直接运算(参照计算机组成原理)
sizeof是一个运算符,可以给出某个类型或某个变量在内存中所占据的字节(个)数,返回的是一个数字
例如sizeof(int)、sizeof(i)
sizeof是一个静态运算符,它的结果在编译时刻就决定了,不要在sizeof里面做运算,这些运算不会去做
sizeof的运算结果是括号里的结果所占的字节数,整数型的a加double类型的浮点数1.0,运算结果是double类型的,所以输出结果第二行显示8
unsigned将每位二进制看成无符号位,可以将数值的正整数部分的范围扩大 ,表示更多的正整数,但是主要是为了做移位运算的
如何查看自己的计算机的int类型可以表示的最大整数是多少?
各种类型的整数在计算机内部就像一个圆,当最大的数加1时,就会变成最小的整数,当最小的整数减1时就会变成最大的整数
注意:整数关于0左右是不对称的,左端比右端多一个整数