C4节:类型转换,分支、循环语句,缓冲区

隐式类型转换把一个表达式中的所有数据调整成同样的类型。
把占地小的变量调整成占地大的变量
int和float一起计算时int会被转换成float数
有符号和无符号数据一起计算时把有符号数据转换成无符号数据

强制类型转换可以把任何数据或变量当成某个类型来使用

/*
    类型转换练习
*/
#include <stdio.h>
int main() {
    char ch = -10;
    printf("-10 + 3 > 0是%d\n", -10 + 3 > 0);
    printf("-10 + 3u > 0是%d\n", -10 + 3u > 0);
    printf("sizeof(3 > 0 ? 1 : 0.9)是%d\n", sizeof(3 > 0 ? 1 : 0.9));
    printf("ch是%d,(unsigned char)ch是%d\n", ch, (unsigned char)ch);
    return 0;
}

流程控制语句用来改变语句执行顺序

分支语句可以在程序中产生分叉
if语句是一种分支语句

if语句格式如下
if (逻辑表达式1) {//有且只能有一个
    逻辑表达式1成立时的处理代码
}
else if (逻辑表达式2) {//0次或多次
    逻辑表达式2成立时的处理代码
}
else { //最多一个,可能没有
    所有逻辑表达式都不成立的处理代码
}

/*
    if练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    printf("请输入一个数字:");
    scanf("%d", &num);
    if (num < 0) {
        printf("负数\n");
    }
    else if (num > 0) {
        printf("正数\n");
    }
    else {
        printf("零\n");
    }
    return 0;
}

练习:
    1.考试成绩练习

编写if语句时,如果多个分支不重叠才可以使用else,如果必有一个分支成立才可以把最后的逻辑表达式省略。

/*
    考试成绩练习
*/
#include <stdio.h>
int main() {
    int rank = 0;
    printf("请输入考试成绩:");
    scanf("%d", &rank);
    if (90 <= rank && rank <= 100) {
        printf("优\n");
    }
    else if (80 <= rank && rank <= 89) {
        printf("良\n");
    }
    else if (70 <= rank && rank <= 79) {
        printf("中\n");
    }
    else if (60 <= rank && rank <= 69) {
        printf("及格\n");
    }
    else {
        printf("不及格\n");
    }
    return 0;
}

练习:
    2.使用if语句找出四个数字中最大数

/*
    最大数练习
*/
#include <stdio.h>
int main() {
    int num1 = 0, num2 = 0, num3 = 0, num4 = 0;
    int max = 1 << 31;
    printf("请输入四个数字:");
    scanf("%d %d %d %d", &num1, &num2, &num3, &num4);
    if (num1 > max) {
        max = num1;
    }
    if (num2 > max) {
        max = num2;
    }
    if (num3 > max) {
        max = num3;
    }
    if (num4 > max) {
        max = num4;
    }
    printf("最大数是%d\n", max);
    return 0;
}

switch...case也是一种分支语句

/*
    switch...case分支练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    printf("请输入1或者2:");
    scanf("%d", &num);
    switch(num) {
    case 1:
        printf("男\n");
        break;
    case 2:
        printf("女\n");
        break;
    default:
        printf("人妖\n");
        break;
    }
    return 0;
}

练习:
    3.根据年份数字判断是否闰年
       能被4整除但不能被100整除
       能被400整除

/*
    闰年练习
*/
#include <stdio.h>
int main() {
    int year = 0;
    printf("请输入年:");
    scanf("%d", &year);
    if ((!(year % 4) && (year % 100)) || !(year % 400)) {
        printf("闰年\n");
    }
    else {
        printf("不是闰年\n");
    }
    return 0;
}

循环语句也是一种流程控制语句,可以反复执行同样一段程序。

for语句是一种循环语句,可以用来描述一个计数过程,格式如下
int loop = 0;
for (loop = 0;loop < 次数;loop++) {
    反复执行的语句
}

for语句的执行过程是分组的
for (1;2;3) {
    4
}
[1,2] [4, 3, 2] [4, 3, 2] ......
编号为2的语句是一条逻辑表达式,用来控制循环是否要结束。
编号为2的语句为真时启动下一组,为假时循环结束
编号为4的语句可能根本就不执行

/*
     循环练习
*/
#include <stdio.h>
int main() {
    int loop = 0;
    for (loop = 0;loop < 3;loop++) {
        printf("1\n");
    }
    return 0;
}

练习:
    1.把一个-128到127之间数字的二进制反向打印在屏幕上

/*
    for语句打印二进制练习
*/
#include <stdio.h>
int main() {
    int num = 0, loop = 0;
    printf("请输入一个-128到127之间的数字:");
    scanf("%d", &num);
    for (loop = 0;loop < 8;loop++) {
        //printf("%d", num & 1);
        //num >>= 1;
        printf("%d", (num & 0x80) >> 7);
        num <<= 1;
    }
    printf("\n");
    return 0;
}


    2.摘花瓣练习

/*
    花瓣练习
*/
#include <stdio.h>
int main () {
    int num = 0, loop = 0, flag = 0;
    printf("请输入花瓣片数:");
    scanf("%d", &num);
    for (loop = 0;loop < num;loop++) {
        if (flag) {
            flag = 0;
            printf("她爱我\n");
        }
        else {
            flag = 1;
            printf("她不爱我\n");
        }
    }
    return 0;
}


    3.使用for打印如下图形
      54321
      5432
      543
      54
      5

/*
    for练习
*/
#include <stdio.h>
int main() {
    int num = 54321, loop = 0;
    /*for (loop = 0;loop < 5;loop++) {
        printf("%d\n", num);
        num /= 10;
    }*/
    for (num = 54321;num >= 5;num /= 10) {
        printf("%d\n", num);
    }
    return 0;
}

可以使用规律变化的变量替代专门的循环变量。

练习
    1.用循环打印如下图形
      1 X 9 =  9
      2 X 8 = 16
      3 X 7 = 21
      4 X 6 = 24
      5 X 5 = 25

/*
    for练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    for (num = 1;num <= 5;num++) {
        printf("%d X %d = %2d\n", num, 10 - num, num * (10 - num));
    }
    return 0;
}


    2.鸡兔同笼问题
      一个笼子里鸡兔共 40个头,100只脚,问分别又几只兔子几只鸡?

/*
    鸡兔同笼练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    for (num = 0;num <= 40;num++) {
        if ((4 * num + 2 * (40 - num)) == 100) {
            printf("兔子一共有%d只,鸡一共有%d只\n", num, 40 - num);
        }
    }
    return 0;
}


    3.判断某个正整数是不是素数

/*
    判断素数的练习
*/
#include <stdio.h>
int main() {
    int num = 0, num1 = 0, res = 1;
    printf("请输入一个正整数:");
    scanf("%d", &num);
    for (num1 = 2;num1 <= num - 1;num1++) {
        if (!(num % num1)) {
            printf("不是素数\n");
            res = 0;
            break;  //终止循环的执行
        }
    }
    if (res) {
        printf("是素数\n");
    }
    return 0;
}

在循环中随时可以使用break;语句终止循环的执行
在循环中使用continue;语句可以跳到大括号末尾

/*
     continue练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    for (num = 1;num <= 10;num++) {
        if (num == 4) {
            continue;
        }
        printf("%d\n", num);
    }
    return 0;
}

循环嵌套用于把复杂的问题先分组。外层循环描述组之间的变化,内层循环描述组内的变化。

/*
    循环嵌套练习
*/
#include <stdio.h>
int main() {
    int row = 0, col = 0;
    for (row = 5;row >= 1;row--) {
        for (col = row;col >= 1;col--) {
            printf("%d", col);
        }
        printf("\n");
    }
    return 0;
}

练习:
      1.打印如下内容
        *
        **
        ***
        ****
        *****


      2.打印如下内容
        *
         ***
          *****
           *******
            *********

/*
    循环嵌套练习
*/
#include <stdio.h>
int main() {
    int row = 0, col = 0;
    for (row = 0;row <= 4;row++) {
        for (col = 0;col <= row - 1;col++) {
            printf(" ");
        }
        for (col = row;col <= 3 * row;col++) {
            printf("*");
        }
        printf("\n");
    }
    return 0;
}

for循环的多种写法
1.省略大括号
2.使用,操作符
3.临时定义循环变量
4.小括号中只保留循环条件
5.空语句
6.死循环

while语句也是一种编写循环的语句
使用方法如下
while (逻辑表达式) {
    反复执行的语句
}
逻辑表达式为真则循环继续执行
假设有如下语句
while (1) {
    2
}
执行顺序是[1, 2][1, 2][1, 2]...

练习:
    1.猜数游戏
    2.统计一个数字中6的个数

/*
    猜数练习
*/
#include <stdio.h>
int main() {
    int num = 0, num1 = 0;
    printf("请输入一个数字:");
    scanf("%d", &num);
    /*while (num != num1) {
        printf("请猜一个数字:");
        scanf("%d", &num1);
        if (num1 > num) {
            printf("猜大了\n");
        }
        else if (num1 < num) {
            printf("猜小了\n");
        }
        else {
            printf("你真聪明\n");
        }
    }*/
    do {
        printf("请猜一个数字:");
        scanf("%d", &num1);
        if (num1 > num) {
            printf("猜大了\n");
        }
        else if (num1 < num) {
            printf("猜小了\n");
        }
        else {
            printf("你真聪明\n");
        }
    } while (num1 != num);
    return 0;
}

 

/*
    统计数字中6的个数练习
*/
#include <stdio.h>
int main() {
    int num = 0, num1 = 0;
    printf("请输入一个数字:");
    scanf("%d", &num);
    while (num != 0) {
        if (num % 10 == 6) {
            num1++;
        }
        num /= 10;
    }
    printf("一共有%d个6\n", num1);
    return 0;
}

do...while也是一种循环,使用方法如下
do {
   反复执行的代码
} while (逻辑表达式);
假设有如下语句
do {
    2
} while (1);
它的执行顺序是[2 1][2 1][2 1]....

do...while循环至少会执行一遍

while语句也可以写空语句和死循环

goto语句可以跳转到任何一条语句

每次使用scanf函数读数据后都需要清理输入缓冲区

输出缓冲区内容显示在屏幕上的条件
1.遇到\n
2.函数结束
3.输出缓冲区满了
4.使用fflush(stdout)强制刷新

/*
    输入缓冲区练习
*/
#include <stdio.h>
int main() {
    int num = 0;
    printf("请输入一个数字:");
    while (!scanf("%d", &num)) {
        scanf("%*[^\n]");
        scanf("%*c");
        printf("请再次输入数据:");
    }
    scanf("%*[^\n]");
    scanf("%*c");
    printf("num是%d\n", num);
    printf("请输入一个数字:");
    scanf("%d", &num);
    scanf("%*[^\n]");
    scanf("%*c");
    printf("num是%d\n", num);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值