C语言|MOOC 翁恺 C语言笔记(一)

视频链接
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",...)

  • 带小数点的数
    • double
    • print("%f",...)

    • scanf("%lf",...)

p16 表达式 表达式是一系列运算符(operator)和算子(operand)的组合,用来计算一个值。
  • 计算时间差
  • 输入两个时间,每个时间分别输入小时和分钟的值,然后输出两个时间之间的差,也以几小时几分显示
#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被赋予的值,也就是6
    • a=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两个值,需要第三个变量进行临时存储
p19 复合赋值
符号 含义
+= 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
补充练习(两道题)
  1. 逆序的三位数:程序每次读入一个三位数,然后输出按位逆序的数字
    • 如输入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); }

  2. 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"

5月6日 p24 做判断
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

p26 找零计算器
  • 找零计算器需要用户做两个操作:输入购买的金额,输入支付的票面,而找零计算器的功能是:计算并打印找零,或告知用户余额不足以购买。
    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;

p26 否则的话
if (条件成立){ ... } else{ // 条件不成立的话 ... }

p28 IF语句再探
if (条件成立) 如果条件成立,则执行这一行语句// 如果条件成立时,要执行多行命令,则需要用{}括起来

p29 嵌套的if-else
  • else总是和最近的那个if匹配
p30 级联的if-else
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; } }

p31 IF常见错误
  • 忘记写大括号{}
  • if后面的分号
  • 错误使用 == 和 =
  • 使人困惑的else
p32 多路分支
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"); } }

补充练习(五道题)
  1. 【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); } }

  2. 三天打鱼两天晒网
    • 假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第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); } }

  3. 用天平找小球
    • 三个球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"); } }

  4. 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); } }

  5. 成绩转换
    • 本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
      大于等于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"); } }

    推荐阅读