第五天(循环结构)

 

循环结构的核心就是为了重复代码
    如我现在想 1 +到 100,由于数字很有可能是没有顺序的
        因此我们要知道怎么去累加
    int sum = 0;
    int i = 1;
    sum += i;
    i++;
    sum += i;
    i++;
    sum += i;
    i++;
    sum += i;
    i++;
    sum += i;
    i++;
    sum += i;
    i++;
    ....
    我的代码需要写很长,发现代码都是一样的,我这个时候就想到怎么重复的去使用这些代码
        怎么重复使用?
            我有一个条件 --- i >= 1 && i <= 100
            每加一次,i就递增1,一直到不满足条件就完事了
        
c语言里面有几种语法来实现循环
    1 goto --- 实质不是循环的意思,goto是实现无条件地址跳转
                代码是要放在内存里面的,那么指令在运行的时候就会有地址
                我就可以指定你去到这个地址上面去执行代码    
                我们不知道这些指令的地址,那么就通过打标机来进行标记指令

                loop://标记

                goto loop;//去到这个loop标记的地址上面往下面执行代码

            如果是无条件跳转,你就很容易陷入死循环
                int a = 1;
                int sum = 0;
            loop:
                   //int a; //不能定义  如果goto过来会重复定义 所以不行
                sum += i;
                i++;
                goto loop;

            为了防止上面的死循环,我们更多的时候是让goto形成有条件的跳转
                if()
                {
                    goto loop;
                }
    eg:1 +....+ 100        
            int i = 1;
            int sum = 0;
        loop:
            sum += i;
            i++;
            if(i <= 100)//只要i不满101  我就要重复执行上面的两句代码
            {
                goto loop;
            }
练习:
    1 将100以内所有的奇数累加
        i = 1;

        i += 2;
    2 找出所有的水仙花数(三位数) 

        //从100开始  到999,将每一个数的个位十位百位取出来
        //算他们的立方和 和 本身比较 如果相等就是水仙花数
        int i = 100;
        int gewei = 0,shiwei = 0,baiwei = 0;
    loop:
        //取出i的个十百位
        gewei = i % 10;
        shiwei = i / 10 % 10;
        baiwei = i / 100 % 10;
        //他们的立方和和自己是不是相等
        if(gewei*gewei*gewei + shiwei**shiwei*shiwei + baiwei*baiwei*baiwei == i)
        {
            printf("%d ",i);
        }
        i++;
        //有条件的跳转
        if(i < 1000)
        {
            goto loop;
        }
        

        2.c

    goto如果乱用,会导致我们的代码很难得看明白
        不是说goto不好用,是使用goto的人乱用了
        因此尽量不要乱用goto --- 尽量不要goto穿插使用
            慎用goto
        if()
        {
            goto loop3;
        }

        if()
        {
            if()
            {
                goto loop2;
            }
            else
                goto loop1;
        }

    2 do while:属于循环了,循环就有循环体,循环体要搞清楚在哪里
        语法
        do->后面只认一条语句,如果你有多条语句要成为循环体,那么请打{}
        {
            循环体
        }while(任何合法的表达式都可以使用);
        
        执行规则,先执行do后面的语句,然后判断while后面的条件,如果为真则执行循环体
            为假则退出循环
        不管你的条件是什么,反正要先做一遍do
        编程的时候建立先打大括号

    eg:
        1 + .... + 100
            int i = 1;
            int sum = 0;
            do
            {
                sum += i;
                i++;
            }while(i < 101);
            printf("sum = %d\n",sum);
        见3.c
练习:
    1 100以内所以偶数的和

    2 有一个变量a,你不知道(或者懒得找)它的类型,现在我需要知道这个a里面
        有多少个功能被打开了(这个变量a里面有多少个1)
            //循环条件是将a所有的bit都过一遍
                0 ~ sizeof(a) * 8
                int sum = 0;//累加1的个数
                int n = 0;//循环a的bit
                //a随便定义
                int a;
                do
                {
                    if(//有条件对sum进行累加 我发现这个bit为1我才累加)
                    {
                        sum++;
                    }
                    //bit得往前面走   
                }while(循环所有的bit(0 ~ sizeof(a) * 8(这个数是不能到的)));

            见代码4.c
        
        


    3 while ---- 循环
        语法:
            while(合法的表达式)
            {
                循环体;//循环体是代码块,因此是可以定义变量的 
            }

        执行规则:
            先来看合法的表达式的值,如果为真则执行循环体,循环体执行了一遍
                再来判断表达式的值,为真则继续执行循环体,为假则退出循环
            
            while(1)
            {
                int a = 0;//每次执行的时候a都是重新定义的
                a++;
                //
            }//到这里执行一遍循环 a就释放了

    eg:
        1 + ... + 100;
            sum = 0
            i = 1
            while(i <= 100)
            {
                sum += i;
                i++;
            }

        有如下代码
            sum = 0
            i = 1
            while(i <= 100)
            {
                int sum1 = 0;
                sum1 += i;
                i++;
                if(i == 100)
                {
                    sum = sum1;
                }
            }
            //sum == 
                5.c

作业:
    1   上面的练习2(134行)后面多加一句,请提高效率 ---- 这个作为作业,不限定用哪一个循环

   

#include <stdio.h>
int main()
{
 /*
	int a = 2;
	int sum = -1;
 loop:
 	sum += a;
 	a +=2;
	if(a <= 100)
	{
		goto loop;	
	}
	printf("%d\n",sum);
*/
 /*
	int a = 2;
    int sum = 0;
    do
    {
        sum += a;
        a += 2;
    }
    while(a < 101);
    printf("sum = %d\n",sum);
*/
/*
    int sum = 0;
    int n = 0;
    int a ;
    scanf("%d",&a);
    do
    {
        if(a & n << 1)
        {
            sum++;
        }
        n++;
    }while(n < sizeof(a)*8);
    printf("sum = %d",sum);
*/
    int a,sum,two;
    scanf("%d",&a);
    
    for(two = sizeof(a)*8-1;two >= 0;two--)
    {
        if(a & 1<<two)
        printf("1");
        else
        {
            printf("0");
        }
        if(!(two%8))
        {
            printf(" ");
        }
    }

2   求两个正整数(从键盘输入),求这两个数的最大公约数和最小公倍数
            公约数:
                a % c == 0 && b % c == 0
                    我们就说c是a b的公约数
            最小公倍数 = a * b / 最大公约数

#include<stdio.h>
int main()
{
	int a;
	int b;
	int c = 0;
	printf("输入两个数字\n");
	scanf("%d%d",&a,&b);
	c = a < b ? a : b;
	printf("%d与%d的最大公约数为\n",a,b);
	while(a % c || b % c)
	{
			c--;
	}
	printf("%d\n",c);
	
	
	printf("他们俩的最小公倍数为%d\n",a*b/c);
		
	
	
	
}

辗转 相除

#include<stdio.h>
int main()
{
	int a;
	int b;
	int c;
	int d;
	int e;
	printf("输入两个数字\n");
	scanf("%d%d",&a,&b);
	printf("%d与%d的最大公约数为\n",a,b);
	c = a;
	d = b;
	while(d)
	{
		e = c % d;
		c = d ;
		d = e;
	} 
	printf("%d\n",c);
	printf("他们俩的最小公倍数为\n%d\n",a*b/c);
	
	
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值