




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
语言循环结构语言循环结构1(优选)语言循环结构(优选)语言循环结构C语言的重复语句用于设置循环。循环是重复执行其他语句的一种语句,循环中重复执行的语句就是循环体
C语句中,每个循环都有一个控制表达式。每次执行循环体时都要对控制表达式进行计算。如果表达式为真,也就是不为零,那么继续执行循环。重复语句C语言的重复语句用于设置循环。重复语句C提供三种循环语句:while语句用于判定控制表达式在循环体执行之前的循环。do语句用于判定控制表达式在循环体执行之后的循环。for语句对于自增或自减计数变量的循环十分方便。重复语句C提供三种循环语句:重复语句使用while语句是最简单、最基本的设置循环方法。While语句格式如下 while(表达式)语句表达式即为控制表达式;语句则是循环体。while语句使用while语句是最简单、最基本的设置循环方法。whilwhile语句示例 while(i<n)/*控制表达式*/ i=i*2;/*循环体*/执行while语句时,首先计算控制表达式的值。如果值不为零(真),那么执行循环体,接着再次判定表达式。这个过程持续进行直到最终控制表达式的值变为零。while语句while语句示例while语句while语句示例计算大于或等于数n的最小的2次幂 i=1; while(i<n) i=i*2;设n为10时,下面跟踪显示了while语句执行情况 i=1; i现在值为1. i<n成立吗? 是,继续。 i=i*2; i现在为2. i<n成立吗? 是,继续。 i=i*2; i现在为4。 i<n成立吗? 是,继续。 i=i*2; i现在为8。 i<n成立吗? 是,继续。 i=i*2; i现在为16。 i<n成立吗? 不成立,退出循环。while语句while语句示例计算大于或等于数n的最小的2次幂while虽然循环体必须是单独的一条语句,但这只是个技术问题。如果需要多条语句,那么只要用一对大括号构造成单独一条复合语句就可以了 while(i>0){ printf("Tminus%dandcounting\n",i); i; }即使没有严格要求的时候,一些程序员始终使用大括号括住循环体 while(i<n){ i=i*2; }while语句虽然循环体必须是单独的一条语句,但这只是个技术问题。whil下面的语句显示一串“倒数计数”信息 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }整个过程持续到显示信息为“Tminus1andcounting”。while语句下面的语句显示一串“倒数计数”信息while语句关于while语句的一些讨论在while循环终止时,控制表达式的值为假。因此,当通过表达式i>0控制循环终止时,i必须是小于或等于0的。可能根本不执行while循环体。因为控制表达式是在循环体执行之前进行判定。while语句常常可以有多重写法。更加简明的递减计数循环如下 while(i>0) printf("Tminus%dandcounting\n",i);while语句关于while语句的一些讨论while语句printf("%disprime\n",n);}while();}intmain(void)scanf("%f",&credit);从1向上加到n for(i=1;i<=n;i++)…loop_done:…/*emptyloopbody*/;printf("Tminus%dandcounting\n",i);for(d=2;d<n;d++)case4:break语句不会产生期望的效果它可以跳出switch语句,但是无法跳出循环。printf("Thisprogramprintsatableofsquares.“0”代表当前扫描器“位于空格串中”这一状态。for(d=2;d<n&&n%d!=0;d++)for(;;){i<n成立吗? 不成立,退出循环。如果控制表达式的值始终是非零值的话,while语句将无法终止。C语句程序员有时故意用非零常量作为控制表达式来构造无限循环 while(1)…除非循环体含有跳出循环控制的语句(break,goto,return)或调用了导致程序终止的函数,否则上述这种形式的while语句将永远执行下去。无限循环printf("%disprime\n",n);如果控程序square.c用一个while语句显示平方值表格。用户指定平方值表格的行数 Thisprogramprintsatableofsquares. Enternumberofentriesintable:5 11 24 39 416 525程序显示平方值的表格程序square.c用一个while语句显示平方值表格。程序square.c
/*Printsatableofsquaresusingawhilestatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;while(i<=n){printf("%10d%10d\n",i,i*i);i++;}
return0;}square.c程序sum.c对用户输入的整数数列求和 Thisprogramsumsaseriesofintegers. Enterintegers(0toterminate):8237150 Thesumis:107程序需要使用循环,循环采用scanf函数读取用户输入数,然后再把这个数加到运算的总和中。程序数列求和程序sum.c对用户输入的整数数列求和程序数列求和sum.c
/*Sumsaseriesofnumbers*/
#include<stdio.h>
intmain(void){intn,sum=0;
printf("Thisprogramsumsaseriesofintegers.\n");printf("Enterintegers(0toterminate):");
scanf("%d",&n);while(n!=0){sum+=n;scanf("%d",&n);}printf("Thesumis:%d\n",sum);
return0;}sum.c例6.3求1到100的和
学生练习运行结果:5050例6.3求1到100的和
学生练习运行结果:5050第二,计算表达式2并将计算结果作为整个逗号表达式的结果。如果需要多条语句,那么只要用一对大括号构造成单独一条复合语句就可以了除非循环体含有跳出循环控制的语句(break,goto,return)或调用了导致程序终止的函数,否则上述这种形式的while语句将永远执行下去。表达式1、表达式2和表达式3全都是表达式。“向下减使用>或〉=运算符。return0;scanf("%d",&n);printf("%10d%10d\n",i,square);通常循环的退出点是在while或for循环体之前,或do循环体之后。Enterintegers(0toterminate):8237150while(i>0){说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。在for语句中省略表达式case2:printf("***ACMEcheckbookbalancingprogram***\n");如果值不为零(真),那么执行循环体,接着再次判定表达式。scanf("%d",&n);如果把条件n%d==0移到循环控制表达式中,那么循环体将会为空使用break语句可以在循环体中间设置退出点,甚至设置多个退出点。例6.2求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
printf(″%d\\n″,sum);
}说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。
运行结果:5050第二,计算表达式2并将计算结果作为整个逗号表达式的结果。例6do语句的一般格式如下 do语句while(表达式);执行do语句时,先执行循环体,再计算控制表达式的值。如果表达式的值非零,那么再次执行循环体,然后再次计算表达式的值。do语句do语句的一般格式如下do语句使用do语句重写前面的“倒数计数”程序 i=10; do{ printf("Tminus%dandcounting\n",i); i; }while(i>0);do语句和while语句没有本质的区别。唯一的不同在于do语句的循环体至少会被执行一次。do语句使用do语句重写前面的“倒数计数”程序do语句最好对所有的do语句都使用大括号包括循环体,因为没有大括号的do语句很容易被误认为是while语句 do printf("Tminus%dandcounting\n",i); while(i>0);粗心的读者可能会把单词while误认为是while语句的开始。do语句while(i<=100)最好对所有的do语句都使用大括号包括循环体,因为没有大括号的例6.3求1到100的和
运行结果:5050例6.3求1到100的和
运行结果:5050例6.3求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
do
{sum=sum+i;
i++;
}
while(i<=100);
printf("%d\\n″,sum);
}运行结果:5050例6.3求1到100的和
#include<stdio程序numdigits.c计算用户输入的整数的位数 Enteranonnegativeinteger:60 Thenumberhas2digit(s).方法是将将用户输入的整数反复除以10,直到结果变为0,除的次数就是用户输入整数的位数。do语句比while语句更适合,因为每个整数,即便是0都至少有一位数字。程序计算整数的位数程序numdigits.c计算用户输入的整数的位数程序计算numdigits.c
/*Calculatesthenumberofdigitsinaninteger*/
#include<stdio.h>
intmain(void){intdigits=0,n;
printf("Enteranonnegativeinteger:");scanf("%d",&n);
do{n/=10;digits++;}while(n>0);
printf("Thenumberhas%ddigit(s).\n",digits);
return0;}numdigits.cfor语句对于“向上加”(变量自增)或“向下减”(变量自减)的循环来说是最好的选择。for语句和while语句关系紧密。同样,循环体只执行一次,并显示相同的信息。return0;break;while(n<10){case3:while(i>0){for(k=1;k<=i;k++)“0”代表当前扫描器“位于空格串中”这一状态。程序numdigits.i=i*2; i现在为8。表达式2控制用于控制循环的终止(循环持续执行,只要表达式2的值非零)。scanf("%d",&i);Entercommand:4在控制表达式中使用==代替<,<=,>,或>=。sum+=i;for(i=10;i>0;i);/***WRONG***/用数学不等式来描述打印星号区域:说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。goto语句能跳转到函数中任何有标号的语句处。for语句适合应用在使用“计数”变量的循环中,然而它也灵活用于许多其他类型的循环中。for语句的一般格式如下 for(表达式1;表达式2;表达式3)语句 表达式1、表达式2和表达式3全都是表达式。示例 for(i=10;i>0;i) printf("Tminus%dandcounting\n",i);for语句for语句对于“向上加”(变量自增)或“向下减”(变量自减)for语句的执行流程for(表达式1;表达式2;表达式3)
语句;for语句for语句的执行流程for语句for语句和while语句关系紧密。除了极少数情况,for循环总可以等价替换为while循环 表达式1; while(表达式2){ 语句 表达式3; }表达式1是在循环开始执行前,只执行一次的初始化步骤。for语句for语句和while语句关系紧密。for语句表达式2控制用于控制循环的终止(循环持续执行,只要表达式2的值非零)。表达式3是在每次循环的最后被执行的一个操作。按照这种模式,上面的for循环可以改写为如下的while循环 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }for语句表达式2控制用于控制循环的终止(循环持续执行,只要表达式2的研究等价的while语句有助于更好地理解for语句。例如,假设把先前for循环示例中的i替换为i for(i=10;i>0;i) printf("Tminus%dandcounting\n",i);等价的while循环显示上述的替换对循环没有任何影响 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }for语句研究等价的while语句有助于更好地理解for语句。for语由于for语句中的第一和第三表达式都是以语句的方式执行的,所以它们的值互不相关——它们有用仅仅是因为有副作用。
所以,这两个表达式常常是赋值表达式或自增/自减表达式。for语句由于for语句中的第一和第三表达式都是以语句的方式执行的,所for语句对于“向上加”(变量自增)或“向下减”(变量自减)的循环来说是最好的选择。对于向上加或向下减共有n次的情况,for语句经常会采用下列形式中的一种。从0向上加到n–1 for(i=0;i<n;i++)…从1向上加到n for(i=1;i<=n;i++)…从n1向下减到0 for(i=n1;i>=0;i)…从n向下减到1 for(i=n;i>0;i)…for语句惯用法for语句对于“向上加”(变量自增)或“向下减”(变量自减)常见语句错误在控制表达式中用<(大于)代替>(反之亦然)。“向上加”使用<或<=运算符;“向下减使用>或〉=运算符。在控制表达式中使用==代替<,<=,>,或>=。编写的控制表达式用i<=n代替i<n,会产生“循环次数差一次”错误。for语句惯用法常见语句错误for语句惯用法C语言允许省略任意或全部的表达式。如果省略第一个表达式,那么在执行循环前没有初始化的操作 i=10; for(;i>0;i) printf("Tminus%dandcounting\n",i);如果省略第三个表达式,那么循环体需确保第二个表达式的值最终会变为假 for(i=10;i>0;) printf("Tminus%dandcounting\n",i);在for语句中省略表达式C语言允许省略任意或全部的表达式。在for语句中省略表达式当第一和第三表达式都省略时,for循环与while循环没有任何区别 for(;i>0;) printf("Tminus%dandcounting\n",i); 等价于 while(i>0) printf("Tminus%dandcounting\n",i);while语句的形式更清楚,因此更可取。在for语句中省略表达式当第一和第三表达式都省略时,for循环与while循环没有任如果省略第二个表达式,那么它默认为真,因此for语句不会终止(除非以某种其他形式停止)。例如某些程序员用下列的for语句建立无限循环 for(;;)…在for语句中省略表达式如果省略第二个表达式,那么它默认为真,因此for语句不会终止C99中,for语句的第一个表达式能被替换为一个声明(定义)。这个特性允许程序员在for循环中定义变量 for(inti=0;i<n;i++) …这样,变量i不需要在for循环前定义。C99中的for语句C99中,for语句的第一个表达式能被替换为一个声明(定义)在for语句中定义的变量不能在循环体外访问,即在循环外不可见) for(inti=0;i<n;i++){ … printf("%d",i);/*legal;iisvisibleinsideloop*/ … } printf("%d",i);/***WRONG***/C99中的for语句在for语句中定义的变量不能在循环体外访问,即在循环外不可见让for语句定义自己的循环控制变量通常是个好的做法,方便且让程序易于理解。当然,如果程序需要在循环结束后访问这样的变量,那么就需要采用for语句常规的方式。for语句可以定义多个相同类型的变量 for(inti=0,j=0;i<n;i++) …C99中的for语句让for语句定义自己的循环控制变量通常是个好的做法,方便且让有时,for语句可能需要多个初始表达式,或在每次循环时一次对几个变量进行自增(减)操作。可以在for语句的第一和第三表达式中使用逗号表达式实现这些想法。逗号表达式具有如下形式 表达式1,表达式2 这里表达式1和表达式2可以是任意两个表达式。逗号运算符有时,for语句可能需要多个初始表达式,或在每次循环时一次对逗号表达式的计算分两步实现第一,计算表达式1并丢弃计算结果。第二,计算表达式2并将计算结果作为整个逗号表达式的结果。计算表达式1始终是有意义的。当计算逗号表达式++i,i+j,i先自增,然后计算i+j假设,变量i和j的值分别为1和5,那么上面逗号表达式的值为7,而i的值将自增为2。逗号运算符逗号表达式的计算分两步实现逗号运算符逗号运算符是左结合性的,所以编译器把下列表达式 i=1,j=2,k=i+j 解释为 ((i=1),(j=2)),(k=(i+j))即左边的操作先于右边的执行,这样表达式i=1,j=2,和k=i+j将从左到右执行。逗号运算符逗号运算符是左结合性的,所以编译器把下列表达式逗号运算符逗号运算符允许将两个或多个表达式黏贴成一个表达式。在后面章节中我们会看到某些定义将从逗号运算符中受益。for语句是唯一除上述之外还可以发现逗号运算符的地方。例如 for(sum=0,i=1;i<=N;i++) sum+=i;利用附加的逗号运算符,for语句可以初始化两个及以上的变量。逗号运算符逗号运算符允许将两个或多个表达式黏贴成一个表达式。逗号运算符程序square.c(Section6.1)可以通过将while循环转化为for循环的方式进行改进程序显示平方值表格(改进版)程序square.c(Section6.1)可以通过将whsquare2.c
/*Printsatableofsquaresusingaforstatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
for(i=1;i<=n;i++)printf("%10d%10d\n",i,i*i);
return0;}square2.cbreak语句从switch语句中转移出程序控制,但没有从while循环中转移出来。printf("Tminus%dandcounting\n",i);for(表达式1;表达式2;表达式3)语句for(i=10;i>0;i);/***WRONG***/c(Section6.Thisprogramprintsatableofsquares.printf("Thesumis:%d\n",sum);i<n成立吗? 是,继续。for(i=10;i>0;i);/***WRONG***/break语句把程序控制转出循环体。printf("Thenumberhas%ddigit(s).goto语句能跳转到函数中任何有标号的语句处。}while();}/*emptyloopbody*/;while(…){intmain(void)printf("Error:Divisionbyzero\n");Enterintegers(0toterminate):8237150sum+=i;下面几种都是合法的形式:C语言对控制循环行为的三个表达式没有加任何限制。
虽然这些表达式通常对同一个变量进行初始化、判定和更新,但是不要求它们之间以任何方式进行相互关联。程序square3.c
等价于square2.c,但是包含一个for语句,它初始化一个变量(square),判定另一个变量(i),并对第三个变量(odd)进行自增操作。
for语句这种极大的灵活性有时是十分有用的,但是原始的程序无疑更加清晰。程序显示平方值表格(改进版)break语句从switch语句中转移出程序控制,但没有从wsquare3.c
/*Printsatableofsquaresusinganoddmethod*/
#include<stdio.h>
intmain(void){inti,n,odd,square;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;odd=3;for(square=1;i<=n;odd+=2){printf("%10d%10d\n",i,square);++i;square+=odd;}
return0;}square3.c通常循环的退出点是在while或for循环体之前,或do循环体之后。使用break语句可以在循环体中间设置退出点,甚至设置多个退出点。退出循环通常循环的退出点是在while或for循环体之前,或do循环break语句能够把程序控制从switch语句中转移出来,而且还可以用于跳出while、do或for循环。可以编写一个循环用于测试一个数是否是素数,只要发现一个约数就用break语句终止循环 for(d=2;d<n;d++) if(n%d==0) break;break语句break语句能够把程序控制从switch语句中转移出来,而在循环终止后,可以用if语句来确定是提前终止(即n不是素数)还是正常终止(n是素数) if(d<n) printf("%disdivisibleby%d\n",n,d); else printf("%disprime\n",n);break语句在循环终止后,可以用if语句来确定是提前终止(即n不是素数)break语句特别适合退出点在循环体中间,而不是循环体之前或之后的循环。例如,用于读入用户输入并且在遇到特殊输入值时终止的循环 for(;;){ printf("Enteranumber(enter0tostop):"); scanf("%d",&n); if(n==0) break; printf("%dcubedis%d\n",n,n*n*n); }break语句break语句特别适合退出点在循环体中间,而不是循环体之前或break语句把程序控制从最内层封闭的while、do、for或switch语句中转移出来。当这些语句出现嵌套时,break语句只能跳出一层嵌套 while(…){ switch(…){ … break; … } }break语句从switch语句中转移出程序控制,但没有从while循环中转移出来。break语句break语句把程序控制从最内层封闭的while、do、focontinue语句与break语句类似break语句把程序控制转出循环体。continue语句把程序控制转移到循环体结束之前的一点。break语句使程序控制跳出循环,continue语句把程序控制留在循环体内。break语句和continue语句的另一个区别break语句可以在用于switch语句和循环中,而continue语句则只能用在循环中。continue语句continue语句与break语句类似continue语句使用continue语句的循环示例 n=0; sum=0; while(n<10){ scanf("%d",&i); if(i==0) continue; sum+=i; n++; /*continuejumpstohere*/ }continue语句使用continue语句的循环示例continue语句不用continue语句的相同循环示例 n=0; sum=0; while(n<10){ scanf("%d",&i); if(i!=0){ sum+=i; n++; } }continue语句不用continue语句的相同循环示例continue语句例6.5学生读程
#include<stdio.h>
voidmain()
{intn;
for(n=100;n<=200;n++)
{if(n%3==0)
continue;
printf("%d″,n);
}
}说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。例6.5学生读程
#include<stdio.h>
vo例6.5把100~200之间的不能被3整除的数输出。
#include<stdio.h>
voidmain()
{intn;
for(n=100;n<=200;n++)
{if(n%3==0)
continue;
printf("%d″,n);
}
}说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。例6.5把100~200之间的不能被3整除的数输出。
#goto语句能跳转到函数中任何有标号的语句处。标号是放置在语句开始处的标识符 标识符语句一条语句可以有多个标号。goto语句格式如下 goto标识符;执行语句gotoL,把程序控制转移到标号L后的语句上,转移目标语句必须与goto语句在同一个函数中。goto语句goto语句能跳转到函数中任何有标号的语句处。goto语句Entercommand:1例如,用于读入用户输入并且在遇到特殊输入值时终止的循环C99中,for语句的第一个表达式能被替换为一个声明(定义)。loop_done:…gotoloop_done;/*breakwon'tworkhere*/scanf("%d",&n);“0”代表当前扫描器“位于空格串中”这一状态。程序显示平方值表格(改进版)printf("%disdivisibleby%d\n",n,d);当这些语句出现嵌套时,break语句只能跳出一层嵌套printf("Thesumis:%d\n",sum);printf("***ACMEcheckbookbalancingprogram***\n");do语句和while语句没有本质的区别。case3:如果表达式为真,也就是不为零,那么继续执行循环。break语句从switch语句中转移出程序控制,但没有从while循环中转移出来。scanf("%d",&n);printf("*");循环嵌套中,每层循环的进行都有相应的控制机制(比如循环变量)。在控制表达式中使用==代替<,<=,>,或>=。从n1向下减到0 for(i=n1;i>=0;i)…如果C语言没有break语句,goto语句可以用于退出循环 for(d=2;d<n;d++) if(n%d==0) gotodone; done: if(d<n) printf("%disdivisibleby%d\n",n,d); else printf("%disprime\n",n);goto语句Entercommand:1如果C语言没有break语句goto语句在日常的C语言编程中很少用到。break、continue和return
等语句本质上都是受限制的goto语句,它们和exit函数一起足够应付其他编程语言中大多数goto语句的情况。尽管如此,goto语句偶尔还是很有用的。goto语句goto语句在日常的C语言编程中很少用到。goto语句考虑从包含switch语句的循环中退出的问题。break语句不会产生期望的效果它可以跳出switch语句,但是无法跳出循环。goto语句可以解决这个问题 while(…){ switch(…){ … gotoloop_done;/*breakwon'tworkhere*/ … } } loop_done:…goto语句在需要从嵌套的多层循环中转出时还是很有用。goto语句考虑从包含switch语句的循环中退出的问题。goto语句例6.1用if语句和goto语句构成循环
voidmain()
{inti,sum=0;
i=1;
loop:if(i<=100)
{sum=sum+i;
i++;
gotoloop;
}
printf("%d\\n″,sum);
}说明:这里用的是“当型”循环结构,当满足“i<=100”时执行花括弧内的循环体。运行结果:5050例6.1用if语句和goto语句构成循环
voidma许多简单的交互式程序都是基于菜单的,它们向用户显示可供选择的命令列表。一旦用户选择了某条命令,程序就执行相应的操作,然后提示用户输入下一条命令。这个过程一直会持续到用户选择“退出”或“停止”命令。这类程序的核心显然是循环。 for(;;){
提示用户输入命令;
读入命令;
执行命令; }程序账本结算许多简单的交互式程序都是基于菜单的,它们向用户显示可供选择的执行这个命令将需要switch语句(或级联式if语句) for(;;){
提示用户输入命令;
读入命令; switch(command){ case命令1:执行操作1;break; case命令2:
执行操作2;break; . . . case命令n:
执行操作n;break; default:显示错误信息;break; } }程序账本结算执行这个命令将需要switch语句(或级联式if语句)程序账程序checking.c用这种循环来维护账本的余额程序将为用户提供选择菜单刷新帐户余额,往帐户上存钱,从帐户上取钱,显示当前余额,退出程序。程序账本结算程序checking.c用这种循环来维护账本的余额程序账本结***ACMEcheckbookbalancingprogram***Commands:0=clear,1=credit,2=debit,3=balance,4=exit
Entercommand:1Enteramountofcredit:1042.56Entercommand:2Enteramountofdebit:133.79Entercommand:1Enteramountofcredit:1754.32Entercommand:2Enteramountofdebit:1400Entercommand:2Enteramountofdebit:68Entercommand:2Enteramountofdebit:50Entercommand:3Currentbalance:$1145.09Entercommand:4程序账本结算***ACMEcheckbookbalancingprchecking.c
/*Balancesacheckbook*/
#include<stdio.h>
intmain(void){intcmd;floatbalance=0.0f,credit,debit;
printf("***ACMEcheckbookbalancingprogram***\n");printf("Commands:0=clear,1=credit,2=debit,");printf("3=balance,4=exit\n\n");for(;;){printf("Entercommand:");scanf("%d",&cmd);switch(cmd){case0:balance=0.0f;break;checking.ccase1:printf("Enteramountofcredit:");scanf("%f",&credit);balance+=credit;break;case2:printf("Enteramountofdebit:");scanf("%f",&debit);balance=debit;break;case3:printf("Currentbalance:$%.2f\n",balance);break;case4:return0;default:printf("Commands:0=clear,1=credit,2=debit,");printf("3=balance,4=exit\n\n");break;}}}case1:语句可以为空,即除了末尾的分号外什么符号也没有。下面一行代码包含三条语句 i=0;;j=1;空语句主要有一个好处编写空循环体的循环。空语句语句可以为空,即除了末尾的分号外什么符号也没有。空语句“1”代表当前扫描头“位于字母串中”这一状态;continue语句把程序控制转移到循环体结束之前的一点。虽然循环体必须是单独的一条语句,但这只是个技术问题。这个过程持续进行直到最终控制表达式的值变为零。Enterintegers(0toterminate):8237150return0;#include<stdio.1用if语句和goto语句构成循环
voidmain()
{inti,sum=0;
i=1;
loop:if(i<=100)
{sum=sum+i;
i++;
gotoloop;
}
printf("%d\\n″,sum);
}i=1,j=2,k=i+j因为控制表达式是在循环体执行之前进行判定。执行语句gotoL,把程序控制转移到标号L后的语句上,转移目标语句必须与goto语句在同一个函数中。/*Printsatableofsquaresusingawhilestatement*/gotoloop_done;/*breakwon'tworkhere*/Enterintegers(0toterminate):8237150使用do语句重写前面的“倒数计数”程序do语句比while语句更适合,因为每个整数,即便是0都至少有一位数字。scanf("%d",&n);{…}…}但是在某一层x中,可能会使用甚至改变另一层y的控制机制(比如在x层中引用甚至修改y层的循环变量的值),这是造成多层循环难以理解的重要原因。考虑下面寻找素数的循环 for(d=2;d<n;d++) if(n%d==0) break;如果把条件n%d==0移到循环控制表达式中,那么循环体将会为空 for(d=2;d<n&&n%d!=0;d++) /*emptyloopbody*/;为了避免混淆,C程序员习惯性地把空语句单独放置一行。空语句“1”代表当前扫描头“位于字母串中”这一状态;考虑下面寻找素不小心在if、while或for语句放置了分号形成空语句会造成上述语句的提前结束。例1: if(d==0);/***WRONG***/ printf("Error:Divisionbyzero\n"); 函数调用printf不在if语句中,所以无论d的值是否等于0都会执行该函数。例2: i=10; while(i>0);/***WRONG***/ { printf("Tminus%dandcounting\n",i); i; } while圆括号后多余的分号(空语句)造成无限循环。
空语句不小心在if、while或for语句放置了分号形成空语句会造例3: i=11; while(i>0);/***WRONG***/ printf("Tminus%dandcounting\n",i); 循环体在循环终止后只执行一次;显示信息如下 Tminus0andcounting例4: for(i=10;i>0;i);/***WRONG***/ printf("Tminus%dandcounting\n",i); 同样,循环体只执行一次,并显示相同的信息。空语句例3:空语句循环的嵌套一个循环体内又包含另一个完整的循环结构称为循环的嵌套。内嵌的循环中还可以嵌套循环,这就是多层循环。三种循环(while循环、do-while循环和for循环)可以互相嵌套。循环的嵌套循环的嵌套下面几种都是合法的形式:(1)
while()(2)do(3)for(;;){…{…{while()dofor(;;){…}{…}{…}}while();}}while();
循环的嵌套循环的嵌套(4)
while()(5)for(;;)(6)do{…{…{…do{…}while()for(;;){}while(){}…{…}…}}}while()
循环的嵌套循环嵌套的难点循环嵌套中,每层循环的进行都有相应的控制机制(比如循环变量)。但是在某一层x中,可能会使用甚至改变另一层y的控制机制(比如在x层中引用甚至修改y层的循环变量的值),这是造成多层循环难以理解的重要原因。循环嵌套的难点循环嵌套中,每层循环的进行都有相应的控制机循环嵌套的难点例:intmain(){inti,k,s=0;for(i=1;i<=10;i++) for(k=1;k<=i;k++) s+=k;printf("%d",s);}此程序的作用是什么?打印的结果是?循环嵌套的难点例:循环嵌套的难点例:intmain(){inti,k,s=0;for(i=1;i<=10;i++) for(k=1;k<=i;k++) { if(k%2==0) i++; s+=k;}printf("%d",s);}}此程序的作用是什么?打印的结果是?循环嵌套的难点例:程序设计算法vs数学建模例:使用循环,在屏幕上打印如下图案:*************************效果:程序设计算法vs数学建模例:使用循环,在屏幕上打印如下图程序设计算法vs数学建模分析:1.将图形放入笛卡尔坐标系(即建模)
**************************************************坐标平移程序设计算法vs数学建模分析:1.将图形放入笛卡尔坐标程序设计算法vs数学建模2.得到数学模型:
0123456-1-2-3-4-5-6打印空格打印空格打印空格打印空格打印星号程序设计算法vs数学建模2.得到数学模型:012345程序设计算法vs数学建模3.用数学不等式来描述打印星号区域:(1)写出四条边线的方程(也可先不平移坐标,写出原方程后再平移):(x-3)+(y+3)=3,-(x-3)+(y+3)=3,-(x-3)-(y+3)=3,(x-3)-(y+3)=3(2)统一描述为:|x-3|+|y+3|=3(3)故可描述打印星号区域为:
|x-3|+|y+3|≤30123456-1-2-3-4-5-6打印星号yx程序设计算法vs数学建模3.用数学不等式来描述打印星号程序设计算法vs数学建模由此得到本程序核心算法的描述:if(当前光标处于|x-3|+|y+3|≤3的区域中)
打印*;else打印空格;程序设计算法vs数学建模由此得到本程序核心算法的描述:程序设计算法vs数学建模完整程序如下#include<math.h>/*程序中要使用求绝对值函数fabs(),需包含此头文件*/intmain(){intx,y;for(y=0;y>=-6;y--)/*此循环用于处理行*/{for(x=0;x<=6;x++)/*此循环用于处理某行中的各列*/if(fabs(x-3)+fabs(y+3)<=3)/*在y行x列中,坐标满足本条件则打印星号,否则打空格*/printf("*");elseprintf(“”);/*可尝试将此处换成打印减号,结果更直观*/printf("\n");/*每处理完一行,需换行*/}}程序设计算法vs数学建模完整程序如下程序设计算法思想描述*例:输入一个英文句子,以句号.结束,计算其中包含多少单词(假设除句号外输入的字符均为英文字母或者空格)。分析:把句子看成是由字母序列和空格序列(单词间可能有多个空格)交替组成的一个字符串。程序处理的方式,是对句子中的所有字符进行逐一扫描(可以想象成有一个扫描头,不断地扫描句子中的每个字符),然后在这个过程中判定单词的出现,如出现则把计数变量加1。
在编制程序前,先思考如何描述这个扫描的过程??方法:使用状态转移图(或称状态机):程序设计算法思想描述*例:输入一个英文句子,以句号.结束,“1”代表当前扫描头“位于字母串中”这一状态;“0”代表当前扫描器“位于空格串中”这一状态。当“扫描到字母”事件或者“扫描到空格”事件发生时,扫描头的状态会被改变,如图箭头所示。程序设计算法思想描述*01扫描到空格扫描到字母扫描到空格扫描到字母“1”代表当前扫描头“位于字母串中”这一状态;程序设计算法思我们关心的是当处于状态0时,“扫描到字母”事件发生的情况。这个时候意味着什么?——之前扫描到的是空格,现在是个字母,即意味着扫描到了一个单词的开头!所以此时,计数变量加1。程序设计算法思想描述*01扫描到空格扫描到字母扫描到空格扫描到字母我们关心的是当处于状态0时,“扫描到字母”事件发生的情况。这语言循环结构语言循环结构87(优选)语言循环结构(优选)语言循环结构C语言的重复语句用于设置循环。循环是重复执行其他语句的一种语句,循环中重复执行的语句就是循环体
C语句中,每个循环都有一个控制表达式。每次执行循环体时都要对控制表达式进行计算。如果表达式为真,也就是不为零,那么继续执行循环。重复语句C语言的重复语句用于设置循环。重复语句C提供三种循环语句:while语句用于判定控制表达式在循环体执行之前的循环。do语句用于判定控制表达式在循环体执行之后的循环。for语句对于自增或自减计数变量的循环十分方便。重复语句C提供三种循环语句:重复语句使用while语句是最简单、最基本的设置循环方法。While语句格式如下 while(表达式)语句表达式即为控制表达式;语句则是循环体。while语句使用while语句是最简单、最基本的设置循环方法。whilwhile语句示例 while(i<n)/*控制表达式*/ i=i*2;/*循环体*/执行while语句时,首先计算控制表达式的值。如果值不为零(真),那么执行循环体,接着再次判定表达式。这个过程持续进行直到最终控制表达式的值变为零。while语句while语句示例while语句while语句示例计算大于或等于数n的最小的2次幂 i=1; while(i<n) i=i*2;设n为10时,下面跟踪显示了while语句执行情况 i=1; i现在值为1. i<n成立吗? 是,继续。 i=i*2; i现在为2. i<n成立吗? 是,继续。 i=i*2; i现在为4。 i<n成立吗? 是,继续。 i=i*2; i现在为8。 i<n成立吗? 是,继续。 i=i*2; i现在为16。 i<n成立吗? 不成立,退出循环。while语句while语句示例计算大于或等于数n的最小的2次幂while虽然循环体必须是单独的一条语句,但这只是个技术问题。如果需要多条语句,那么只要用一对大括号构造成单独一条复合语句就可以了 while(i>0){ printf("Tminus%dandcounting\n",i); i; }即使没有严格要求的时候,一些程序员始终使用大括号括住循环体 while(i<n){ i=i*2; }while语句虽然循环体必须是单独的一条语句,但这只是个技术问题。whil下面的语句显示一串“倒数计数”信息 i=10; while(i>0){ printf("Tminus%dandcounting\n",i); i; }整个过程持续到显示信息为“Tminus1andcounting”。while语句下面的语句显示一串“倒数计数”信息while语句关于while语句的一些讨论在while循环终止时,控制表达式的值为假。因此,当通过表达式i>0控制循环终止时,i必须是小于或等于0的。可能根本不执行while循环体。因为控制表达式是在循环体执行之前进行判定。while语句常常可以有多重写法。更加简明的递减计数循环如下 while(i>0) printf("Tminus%dandcounting\n",i);while语句关于while语句的一些讨论while语句printf("%disprime\n",n);}while();}intmain(void)scanf("%f",&credit);从1向上加到n for(i=1;i<=n;i++)…loop_done:…/*emptyloopbody*/;printf("Tminus%dandcounting\n",i);for(d=2;d<n;d++)case4:break语句不会产生期望的效果它可以跳出switch语句,但是无法跳出循环。printf("Thisprogramprintsatableofsquares.“0”代表当前扫描器“位于空格串中”这一状态。for(d=2;d<n&&n%d!=0;d++)for(;;){i<n成立吗? 不成立,退出循环。如果控制表达式的值始终是非零值的话,while语句将无法终止。C语句程序员有时故意用非零常量作为控制表达式来构造无限循环 while(1)…除非循环体含有跳出循环控制的语句(break,goto,return)或调用了导致程序终止的函数,否则上述这种形式的while语句将永远执行下去。无限循环printf("%disprime\n",n);如果控程序square.c用一个while语句显示平方值表格。用户指定平方值表格的行数 Thisprogramprintsatableofsquares. Enternumberofentriesintable:5 11 24 39 416 525程序显示平方值的表格程序square.c用一个while语句显示平方值表格。程序square.c
/*Printsatableofsquaresusingawhilestatement*/
#include<stdio.h>
intmain(void){inti,n;
printf("Thisprogramprintsatableofsquares.\n");printf("Enternumberofentriesintable:");scanf("%d",&n);
i=1;while(i<=n){printf("%10d%10d\n",i,i*i);i++;}
return0;}square.c程序sum.c对用户输入的整数数列求和 Thisprogramsumsaseriesofintegers. Enterintegers(0toterminate):8237150 Thesumis:107程序需要使用循环,循环采用scanf函数读取用户输入数,然后再把这个数加到运算的总和中。程序数列求和程序sum.c对用户输入的整数数列求和程序数列求和sum.c
/*Sumsaseriesofnumbers*/
#include<stdio.h>
intmain(void){intn,sum=0;
printf("Thisprogramsumsaseriesofintegers.\n");printf("Enterintegers(0toterminate):");
scanf("%d",&n);while(n!=0){sum+=n;scanf("%d",&n);}printf("Thesumis:%d\n",sum);
return0;}sum.c例6.3求1到100的和
学生练习运行结果:5050例6.3求1到100的和
学生练习运行结果:5050第二,计算表达式2并将计算结果作为整个逗号表达式的结果。如果需要多条语句,那么只要用一对大括号构造成单独一条复合语句就可以了除非循环体含有跳出循环控制的语句(break,goto,return)或调用了导致程序终止的函数,否则上述这种形式的while语句将永远执行下去。表达式1、表达式2和表达式3全都是表达式。“向下减使用>或〉=运算符。return0;scanf("%d",&n);printf("%10d%10d\n",i,square);通常循环的退出点是在while或for循环体之前,或do循环体之后。Enterintegers(0toterminate):8237150while(i>0){说明:当n能被3整除时,执行continue语句,结束本次循环(即跳过printf函数语句),只有n不能被3整除时才执行printf函数。在for语句中省略表达式case2:printf("***ACMEcheckbookbalancingprogram***\n");如果值不为零(真),那么执行循环体,接着再次判定表达式。scanf("%d",&n);如果把条件n%d==0移到循环控制表达式中,那么循环体将会为空使用break语句可以在循环体中间设置退出点,甚至设置多个退出点。例6.2求1到100的和
#include<stdio.h>
voidmain()
{inti,sum=0;
i=1;
while(i<=100)
{sum=sum+i;
i++;
}
printf(″%d\\n″,sum);
}说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句。
运行结果:5050第二,计算表达式2并将计算结果作为整个逗号表达式的结果。例6do语句的一般格式如下 do语句while(表达式);执行do语句时,先执行循环体,再计算控制表达式的值。如果表达式的值非零,那么再次执行循环体,然后再次计算表达式的值。do语句do语句的一般格式如下do语句使用do语句重写前面的“倒数计数”程序 i=10; do{ printf("Tminus%dandcounting\n",i); i; }while(i>0);do语句和while语句没有本质的区别。唯一的不同在于do语句的循环体至少会被执行一次。do语句使用do语句重写前面的“倒数计数”程序do语句最好对所有的do语句都使用大括号包括循环体,因为没有大括号的do语句很容易被误认为是while语句 do printf("Tminus%dandcounting\n",i); while(i>0);粗心的读者可能会把单词while误认为是while语句的开始。do语句while(i<=100)最好对所有的do语句都使用大括号包括循环体,因为没有大括号的例6.3求1到100的和
运行结果:5050例6.3求1到100的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供应链协同管理试题及答案集锦
- 高效学习2024年CPSM考试试题及答案
- 供应链管理师团队建设知识试题及答案
- 四川省眉山市重点中学2025届高考仿真卷化学试卷含解析
- 蛋白质的折叠与功能的关系试题及答案
- SCMP问题梳理与试题及答案
- 2024年物流师考试的重点难点试题及答案
- 2024年CPSM考试基本概念试题及答案
- 铸铁闸门吊装专项施工方案
- 2025四川西南航空职业学院辅导员考试题库
- 材料研究方法重点总结
- 道德与法治课件:《学会宽容》PPT课件(第1课时)
- 平行四边形对角线的性质 (4)
- 新媒体运营-如何打造私域流量PPT课件(带内容)
- 北京语料库检索使用说明
- 高职单招英语单词
- 睿智cpld开发板用户手册10版本
- 高效执行四原则
- 勇者斗恶龙怪兽篇 金手指
- 喷油车间生产管理制度 (共5篇)
- 课题研究思路流程图
评论
0/150
提交评论