#37_0 循环嵌套2

项目1 位乘大于位和

输出1至100之间每位数的乘积大于每位数的和的数

代码一:
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.0
*问题描述:输出1至100之间每位数的乘积大于每位数的和的数
*/
#include <stdio.h>
int main()
{
    int a,b,m,i=0;
    m=1;
    while (m<100)
    {
        if (m>=10)
        {
            a=m/10;
            b=m%10;
            if (a*b>a+b)
            {
                printf("%d\t",m);
                i++;
                if (i%5==0)
                    printf("\n");
            }
            m++;
        }
        else
            m++;
    }
    return 0;
}

代码二(参考了http://blog.youkuaiyun.com/sxhelijian/article/details/45113615

/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.1
*问题描述:输出1至100之间每位数的乘积大于每位数的和的数
*/
#include <stdio.h>
int main()
{
    int i,j,k,s,count=0;
    i=1;
    while (i<100)
    {
        k=1;
        s=0;
        j=i;
        while (j>0)
        {
          k*=j%10;  //求各位数乘积
          s+=j%10;  //求各位数之和
          j/=10;
        }
        if (k>s)
        {
            printf("%d\t",i);
            count++;
            if (count%5==0)
                printf("\n");
        }
        i++;
    }
    return 0;
}
运行结果

这里写图片描述

小结

代码二比代码一灵活,代码二适用范围广,为多位数的各位数求和与求乘积提供了新思路,代码一具有专用性(改动范围则程序修改量大)

项目2 乘法口诀表

编程序,输出一个乘法口诀表,形如
这里写图片描述

代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月22日
*版 本 号:v1.0
*问题描述:输出一个乘法口诀表
*/
#include <stdio.h>
int main()
{
    int i,j;
    printf("九九乘法表:\n");
    for (i=1;i<=9;i++)
    {
        for (j=1;j<=i;j++)
        {
            printf("%d×%d=%d  ",i,j,i*j);
            if (i==j)
                printf("\n");
        }
    }
    return 0;
}
运行结果

这里写图片描述

小结

优化:内循环中的if语句可移动到循环外,大大降低运算量(内循环不再每次都判断了)。

项目3 单位转换对照表

编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺),以方便工厂里工人师傅使用。输出形式如下图所示,罗列了从0英尺到99英尺对应的米数,即第i行第j列的值vij代表i*10+j英尺对应的米数。例如,通过下图所示,我们可以方便地查到17英尺相当于5.18米。只输出内容即可,不用考虑表格线。
这里写图片描述
提示:每输出10英尺的转换表后,另起一行输出。为使输出美观,可以在各项中间用’\t’分隔。

代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.0
*问题描述:编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺)
*/
#include <stdio.h>
int main()
{
    int i,j;
    float vij;
    printf("Inch2Meter\t");
    for (j=0;j<=9;j++)
        printf("%d\t",j);
    printf("\n");
    for (i=0;i<=9;i++)
    {
        printf("%d\t",i);
        for(j=0;j<=9;j++)
        {
            vij=(10*i+j)/3.28;
            printf("%.2f\t",vij);
        }
        printf("\n");
    }
    return 0;
}
运行结果

这里写图片描述

小结

关于printf应用参考printf 格式化输出符号详细说明
代码优化(对输出数据限位,右对齐,采用空格隔开数据,\t单行显示不了):

/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.1
*问题描述:编程序生成一张从英尺到米的转换表(1米大约等于3.28英尺)
*/
#include <stdio.h>
int main()
{
    int i,j;
    float vij;
    printf("Inch2Meter ");
    for (j=0;j<=9;j++)
        printf("%6d ",j);//%md;如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。
    printf("\n");
    for (i=0;i<=9;i++)
    {
        printf("%10d ",i);//Inch2Meter占了10位,i要与之右对齐
        //输出有效数字预留为5位,小数占2位,整数占3位
        for(j=0;j<=9;j++)
        {
            vij=(10*i+j)/3.28;
            printf("%6.2f ",vij);//%m.nf;输出共占m列,其中有n位小数,若数值宽度小于m左端补空格。
        }
        printf("\n");
    }
    return 0;
}

优化后输出:
这里写图片描述

项目4 大奖赛计分

(1)基本要求:在歌手大奖赛中,有10个评委为参赛的选手打分,分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数的平均值。请编写一个程序实现。
(2)上面的程序只能处理一位选手的成绩,现拓展为多人版。输出当前选手的最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入的不是N或n,可以为下一位选手计算成绩。

代码
/**
*Copyright @2018,优快云学院
*All rights reserved.
*文件名称:main.c
*作    者:袁生
*完成日期:2018年1月24日
*版 本 号:v1.0
*问题描述:(1)基本要求:在歌手大奖赛中,有10个评委为参赛的选手打分,
*分数为1~10分。选手最后得分为:去掉一个最高分和一个最低分后其余8个分数
*的平均值。请编写一个程序实现。
*(2)上面的程序只能处理一位选手的成绩,现拓展为多人版。输出当前选手的
*最后得分后,提示“按任意键计算下一位选手的成绩,退出请选择N:”如果输入
*的不是N或n,可以为下一位选手计算成绩。
*/
#include <stdio.h>
//#include <stdlib.h> //放sys("PAUSE")的头文件
int main()
{
    int i,j,n,jn;
    char option;
    float mark,min,max,sum,av;
    while (1)
    {
        printf("请输入歌手数n和裁判数jn:\n");
        scanf("%d%d",&n,&jn);
        if (n<1||jn<3)
            continue;
        break;
    }
    fflush(stdin);  //清缓存
    printf("\n");
    for (i=1;i<=n;i++)
    {
        printf("请输入第 %d 位歌手成绩:\n",i);
        min=10;
        max=1;
        sum=0;
        j=1;
        while (j<=jn)   //不用for循环,不然continue运行后j会加1再执行循环体
        {
            printf("第%d位裁判打分:",j);
            scanf("%f",&mark);
            if (mark<1||mark>10)
            {
                printf("请重新输入:\n");
                continue;
            }
            sum+=mark;
            max=(max<mark)?mark:max;
            min=(min>mark)?mark:min;
            j++;
        }
        printf("\n");
        printf("去掉一个最高分:%.2f 去掉一个最低分:%.2f\n",max,min);
        sum=sum-max-min;
        av=sum/(jn-2);
        printf("第 %d 位歌手最后得分:%.2f\n",i,av);
        printf("\n");

        if (i<n)
        {
            printf("按任意键计算下一位选手的成绩,退出请选择N:");
            //不管按什么键最后都要回车
            while ((option=getchar())!='\n');   //清缓存或者用fflush(stdin)
            if ((option=getchar())=='n'||option=='N')
                break;
            fflush(stdin);//再清一次
        }
    }
    return 0;
}
运行结果

这里写图片描述

小结
  1. 歌手数和裁判数输入判断容易忽略;
  2. 处理单个歌手成绩用for循环代替while循环,一旦分数输错会影响输出
  3. 在任意键继续那一部分,在输入字符前后都有清理程序,另外最后一位歌手计分完毕并不需要输出该提示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值