以下是我最近学习c语言的笔记
听懂和会用是两码事
先把c语言学精了再触类旁通
就算代码写对了也要知道为什么做对了
写错了更要看怎么错的 程序出错的时候就是提高技术的时候
记笔记特别重要,所以就有了这个word
还有就是思维导图,学会去做,才能深刻明白这个代码的原理
还有我的一个习惯是对的,就是编程完把代码的运行过程描述一遍
把编程的原理和编程思想沉淀到大脑里面
迟早会开窍的
语法的规则和用法是完全有必要去背背的,这个是操作规范
能够建立起一个知识体系,这才叫精通,用思维导图去建立
猴博士的题
求根号中的表达式
double a, b, c,s,area;
scanf_s(" % lf, % lf, % lf", &a, &b, &c);
s = (a + b + c) / 2;
area = sqrt(s * (s - a) * (s - b) * (s - c));
printf("a=%f\tb=%f\tc=%f\n", a, b, c);
printf("area=%f\n", area);
输入一个三位数,分别输出个十百位
double a;
int ge, shi, bai;
scanf_s("%lf", &a);
bai = (int)(a / 100); 加上(int)的目的是取整数部分 (int)3.14就是3
shi = (int)((a - bai * 100) / 10); 此处运用数学思维
ge = (int)(a - bai * 100 - shi * 10);
printf("个位数为%d", ge);
printf("十位数为%d", shi);
printf("百位数为%d", bai);
比较三个值的大小并从大到小排列
double a, b, c, t;
scanf_s("%lf,%lf,%lf", &a, &b, &c);
if (a > b)
{
t = a; t作为临时变量,起到一个承接的作用
a = b; b把值赋予给了a
b = t; 最后t把a的值给了b,从而实现了大小互换
}
if (a > c); 其他同理
{
t = a;
a = c;
c = t;
}
if (b > c);
{
t = b;
b = c;
c = t;
}
printf("%f,%f,%f\n", a, b, c);
将三个整数大小排序pro max
void LargToSm(int a, int b, int c)
{
int temp;
if (a < b)
{
temp = a;
a = b;
b = temp;
}
if (a < c)
{
temp = a;
a = c;
c = temp;
}
if (b < c)
{
temp = b;
b = c;
c = temp;
printf("%d%d%d", a, b, c);
}
}
int main()
{
int x, y, z;
scanf_s("%d%d%d", &x, &y, &z);
LargToSm(x, y, z);
此处涉及两个变量的互换
如果没有临时变量t
假设a为5 b为6
a=b 运行后 a得到了b的值变成了6,但是b的值还是6
这时候再运行b=a,已经没有5了
原理相当于交换两杯水,需要一个空杯子
翁恺老师
常见表达形式
>
>=
<
<=
==等于
区分= ,a=b指b把值赋予a
而==就是条件中a等于b而不是赋值
!=是不等于的意思
&&为两边均满足
例如 a>b&&b>c
||两边满足一个
a>b||b>c
计算找钱plus
#include<stdio.h>
int main()
{
int amount = 100;
int price = 0;
printf("请输入价格:");
scanf_s("%d", &price);
printf("请输入票面:");
scanf_s("%d", &amount);
int change = amount - price;
printf("the change is:%d\n", change);
return 0;
用int去定义的话,输出部分如果有小数部分则只输出整数部分
计算身高
printf("请分别输入身高的英尺和英寸:"
"如输入\"5 7\"表示5英尺7英寸:");
double foot;
double inch;
scanf_s("%lf %lf", &foot, &inch);
printf("身高为%lf米\n",
((foot + inch / 12) * 0.3048));输出部分也可以用一个列式
摄氏度华氏度的转化
double h,s;
scanf_s("%lf", &h);
s = (h - 32) * 5 / 9.0;
printf("%.2lf", s); 注意,在%和lf之间加.2为取小数点后两位的意思
浮点数概念
带小数的数叫做浮点数
确定点位的叫做定点数
Double是双精度浮点数
Float 是单精度浮点数
=+-这些都是运算符
算式中的量都是算子
计算时间差思路
第一步是先分别定义两个时间的小时和分钟
然后用scanf函数输入
第二步统一单位,将小时换算为分钟
第三步进行相减,用整数除法直接获得小时
用%取余获得分钟
int hour1, hour2, min1, min2;
printf("请输入时间:");
scanf_s("%d %d", &hour1, &min1);
scanf_s("%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);
求平均数
注意,两个整数的平均数可能会出现一位小·数
因此要除以2.0
int a, b;
printf("请输入两个整数:");
scanf_s("%d %d", &a, &b);
double c = (a + b) / 2.0;
printf("平均数为:%lf", c);
运算符优先级
加号 | 单目不变 | 自右向左 |
减号 | 单目取负 | 自右向左 |
乘号 | 乘 | 自左向右 |
除号 | 除 | 自左向右 |
取余 | 取余 | 自左向右 |
加号 | 加 | 自左向右 |
减号 | 减 | 自左向右 |
赋值 | = | 自右向左 |
越上面优先级越高
单目运算符的+-相当于数学中的正负号
赋值也是运算,也有结果
例如a=b=6
先进行6把值赋给b,然后才把得到6这个值的b赋予给a
赋值的优先级是最低的,先计算等号右边的部分
表达式不要写成一大串,最好拆开写
复合赋值运算
例如 total+=(sum+100)/2
相当于total=total+(sum+100)/2
total*=sum+12
注意,这时候要把右边算完才能进行复合运算
相当于在sum+12左右加了括号
Total=total*(sum+12)
“++””--”
相当于给一个变量+1或者-1
A++ 和 ++A 有什么区别呢
一个是前缀形式一个是后缀形式
结果不同
分别是a加1以前的值和a加1以后的值
比如a=10,a++就是10,但是副作用是a=11
在进行一次++a,++a=12,a也是12
找钱问题pro
int price = 0;
int bill = 0;
printf("请输入金额:");
scanf_s("%d", &price);
printf("请输入票面:");
scanf_s("%d", &bill);
if (bill > price)
{
printf("应该找您%d元\n", bill - price);
}
else
{
printf("你就这点钱???\n");
}
鸡兔同笼
方法一:公式法
int n, m;
scanf_s("%d %d", &n, &m);
int r = m / 2 - n;
int c = n - r;
printf("%d %d", c, r);
return 0;
#include<stdio.h>
int main()
{
关于VIP打折的问题(扩展)
float finalprice(char isVIP,float count, float price);
char vip;
float exchangeCount, price, sum;
printf("is vip?true input'T'or't',or the other key");
scanf_s("%c", &vip);
printf("please input the price");
scanf_s("%c", &price);
printf("please input the count");
scanf_s("%c", &exchangeCount);
sum = finalprice(vip, exchangeCount, price);
printf("the total is:%f\n", sum);
return 0;
}
float finalprice(char isVIP, float count, float price)
{
if (isVIP == 't' || isVIP == 'T')
return 0.7 * count * price;
else
return count * price;
}
初识const
Const用于定义常数,也就是说,定义的变量的值不能在后续的程序中被重新定义
例如以下问题
计算薪水
const double rate = 100; 通过const设定标准
const int standard = 40;
double pay=0.0;
int hour;
printf("请输入工作小时数:");
scanf_s("%d", &hour);
printf("\n");
if (hour > standard)
{
pay = rate * standard + (hour - standard) * (rate * 1.5);
}
else
{
pay = rate * standard;
}
printf("应付工资为%f\n", pay);
最近易错的点:
定义的变量没有设置初始值
Printf没有加f
Scanf函数里面忘记加&
判断是否为偶数
int a;
scanf_s("%d", &a);
if (a % 2 == 0)
{
printf("true");
}
else {
printf("false");
}
比较三个数大小plus
斐波那契数列
先来一个比较两个数的大小pro
#include <stdio.h>
int max(int x, int y)
{
此处运用了max函数,用于比较括号内的变量大小,难点在于两段式的代码,先定义max函数,比较大小时直接引用 |
int z;
if (x > y)
z = x;
else
z = y;
return(z);
}
int main()//主函数
{
int max(int x, int y);
int a, b;
scanf("%d %d", &a, &b);
int c;
c = max(a, b);
printf("max is %d", c);
return 0;
}
写法二
int a, b, c;
scanf("%d %d", &a, &b);
c = max(a, b);
printf("最大的数为:%d", c);
下面切入正题
a>b成立的情况下 第一个判断:先比较a和b哪个比较大,哪个小踢掉哪个,这时候拿大的和c来比较 第二个判断:假设a比b大,a现在和c进行比较,如果发现a还是比c大,那么结果就是a 第三个判断:第二种判断中,如果a比c小,那么结果就是c a>b不成立的情况下 第一个判断:比较b和c,谁大谁胜出 原理和打擂台差不多 |
那么用代码实现
int a, b, c;
scanf_s("%d %d %d", &a, &b, &c);
int max = 0;
if (a > b)
{
if (a > c)
{
max = a; 此处易错点为大括号的包容关系
}
else
max = c;
}
if (a < b)
{
if (b > c)
{
max = b;
}
else else和最近的if匹配(编译器默认的)
所以要加大括号
max = c;
}
printf("the biggest is%d", max);
程序实验课
一个程序其实是由多个源文件组成
必须要有一个int main(主函数)
以上我写的程序都基本上是只有一个源程序文件
主函数是老大不能调用
其他函数都可以任意使唤
·预处理指令
·全局声明
·函数定义 #include<stdio.h>等
思路:第一步,判断是否x<0 是则直接输出,不是则继续判断 第二步,判断x是否==0 是则输出0,不是的话最后只能输出2x |
分段函数
例如f(x)=-1; x<0
0; x=0
2x; x>0
此处的代码运用了级联的if-else if
·让所有的else对齐
I模板:f(expl) St1; Else if(exp2) St2; Else St3; |
代码为
Int f;
If(x<0){
f = -1;
} else if(x == 0);
f = 0; 此处的else一一对齐
} else {
f = 2*x;
}
printf(“%d”, f ) ; 单一出口
再谈if else
易错点
·忘了加大括号
·if后面的分号
·错误使用==和=(赋值和相等)
·使人困惑的else
要尊重王宁!!!!根据王宁来解决问题
大括号里面的语句用tab缩进
这样写的代码比较瘦长
一般大企业都有自己的规范要求(企业文化)
多路分支
switch(控制表达式){ case 常量:常量如1,2,3,4 语句 case 常量 语句 default: 语句 } |
switch-case
int type;
scanf_s("%d", &type);
switch ( type ) {
case 1:
printf("你好");
break;
case 2:
printf("早上好");
break;
case 3:
假如输入3,则直接跳过了case1,2来到了3,运行完3里面的语句会继续往下跳,直到遇到了break,break是一个路牌 |
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("啊????");
}
循环
If和else具有局限性,如果想体现任意范围就不行了
这时候就需要循环了
模拟一下运行过程 x n(循环一次n+1) 352 0 X的值回到while那一行 35 1 循环 3 2 3除以10等于0 结果n=3 不满足x>0,停止循环 输出结果 |
第一个循环代码,计算几位数
int x;
int n = 0;
scanf_s("%d", &x);
n++; n++即为n+1的意思
x /= 10;
while (x > 0) { 一直重复判断x是否大于0直到最后一位数
n++;
x /= 10;
}
printf("%d\n", n);
为什么while里面不能是x>=0呢
因为等于0的话,输出0的时候就是死循环了
计算log2x,计算x是2的几次方
错误举例
int x;
int ret=0; 为什么这个ret从0开始?
scanf_s("%d", &x);
while (x > 1) { 为什么循环的条件是x>1?
x /= 2;
ret++;
}
printf("log2 of %d is %d", x, ret);
输入16
此时的输出结果为log2 of 1 is 4
为什么x的值会变成1呢
因为x值结果循环后不满足x>1,结果为1
直接输出1
对策,计算之前先保留原始值
Do-while循环
Do
{
<循环体语句>
}while(<循环条件>)
int x;
scanf_s("%d", &x);
int n = 0;
do
{
x /= 10;
n++;
} while (x > 0);
printf("%d", n);
也可以把while当作“当”
当条件满足时,不断地循环循环体内的语句
倒计时发射
#include<stdio.h>
int main()
{
int count = 3; 想设定倒计时的数值可以从这里输入
while (count >=0) {
printf("%d\n", count);
count--;
}
printf("发射!\n");循环走了四轮
return 0;
}
此处count—与循环体中printf的相对位置和运行的结果有很大的关系
休闲游戏——猜数游戏
让用户不断地去猜数,所以要用到循环
循环的条件最重要,以及循环终止的条件
1·让计算机随机想一个数
2·计数的变量const的初始化为0
3·用户输入一个数字a
4·const递增++
5·判断a和number的大小关系,如果a大则输出大,如果a小则输出小
6·如果a和number的大小不相等(循环的条件)则回到第三步
7·否则,程序输出“猜中”和次数,程序结束
计算机随机出一个数,用到了rand()
X%n的结果是[0,n-1]的一个整数
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<time.h> 计时
int main()
{
srand(time(0));
int number = rand() % 100 + 1; 随机取一个1到100的数,加1使得值不取到0并且能取100
int count = 0; 初始值为0
int a = 0;
printf("我已经想好了一个0到100之间的数。");
do {
printf("猜猜这个1到100的数:");
scanf_s("%d", &a);
count++; 猜数的所用次数加1
if (a > number) {
printf("你猜的数大了");
}
else if (a < number) {
printf("你猜的数小了"); 对a和number的大小关系进行判断
}
} while (a != number); 如果a等于number,循环结束
printf("太好了,你用了%d次就猜到了答案\n", count);
return 0;
}