零基础入门学习C语言006讲:循环结构(2)
循环的嵌套
【例6.7】
#include "stdio.h"
void main()
{
int i, j, k;
printf("i j k\n");
for (i = 0; i < 2; i++)
{
for (j = 0; j < 2; j++)
{
for (k = 0; k < 2; k++)
{
printf("%d %d %d\n", i, j, k);
}
}
}
}
问题:输出以下图形
#include "stdio.h"
void main()
{
int i;
int j;
for (i = 0; i < 6; i++)
{
for (j = 0; j < 6; j++)
{
if (j <= i)
{
printf("%c",'*');
}
}
printf("\n");
}
}
#include "stdio.h"
void main()
{
int i, j;
for (i = 1; i < 7; i++)
{
for (j = 1; j <= i; j++)
{
putchar('*');
}
printf("\n");
}
}
几种循环的比较
(1) 四种循环都可以用来处理同一问题,一般情况下它们可以互相代替。但一般不提倡用goto型循环。
(2) 在while循环和do-while循环中,只在while后面的括号内指定循环条件,因此为了使循环能正常结束,应在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。
for循环可以在表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。因此for语句的功能更强凡用while循环能完成的,用for循环都能实现。
(3) 用while和do-while循环时,循环变量初始化的操作应在while和do-while语句之前完成而for语句可以在表达式1中实现循环变量的初始化。
(4)while循环、do-while循环和for循环,可以用break语句跳出循环,用continue语句结束本次循环(break语句和continue语句见下节)。而对用goto语句和if语句构成的循环,不能用break语句和continue语句进行控制。
【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。
#include "stdio.h"
void main()
{
int i, j, k;
printf("\n");
for (i = 1; i<5; i++) //以下为三重循环
{
for (j = 1; j<5; j++)
{
for (k = 1; k<5; k++)
{
if (i != k&&i != j&&j != k) //确保i、j、k三位互不相同
{
printf("%d,%d,%d\n", i, j, k);
}
}
}
}
}
break和continue语句
break语句可以用来从循环体内跳出循环体,即提前结束循环,接着执行循环下面的语句
一般形式:
break;
break语句不能用于循环语句和switch语句之外的任何其他语句中。
注意:
1) break语句对if-else的条件语句不起作用。
2) 在多层循环中, 一个break语句只向外跳一层。
例:
#include "stdio.h"
void main()
{
float pi = 3.14159;
int r;
float area;
for (r = 1; r <= 10; r++)
{
area = pi*r*r;
if (area > 100)
{
break;
}
printf("r = %d, area = %f\n", r, area);
}
}
程序的作用是计算r=1到r=10时的圆面积,直到面积area大于100为止。从上面的for循环可以看到:当area>100时,执行break语句,提前结束循环,即不再继续执行其余的几次循环。
#include "stdio.h"
#include <conio.h> //后边getch函数和putch函数需要
void main()
{
int i = 0;
char c;
while (1) //设置循环
{
c = '\0'; //变量赋初值
while (c != 13 && c != 27) //键盘接收字符直到按回车或Esc键
{
c = getch();
printf("%c\n", c);
}
if (c == 27)
break; //判断若按Esc键则退出循环
i++;
printf("The No. is %d\n", i);
}
printf("The end");
}
continue 语句
作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。
一般形式:
continue;
continue语句和break语句的区别
continue语句只结束本次循环,而不是终止整个循环的执行。
break语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
例题:
显示输入的字符, 如果按的是Esc键, 则退出循环; 如果按的是Enter键, 则不做任何处理,继续输入下一个字符。
#include "stdio.h"
#include <conio.h> //后边getch函数和putch函数需要
void main()
{
char ch;
for ( ; ; )
{
ch = getch(); //字符输入函数
if (ch == 27) // Esc键的ACSII码为27
break; //退出循环*/
if (ch == 13)
continue; //按的是Enter:键,跳过字符输出语句
putch(ch); //显示输入的字符
}
getch(); //让程序停一下,拍任意键继续
}
例题:把100~200之间的不能被3整除的数输出。
#include "stdio.h"
void main()
{
int n;
for (n = 100; n <= 200; n++)
{
if (n % 3 == 0)
continue;
printf("%d ",n);
}
}
例题:用π/4 ≈ 1-1/3+1/5-1/7+…公式求π的近似值,直到某一项的绝对值小于为止。
#include <stdio.h>
#include<math.h>
void main()
{
int s;
float n, t, pi;
t = 1;
pi = 0;
n = 1.0;
s = 1;
while (fabs(t) > 1e-6) //fabs()函数确定精度
{
pi = pi + t;
n = n + 2;
s = -s;
t = s / n;
}
pi = pi * 4;
printf("pi = %10.6f\n", pi);
}
例题:求Fibonacci数列前40个数。这个数列有如下特点:第1,2两个数为1,1。从第3个数开始,该数是其前面两个数之和。
#include <stdio.h>
void main()
{
long int f1,f2;
int i;
f1 = 1;
f2 = 1;
for (i = 1; i <= 20; i++)
{
printf("%12ld %12ld ",f1,f2);
if (i % 2 == 0)
{
printf("\n");
}
f1 = f1 + f2;
f2 = f2 + f1;
}
}
例题:写一个程序,允许输入一个数m,并判断m是否为素数
#include <stdio.h>
#include <math.h>
void main()
{
int m, i, k;
scanf("%d", &m);
k = sqrt(m);
for (i = 2; i <= k; i++)
if (m%i == 0)
break;
if (i>k)
{
printf("%d is a prime number\n",m);
}
else
{
printf("%d is not a prime number\n",m);
}
}
题目升级:求100~200间的全部素数并打印出来。
#include <stdio.h>
# include <math.h>
void main()
{
int m, k, i, n = 0;
for (m = 101; m <= 200; m = m + 2)
{
k = sqrt(m);
for (i = 2; i <= k; i++)
{
if (m%i == 0) break;
}
if (i >= k + 1)
{
printf("%d ", m);
n=n+1;
}
if(n%10==0)
{
printf("\n");
}
}
printf ("\n");
}
例题:译密码!! 为使电文保密,往往按一定规律将其转换成密码,收报人再按约定的规律将其译回原文。
例如: 可以按以下规律将电文变成密码:
将字母A变成字母E,a变成e,即变成其后的第4个 字母,W变成A,X变成B,Y变成C,Z变成D。
友情提示:应该有要求两个功能!
一, 输入原文译成密码;
二,输入密码译成原文!
/********************************************
明文变为密码
********************************************/
#include "stdio.h"
void main()
{
char ch;
printf("Input your Ming_Wen:");
while (1)
{
ch = getchar();
if (ch == '\n')
{
break;
}
if (ch >= 'A'&&ch <= 'Z')
{
ch = (ch + 4 - 65) % 26 + 65;
}
else if (ch >= 'a'&&ch <= 'z')
{
ch = (ch + 4 - 97) % 26 + 97;
}
printf("%c", ch);
}
}
/********************************************
密码变为明文
********************************************/
#include "stdio.h"
void main()
{
char ch;
printf("Input your Mi_Ma:");
while (1)
{
ch = getchar();
if (ch == '\n')
{
break;
}
if (ch >= 'A'&&ch <= 'Z')
{
ch = (ch - 4 - 65) % 26 + 65;
}
else if (ch >= 'a'&&ch <= 'z')
{
ch = (ch - 4 - 97) % 26 + 97;
}
printf("%c", ch);
}
}