第四节(基本程序控制)

网友投稿 223 2022-10-31

第四节(基本程序控制)

本次将介绍控制程序流的3种新方法。

●如何使用简单的数组

●如何使用for、while和do... while循环多次执行语句

●如何嵌套程序控制语句

一.数组:基本概念:

在开始学习for语句之前,应该先了解一下数组的基本概念。

在C语言中,for语句和数组密切相关。为了帮助读者理解稍后for语句要用到的数组,这里先简要地介绍什么是数组。

数组是一组带索引的数据存储位置,各位置的名称相同,以不同的下标或索引来区分。

下标(也叫作索引)指的是数组变量名后面方括号中的数字。

int data[1000];

通过下标区分每个元素,如data[0] 至data[999] 。

注意,第1个元素是data[0],不是data[1] 。

注意,可将索引视为偏移量。

对于数组的第1个元素,偏移为0。

对于第2个元素,需要偏移1个元素,因此索引是1。

如上例所示,数组的每个元素都相当于一个普通的int类型变量,可以像使用int类型变量一样使用它们。

数组的下标也可以是C变量,如下所示:

intdata[1000];int index;index = 100;datalindex] = 12; /*与data[100] = 12等价*/

至此,已经简要介绍完数组。了解这些基本知识后,应该能明白本次后面程序示例中是如何使用数组的。

如果还不太清楚,别担心,后面还会将详细讲解数组的相关知识。

二.控制程序的执行:

C程序默认的执行顺序是自上而下。

从main()函数的起始位置开始,逐条执行语句,直至main() 函数的末尾。

然而,在实际的C程序中,很少严格按这样的顺序执行。

C语言提供了各种程序控制语句,方便程序员控制程序的执行顺序。

前面介绍了一种程序控制语句-if语句,接下来介绍另外3种有用的控制语句: .

●for语句;

●while语句;

●do...while语句。

2.1 for语句:

for语句是由一条或多条语句组成的块。

for 语句有时也被称为for循环,因为程序会循环执行for语句多次。

在前面的程序示例中使用过for语句。下面介绍for 语句是如何工作的。

for语句的结构如下:

for (初值部分;循环条件;更新部分) 语句

初值部分、循环条件和更新部分都是C语言的表达式。语句可以是C语言的任意语句。

程序执行到for语句时,将按以下步骤进行。

​1.对初值部分求值。通常,初值部分是给变量设置特定值的赋值表达式。​​

​​2.对循环条件求值。通常,循环条件是关系表达式。​​

​​3.如果循环条件的求值结果为假(即,该表达式等于0 ),则for语句结束,并接着执行语句后面(即,跳过语句)的第1条语句。​​

​​4.如果循环条件的求值结果为真(即,该表达式等于非0 ),则执行for语句中的语句。​​

​​5.对更新部分求值。接着返回第2步继续执行。​

下例图清楚地演示了执行for语句的过程。

注意,如果第1次对循环条件求值为假,则直接结束for语句,完全不执行其中的语句。

下面程序中是一个简单的示例,用for语句打印数字1~20。

你会发现,使用for语句的代码比使用20个printf()语句打印20个值的代码要紧凑得多。

输入:

//简单的for语句例子。#include#define MAXCOUNT 20int count;int main(void){ //打印数字1-20 for (count = 1; count <= MAXCOUNT; count++) printf("%d\n", count); return 0;}

输出:

解析:

for语句频繁用于“向上计数”,将计数器变量的值递增1成为另一个值,

如上例所示。也可以用for语句来“向下计数”,将计数器变量递减1,如下所示:

for (count = 100; count > 0; count--)

递增量或递减量不一定是1,如下所示,每次循环把count递增5:

for (count = 0; count < 1000; count += 5)

for语句非常灵活。例如,如果程序前面已经初始化了待测试的变量或者已给待测试变量赋值,便可省略初值部分,

如下所示。但是,不能省略初值部分后面的分号分隔符。

count = 1;for ( ; count < 1000; count++)

初值部分可以是任意有效的C表达式,只会在程序运行至for语句时被执行一次。

如下代码所示,Now sorting the array...只会被打印一次:

count = 1;for (printf ("Now sorting the array. . .") ; count < 1000; count++) /*排序语句已省略*/

如果把更新的步骤放在for语句体中,更新部分也可以省略。

例如,要打印数字0至99,可以这样写:

for (count = 0; count < 100;) printf("&d",count++);

用于判断是否终止循环的循环条件也可以是任意C表达式。

只要它的求值结果为真(非零),for语句会一直执行下去。

用C语言的逻辑运算符可以构建复杂的循环条件。

例如,下面的for语句打印数组array[]中的元素,在打印完所有元素后或元素的值为0时,将停止打印:

for (count = 0; count < 1000 && array[count] != 0; count++) printf("&d", array[count]);

可以进一步简化该for循环,如下所示:

for (count = 0; count < 1000 && array [count];) printf("&d", array [count++]) ;

在for语句中可以使用空语句。记住,空语句指的是分号独占一行。

如果要把数组中的1000个元素都赋值为50,可以这样写:

for (count = 0; count < 1000; array[count++] = 50) ;

该for语句把给数组中每个元素赋值50的操作放在更新部分。如果像下面这样写更好:

for (count = 0; count < 1000; array[count++] = 50){ ; {

将分号放在块中(即,花括号中),突出for语句体中不执行任何工作的意图。

逗号运算符常用于for语句中。

可以创建一个表达式,用逗号运算符分隔两个子表达式。

按照从左至右的顺序,依次对两个子表达式被求值,整个表达式的值是右边子表达式的值。

使用逗号运算符,可以让for语句的每个部分都完成多个任务。

假设有两个各包含1000个元素的数组a[]和b[]。

如果想把a[]中的内容倒序拷贝给b[] (即完成拷贝操作后,b[0] = a[999]、b[1] = a[998] ,以此类推),可以使用下面的for语句:

for(i=0,j=999;i<1000;1++,j--) b[j] = a[i];

逗号运算符分隔了两个子赋值表达式,分别将0和999赋值给变量i和j,然后在每次循环时分别递增两个变量。

语法:for语句

for (初值部分;循环条件;更新部分) 语句;

初值部分是任意有效的C表达式。通常是将变量设置为特定值的赋值表达式。

循环条件是任意有效的C表达式。通常是关系表达式。

循环条件的值为假(0)时,结束for语句,并执行语句后面的第1条语句;循环条件的值为真(非0 )时,执行语句中的C语句。

更新部分是任意有效的C表达式。通常是递增或递减变量(已初始化的变量)的表达式。

语句是任意的C语句,只要循环条件为真,就执行该部分的语句。

for语句是一个循环语句。语句头包括初值部分、循环条件和更新部分。

for语句首先执行初值部分,然后检查循环条件。

如果循环条件为真,则执行语句。执行完语句后,对更新部分求值。

然后,for语句再次检查循环条件,确认是否继续循环。

示例1:

// 打印0至9的值int x;for (x =0; x < 10; x++) printf("\nThe value of x is %d", x);

示例2:

//获取用户输入的数字,除非用户输入99int nbr = 0;for ( ; nbr != 99; ) scanf( "%d", &nbr);

示例3:

//提示用户输入10个整型值//将用户输入的值储存在value数组中//如果用户输入的数是99,则停止循环int value[10];int ctr, nbr = 0;for (ctr = 0; ctr < 10 && nbr != 99; ctr++) { puts("Enter a number, 99 to quit "); scanf("%d", &nbr); value[ctr] = nbr; }

2.2嵌套for语句:

在一个for语句中执行另一个for语句,称为嵌套.

利用嵌套的for语句,可以完成一些复杂的程序设计。下列程序中不是一个复杂的程序,但是它演示了如何嵌套for语句。

输入:

//嵌套for循环的程序示例#include void print_ttable(int outer, int inner);int main(){ int inner = 10; int outer = 10; printf("The times table:\n"); print_ttable(outer, inner); return(0); }void print_ttable(int outer, int inner){ int a, b; for (a = 1; a <= outer; a++) { for (b = 1; b <= inner; b++) { printf("%d\t", a*b); } printf("\n"); } return;}

输出:

解析:

其次;

如果要使用带空语句的for语句,记得在for 语句后写上分号,或者让分号独占一行这样代码更加清晰。

不要在for语句中处理太多任务。虽然可以使用逗号分隔符, 但是将一些功能放在函数体中,代码的可读性更高。

2.3 while语句:

while语句(也称为while循环)不断执行一个语句块,直至指定的循环条件为假。

while 语句的格式如下:

while (循环条件) 语句

循环条件是任意的C表达式,语句是任意有效的C语句。程序执行到while语句时,将进行以下过程。

​1.对循环条件求值。​​

​​2.如果循环条件为假(0 ),则结束while语句,程序将转至执行语句后面的第1条语句。​​

​​3.如果循环条件为真(非0 ),则执行语句中的C语句。​​

​​4.执行将返回第1步。​

while语句的运行过程如图所示。

程序中使用了一个while语句打印1~20 ( 与使用for语句完成的任务相同)

输入:

//while 语句的简单示例#include #define MAXCOUNT 20int count;int main(void){ //打印数字1-20 count = 1; while (count <= MAXCOUNT) { printf("%d\n", count); count++; } return 0; }

输出:

解析:

该程序与for程序1完成的任务相同。第11行,把1赋值给count。因为while语句没有初始化变量或给变量赋值的部分,所以必须在while循环之前完成初始化或赋值工作。第13行是while语句,其中包含的循环条件(count <= 20 )与程序中for语句的循环条件相同。在while 循环中,第16行将count 递增1。如果遗漏了第16行会发生什么情况?此时,由于count始终为1(小于20 ),程序将一直循环下去不会停止。

注意,while语句实际上是没有初值部分和循环条件的for语句,因此:

for( ; 循环条件 ; )

相当于

while (循环条件)

因此,在for 语句中完成的任何工作都能在while语句中完成。

使用while语句时,必须在while语句前面完成必要的初始化或赋值工作,而且必须将更新变量值的部分放进while循环体中。

注意:记得在while循环内部的代码块中改变循环条件的值,否则该循环将成为一个无限循环。

如果需要初始化和更新变量,大部分经验丰富的C语言程序员都更倾向于使用for语句而不是while语句。

这是基于源代码的可读性做出的选择。

使用for语句时,初值部分、循环条件和更新部分都放在一起,便于阅读和修改;而使用while 语句,初始化部分和更新变量部分位于不同的地方,不方便查找。

语法:while语句

while (循环条件) 语句

循环条件是任意有效的C表达式,通常是一个关系表达式。

循环条件的值为假(0 )时,结束while语句,并执行语句后面的第1条语句;

循环条件的值为真(非0 )时,执行语句中的C语句。

语句是任意的C语句,只要循环条件为真,就执行该部分的语句。

while语句是一个循环语句。

只要循环条件为真(非0),就重复执行语句块中的语句。

如果循环条件为假,则完全不执行(一次也不执行)语句。

示例1:

int x = 0;while (x < 10) { printf("\nThe value of x is %d", x); x++;}

示例2:

//获取数字,直接输入的数字是99int nbr = 0;while (nbr <= 99) scanf("%d", &nbr);

示例3:

//提示用户输入10个整型值//将用户输入的值储存在value数组中//如果用户输入的数是99,则停止循环int value[10];int ctr = 0;int nbr;while (ctr < 10 && nbr != 99) { puts("Enter a number, 99 to quit "); scanf("%d", &nbr); value[ctr] = nbr; ctr++; }

2.4嵌套while语句:

与for语句和if语句类似,while语句也可以嵌套使用。

下面程序是一个使用嵌套while语句的示例。虽然这不是使用while语句的最好示例,但是该例提供了一些新的思路。

输入:

//嵌套while语句示例#include int array[5];int main(void){ int ctr = 0, nbr = 0; printf("This program prompts you to enter 5 numbers\n"); printf("Each number should be form 1 to 10\n"); while (ctr < 5) { nbr = 0; while (nbr < 1 || nbr > 10) { printf("\nEnter number %d of 5: ", ctr + 1); scanf("%d", &nbr); } array[ctr] = nbr; ctr++; } for (ctr = 0; ctr < 5; ctr++) printf("Value %d is %d\n", ctr + 1, array[ctr]); return 0;}

输出:

解析:

2.5 do... while循环

C语言提供的第3个循环是do...while循环,只要循环条件为真,便不断执行一个语句块。

do. . .while循环在循环底部测试循环条件,而for循环和while循环则在循环的顶部进行测试。

do.. .while循环的结构如下:

do 语句while (循环条件);

循环条件是任意的C表达式,语句是任意的C语句。

当程序执行到do...while语句时,将进行以下步骤。

​1.执行语句中的语句。​​

​​2.对循环条件求值。如果结果为真,执行将回到第1步。如果结果为假,则结束循环。​

do.. .while循环的执行过程如图所示。

do. . .while循环中的语句至少会被执行一次。

这是因为do.. .while在底部测试循环条件,而非顶部。

而for 循环和while循环都是在循环的顶部对循环条件求值,所以对于这两个循环,如果循环条件的结果为假,则完全不会执行循环体中的语句。

do.. .while循环没有while循环和for循环使用频繁。

只有在循环体中的语句要至少被执行一次,才会使用do...while循环。

当然,如果能确保在第1次执行到while循环时,其循环条件为真,也可以在while循环中完成相同的任务。

但是,使用do.. . while循环更加简单明了。

下面程序中是do... while循环的示例。

输入:

// 简单的do ...while语句示例#include int get_menu_choice(void);int main(void){ int choice; choice = get_menu_choice(); printf("You chose Menu Option %d\n", choice); return 0;}int get_menu_choice(void){ int selection = 0; do { printf("\n"); printf("\n1 - ADD a Record"); printf("\n2 - Change a record"); printf("\n3 - Delete a record"); printf("\n4 - Quit"); printf("\n"); printf("\nEnter a selection: "); scanf("%d", &selection); } while (selection < 1 || selection > 4); return selection;}

输出:

解析:

该程序提供了一个带有4个选项的菜单,用户可以选择其中一个。然后,程序将打印用户选择的数字。现在,你应该能理解该程序清单中的大部分内容,在后面将会扩展这个程序。main()函数(第7~16行)中的内容在前面都介绍过。main()函数体中的代码(第9~ 13行)可写成一行,如下所示:printf( "You chose Menu option %d", get_menu_option() );如果你打算扩展该程序,并根据用户选择的选项执行相应的操作,就会用到get_menu_choice() 的返回值,因此将其赋给一个变量 (如本例中的chioce )是明智之举。第18^37行是get_menu_choice() 函数,该函数在屏幕上显示一个菜单(第24 30行),然后获取用户输入的选项。因为至少要在屏幕上显示一次菜单,用户才能据此输入选择的数字,所以在这种情况下使用do...while循环很合适。该程序会一直显示菜单,直至用户输入有效的选项。第34行 是do. . .while语句中的while部分,用于确保用户输入数字的有效性,因此将其使用的变量命名为selection很合适。如果用户输入的值不在1~4之间,将重复显示菜单,并提示用户输入新的值。当用户输入了有效的选项,程序将继续执行至第36行,返回selection变量的值。

语法:do. .. while语句

do { 语句 } while (循环条件);

循环条件是任意有效的C表达式,通常是一个关系表达式。

循环条件的值为假(0 )时,结束while语句,并执行while语句后面的第1条语句;

循环条件的值为真(非0 )时,程序回到do部分,执行语句部分的C语句。

语句是任意的C语句。

程序首次执行到do... while循环.时,将执行语句,然后只要循环条件为真,就会再次执行该部do...while语句是一个循环语句。

只要循环条件为真(非0 ),便会重复执行其中的语句或语句块。

与while语句不同,do...while 语句至少要执行语句一次。

示例1:

//即使循环条件为假,也会打印一次!int x = 10;do { printf("\nThe value of x is %d, x); }while (x != 10);

示例2:

//获取用户键入的数字,除非用户输入的值大于99int nbr;do { scanf"%", &nbr ); }while (nbr <= 99);

示例3:

//提示用户输入10个整型值//将用户输入的值储存在value数组中//如果用户输入的数是99,则停止循环int value[10];int ctr = 0;int nbr;do { puts("Enter a number, 99 to quit "); scanf("%d",&nbr); value[ctr] = nbr; ctr++; }while (ctr < 10 && nbr != 99);

三.嵌套循环:

嵌套循环指的是在一个循环中包含另一个循环。

前面绍过一些嵌套语句。

只要外层循环中包含完整的内部循环,C语言不允许重叠循环,除此之外对其没有其他限制。

因此,下面的写法是不允许的:

for ( count = 1; count < 100; count++){ do { //do...while循环 } //循环结束}while (x != 0);

如果将do. ..while循环完整地放入一个for循环中,就没问题:

for ( count = 1; count < 100; count++){ do { //do...while循环 }while (x != 0);} //循环结束

在使用嵌套循环时要记住,改变内层循环可能会影响外层循环。

尽管如此,还应注意到,内层循环也可能因为未使用外层循环中的变量而独立于外层循环。

在上面的示例中,如果内层循环改动了count的值,就会影响外层for循环的执行。

良好的代码缩进风格可提高嵌套循环的可读性。

每一级循环应该相对于上一级循环进行缩进,让每一级循环的代码更加一目了然。

四.本次总结:

C语言提供3种循环语句控制程序的执行。

它们分别是​​for语句、while语句和do.. .while语句。​​

这3种循环都能据循环条件中某个变量的情况,执行一个语句块零次、一次或多次。

许多程序设计任务都需要重复执行这些循环中的语句。

虽然3种循环语句都能完成相同的工作,但是它们也各有不同。

​​for语句将初值部分、循环条件和更新部分都放在一行。​​

​​while语句在循环条件为真时,执行循环体中的语句。​​

​​do...while语句至少执行循环体中的语句一次,只要循环条件的求值结果为真,就不断执行循环体中的语句。​​

嵌套循环是把一个循环放在另一个循环中。

C语言不允许重叠嵌套,对嵌套循环没有其他限制。

问答题

1.如何选择程序控制语句?是选择for语句、while 语句还是do . . .while语句?

如果你细心看完上诉的语法部分,会发现这3种循环都能解决循环问题,而且它们各有不同。

如果需要在循环中初始化和更新变量时,用for语句最好。

如果只知道要满足的循环条件,但是不知道需要循环多少次,while是最佳之选。

如果希望一组语句至少被执行一次,那么最好使用do. ..while 语句。

基本上这3种语句能处理绝大多数问题

可以嵌套任意层。如果你的程序需要嵌套两层以上的循环,就应该考虑使用函数来代替。

否则,你会发现花括号太多会影响阅读和理解,而函数能让代码简洁易读。

2.是否可以嵌套不同的循环?

可以嵌套if 、for 、 while 、do . ..while,或其他语句。你所写的许多程序都需要用到多个嵌套循环。

3.数组中的第1个元素的索引值是多少?

在C语言中第一个索引是0。

4.for语句和while 语句有何不同?

for语句包含初值部分和更新部分。

5.while语句和do. . .while语句有何不同?

do...while语句至少执行一次,其末尾是while语句。

6. while语句能完成for语句完成的相同工作,这句话是否正确?

正确,while语句可以完成for语句的工作。在执行while循环之前必须初始化变量,并在while循环中递增变量。

7.嵌套语句的数量是否有限制?

嵌套语句的数量没有限制。

8.while语句是否可以嵌套在do . . . while语句中?

可以的。

9. for语句的4个部分是什么?

初始化部分

条件部分

递增部分

语句部分

10.while语句的两个部分是什么?

条件和语句。

11.do​​. . .while 语句的两个部分是什么?

也是条件和语句。

实操题

long array[50];

2.写一条语句,将123.456赋值给练习题1数组的第50个元素。

array[49] = 123.456;

注意上面的答案,第50个元素的下标是49。注意数组的索引从0开始即可。

3.下面的语句执行完毕后,x的值是多少?

for (x=0; x<100,x++);

x的值是100

4.下面的语句执行完毕后,x的值是多少?

for (ctr = 2; ctr<10; ctr += 3);

语句执行完毕之后,ctr的值是11(ctr从2开始,每次递增3,直至大于或等于10为止)

5.根据以下代码,将打印多少个x ?

for(x = 0; x< . 10; x++)for (y= 5; y>0; y--)puts ("X");

内层循环打印5个x,外层循环执行内层循环10次。因此总共打印50个x。

6.编写一个for语句,从1~100,每次递增3。

编写如下:

int x;for( x = 1; x <= 100; x += 3);

7.编写一个while语句,从1~100,每次递增3。

编写如下:

int x = 1;whlie( x <= 100 ) x += 3;

8.编写一个do. . .while语句,从1~100,每次递增3。

编写如下:

int ctr = 1;do{ ctr += 3;} whlie( ctr < 100 );

9.排错:以下代码段有哪些错误?

record = 0;while (record< 100){ printf( "\nRecord %d ", record ); printf( "\nGetting next number...");}

该程序不会结束。

record被初始化为0,然后while循环检查record是否小于100。因为0小于100,所以执行循环,打印出两条语句。

然后循环再次检查条件,条件仍然成立(0小于100)因此再次循环。这一过程将不断重复。

应该在循环体内递增record的值,即在第二次调用printf()函数后面加上下面的代码

record++;

10.排错:以下代码段有哪些错误?(MAXVALUES 不是错误!)

for (counter = l; counter < MAXVALUES; counter++ );printf("\nCounter = %d", counter );

在循环中,经常使用已定义的符号常量。改代码的问题是,for语句头的末尾不应该有分号。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java代码中4种字符串拼接方式分析
下一篇:Upstate公司推出自动售货机Weigand MDB接口产品
相关文章

 发表评论

暂时没有评论,来抢沙发吧~