浙江大学翁恺教你C语言程序设计!C语言基础入门!

一起学习的兄弟可以去我主页,我在另外一个up主那里,看完了所有翁恺课程,有详细笔记,这里我就不复制过来了,要看可以在
“苏杭zzz”这里找到


变量定义的一般形式就是:类型名称+变量名称+;
如:int price;
int amount;
int price,amount

在scanf里读取什么东西,需在该东西前加&否则无法读取
整数除法会省略小数点后面的数,要求有小数点的数值,需要使用浮点数




数据类型:
1.整数:int,printf(“%d”,...)
scanf(“%d”,...)
2.带小数点的数:double,printf(“%f”,...),scanf(“%lf”,...)
3.运算符(operator):是指进行运算的动作,比如加法运算符“+”,减法运算符“-”
算子(operand):是指参与运算的值,这个值可能是常数,也可能是变量,还可能是一个方法的返回值
4.两个整数的运算结果只能是整数
整数运算没有小数部分,因此要使用浮点数,若在设置变量,则变量的赋值有小数,因此用double,而不用int,输出时,有小数,因此使用%f,而不是%d

一般自左向右
单目+-和赋值=自右向左

赋值运算会把右边的式子先算完,再来和左边的变量结合,如:
total*=sum+12
total=total*(sum+12)



如果
if(条件成立){
...
}


优先级:所有的关系运算符的优先级比算数运算符的低,但是比赋值运算符的高




else,if后面可以没有大括号,但只有那一句是有效的
注意:写程序是写步骤,而不是写关系和说明。(非常重要)
区分内嵌式和级联

使用级联时:大于,从上往下数字大到小;小于,从上往下数字小到大。


平均数代码的选择,一个判断做两次会浪费,如下

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

两种形式:1.i=0;i<n
2.i=1;i<=n

小套路:做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时记录结果的变量应该初始化为1。

循环内定义


这里while循环的i虽然也只在循环内使用,但由于进入while前需判断,故应在循环前就定义int=i




枚举:

在除号俩边有一个是浮点数,则计算机会把另一个数也变成浮点数
整数逆序:
d=x%10
ret=ret*10+d
整数逆序只适用于末尾没有0的数

gcd:最大公因数
关注 0与一个数的最大公约数是这个数本身,所以0与0的最大公约数是0。





sizeof是静态运算符它的结果在编译时刻就决定了
不要在sizeof的括号内做运算,这些运算是不会做的







八进制输出用%o,十六进制用%x
如果赋值带字母,则小写x就输出小写的a,大写的X就输出大写的A









超过范围的浮点数:
printf输出inf表示超过范围的浮点数:+-∞
printf输出nan表示不存在的浮点数








承接上文:对于printf,任何小于int的类型会被转换成int;float会被转换成double。
但是scanf不会,要输入short,需要%hd

bool:#include <stdbool.h>
之后就可以使用bool和true、false

x∈(4,6)表示为x>4&&x<6
回忆:逻辑运算符<关系运算符,单目>双目
优先级:所有的关系运算符的优先级比算数运算符的低,但是比赋值运算符的高


条件运算符:1.问号?前是条件,问号后面是条件满足时的值,冒号:后面是条件不满足是的值。

2.条件运算符的优先级高于赋值运算符,但是低于其他运算符
3.自右向左结合
逗号运算符:

目前来说逗号运算符只有在for循环中使用
for(i=0,j=10;i<j;i++,j--)
函数是一块代码,接受零个或多个函数,做一件事情,并返回零个或一个值

调用函数
1.函数名(参数值);
2.()起到了表示函数调用的重要作用
3.即使没有参数也需要()

可以赋值给变量;
可以再传递给函数;
甚至可以丢弃;



声明:检查你对函数的调用是不是对的,以及和定义匹不匹配。
把函数的头取出来加上分号;就变成函数原型

上图最后一点注意
当你值和函数头里的参数类型不匹配时,数据会发生混乱



本地变量



1.定义函数时后面的()是参数表,用来填入参数,当没有参数时,填(void),或者不填,但是不填表示参数表未知,并不代表没有参数。最好确认没有参数后填进void,否则当你值和函数头里的参数类型不匹配时,数据会发生混乱。当然,int main()同样
2.在调用函数时,括号里的逗号不是运算符,如:f(a,b),但如果是f((a,b)),那就是了,区别就是传了俩个还是一个参数进去
3.注意:c语言不允许嵌套定义,一个函数里允许放别的函数的声明,但不允许放别的函数的定义。
4.给return返回值时,不要加括号,虽然没影响,但是容易误解return也是定义函数,把参数i的值传进return
int main()返回return 0;是有意义的,有程序会查看


数组


右边叫右值
赋值号右边是读取,左边是写入
数组的单元
1.数组的每个单元就是数组类型的一个变量。
2.使用数组时放在【】中的数字叫做下标或索引,下标从0开始记数。


这里的下标自动从0开始计数,故循环内不用初始化cnt,否则无法定义数组d
统计数的个数

数组运算

int count[number];
for ( i=0;i<number;i++ ) {
count[i]=0;
}可以表示为:
int count[n]={};
其中大括号中第一个数字给数组的第一个单元赋值,其余没写的赋值0

数组的大小







使用平方根sqrt()必须写入#include <math.h>





a[i,j]=a[j],逗号运算符,从左向右,取逗号右边为运算结果
二维数组的初始化

大括号中的大括号也可以不打,二维数组在内存中的排列跟一维数组是一样的,将这个矩阵从左上角到右下角,用这些数字逐行的填满,为了让人类读者容易理解,可以加大括号
tic-tac-toe游戏制作步骤:



行列代码基本相同

&a==a==&a[0]==&a[1]地址相同
指针p的值是某个变量的地址
*p是一个int所以p是一个指针

指针:定义一个指针要*+一个变量->*p,这算是一个指针
int* p=int *p只是星号位置不同,定义俩个指针需要俩个星号不能理解为int *p,q;而是int *p,*q;



*是一个单目运算符,用来访问指针的值所表示的地址上的变量
当*p作为一个整体时,可以看作是一个·整数
数组参数:
在函数参数表中是等价的
一般函数的参数与调用他的地方是没有联系的,指针改变了这种情况


数组在传入函数前后地址没发生改变,但sizeof改变,传进函数里的数组的大小是指针的大小,实际传进后就变成指针了。
故没法在函数里头用sizeof得出正确的函数个数,且在中括号里定义大小也没有用。
在参数表里把数组写成指针的样子也是可以的




要么是指针不可修改,要么是通过指针不可修改


