分支和循环结构的继续熟练

三个数 从大到小输出

#include <stdio.h>
int main()
{
    int a, b, c;
    printf("请输入三个数:\n");
    scanf("%d%d%d", &a, &b, &c);
    if (a < b)
    {
        a = a ^ b;
        b = b ^ a;
        a = a ^ b;
    }
    if (a < c)
    {
        a = a ^ c;
        c = a ^ c;
        a = a ^ c;
    }
    if (b < c)
    {
        b = b ^ c;
        c = c ^ b;
        b = b ^ c;
    }

    printf("%d %d %d", a, b, c);
    return 0;
}

分支用到了if条件句,我用了异或的方法进行两个数的值得互换,‘^’异或,将两个数按二进制位异或,同为0,异为1。进阶的利用循环结构的一组数据的大小排列如下:

#include <stdio.h>
int main()
{
    int a[10] = {0};
    int i = 0;
    int c = 0;
    int j = 0;
    printf("请输入10个数:\n");
    for (i = 0; i < 10; i++)
    {
        scanf("%d", &a[i]);
    }

    for (i = 0; i < 10; i++)
    {
        for (j = i+1; j < 10; j++)
        {
            if (a[i] < a[j])
            {
                c = a[i];
                a[i] = a[j];
                a[j] = c;
            }

        }

    }
    for (i = 0; i < 10; i++)
    {
        printf("%d  ", a[i]);
    }

    return 0;
}

利用循环语句进行填充数组,循环语句进行大小的排列,也称为冒泡法,用第三个值进行两个数字的值的交换,用循环语句进行顺序打印

打印1~100以内3的倍数

#include <stdio.h>
int main()
{
    int i = 0;
    for (i = 0; i < 100; i++)
    {
        if (i % 3 == 0)
        {
            printf("%d ", i);
        }
    }
    return 0;
}

继续使用循环语句打印多个数字,a%b表示a除以b之后取余数,余数为0即为3的倍数

求两个数的最大公约数 辗转相除法

#include <stdio.h>
int main()
{
    int n = 18;
    int m = 24;
    int r = 0;
    scanf("%d%d", &m, &n);
    while (r = m % n)
    {
        //r = m % n;
        m = n;
        n = r;
    }
    printf("%d\n", n);
    return 0;
}

辗转相除:为了得到两个数的最大公约数,以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数。代码中“//r = m % n”这个部分是可以优化放在循环条件的地方,就能提高执行效率,当余数为零时,while(0)下面的循环不再执行,逻辑成立。

打印1000~2000的闰年

#include <stdio.h>
int main()
{
    int year = 0;
    int count = 0;
    printf("1000到2000年间的闰年为:\n");
    for (year = 1000; year <= 2000; year++)
    {
        //if (year % 4 == 0 && year % 100 != 0)
        //{
        //  printf("%d ", year);
        //  count++;
        //}
        //else if (year % 400 == 0)
        //{
        //  printf("%d ", year);
        //  count++;
        //}
        if((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
        {
            printf("%d ", year);
            count++;
        }
    }
    printf("\n%d\n", count);
    return 0;
}

闰年的判断方法为,一个年份能被四整除且不能被100整除,或者能被四百整除,注释起来的地方为将两个判断句分开,将带这个判断条件整合成一个条件,放在if语句中,更优。

100到200之间的素数

#include <stdio.h>  //1.试除法
#include <math.h>   //2.将试除的上限值改为sqrt(i)
int main()                 //3.将偶数去掉,再次减少计算量
{
    int i = 0;
    int j = 0;
    int k = 0;
    for (i = 101; i <= 200; i+=2)
    {
        for (j = 2; j <sqrt(i); j++)
        {
            if (i % j == 0)
            {
                break;
            }
        }
        if (j > sqrt(i))
        {
            k++;
            printf("%d ", i);
        }
    }
    printf("\n素数有%d个\n", k);
    return 0;
}

都是用到了试除法,第一次是将内部循环中的限制条件改为sqrt(),求算术平方根,减少计算量,第二次优化是将外循环中的偶数跳过,再次减少了计算量。

求1/1-1/2+1/3-1/4...+1/99-1/100

#include <stdio.h>
int main()
{
    double n = 0, i = 0;
    double s1 = 0, s2 = 0;
    double s = 0;
    for (n = 1; n < 100; n += 2)
    {
        s1 = 1 / n + s1;
    }
    for (i = 2; i <= 100; i += 2)
    {
        s2 = s2 - 1 / i;
    }
    printf("%lf\n", s = s1 + s2);
    return 0;
}

第一次想到的方法是把正的负的分开来算,需要定义的变量较多。

#include <stdio.h>
int main()
{
    double n = 0;
    double s = 0;
    int flag = 1;
    for (n = 1; n <= 100; n++)
    {
        s =flag* 1 / n + s;
        flag = -flag;
    }

    printf("%lf\n", s );
    return 0;
}

利用一个flag变量,每次循环乘以-1,实现正负相加的循环,最终求得答案。

在屏幕上打印一个乘法口诀表

#include <stdio.h>
int main()
{
    int i = 1, j = 1;
    int x = 0;
    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= 9; j++)
        {
            x = i * j;
            printf("%d * %d = %d ", j, i, x);
            if (i <= j)
            {
                printf("\n");
                break;  //一开始使用的continue 导致无法正确跳出循环而只是跳过该次循环 
            }   
        }
    }
    return 0;
}

第一次想了比较久,也想到了需要两层循环,也想到了内层循环需要限制,可是前面就是没有想到需要使用的是break跳出循环,而不是continue跳过该次循环,到后来看完答案,上厕所的时候才突然想到,应该用break,就不会继续打印出一列乘法求和了,有兴趣的可以看看把break换成continue是什么样子。以下是老师给出的代码:

#include <stdio.h>
int main()
{
    int i = 1, j = 1;
    int x = 0;
    for (i = 1; i <= 9; i++)
    {
        for (j = 1; j <= i; j++)    //i代表行数,而每行的打印个数等于改行行数,所以内循环的上限为i
        {
            x = i * j;
            printf("%d*%d =%-2d ", j, i, x); //一点细节为 %数字d 数字表示左缩进(-)或者右缩进(+)位数由数字决定
        }
        printf("\n");
    }
    return 0;
}

猜数字游戏 ! !

这个是我今天花了最长时间的一个代码了,一部分原因是对于函数使用的不熟练,一部分原因是因为接纳这种代码的逻辑关系确实需要一点时间,源代码如下,有兴趣的话可以玩着试试,

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu()
{
    printf("##############################################\n");
    printf("********* 1.play  *        *  0.exit *********\n");
    printf("##############################################\n");
}
void game()
{
    int g = 0;
    int ret = 0;
    ret = rand() % 100 + 1;
    while (1)
    {
        scanf("%d", &g);
        if (g > ret)
        {
            printf("大了\n");
        }
        else if (g < ret)
        {
            printf("小了\n");
        }
        else
        {
            printf("恭喜你 猜对了 \a \n");
            break;
        }

    }
}
int main()
{
    int input = 0;
    menu();
    srand((unsigned int)time(NULL));
    do
    {
        printf("请选择是否要开始游戏:1/0\n");
        scanf("%d", &input);
        switch (input)
        {
        case 1:
        {
            printf("请猜数字:\n");
            game();
            break;
        }
        case 0:
        {
            printf("退出游戏\n\a");
            break;
        }
        default:
        {
            printf("请输入0/1\n");
            break;
        }
        }
    } while (input);

    return 0;
}

核心为:
1.电脑会生成一个随机数
2.猜数字
3.可以连续玩
其中的细节包括:
1.利用do while在主函数内做一个至少会循环一次的循环语句,在里面进行是否进入游戏的判断。
2.利用函数创建一个简单的菜单栏,无返回值函数viod。
3.在主函数循环之外写一个生成随机数的函数rand(),再循环内,则每次猜就会生成一个新的数字。 所需头文件为 <stdlib.h>。
4.随机数生成需要srand函数重新定义,否则每一次都会生成一组相同的随机数。
5.srand函数也需要随机数,才能让rand每一次在不同的起点生成随机数。
6.所以用时间戳作为srand函数的参数,变量类型强制转换为(unsigned int)time。所需头文件为<time.h>。
7.时间戳生成函数的参数的类型为指针,NULL为空指针,我们无需一个具体的指针,所以用空指针生成时间戳供srand使用就够了。
8.并且游戏函数内部能进行对于数字的判断,进行相应的提示,大了或者小了。
9.首先是要理解架构,搭建框架,再填充其中细节,虽然我也是个程序小白,但是我觉得这么理解是没有错的。

扫描二维码关注公众号,回复: 12151850 查看本文章

goto 语句

#include <stdio.h>
#include <stdlib.h> //system 的头文件 
#include <string.h> //strcmp 的头文件
int main()
{
    char input[20] = { 0 };
    //system() 用来执行系统命令的
    system("shutdown -s -t 60");
again:
    printf(" 电脑要关机了 请输入:我最帅 \n");
    scanf("%s", input);
    if (strcmp(input, "我最帅") == 0)
    {
        system("shutdown -a");
    }
    else
    {
        printf("\a");
        goto again;
    }

    return 0;
}

goto语句的使用一直有所争议,其实程序之中没有goto语句也不会有什么影响,而且goto语句的频繁使用会使得逻辑混乱,可能会导致程序员本人也读不懂。
以上的关机程序就能体现goto最有用的地方,跳出多层循环,当一个代码之中有多层循环嵌套,需要直接从最里层跳出,goto语句的方便之处方能体现,again就是一个标点,goto again,就是直接跳到again的地方继续执行语句,而break只能跳出一层。
system("shutdown -s -t 60")为系统函数,需要<stdlib.h>的头文件,shutdown -s 为执行关机,后面的 -t60 为六十秒后执行,shutdown -a为取消关机,字符'\a'为提示音。(当然本人夹带私货,自恋了一波【doge】)
明天开始函数

猜你喜欢

转载自blog.51cto.com/15078858/2591240