c语言第六章条件型循环结构,C语言程序设计(六)

news/2024/7/3 7:13:22 标签: c语言第六章条件型循环结构

第六章 循环控制结构

循环结构:需要重复执行的操作

被重复执行的语句序列称为循环体

计数控制的循环

条件控制的循环

当型循环结构

直到型循环结构

for

while

do-while

while(循环控制表达式)

{

语句序列

}

计算循环控制表达式的值,如果循环控制表达式的值为真,执行循环体中的语句,返回;如果循环控制表达式的值为假,退出循环。

do

{

语句序列

}while(循环控制表达式);

执行循环体中的语句,计算循环控制表达式的值,如果循环控制表达式的值为真,返回;如果循环控制表达式的值为假,退出循环。

for(初始化表达式;循环控制表达式;增值表达式)

{

语句序列

}

初始化表达式的作用是为循环控制变量赋初值,决定了循环的起始条件

如何对循环变量进行增值,决定了循环的执行次数

如果在循环体内再次改变这个变量的值,将改变循环正常的执行次数

//L6-1

#include

main()

{

int i, n, sum;

printf("Input n:");

scanf("%d", &n);

sum = 0; /* 累加和变量初始化为0 */

for (i=1; i<=n; i++)

{

sum = sum + i; /* 做累加运算 */

}

printf("sum = %d\n", sum);

}

逗号运算符:可把多个表达式连接在一起,作用是实现对各个表达式的顺序求值

空语句(仅由一个分号构成):表示什么也不做,常用于编写延时程序

//L6-2

#include

main()

{

int i, n;

long p = 1; /* 因阶乘值取值范围较大,故p定义为长整型,并赋初值1 */

printf("Please enter n:");

scanf("%d", &n);

for (i=1; i<=n; i++)

{

p = p * i; /* 做累乘运算 */

}

printf("%d! = %ld\n", n, p); /* 以长整型格式输出n的阶乘值 */

}

//L6-3

#include

main()

{

int i, n;

long p = 1;

printf("Please enter n:");

scanf("%d", &n);

for (i=1; i<=n; i++)

{

p = p * i;

printf("%d! = %ld\n", i, p); /* 输出1~n之间的所有数的阶乘值 */

}

}

//L6-4(嵌套循环)

#include

main()

{

int i, j, n;

long p, sum = 0; /* 累加求和变量sum初始化为0 */

printf("Input n:");

scanf("%d", &n);

for (i=1; i<=n; i++)

{

p = 1; /* 每次循环之前都要将累乘求积变量p赋值为1 */

for (j=1; j<=i; j++)

{

p = p * j; /* 累乘求积 */

}

sum = sum + p; /* 累加求和 */

}

printf("1!+2!+…+%d! = %ld\n", n, sum);

}

//运行结果

Input n:4

1!+2!+…+4! = 33

编写累加求和程序的关键在于寻找累加项的构成规律

当累加项较为复杂或者前后项之间无关时,需要单独计算每个累加项

当累加项的前项和后项之间有关时,可以根据关系通过前项来计算后项

//6-5

#include

main()

{

int i, j;

for (i=0; i<3; i++) /* 控制外层循环执行3次 */

{

printf("i=%d: ", i);

for (j=0; j<4; j++) /* 控制内层循环执行4次 */

{

printf("j=%d ", j);

}

printf("\n");

}

}

//运行结果

i=0: j=0 j=1 j=2 j=3

i=1: j=0 j=1 j=2 j=3

i=2: j=0 j=1 j=2 j=3

//6-6(条件控制的循环)

#include

#include

main()

{

int magic; /* 计算机"想"的数 */

int guess; /* 用户猜的数 */

magic = rand(); /* 调用随机函数"想"一个数magic */

printf("Please guess a magic number:");

scanf("%d", &guess); /* 输入用户猜的数guess */

if (guess > magic) /*若guess>magic,则提示"Wrong!Too big"*/

printf("Wrong! Too big!\n");

else if (guess < magic)/*若guess

printf("Wrong! Too small!\n");

else /* 否则提示"Right!"并打印这个数 */

printf("Right!\n");

}

//6-7

#include /* 将函数time()所需要的头文件time.h包含到程序中 */

#include

#include

main()

{

int magic, guess, counter = 0;

srand(time(NULL)); /* 为函数rand()设置随机数种子 */

magic = rand() % 100 + 1;

do{

printf("Please guess a magic number:");

scanf("%d", &guess);

counter ++;

if (guess > magic)

printf("Wrong! Too big!\n");

else if (guess < magic)

printf("Wrong! Too small!\n");

else

printf("Right!\n");

}while (guess != magic);

printf("counter = %d\n", counter);

}

//运行结果

Please guess a magic number:50

Wrong! Too small!

Please guess a magic number:75

Wrong! Too big!

Please guess a magic number:62

Wrong! Too big!

Please guess a magic number:56

Wrong! Too big!

Please guess a magic number:53

Wrong! Too big!

Please guess a magic number:51

Right!

counter = 6

//L6-8

#include

#include

#include

main()

{

int magic, guess, counter = 0;

srand(time(NULL));

magic = rand() % 100 + 1;

do{

printf("Please guess a magic number:");

scanf("%d", &guess);

counter ++;

if (guess > magic)

printf("Wrong! Too big!\n");

else if (guess < magic)

printf("Wrong! Too small!\n");

else

printf("Right!\n");

}while (guess!=magic && counter<10);/*猜不对且未超过10次时继续猜*/

printf("counter = %d\n", counter);

}

//L6-9

#include

#include

#include

main()

{

int magic, guess, counter = 0;

int ret; /* 保存函数scanf()的返回值 */

srand(time(NULL));

magic = rand() % 100 + 1;

do{

printf("Please guess a magic number:");

ret = scanf("%d", &guess);

while (ret != 1) /* 若存在输入错误,则重新输入 */

{

while (getchar() != ‘\n‘); /* 清除输入缓冲区中的非法字符 */

printf("Please guess a magic number:");

ret = scanf("%d", &guess);

}

counter++;

if (guess > magic)

printf("Wrong!Too big!\n");

else if (guess < magic)

printf("Wrong!Too small!\n");

else

printf("Right!\n");

} while (guess!=magic && counter<10); /*猜不对且未超过10次时继续猜*/

printf("counter = %d\n", counter);

}

//L6-10

#include #include#includemain()

{int magic, guess, counter = 0, ret;char reply; /*保存用户输入的回答*/srand(time(NULL));do{

magic= rand() % 100 + 1;do{

printf("Please guess a magic number:");

ret= scanf("%d", &guess);while (ret != 1) /*若存在输入错误,则重新输入*/{while (getchar() != ‘\n‘); /*清除输入缓冲区中的非法字符*/printf("Please guess a magic number:");

ret= scanf("%d", &guess);

}

counter++;if (guess >magic)

printf("Wrong!Too big!\n");else if (guess

printf("Wrong!Too small!\n");elseprintf("Right!\n");

}while (guess!=magic && counter<10); /*猜不对且未超10次继续猜*/printf("counter = %d\n", counter);

printf("Do you want to continue(Y/N or y/n)?"); /*提示是否继续*/scanf("%c", &reply); /*%c前有一个空格*/}while (reply==‘Y‘ || reply==‘y‘); /*输入Y或y则程序继续*/}

goto、break、continue和return语句是C语言中用于控制流程转移的跳转语句

goto语句为无条件转向语句,它既可以向下跳转,也可往回跳转

它的作用是在不需要任何条件的情况下直接使程序跳转到该语句标号所标识的语句去执行

其中语句标号代表goto语句转向的目标位置,应使用合法的标识符表示语句标号,其命名规则与变量名相同

break语句用于退出switch结构,也可用于由while、do-while和for构成的循环体中

当执行循环体遇到break语句时,循环将立即终止,从循环语句后的第一条语句开始继续执行

//L6-11

#include

main()

{

int i, n;

for (i=1; i<=5; i++)

{

printf("Please enter n:");

scanf("%d", &n);

if (n < 0) goto END;

printf("n = %d\n", n);

}

END:printf("Program is over!\n");

}

continue语句与break语句都可用于对循环进行内部控制,但二者对流程的控制效果是不同的

当在循环体中遇到continue语句时,程序将跳过continue语句后面尚未执行的语句,开始下一次循环

即只结束本次循环的执行,并不终止整个循环的执行

//L6-12

#include

main()

{

int i, n;

for (i=1; i<=5; i++)

{

printf("Please enter n:");

scanf("%d", &n);

if (n < 0) continue;

printf("n = %d\n", n);

}

printf("Program is over!\n");

}

在嵌套循环的情况下,break语句和continue语句只对包含它们的最内层的循环语句起作用,不能用break语句跳出多重循环。

若要跳出多重循环,break语句只能一层一层地跳出,显然goto语句是跳出多重循环的一条捷径。

以下两种情况使用goto语句可以提高程序的执行效率,使程序结构更清晰

快速跳出多重循环

跳出共同的出口位置,进行退出前的错误处理工作

//L6-13

#include

main()

{

int x;

int find = 0; /* 置找到标志变量为假 */

for (x=1; !find; x++) /* find为假时继续循环 */

{

if (x%5==1 && x%6==5 && x%7==4 && x%11==10)

{

printf("x = %d\n", x);

find = 1; /* 置找到标志变量为真 */

}

}

}

//运行结果

x = 2111

结构化程序设计:

结构化程序设计是一种进行程序设计的原则和方法,按照这种原则和方法设计的程序,具有结构清晰、容易阅读、容易修改、容易验证等特点

程序应该只有一个入口和一个出口

不应有不可达语句和死循环

尽量避免使用goto语句,因为它破坏了结构化设计风格

采用自顶向下、逐步求精的模块化设计方法

常用的程序调试与排错方法:

除为了取得堆栈轨迹和一两个变量的值之外,尽量不要使用排错系统,因为人很容易在复杂数据结构和控制流的细节中迷失方向

有时以单步运行遍历程序的方式还不如努力思考,并辅之以在关键位置增设打印语句和测试代码,后者的效率更高

排错策略:

缩减输入数据,设法找到导致失败的最小输入

注释掉一些代码,分而治之

增量测试

类型溢出

//L6-14

#include

main()

{

long i, sum = 0;

for (i=1; ;i++)

{

sum = sum + i*i*i;

if (sum >= 1000000) break;

}

printf("count = %d\n", i);

}

//运行结果

count = 45

//L6-15

#include

main()

{

double term, result = 1;

int n;

for (n=2; n<=100; n=n+2)

{

term = (double)(n * n) / ((double)( n - 1) * ( n + 1));

result = result * term;

}

printf("pi = %f\n", 2 * result);

}

//运行结果

pi = 3.126079

原文:https://www.cnblogs.com/dingdangsunny/p/11372455.html


http://www.niftyadmin.cn/n/1175968.html

相关文章

java 如何把自己写的泪打成jar包,如何放入classpath让其他人可以使用

定位到要打包的上一层路径&#xff0c;执行jar -cvf test.jar *.*(输入需要打包的内容&#xff0c;此为所有内容) 在你要打包的文件夹同级目录下回生成该文件夹名字的jar包了 其他人使用时&#xff0c;在classpath里加上该路径即可,".;"在加上该jar包的位置。 转载于…

编码器改造,得到方向和脉冲

网上有比较多方案&#xff0c;就是利用D触发器&#xff0c;将脉冲AB相两个输入&#xff0c;然后如果A、B两个相序改变&#xff0c;那么输出的Q端的电平发生改变。 前面的是施密特整型电路&#xff0c;由于带编码的电机编码电路部分已经带了整型&#xff0c;所以可以不用这个。…

jenkins构建后邮件发送

1、进入系统管理->系统设置2、在Jenkins Location找到系统管理员邮件地址&#xff0c;输入发送邮件的邮箱地址3、在邮件通知中输入配置4、配置好了之后可以勾选“通过发送测试邮件测试配置”来测试配置是否成功5、需要更高级的邮件通知功能需要再安装一个Jenkins插件&#x…

电脑上没有android sdk,从zip安装android studio时,Windows 10上没有SDK(示例代码)

我在这里阅读了一些关于在哪里可以找到Android SDK的问题(在users / username / appdata / local / ...上)但是没有回答帮助我理解如何找到(或下载)SDK&#xff0c;因为我没有通过.exe安装Android Studio&#xff0c;而是下载了存档(zip)并将其解压缩。我尝试下载sdk tools并使…

团队作业

---恢复内容开始--- Spec模板 一、概述 1、项目背景 图书馆在正常运营中面对大量书籍、读者信息以及两者间相互联系产生的借书信息、还书信息。现有的人工记录方法既效率低又错误过多&#xff0c;大大影响了图书馆 的正常管理工作。因此需要对书籍资源、读者资源、…

[Java开发之路](16)学习log4j日志

1. 新建一个Javaproject。导入Jar包(log4j-1.2.17.jar)Jar包下载地址&#xff1a;点击打开链接2. 配置文件&#xff1a;创建并设置log4j.properties# 设置log4j.rootLogger debug,stdout,D,E# 输出信息到控制台log4j.appender.stdout org.apache.log4j.ConsoleAppenderlog4j.…

数据库基础知识001

1、SQL分类 &#xff08;1&#xff09;DDL&#xff08;Data Definition Language)语句&#xff1a;数据定义语言&#xff0c;这些语句定义了不同的数据段、数据库、表、列、索引等数据库对象的定义。常用关键字&#xff1a;create、drop、alter等。 &#xff08;2&#xff09;D…

Knockout应用开发指南 第一章:入门

原文:Knockout应用开发指南 第一章&#xff1a;入门1 Knockout简介 (Introduction) Knockout是一个轻量级的UI类库&#xff0c;通过应用MVVM模式使JavaScript前端UI简单化。 Knockout有如下4大重要概念&#xff1a; 声明式绑定 (Declarative Bindings)&#xff1a;使用简明易…