一个好的语言应该能够提供以下三种形式的程序流:

●顺序执行语句序列(顺序)

●在满足某个条件之前反复执行一个语句序列(循环)

●通过进行一个判断在两个可选的语句序列之间选择执行(分支)

5.1while循环

程序

//summing.c -- 对用户输入的整数求和
#include<stdio.h>
int main(void)
{
long num;
long sum = 0L;//把sum初始化为0
int status; printf("Please enter an integer to be summed. ");
printf("(q to quit):");
status = scanf("%ld",&num);
while (status == 1)
{
sum = sum + num;
printf("Please enter next integer (q to quit):");
status = scanf("%ld",&num);
}
printf("Those integers sum to %ld.\n",sum);
return 0;
}

结果

Please enter an integer to be summed. (q to quit):44
Please enter next integer (q to quit):33
Please enter next integer (q to quit):88
Please enter next integer (q to quit):121
Please enter next integer (q to quit):q
Those integers sum to 286. C:\Users\51670\source\repos\summing\Debug\summing.exe (进程 6224)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

1.程序注解

  scanf返回成功读入的项目的个数。如果scanf()成功读入了一个整数,就把这个整数放在num中并返回值1,随后值1被赋值给status(请注意输入值赋给num,而不是status)。如果您输入的不是数字,例如输入q,那么scanf()就不能读入一个整数,所以它的返回值和status都为0。这将使循环终止。

  while是一个入口条件循环,所以程序员必须在进入循环体之前获取输入并检查status的值。

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

1.真值的问题

  关系运算符也可以用于字符的比较。进行比较时使用的是机器的字符代码(ASCLL)。然而,不能使用关系运算符来比较字符串。

  关系运算符也可以用与浮点数。但要小心,在浮点数比较中只能使用<和>。原因在于舍入误差可能造成两个逻辑上应该相等的数不相等。

  如果进行比较的数有一个是常量,则可以把它放在比较表达式的左边,这样有助于发现错误:

5 = canoes;//语法错误
5 == canoes;//检查canoes的值是否为5

2.新的__Bool类型

//boolean.c --使用_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;
}

  C99还提供了一个stdio.h头文件。包含这个头文件可以使用bool来代替_B00l,并把true和false定义成值为1和0的符号常量。在程序中包含这个头文件可以写出与C++兼容的代码,因为C++把bool、图恩和false定义为关键字。

  关系运算符的优先级要低于包括+和-在内的算数运算符,但是要高于赋值运算符。

5.3不确定循环与计数循环

#define _CRT_SECURE_NO_WARNINGS 1
//sweetie1.s -- 一个计数循环
#include<stdio.h>
int main(void)
{
const int NUMBER = 22;
int count = 1;
//初始化
while (count <= NUMBER)//判断
{
printf("Be my Valentine!\n");//动作
count++; //更新计数
}
return 0; }

在建立一个重复执行固定次数的循环时涉及到三个动作:

1.必须初始化一个计数器

2.计数器与某个有限的值进行比较

3.每次执行循环,计数器的值都要递增

  while循环条件执行比较的动作,增量运算符执行递增的动作。上述程序中,递增在循环的结尾处执行。这种选择使得有可能不小心漏掉递增的动作。所以更好的方法是使用count++<=NUMBER来吧判断与更新动作结合在一个表达式中,但使用这种方法时计数器的初始化仍然是在循环之外进行的,这样就有可能忘记初始化。

5.4逗号运算符

#define _CRT_SECURE_NO_WARNINGS 1
//2022年4月8日08:57:37
#include<stdio.h>
int main(void)
{
const int FIRST_OZ = 37;
const int NEXT_OZ = 23;
int ounces, cost; printf(" ounces cost\n");
for (ounces = 1, cost = FIRST_OZ; ounces <= 16; ounces++, cost += NEXT_OZ)
printf("%5d $%4.2f\n",ounces,cost/100.0);
return 0;
}

  逗号运算符的两个属性。首先,它保证被它分开的表达式按从左到右的次序进行计算(换句话说,逗号是个顺序点,逗号左边产生的所有副作用都在程序运行到逗号右边之前生效)。其次,逗号运算符的值是右边成员的值。逗号也被用作分隔符。

5.5数组

  一个数组就是线性存储的一系列相同类型的值,整个数组有一个单一的名字,单独的项或元素可以使用一个整数索引来进行访问。

float debts[20];

  实际上,可以像使用相同类型的变量那样使用一个数组元素。例如,您可以把一个值读入一个特定的元素:

scanf("%f",&debts[4]);

  一个潜在的易犯错误是:出于执行速度的考虑,C并不检查您是否使用了正确的下标。例如,以下是错误的代码:

debts[20] = 88.32;//没有这个数组元素

  但是编译器并不会发现这样的错误。当程序运行时,这些语句把数据放在可能由其他数据使用的位置上,因而可能破坏程序的结果甚至使程序崩溃。

  如果字符数组包含了空字符\0,那么字符数组的内容就构成一个字符串,其中空字符标志着字符串的结尾。数组中元素是顺序存储的。

在for循环中使用数组

//2022年4月8日09:34:09
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define SIZE 10
#define PAR 72
int main(void)
{
int index, score[SIZE];
int sum = 0;
float average; printf("Enter %d golf scores:\n", SIZE);
for (index = 0; index < SIZE; index++)
scanf("%d", &score[index]);//读入10个分数
printf("The scores read in are as follows:\n");
for (index = 0; index < SIZE; index++)
printf("%5d", score[index]);//验证输入
printf("\n");
for (index = 0; index < SIZE; index++)
sum += score[index];//求它们的和
average = (float)sum / SIZE;//节省时间的方法
printf("Sum of scores = %d,average = %.2f\n", sum, average);
printf("That's a handicap of %.0f.\n",average-PAR);
return 0;
}

结果

Enter 10 golf scores:
102 98 112 108 105 103
99 101 96 102 100
The scores read in are as follows:
102 98 112 108 105 103 99 101 96 102
Sum of scores = 1026,average = 102.60
That's a handicap of 31. C:\Users\51670\Desktop\C Program\scores_in\Debug\scores_in.exe (进程 21444)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

  首先,注意到尽管这个例子显示您输入了11个数,但只有10个被读入了,因为读取循环只读入10个值。因为scanf()跳过空白字符,所以您可以在一行之内输入所有的10个数,也可以在每一行只输入一个数,或者您也可以像这个例子一样混合使用新行与空格来分隔输入(因为要对输入进行缓冲,所以只有当您键入回车键的时候这些数字才被发送给程序)。

  这些例子说明了一些风格问题。首先,使用#define指令创建一个指定数组大小的明显常量(SIZE)是一个好主意,您可以在定义数组和设置循环限制条件时使用这个常量。

  其次,下面的代码可以很方便地处理一个大小为SIZE的数组:

for(index=0;index<SIZE;index++)

  第三,一个好的编程习惯是使程序重复输出或“回显”刚刚读入的值。这有助于确保程序出来了您所期望的数据。

5.6关键概念

  循环是一个强大的编程工具。在建立循环时应该特别注意三个方面:

●明确定义结束循环的条件

●确保在循环判断中使用的值在第一次使用之前已经初始化

●确保循环在每个周期中更新了判断值

  C通过数值计算来处理判断条件。结果为0表示假,任何其他值都表示为真。使用了关系运算符的表达式通常被用来进行判断,他们有些特殊。如果为真,关系表达式的值为1,假为0,这与新的_Bool类型所允许的值保持一致。

  数组由相同类型的邻近的内存位置组成。您需要谨记数组元素是从0开始编号的,这样最后一个元素的下标就比元素个数少1.C并不检查您是否使用了合法的下标值,所以这需要由您自己来负责。

  使用一个函数需要完成三个单独的步骤:

  1.使用函数原型声明该函数

  2.在程序中通过函数调用来使用该函数。

  3.定义函数

  原型使编译器可以检查您是否正确地使用了函数,而定义则规定了函数如何工作。现代的编程习惯是把程序的元素分为接口和实现部分,原型和定义就是这样的例子。接口部分描述了如何使用一个特性,这正是原型所做的;而实现部分说明了采取的具体动作,这正是定义所做的。

第五章 C控制语句:循环的更多相关文章

  1. 《Python基础教程(第二版)》学习笔记 -> 第五章 条件、循环 和 其他语句

    条件和条件语句 下面的值在作为布尔表达式的时候,会被解释器看作假(False):False None    0    ""    ()    []    {} 条件执行和if语句 ...

  2. python学习(五) 条件、循环和其他语句

    第五章 条件.循环和其他语句 5.1 print和import的更多信息 5.1.1 使用逗号输出 >>> print('age',43,45)         // 可以用逗号隔开 ...

  3. java 第五章

    java 第五章   while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行.    while   的执行步骤 (1) 声明 ...

  4. “全栈2019”Java第二十五章:流程控制语句中循环语句while

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. Java语言程序设计(基础篇) 第五章 循环

    第五章 循环 5.2 while循环 1.while循环的语法如下: while(循环继续条件){ //循环体 语句(组); } 2.程序:提示用户为两个个位数相加的问题给出答案 package co ...

  6. C++ Primer Plus学习:第五章

    C++入门第五章:循环和关系表达式 for循环 for循环的组成部分 设置初始值. 执行测试,看循环是否应该继续执行. 执行循环操作. 更新用于测试的值. 以上操作由括号括起,每个部分均是一个表达式, ...

  7. Python实验报告——第3章 流程控制语句

    实验报告 [实验目的] 1.掌握python中流程控制语句的使用,并能够应用到实际开发中. [实验条件] 1.PC机或者远程编程环境 [实验内容] 1.完成第三章流程控制语句实例01-09,实战一到实 ...

  8. python学习心得第五章

    python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...

  9. Javascript权威指南——第二章词法结构,第三章类型、值和变量,第四章表达式和运算符,第五章语句

    第二章 词法结构 一.HTML并不区分大小写(尽管XHTML区分大小写),而javascript区分大小写:在HTML中,这些标签和属性名可以使用大写也可以使用小写,而在javascript中必须小写 ...

  10. 《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

    http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth3 ...

随机推荐

  1. 记录aop失效问题

    例子:转账demo 使用技术:基于注解的方式实现,aop也是通过注解实现(Spring) 出现问题:aop已经写好,但是没有生效 原因:1.切入点是否正确(不是本问题) 2.基于注解方式实现,没有配置 ...

  2. Win10家庭版找不到组策略gpedit.msc怎么解决?

    链接:https://pan.baidu.com/s/1SoSWCfHwZhD3tV4C7DcirA 提取码:okfm 1.下载文件 2.以管理员身份运行 3.

  3. 织梦清除文章后后台页码异常怎么办?dedecms页码缓存更新设置

    织梦dedecms当我们清除大量文章后,发现织梦后台文章列表的页码还是原来的数量或者页码显示异常,该怎么办呢?其实是因为dedecms页码有缓存更新设置,DeDeCMS有缓存机制,有些比较费时的SQl ...

  4. Windows 10 ~ Docker 安装

    Windows安装Docker 不推荐在Windows系统安装Docker,会有一些奇怪的坑不容易解决,建议windows环境安装虚拟机,通过虚拟机中的Linux系统安装Docker 官方安装文档 9 ...

  5. web自动化测试python+selenium----API

    import time from selenium import webdriver # 启动谷歌浏览器,开启与浏览器之间的会话 driver = webdriver.Chrome() # 访问一个网 ...

  6. 反序列化 sqlserver 中的 sysdiagrams,找到其中包含的表的信息

    转载于:Script SQL Server 2005 diagrams to a file - CodeProject /** <summary> Based on ufn_Varbina ...

  7. python 如何以逗号为分隔符输出数组

    l = [1,2,3,4] print(" ".join(str(i) for i in l)) #输出结果为:1 2 3 4(注意,此时4后面没有空格啦) #以逗号为分隔符 l ...

  8. Redis Template部分接口学习记录

    Redis Template是操作redis的一个封装模板,让我们更加简便的去操作redis. 操作键类型的接口: GeoOperations Redis的地理空间操作,如GEOADD,GEORADI ...

  9. 枚举类list序列化与反序列化

    //序列化 public class AuthTypeEnumListJsonSerializer extends JsonSerializer<List> { @Override pub ...

  10. dpkt 简单应用

    import dpktfrom dpkt.utils import mac_to_str,inet_to_strcap=f'D:/test_pacp/6.pcap'with open(cap,'rb' ...