c语言3月7日学习总结

1.变量的一些问题
1).当变量的值有可能是0时,初始化为-1.
2)C99标准中新增布尔类型,可直接使用

_Bool isTrue; // C99
    isTrue = 1 < 2;

    printf("%d\n", isTrue);//打印0;

2.程序的结构分类
1).结构化程序设计(英语:Structured programming),一种编程范型。它采用子程序、代码区块、for循环以及while循环等结构,来取代传统的 goto。希望借此来改善计算机程序的明晰性、质量以及开发时间,并且避免写出面条式代码。

2).程序结构分成:顺序结构、分支结构和循环结构

3.if语句
1)复合语句
将多条语句,用花括号括起来,那么就构成一个复合语句,在逻辑上相当于一条语句。

 {
    if(1 > 2);
        printf("打印一下");
    printf("程序结束");
    //代码段中的语句称为复合语句
}

2).空语句
只有一个分号的语句称为空语句。也就是什么也不做的语句

         if(1 > 2);
         printf("打印一下");
         printf("程序结束");

该段代码执行结果为 :打印一下执行结束,if后为空语句

4.if else 与 if else if语句

/*
学校现在不允许给学生打分,值能够给打 ABCDE 几个等级
如果分数大于等于 90,那么就是 A
如果分数在 80 到 89 之间,就是 B
如果分数在 70 到 79 之间,就是 C
如果分数在 60 到 69 之间,就是 D
如果分数低于 60 分,那么就是 E
*/
 if(score <= 100 && score >= 90) {
        printf("评级为 A 级\n");
    } else if(score >= 80) {
        printf("评级为 B 级\n");
    } else if(score >= 70) {
        printf("评级为 C 级\n");
    } else if(score >= 60) {
        printf("评级为 D 级\n");
    } else {
        printf("评级为 E 级\n");
    }

注意点:
1、空语句
2、if 语句与复合语句
3、if 语句与 return 语句
4、if 语句的作用域问题
5、作用域紊乱

if(1 > 2) {
        int num = 10;
    }
         printf("%d\n", num);
    // 无法获得num
    if(1 < 2) int num = 10;

)

6、if 语句与 else 子句的配对问题(悬停 else 问题)

if(num >= 0)
    if(num < 5)
        printf("printf1\n");
    else
        if (num < 10)
            printf("printf2\n");
if(num > 12)
    printf("printf3\n");
else
    printf("printf4\n");

打印结果为:printf2 printf4
技巧:从下往上,else 与最近的 if 配对

5.剪刀石头布游戏
思路分析
1)将规则数字化(剪刀:0 石头:1 布:2)
2)计算机出拳
随机出拳,即随机生成一个 0 到 3 的数字
头文件:stdlib.h
arc4random_uniform(int num);
3)提示用户出拳
4)开始比较(详细分析)

 // 给出规则 剪刀0 石头1 布2

    // 1,声明变量
    int computer, player;

    // 2,计算机随机的出一个数字(0,1,2)
    // 参数为一个非负的整数,表达的含义是创建一个 0 到 该数的随机数
    // 这个数字本身取不到
    computer = arc4random_uniform(3);

    printf("计算机出的是%d\n", computer);

    // 3,用户输入数字
    printf("请出拳:剪刀0 石头1 布2\n");
    scanf("%d", &player); // 假定不会出错

    // 5,进行比较
     if(computer == player) {
        printf("平局\n");
    } else if(computer == 2) {
        // 看看用户会不会出 0 ,如果用户出0 那么用户赢,否则计算机赢
        if(player == 0) {
            printf("玩家赢\n");
        } else {
            printf("电脑赢\n");
        }
    } else if(player == 2) {
        // 看计算机是否出0
        if(computer == 0) {
            printf("电脑赢\n");
        } else {
            printf("玩家赢\n");
        }
    } else if(player > computer) {
        printf("玩家赢\n");
    } else {
        printf("电脑赢\n");
    }

6.switch语句
1).switch 后面的表达式的值应该是整型或可以转换为整型的数据
2).switch贯穿:case后不加break执行完成以后,会继续往下执行其他的case.
一个case后可以执行多条语句,也可以执行空语句
例:

case 0: printf("零\n");printf("哈哈哈\n");printf("嘻嘻\n");break;

case 4: case 6: case 9:
case 11:printf("30天\n");break;

注:
1)、switch 需要是整型
2)、case 后可以跟多条语句(变量问题)
3)、break 与 default 都是可选的
4)、default 可以是任意位置


    switch (1) {

        default:printf("没有匹配\n");
        case num:printf("打印2\n");
        case 3:printf("打印3\n");
        case 4:printf("打印4\n");

    }
    //打印结果为: 没有匹配 打印2 打印3 打印4

5)、case 后只允许使用常量
6)、case 后也不允许使用小数
7)、case后定义变量时必须加{}

//错误写法
case 1:
            printf("请输入一个数字\n");
            // int num=2;
            // scanf("%d", &num);
            break;
//正确写法
case 1:{
            printf("请输入一个数字\n");
            // int num=2;
            // scanf("%d", &num);
       }
            break;

7.练习
1). 简单计算器

//简单计算器
int calculator(){

    int num1,num2,oper; //operation
    char array[] = "+-*/";
    //0,1,2,3代表+ - * /
    //提示用户输入
    printf("请输入第一个数:");
    scanf("%d",&num1);
    printf("请输入运算符(0,1,2,3代表+ - * /):");
    scanf("%d",&oper);
    printf("请输入第二个数:");
    scanf("%d",&num2);

    switch(oper){
        case(0):printf("%d %c %d = %d",num1,array[oper],num2,num1+num2);break;
        case(1):printf("%d %c %d = %d",num1,array[oper],num2,num1-num2);break;
        case(2):printf("%d %c %d = %d",num1,array[oper],num2,num1*num2);break;
        case(3):printf("%d %c %d = %d",num1,array[oper],num2,num1/num2);break;
            }
    printf("\n");

2).铁路托运行李规定:行李重不超过50公斤的,托运费按0.15元每公斤计算,如果超过50公斤,超出部分每公斤加收0.1元。编程实现上述功能

double weight; //行李的重量
    double delta; //超出部分的重量
    double userPrice; //运费
    const double price = 0.15;
    const double baseWight = 50;
    const double deltaPrice = 0.1;


    printf("请输入重量:\n");
    scanf("%lf",&weight);

    if (weight <= baseWight) {
        userPrice = weight * price;
    }   else if (weight > baseWight){
        delta = weight - baseWight;
        userPrice = baseWight * price+ delta * (price + deltaPrice);
    }
    printf("你的重量为:%.2lf,运费为%.2lf元\n",weight,userPrice);

3).有3个整数a,b,c,由键盘输入,输出其中最大的数

int a,b,c,max;
    //用户输入三个整数
    printf("请输入第一个数:\n");
    scanf("%d",&a);
    printf("请输入第二个数:\n");
    scanf("%d",&b);
    printf("请输入第三个数:\n");
    scanf("%d",&c);

    //判断
    if (a > b) {
        max = a;
        if (max < c) {
            max = c;
        }
    }else{
        max = b;
    }if (max < c) {
        max = c;
    }
    printf("最大的数是:%d\n",max);

4).由用户输入两个日期(1/31/1900),比较哪一个日期更早

int year1,month1,day1;
    int year2,month2,day2;
    //提示用户输入日期
    printf("请输入第一个日期(格式为:1/31/1900):\n");
    scanf("%d/%d/%d",&month1,&day1,&year1);
    printf("请输入第二个日期(格式为:1/31/1900):\n");
    scanf("%d/%d/%d",&month2,&day2,&year2);

    //判断
    if (year1 > year2){
        printf("%d%d%d日更早\n",year2,month2,day2);
    }else if (year1 < year2){
        printf("%d%d%d日更早\n",year1,month1,day1);
    }else if (year1 == year2){
        if (month1 > month2) {
            printf("%d%d%d日更早\n",year2,month2,day2);
        }else if (month1 < month2){
            printf("%d%d%d日更早\n",year1,month1,day1);
        }else if (month1 == month2){
            if (day1 > day2) {
                printf("%d%d%d日更早\n",year2,month2,day2);
            }else if (day1 < day2){
                printf("%d%d%d日更早\n",year1,month1,day1);
            }else if (day1 == day2){
                printf("%d%d%d日和%d%d%d日是同一天\n",year1,month1,day1,year2,month2,day2);
            }
        }
    }

5).由用户输入一个两位数,用汉字输出出来

int num;
    int decade; //保存十位
    int unit; //保存个位

    //提示用户输入
    printf("请输入一个两位数:\n");
    scanf("%d",&num);
    if (num < 10 || num >99) {
        printf("输入有误,请重新输入\n");
        scanf("%d",&num);
    }
    /*
    if (num % 10 == 0) {
        switch(num / 10){
            case 1: printf("一");break;
            case 2: printf("二");break;
            case 3: printf("三");break;
            case 4: printf("四");break;
            case 5: printf("五");break;
            case 6: printf("六");break;
            case 7: printf("七");break;
            case 8: printf("八");break;
            case 9: printf("九");break;
        }
        printf("十");
    }else if (num / 10 == 1){
        switch(num % 10){
                printf("十");
            case 1: printf("一");break;
            case 2: printf("二");break;
            case 3: printf("三");break;
            case 4: printf("四");break;
            case 5: printf("十");break;
            case 6: printf("十");break;
            case 7: printf("十");break;
            case 8: printf("十");break;
            case 9: printf("十");break;
        }
    }else{
        switch(num / 10){
            case 2: printf("二");break;
            case 3: printf("三");break;
            case 4: printf("四");break;
            case 5: printf("五");break;
            case 6: printf("六");break;
            case 7: printf("七");break;
            case 8: printf("八");break;
            case 9: printf("九");break;
        }
        printf("十");
        switch(num % 10){
            case 1: printf("一");break;
            case 2: printf("二");break;
            case 3: printf("三");break;
            case 4: printf("四");break;
            case 5: printf("五");break;
            case 6: printf("六");break;
            case 7: printf("七");break;
            case 8: printf("八");break;
            case 9: printf("九");break;
        }
    }
    printf("\n");
    */

  //方法二,将两位数拆分,商为十位,余数为个位,加权 
    decade = num / 10;
    unit = num % 10;
    switch(decade){
        case 1: printf("你输入的数为:十");break;
        case 2: printf("你输入的数为:二十");break;
        case 3: printf("你输入的数为:三十");break;
        case 4: printf("你输入的数为:四十");break;
        case 5: printf("你输入的数为:五十");break;
        case 6: printf("你输入的数为:六十");break;
        case 7: printf("你输入的数为:七十");break;
        case 8: printf("你输入的数为:八十");break;
        case 9: printf("你输入的数为:九十");break;
    }
    switch(unit){
        case 1: printf("一");break;
        case 2: printf("二");break;
        case 3: printf("三");break;
        case 4: printf("四");break;
        case 5: printf("五");break;
        case 6: printf("六");break;
        case 7: printf("七");break;
        case 8: printf("八");break;
        case 9: printf("九");break;
    }
    printf("\n");

6).输入年月得到当月天数

//由于2月有28天和29天所以需判断闰年
    // 年份可以被4整除且不能被100整除,或者可以被400整除
    // year % 4 == 0 && year % 100 != 0 || year % 400 == 0
    // 该年就是闰年


    int year, month;

    // 1,提示输入
    printf("请输入年月,2000年1月,可以写作2000-1\n");

    // 2,输入内容
    scanf("%d-%d", &year, &month);

    // 3,判断得结果
    /*
    if(2月) {
        if(闰年)
    }else {
        switch
    }
    */
    //先判断简单的
    if(month == 2) {
       if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
            // 闰年
            printf("29天\n");
        } else {
            printf("28天\n");
        }
    } else {
        switch (month) {
           /*
           case 1:printf("31天\n");break;
           case 3:printf("31天\n");break;
           case 4:printf("30天\n");break;
           case 5:printf("31天\n");break;
           case 6:printf("30天\n");break;
           case 7:printf("31天\n");break;
           case 8:printf("31天\n");break;
           case 9:printf("30天\n");break;
           case 10:printf("31天\n");break;
           case 11:printf("30天\n");break;
           case 12:printf("31天\n");break;
            */
            //简化后,将结果分为30天和31case 4: case 6: case 9:
           case 11:printf("30天\n");break;
           default:printf("31天\n");
        }
    }

你可能感兴趣的:(c)