循环结构程序设计
5.1 while语句
5.2 do-while语句
5.3 for语句
5.4 循环的嵌套
5.5 while与do-while的比较
5.7 改变循环执行的状态
5.7.1 continue语句
5.7.2 break语句
5.7.3 continue与break的区别
5.8 程序应用
5.1 while语句
一般形式:
while (表达式)
{
语句
}
特点:先判断表达式,后执行语句。
例,求1到100的和
#include
int main()
{
int i = 1, sum = 0;
while (i <= 100)
{
sum += i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
注意:
(1)循环体如果包含一个以上的语句,应该用大括弧括起来,以复合语句的形式出现。
(2)在循环体中应有使循环趋向于结束的语句。
5.2 do-while语句
一般形式:
do
{
循环体语句
} while (表达式);
特点: 先执行循环体,然后判断循环条件是否成立。
例,求1到100的和
#include
int main()
{
int i = 1, sum = 0;
do
{
sum += i;
i++;
} while (i <= 100);
printf("sum = %d\n", sum);
return 0;
}
5.3 for语句
一般形式:
for(表达式1;表达式2;表达式3)
{
语句
}
最简单的形式:
for(循环变量赋初值;循环条件;循环变量增值)
{
语句
}
注:
(1) 与for语句等价的while语句的形式:
表达式1;
while(表达式2)
{
语句
表达式3;
}
(2) for语句中的“表达式1”可以省略,此时应在for语句之前给循环变量赋初值。
例如:
for ( ; i <= 100; i++) sum = sum + i;
注意: 表达式1后面的分号不能省略
(3) 如果表达式2省略,即不判断循环条件,循环无终止地进行下去。即认为表达式2始终为真。例如:
for (i = 1; ; i++) sum = sum + i;
(4) 表达式3也可以省略,但应该另外设法保证循环能正常结束。
例如:
for (i = 1; i <= 100; )
{
sum = sum + i;
i++;
}
(5) 可以省略表达式1和表达式3,只有表达式2, 即只给循环条件。
例如:
for (; i<=100; )
{
sum = sum + i;
i++;
}
相当于
while (i<=100)
{
sum = sum + i;
i++;
}
(6) 表达式1和表达式3可以是一个简单的表达式,也可以包含多个简单表达式,中间用逗号间隔。例如
for (sum=0, i=1; i<=100; i++) sum = sum + i;
for (i=1; i<=100; i++, i++) sum = sum + i;
相当于
for (i=1; i<=100; i=i+2) sum = sum + i;
例:
for ( ; (c=getchar()) != ‘\n’; )
printf(″%c″,c);
语句中只有表达式2,而无表达式1和表达式3。作用:每读入一个字符后立即输出该字符,直到遇到“换行”为止。
例,求1到100的和
#include
int main()
{
int i, sum = 0;
for (i = 1; i <= 100; i++)
sum += i;
printf("sum = %d\n", sum);
return 0;
}
5.4 循环的嵌套
一个循环体内又包含另一个完整的循环结构称为循环的嵌套。
三种循环(while循环、do-while循环和for循环)可以互相嵌套
。
例,输出一个矩阵
[ 2 3 4 5 3 4 5 6 4 5 6 7 ] \left[\begin{matrix} 2 & 3 & 4 & 5\\ 3&4&5&6\\ 4&5&6&7\\ \end{matrix} \right]⎣⎡234345456567⎦⎤
#include
int main()
{
int i, j;
for (i = 1; i <= 3; i++)
{
for (j = 1; j <= 4; j++)
printf("%d ", i + j);
printf("\n");
}
return 0;
}
5.5 while与do-while的比较
在一般情况下,用while语句和用do-while语句处理同一问题时,它们的结果一样。但是如果while后面的表达式一开始就为假时,两种循环的结果是不同的。
例如下面两个程序
#include
int main()
{
int i, sum = 0;
printf("please enter i: ");
scanf_s("%d", &i);
while (i <= 10)
{
sum += i;
i++;
}
printf("sum = %d\n", sum);
return 0;
}
运行结果
#include
int main()
{
int i, sum = 0;
printf("please enter i: ");
scanf_s("%d", &i);
do
{
sum += i;
i++;
} while (i <= 10);
printf("sum = %d\n", sum);
return 0;
}
运行结果
5.7 改变循环执行的状态
5.7.1 continue语句
结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
一般形式:
continue;
例,输出100~200之间的不能被3整除
#include
int main()
{
for (int n = 100; n <= 200; n++)
{
if (n % 3 == 0) continue;
printf("%d ", n);
}
printf("\n");
return 0;
}
5.7.2 break语句
可以用来从循环体内跳出循环体,即提前 结束循环,接着执行循环下面的语句。
一般形式:
break;
注意: break语句只能用于循环语句和switch语句。
例,在全系1000名学生中进行募捐,当总数达到10万元时结束,统计此时捐款的人数,以及平均每人捐款的数目
#include
#define SUM 100000
int main()
{
float amount, aver, total;
int i;
for (i = 1, total = 0; i <= 1000; i++)
{
scanf_s("%f", &amount);
total = total + amount;
if (total >= SUM) break;
}
aver = total / i;
printf("num=%d\naver=%10.2f\n", i, aver);
return 0;
}
5.7.3 continue与break的区别
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立
while(表达式1)
{
…
if(表达式2) break;
…
}
continue语句只结束本次循环,而不是终止整个循环的执行
while(表达式1)
{
…
if(表达式2) continue;
…
}
例,依次输出下列矩阵
[ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 6&7&8&9&10\\ 11&12&13&14&15\\ 16&17&18&19&20\\ \end{matrix}\right]⎣⎢⎢⎡1611162712173813184914195101520⎦⎥⎥⎤
[ 1 2 3 4 5 2 4 6 8 10 4 8 12 16 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 2&4&6&8&10\\ &&&&\\ 4&8&12&16&20\\ \end{matrix}\right]⎣⎢⎢⎡1242483612481651020⎦⎥⎥⎤
[ 1 2 3 4 5 2 4 6 8 10 6 9 12 15 4 8 12 16 20 ] \left[\begin{matrix} 1&2&3&4&5\\ 2&4&6&8&10\\ 6&9&12&15&\\ 4&8&12&16&20\\ \end{matrix}\right]⎣⎢⎢⎡1264249836121248151651020⎦⎥⎥⎤
#include
int main()
{
int i, j;
for (i = 1; i <= 20; i++) //第一个矩阵
{
printf("%d\t", i);
if (i % 5 == 0) printf("\n");
}
printf("\n\n");
for (i = 1; i <= 4; i++) //第二个矩阵
{
for (j = 1; j <= 5; j++)
{
if (i == 3)continue;
printf("%d\t", i * j);
}
printf("\n");
}
printf("\n\n");
for (i = 1; i <= 4; i++) //第三个矩阵
{
for (j = 1; j <= 5; j++)
{
if (i == 3 && i * j == 3)continue;
printf("%d\t", i * j);
}
printf("\n");
}
printf("\n\n");
return 0;
}
运行结果
5.8 程序应用
(1)用 公式π 4 = 1 − 1 3 + 1 5 − 1 7 + . . . \frac{\pi}{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+...4π=1−31+51−71+...
求π \piπ的近似值,直到某一项的绝对值小于1 0 − 6 10^{-6}10−6 为止.
#include
#include
int main()
{
int sign = 1;
double sum = 0.0, t = 1.0, i = 1.0;
while (fabs(t) >= 1e-6)
{
sum += t;
i += 2;
sign = -sign;
t = sign / i;
}
printf("%10.8f\n", 4 * sum);
return 0;
}
运行结果:3.14159065
(2)求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。即:
F(1)=1 (n=1);F(2)=1 (n=2);F(n)=F(n-1)+F(n-2) (n≥3)
#include
int main()
{
int f1 = 1, f2 = 1, i;
for (i = 1; i <= 20; i++)
{
printf("%12d%12d", f1, f2);
if (i % 2 == 0)printf("\n");
f1 = f1 + f2;
f2 = f2 + f1;
}
return 0;
}
运行结果
(3)输入一个整数n,判断n是否为素数。
#include
#include
int main()
{
int i, n, k;
scanf_s("%d", &n);
if (n == 1) printf("%d不是素数", n);
else
{
k = sqrt(n);
for (i = 2; i <= k; i++)
if (n % i == 0)break;
if (i <= k)printf("%d不是素数\n", n);
else printf("%d是素数\n", n);
}
return 0;
}
(4)输出100到200之间的素数
#include
#include
int main()
{
int n, i, k, m = 0;
for (n = 101; n < 200; n += 2)
{
k = sqrt(n);
for (i = 2; i <= k; i++)
{
if (n % i == 0) break;
}
if (i >= k + 1)
{
printf("%5d", n);
m++;
}
if (m % 10 == 0) printf("\n"); //每输出10个换行
}
printf("\n");
return 0;
}
运行结果
(5)加法密码
将明文的每个字母向后移动三个,即A变成E,a变成e,W变成A,X变成B,从而实现明文的加密,输出密文。
1.#include
2.int main()
3.{
4. char ch;
5. while ((ch = getchar()) != '\n')
6. {
7. if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z'))
8. {
9. ch += 4;
10. if ((ch > 'Z' && ch <= 'Z' + 4) || ch > 'z') ch -= 26;
11. }
12. printf("%c", ch);
13. }
14. printf("\n");
15. return 0;
16.}
这是针对单个字符的加密,可以将整个程序封装成函数,加密字符串、文本。