零基础入门学习C语言006讲:循环结构(2)

版权声明:转载请标明出处 https://blog.csdn.net/qq_41556318/article/details/89675476

 循环的嵌套

【例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】题目:有1234个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

1.程序分析:可填在百位、十位、个位的数字都是1234。组成所有的排列后再去掉不满足条件的排列。

#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);
				}					
			}
		}
	}
}

  breakcontinue语句

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=1r=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);		
	}
}

猜你喜欢

转载自blog.csdn.net/qq_41556318/article/details/89675476