视频链接
5月5日
p15 浮点数 注意:inch需要除以12.0,这样可以把inch转换成float型
或者将inch定义为double,double是浮点型(表示双精度浮点数),float也是浮点型(表示单精度浮点数)
int main() {
printf("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英尺:");
int foot;
int inch;
scanf("%d %d", &foot, &inch);
// 注意:inch需要除以12.0,这样可以把inch转换成float型
// 或者将inch定义为double,double也是浮点型(表示双精度浮点数),float也是浮点型(表示单精度浮点数)
printf("身高是%.4f米 \n", ((foot + inch / 12.0) * 0.3048));
}
注意foot和inch的类型,int除以int还是int,所以要用float或者double
int main() {
printf("请分别输入身高的英尺和英寸,如输入\"5 7\"表示5英尺7英尺:");
fflush(stdout);
// 注意foot和inch的类型,int除以int还是int,所以要用float或者double
float foot;
float inch;
scanf("%f %f", &foot, &inch);
//scanf("%lf %lf", &foot, &inch);
如果foot和inch都是double
printf("身高是%.4f米 \n", ((foot + inch/ 12 ) * 0.3048));
}
- 整数
- int
-
print("%d",...)
-
scanf("%d",...)
- int
- 带小数点的数
- double
-
print("%f",...)
-
scanf("%lf",...)
- double
- 计算时间差
- 输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分显示
#include
#include int main() {
int hour1, minute1;
int hour2, minute2;
printf("请输入第一个时间,小时和分钟用空格隔开:");
scanf("%d %d", &hour1, &minute1);
printf("请输入第二个时间,小时和分钟用空格隔开:");
scanf("%d %d", &hour2, &minute2);
int temp_time1 = hour1 * 60 + minute1;
int temp_time2 = hour2 * 60 + minute2;
int a = abs(temp_time1 - temp_time2);
int hour = a / 60;
int minute = a % 60;
printf("时间差是:%d小时,%d分钟", hour, minute);
}
p17 运算符优先级
- 赋值也是运算,也有结果
a=6
的结果是a被赋予的值,也就是6a=b=6
——>a=(b=6)
赋值运算,自右向左
运算符 | 运算 | 结合关系 | 举例 |
---|---|---|---|
+ | 单目不变 | 自右向左 | a*+b |
- | 单目取负 | 自右向左 | a*-b(b取相反数,再和a相乘) |
- 计算复利
- 在银行存定期,选择到期后自动转存,并将到期的利息计入本金合并转存。
- 如果1年期的定期利率是3.3%,那么连续自动转存3年后,最初存入的x元定期会得到多少本息余额
本 息 合 计 = x ( 1 + 3.3 % ) 3 本息合计 = x(1+3.3\%)^3 本息合计=x(1+3.3%)3
#include
#include int main() {
double x;
double n;
printf("请输入本金和年期,用空格隔开:");
scanf("%lf %lf", &x, &n);
double total = x * pow(1 + 0.033, n);
printf("%.2lf", total);
}
p18 交换两个变量
- 交换a,b两个值,需要第三个变量进行临时存储
符号 | 含义 |
---|---|
+= | total +=5 --> total = total +5 |
-= | 自减 |
*= | 自乘 |
/= | 自除 |
%= | 自求余 |
++ | count++ --> count += 1 |
– | count-- --> count -= 1 |
int main() {
int a = 5;
int b = a++;
int c = ++a;
printf("b=%d,c=%d", b, c);
}
// b=5,c=7
- 先将
a = 5
赋值给b,然后a才自加一,这个时候b = 5, a = 6
- 再将a自加一,这个时候
a = 7
赋值给c,所以c的值是7
- 逆序的三位数:程序每次读入一个三位数,然后输出按位逆序的数字
- 如输入007,应输出7;如输入123,应输出321
int main() { int input; printf("请输入一个三位数字:"); scanf("%d", &input); int a = input / 100; //百位 int b = (input - a * 100) / 10; //十位 int c = input - a * 100 - b * 10; //个位int output = c * 100 + b * 10 + a; printf("倒序数为:%d", output); }
- BCD解密
- BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
- 输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。输出对应的十进制数。
- 如输入18,会输出12。
补充知识:进制转换
18变成二进制 0001 0010,变成十六进制 0x12 (用0x去表示这个数是十六进制的)
16进制的十六个代表数是0123456789ABCDEF
int x; printf("input a number please:"); scanf("%d",&x); printf("%x",x); //%x意思是将数值按十六进制输出,而且不会带有"0x"
- BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
if (条件成立){
...
}
- 关系运算的结果为真时输出1,否则为0
printf("%d\n",5==3) // output:0
- 所有的关系运算符(==,!=,<,>)的优先级比算术运算(+,-,*,/)的低,但是比赋值运算符(=)的高
7 >= 3 + 4 // 7 >= 7 --> output:1 int a = b > 0; // if b = 1, then a = 1
- 判断是否相等的
==
!=
的优先级比其他的低,而连续的关系运算是从左到右进行的
5 > 3 == 6 > 4 // 1 == 1 --> 1 6 > 5 > 4 // 6>5 --> 判断 1 > 4 --> 0
- 找零计算器需要用户做两个操作:输入购买的金额,输入支付的票面,而找零计算器的功能是:计算并打印找零,或告知用户余额不足以购买。
int main() { double a; double b; printf("请输入购买金额和支付票面:"); scanf("%lf %lf", &a, &b); double c = b - a; if (c>=0){ printf("找零%.2lf元",c); } else{ printf("支付金额不足!"); } }
-
const
修饰符,用来修饰后面的int,功能是:对变量声明为只读特性,并保护变量值以防被修改。
const int m = 35;
if (条件成立){
...
} else{
// 条件不成立的话
...
}
p28 IF语句再探
if (条件成立)
如果条件成立,则执行这一行语句// 如果条件成立时,要执行多行命令,则需要用{}括起来
p29 嵌套的if-else
else
总是和最近的那个if
匹配
if (exp1)
st1;
else if (exp2)
st2;
else
st3;
- 分段函数
f ( x ) = { ? 1 x < 0 0 x = 0 2 x x > 0 f(x) =\begin{cases}-1 & x<0\\0 & x=0\\2x & x>0\end{cases} f(x)=???????102x?x<0x=0x>0?
int main() { int x; int f = 0; if (x < 0) { f = -1; } else if (x == 0) { f = 0; } else { f = 2 * x; } }
- 忘记写大括号{}
- if后面的分号
- 错误使用 == 和 =
- 使人困惑的else
int main(){
int a;
printf("print a number:");
scanf("%d",&a);
if (a == 1){
printf("hello");
} else if (a == 2){
printf("good morning");
} else if (a == 3){
printf("good afternoon");
} else{
printf("goodbye");
}
}
- switch-case
- 控制表达式只能是整数型的结果
- 常量可以是常数,也可以是常数计算的表达式,如
case 1+1:
- 在执行完分支的最后一条语句后,如果后面没有
break
,就会顺序执行到下面的case里去,直到遇到一个break
,或者switch结束为止。
- 常量可以是常数,也可以是常数计算的表达式,如
switch (控制表达式){
case 常量:
语句
case 常量:
语句
case 常量:
语句
default:
语句
}
// switch-case
int main() {
int type;
scanf("%d", &type);
switch (type) {
case 1:
printf("hello");
break;
case 2:
printf("good morning");
break;
case 3:
printf("good afternoon");
break;
default:
printf("goodbye");
}
}
补充练习(五道题)
- 【C语言|MOOC 翁恺 C语言笔记(一)】超速判断
- 模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
- 输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。在一行中输出测速仪显示结果,格式为:“Speed: V - S”,其中V是车速,S或者是Speeding、或者是OK
- 如输入40,输出Speed: 40 - OK;如输入75,输出Speed: 75 - Speeding
int main() { int input; printf("input a number:"); scanf("%d", &input); if (input > 60) { printf("Speed:%d - speeding",input); } else{ printf("Speed:%d - OK",input); } }
- 三天打鱼两天晒网
- 假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
- 输入在一行中给出1个不超过1000的正整数N。在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。
- 如输入103,输出Fishing in day 103;如输入34,输出Drying in day 34
int main() { int date; printf("input a date:"); scanf("%d", &date); int date2 = date % 5; if (date2 <= 3) { printf("Fishing in day %d", date); } else { printf("Drying in day %d", date); } }
- 用天平找小球
- 三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
- 输入在一行中给出3个正整数,顺序对应球A、B、C的重量。在一行中输出唯一的那个不一样的球。
- 如输入1 1 2,输出C
int main() { int a, b, c; printf("input three numbers:"); scanf("%d %d %d", &a, &b, &c); if (a != b && a == c) { printf("B"); } else if (a != b && b == c) { printf("B"); } else if (a != c && a == b) { printf("C"); } }
- 12-24小时制
- 编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
- 输入在一行中给出带有中间的“:”符号(半角的冒号)的24小时制的时间,如
12:34
表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6
表示5点零6分。
提示:在scanf的格式字符串中加入“:”,让scanf来处理这个冒号。
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格,再跟上表示上午的字符串“AM”或表示下午的字符串“PM”。如“5:6 PM”表示下午5点零6分。注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。
- 如输入21:11,输出9:11 PM
int main() { int time1, time2; printf("输入时间,小时和分钟用冒号隔开:"); scanf("%d:%d", &time1, &time2); int temp2 = time1 % 12; if (time1 >= 0 && time1 < 12) { printf("%d:%d AM", time1, time2); } else if (time1 == 12) { printf("%d:%d PM", time1, time2); } else { printf("%d:%d PM", temp2, time2); } }
- 编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
- 成绩转换
- 本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
- 输入在一行中给出1个整数的百分制成绩。在一行中输出对应的五分制成绩。
- 如输入90,输出A
int main() { int x; printf("input your grades:"); scanf("%d",&x); if (x >= 90) { printf("A"); } else if (x < 90 && x >= 80) { printf("B"); } else if (x < 80 && x >= 70) { printf("C"); } else if (x < 70 && x >= 60) { printf("D"); } else { printf("E"); } }
- 本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
推荐阅读
- Unity3D_UGUI|UIGU源码分析3 (ExecuteEvents)
- 读书|读高质量C++/C编程指南第6章
- 数据结构|数据结构 - 堆
- linux|Linux基本指令
- 读书|读高质量C++/C编程指南第4章
- 读书|读高质量C++/C编程指南1-3章
- 数据结构|八大经典排序算法
- c语言|5、C语言队列与应用
- 单片机|c语言回调函数的使用及实际作用详解