11.循环控制

1.for循环

格式:

for(表达式1;表达式2;表达式3)
{
    语句;
}

首先来看代码好理解一点

需求:求1~100之间所有数的和

#include <stdio.h>
int main(){
    int sum =0;
    for (int i = 0; i <= 100 ; ++i) {
        sum = sum + i;
    }
    printf("%d", sum);
    return 0;
}

写了这一行代码之后就是觉得for循环和Java的for循环一样的,后面在学习一下,看看有什么不同;

注意:

1.表达式1、表达式2、表达式3之间是用分号“;”分开的,千万不要写成逗号;

2.for()后面什么都不要加;

2.自增自减

(1)i++;就是表示i+1;

i--就是表示i-1;

i++和++i一样,同样i--和--i一样;

暂时不需要知道区别,书中的作者意思就是写成一样的,不要一会i++,一会i--的,这样就是感觉很乱

只有变量才可以自增自减

3.强制类型转换

来看一行代码

需求:

求1 + 1/2 +1/3......

#include <stdio.h>

int main(void) {
    //先定义两个变量
    int i;
    float sum = 0;
    //然后相加
    for (i = 1; i <=100 ; ++i) {
        sum = sum + (float)1/i;
    }
    printf("%f",sum);
    return 0;
}

运行结果:

D:\code\C\st08.exe
5.187378
Process finished with exit code 0

其中这行代码就是强制转换的一行

 sum = sum + (float)1/i;

要是不进行强制转换就是后面的值都是小数,回舍去后面的部分,这样子的话,运行结果就只是1 了

在C语言中强制类型转换,强制转换的就是紧跟在后面的值或者变量;

如果需要强制转换一个表达式,那么在这个表达式中应该加上括号;

在上面的强制转换的式子中,float必须加上括号,这样子表示的才是表示强制转换,不然就是语法错误;

这时候还会想到,强制类型转换,是将i转换成其他类型数据了吗,答案是否定的,强制类型转换就是会产生一个临时的值,然后就用这个值进行计算;

4.精度问题

还是上面的问题

在除法中必须必须要有一个数是实数,所以在进行运算的时候,1/i定义成浮点类型的不就是可以了吗,答案是否定的,为什么呢?

因为在计算机中float和double都不能确定数据的精度,我们来写一行代码看一下

#include <stdio.h>
int main(){
    double i =2.3;
    printf("%.30f",i);
    return 0;
}

运行结果如下:

D:\code\C\st09.exe
2.299999999999999822364316059975
Process finished with exit code 0

这时候会发现数据比之前定义的数据小一点点,但是并不是所有的浮点类型都不准确,小数的位数是0的就是准确的,还是写一点代码来看一下

#include <stdio.h>
int main(){
    double i =2.0;
    double a =3.0;
    printf("%.20f %.20f\n",i,a);
    return 0;
}

运行结果如下:

D:\code\C\st09.exe
2.00000000000000000000
3.00000000000000000000

Process finished with exit code 0

这时候就是准确的值,所以现在是明白了,为什么将整数转换为浮点

这里有很多的编程题目,但是之前学过Java写过很多了,这里这些题目思路都是差不多,所以暂时不写,以后学习到了数据结构,再来更新题目;

5.while循环

格式:

while(表达式)
{
    语句;
}

当表达式是真的就会执行后面的语句,表达式是假的,就不会执行

注意:

1.while(表达式)后面不加分号;

2.加上{ };

案例:

求1~100的和

#include <stdio.h>
int main(){
    int sum = 0;
    int i = 0;
    while(i <= 100){
        sum = sum+i;
        i++;
    }
    printf("%d",sum);
    return 0;
}

代码是非常的简单;运行结果如下

D:\code\C\st09.exe
5050
Process finished with exit code 0

在这里有一个非常简单的结论,就是在循环次数知道的情况下,一般用for循环,循环次数未知的情况下用while循环;

死循环一般用while(1)就行了;

6.如何看懂一个程序

分三步

  1. 流程(就是读程序)
  2. 每条语句的功能(分析每一个语句的功能)
  3. 试数(带入数据试一试)

7.do...while循环

格式:

do
{
    语句;
}
while(表达式);

注意:

  1. do后面要加{ }
  2. while(表达式)后面一定要加分号;
  3. do...while和while不一样,do...while至少会循环一次,但是while则不是;
  4. getchar()用来吸收scanf遗留在缓冲区的回车;
  5. 在while循环中有一个getchar()就是真正的清空输入缓冲区,getchar()每次从缓冲区取一个字符只要不是回车就是会一直取下去,知道所有的垃圾字符都取出来,直到回车;

8.break和continue

break可以跳出循环体,也可以跳出Switch;

  • break不能用于循环体(for循环、while循环‘do...while循环’)和switch之外的任何一种语句
  • break只能跳出一层循环,就是他所在的最里面的循环
  • 在switch循环中也只能跳出最近的一个循环,但是switch的多层循环并不多见

continue作用就是结束本次循环,跳过循环体下面没有执行的语句,进入到下一次循环,continue不能在switch中执行

来看一点关于continue的代码

#include <stdio.h>

int main() {
    int a;
    while(1){
        printf("今天星期几(输入数字):\n");
        scanf("%d", &a);
    switch (a) {
            case 1:
                printf("今天好好学习C语言!\n");
            break;
            case 2:
                printf("今天好好学习C语言!\n");
            break;
            case 3:
                printf("今天好好学习C语言!\n");
            break;
            case 4:
                printf("今天好好学习C语言!\n");
            break;
            case 5:
                printf("今天好好学习C语言!\n");
            break;
            case 6:
                printf("今天好好学习C语言!\n");
            break;
            case 7:
                printf("今天好好学习C语言!\n");
            break;
            default:
                printf("您输入的数据不存在,请重新输入!\n");
            continue;
        }
        break;
    }
    return 0;
}

运行结果如下:

D:\code\C\st05.exe
今天星期几(输入数字):
8
您输入的数据不存在,请重新输入!
今天星期几(输入数字):
5
今天好好学习C语言!

Process finished with exit code 0

这时候就是会惊奇的发现可以重新输入星期来从新执行代码;

关于continue我自己的理解就是这样子的,他确确实实的就是跳出了当前的循环当前的循环,然后直接重新执行当前的所在的这个循环,直到输入的语句为合适的值为止;

用上面的例子来说,首先上面的代码中有两个循环,最外层的是一个死循环,在死循环的里面的不是,只有当里面的循环是有结果的情况下才会跳出外面的死循环,程序进行到default之后并没有得到反馈的值,然后就继续执行当前的循环,直到得到反馈的值,说实话这里还不是很理解为什么可以这样做,不过相信在后面的学习中会解决这个问题;

continue在上面的程序中,给了程序重新输入的机会;

9.清空输入缓冲区

1.输入缓冲区

所有从键盘录入的数据,不管是字符还是数字,都是储存在内存中的一个缓冲区,叫做键盘输入缓冲区

2.%d和%c缓冲区的区别

  • %d在缓冲区中,空格、回车、tab键都只是分隔符,不会被scanf当成数据取用,当%d遇到这些时只会跳过他们、
  • %c中空格,回车,tab都会被取用

来看一点代码

#include <stdio.h>
int main(void){
    int a,c;
    char b;
    printf("一三输入数据,第二个输入符号:");
    scanf("%d %c %d",&a,&c,&b);
    printf("a=%d c=%c b=%d",a,c,b);
    return 0;
}

运行结果如下:

D:\code\C\st11.exe
一三输入数据,第二个输入符号:45

12
a=45 c=  b=2
Process finished with exit code 0

4.getchar()

原型:

# incldue <stdio.h>
int getchar(void);

功能就是从缓冲区读取一个字符,这个函数简单好用,有用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值