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)=102xx<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. 超速判断

    • 模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出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");
        }
    }
    

你可能感兴趣的:(C语言,c语言,程序设计,mooc)