循环结构2

循环嵌套

例:求1!+2!+...+100!

分析:
仿照求1到100之和的例子,该程序可以写成:
for(int i=1; i<=100; i++){
item = i!
sum = sum + item;
}
但是中间的i!依然无法处理。这就需要嵌套循环解决。

求1到100累加和的例子:
sum =0;
for(int i=0; i<=100; i++){
sum = sum + i;
}

求n的阶乘的例子:
item = 0;
for(int i=1; i<=n; i++){
item = item * i;
}

#include <stdio.h>
int main(void)
{ int i, j;
double sum; /*计算结果较大,需要用double类型*/
double item; /*item用于存放阶乘*/
sum = 0; /*初始化*/
for(i = 1; i <= 100; i++) {
item = 1; /*每次求阶乘都从1开始 */
for (j = 1; j <= i; j++) /* 内层循环算出 item = i! */
item = item * j;
sum = sum + item;
}
printf("1! + 2! + 3! + … + 100! = %e\n", sum);
}

嵌套循环的执行过程

例1

例2

嵌套循环的设计过程

1)确定是否需要多个循环

2)大致确定外层循环

3)详细设计内层循环

4)设计完成后再回过头来看

例: 输入正整数n和a, 求a+aa+aaa= 。。。+(n个)a
,如n=2, a=3, 则结果为3+ 33 = 36

#include<stdio.h>
#include<math.h>
int main(){
int a, n, sum, item;
printf("please enter a:");
scanf("%d", &a);
printf("please enter a:");
scanf("%d", &n);
sum = 0;
/*先计算n个a的值,然后再计算总和*/
if(a>0 && n>0){
for(int i=0; i<=n; i++){
item = 0;
/*内层循环计算n个a组成的数值*/
for(int j=0; j<i; j++){
item += a * pow(10, j);
}
printf("%d\n", item); //将每次循环的结果显示出来,避免出错
sum += item; //外层循环计算多个item累加的数值

}
printf("sum = %d", sum);
}else{
printf("you should enter positive integer a & n;");
}
return 0;

}

break和continue语句

break语句的功能:
结束当前循环

break除了在循环结构中使用,还能在什么情况下使用?

#include <stdio.h>
int main(void){
//输入10个字符,遇到1时跳出
char c;
int i;
for (i = 0; i < 10; i++) {
c = getchar();
if ( c=='1') break;
putchar(c);
}
return 0;
}

continue语句的功能:
跳过循环体内continue后面的语句,继续下一个循环

#include <stdio.h>
int main(void){
//输入10个字符,忽略1
char c;
int i;
for (i = 0; i < 10; i++) {
c = getchar();
if ( c=='1') continue;
putchar(c);
}
return 0;
}

continue只能在循环结构中使用

例:输入一个正整数m,判断它是否为素数。

分析:素数就是只能被1和自身整除的正整数。我们可以用取余计算(%),当结果为0时说明可以整除。

例如,9%3得0,说明9可以被3整除。7%2得1,说明7不能被2整除。

所以,对于非1素数m,它的判断条件是不能被[2,m-1]整除。由于m不可能被大于m/2的数整除,所以这个区间还可以缩小到[2, m/2]

#include<stdio.h>
int main(void){
int m;
int flag = 0;
printf("Input m:");
scanf("%d", &m);


if(m>=0){

// 设置一个标志位,当flag=1时说明该数不是素数
flag = 0;
for(int i=2; i<=m/2; i++){
if(m % i == 0){
flag = 1;
}
}

// 如果循环结束标志位依然为0,那么说明是素数
if(flag == 0 && m != 1){
printf("%d is prime number\n", m);
}else{
printf("%d is not prime number\n", m);
}
}

return 0;
}

#include<stdio.h>
int main(void){
int m;
int i;
printf("Input m:");
scanf("%d", &m);

if(m>=0){

for(i=2; i<=m/2; i++){
if(m % i == 0){
//发现可以被整除,说明不是素数,直接跳出循环
break;
}
}

// 如果循环正常结束,中间没有跳出,那么说明是素数
if(i>m/2 && m != 1){
printf("%d is prime number\n", m);
}else{
printf("%d is not prime number\n", m);
}
}

return 0;
}

例:猜数字游戏,输入你所猜的整数(1~100之间),与计算机随机生成的数做比较。若相等,显示猜中,若不等,显示与被猜数的大小关系,最多猜7次。

分析:
1) 循环次数最大为7
2) 当猜中以后就跳出循环
3)为了区别通过猜中后跳出的循环和循环7次结束的循环,使用一个标志位flag来区分

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
int computer_num;
int your_num;
int count = 7; //最多猜7次的计数器
int flag = 0; //猜中标志

/*生成随机数*/
srand( time(0) );
computer_num = rand() % 100 + 1;
//printf("%d", rand());


while(count > 0){
printf("please enter your number:");
scanf("%d", &your_num);
count --;
flag = 1;
if(your_num == computer_num){
printf("you Great!\n");
break;
}else{
if(your_num > computer_num)
printf("too big! you has %d chance\n", count);
else
printf("too small! you has %d chance\n", count);
}
}

if(flag == 0){
printf("you lose!\n");
}

return 0;
}