2021-09-06 C语言学习第四天 (循环)

C控制语句:循环

本文主要学习以下内容:

  • 关键字:for 、while 、do while
  • 运算符:< 、> 、>= 、<= 、== 、+= 、*= 、-= 、/= 、%=
  • 函数:fabs()
  • C语言有三种循环:for 、while 、do while
  • 使用关系运算符构建控制循环的表达式
  • 其他运算符
  • 循环常用的数组
  • 编写有返回值的函数

while循环

#include<stdio.h>
int main(void)
{
	int n = 5;
	while (n < 7)
	{
		printf("n = %d\n",n);
		n++;
		printf("Now n = %d\n",n);	
	}
	printf("The loop has finished.\n");

	return 0;
}

输出结果如下:

n = 5
Now n = 6
n = 6
Now n = 7
The loop has finished.

while循环的通用形式如下:

while (expression)
	statement

statement部分可以是以分号结尾的简单语句,也可以是用花括号括起来的复合语句。
expression大多使用关键表达式,expression是值之间的比较,可以使用任何表达式。如果expression为真(或者更一般的说,非零),则执行statement部分一次,然后再次判断expression,只要expression判断不为假,则statement部分一直执行,每次循环都称为一次迭代。

  • 何时中止while循环
    要明确一点:只有在对测试条件求值时,才决定是中止还是继续循环。在上面的程序中,当运行到第二次循环时,n首次获得之7,但是此时程序并未退出,在打印出n此时的值后结束本次循环,然后进行下一次测试条件求值,然后才退出循环。
  • while:入口条件循环
    while循环是使用入口条件的有条件循环。所谓有条件指的是语句部分的执行取决于测试表达式描述的条件,如(index < 5)。该表达式就是一个入口条件,必须要满足这个入口条件才会进入循环体。
  • 语法要点
    要注意在while循环测试条件后的单独语句才是循环部分(简单语句或复合语句)
#include<stdio.h>
int main(void)
{
	int n = 0;
	while (n < 3)
		printf("n is %d\n",n);
		n++;
	printf("That's all this program does\n");
	return 0;
}

这是一个很糟糕的无限循环程序:

n is 0
n is 0
n is 0
n is 0
n is 0
n is 0
n is 0
...

虽然我们缩进了n++这条语句,但是我们没有把它和上一条语句括在花括号内。因此,只有跟在测试条件后面的第一条语句是循环的一部分,变量n的值始终没有改变。
我们在注意一下下面的这种情况:

while(scanf("%d",&num) == 1);

这个while循环在测试条件后面直接跟了个分号,表示循环部分为一个空语句。只要我们的输入是一个整数,scanf就会返回1,测试条件为真,循环部分为空语句,程序会直接读取下一个输入,直到我们输入的为一个非整数。

用关系运算符和表达式比较大小

while循环经常依赖测试表达式作比较,这样的表达式被称为关系表达式,出现在关系表达式中的运算符叫做关系运算符。
表:关系运算符:

运算符含义
<小于
>大于
>=大于或等于
<=小于或等于
!=不等于

要注意,不能用关系运算符来比较字符串。

  • 真值
    在C中,表达式一定有一个值,关系表达式也一样,对C而言,表达式为真的值是1,表达式为假的值是0;
while(1)
{
	...
}

这种情况,程序会一直循环。一般而言,所有的非零值都视为真,只有0被视为假。

  • 新的_Bool类型
    C语言中,一直用int类型的变量表示真假,C99专门针对这种类型的变量新增了_Bool类型。
    这种类型的变量只能存储1或0。如果把其他非零值赋给_Bool类型的变量,该变量会被设置为1。
//使用_Bool类型的变量
#include<stdio.h>
int main(void)
{
    long num;
    long sum = 0L;
    _Bool input_is_good;
    printf("Please enter an integer to be summed");
    printf("(q to quit):");
    input_is_good = (scanf("%ld",&num) == 1);
    while (input_is_good)
    {
        sum = sum + num;
        printf("Please enter next integer (q to quit):");
        input_is_good = (scanf("%ld",&num) == 1);
    }
    printf("Those integers sum to %ld.\n",sum);

    return 0;

}

在这个程序中:

input_is_good = (scanf("%ld",&num) == 1);

scanf根据我们的输入得到返回值,然后根据返回值判断是否等于1,是的话返回true,不是则返回false。

for循环

在创建一个重复执行固定次数的循环中涉及了3个行为:
1.必须初始化计数器;
2.计数器与有限的值做比较;
3.每次循环时递增计数器。
for循环中把上述3个行为(初始化、测试和更新)组合在一起:

// sweetie2.c -- 使用for循环的计数循环
#include<stdio.h>
int main()
{
    const int NUMBER =22;
    int count;

    for (count =1 ;count <= NUMBER; count++)
    {
        printf("Be my Valentine!\n");
    }

    return 0;
}

关键字后面的圆括号中有三个表达式,分别用连个分号隔开。第一个表示式时初始化,只会在for循环开始时执行一次,第二个表达式是测试条件,在循环执行之前对表达式求值,如果表达式为假,循环结束,第三个表达式执行更新,在每次循环结束时求值。
注意,在上面的程序中最后得到的count值为23。

出口条件循环:do while

while循环和for循环都是入口条件循环,do while则是出口条件循环,即在循环的每次迭代之后检查测试条件,它能保证至少执行循环体中的内容一次。这种循环被称为do while循环。

/*do_while.c --出口条件循环*/
#include<stdio.h>
int main()
{
    const int secret_code =13;
    int code_entered;
    do
    {
            printf("To enter the triskaidekaphobia therapy club,\n");
            printf("Please enter the secret code number:");
            scanf("%d",&code_entered);
    } while (code_entered != secret_code);
    printf("Congratulations! You are cured!\n");

    return 0;
}

注意do while循环以分号结尾,至少要执行循环一次才会执行测试条件。

To enter the triskaidekaphobia therapy club,
Please enter the secret code number:12
To enter the triskaidekaphobia therapy club,
Please enter the secret code number:14
To enter the triskaidekaphobia therapy club,
Please enter the secret code number:13
Congratulations! You are cured!

嵌套循环

/*rowsl.c --使用嵌套循环 */
#include<stdio.h>
#define ROWS 6
#define CHARS 10
int main()
{
    int row;
    char ch;

    for(row = 0;row < ROWS;row++)		//外层循环
    {
        for(ch = 'A';ch<('A'+CHARS);ch++)		//内部循环
            printf("%c",ch);
        printf("\n");
    }

    return 0;
}

运行该程序后,输出如下:

ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ
ABCDEFGHIJ

内部循环执行6次,内部循环执行10次。

使用函数返回值的循环示例

编写一个有返回值的函数,要完成以下内容:

  • 1.定义函数时,确定函数的返回类型
  • 2.使用关键字return表明待返回的值
double power(double n,int p) //返回一个double类型的值
{
	double pow = 1;
	int i;
	for(i=1;i<=p;i++)
		pow *=n;
	return pow; //返回pow的值
}

声明函数的返回类型只需要在函数名前写出类型即可,就像声明一个变量那样。关键字return表明该函数将把它后面的值返回给主调函数。根据上面的代码,函数返回一个变量的值,返回值也可以是一个表达式的值。如:

return 2*x + b;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值