【问题标题】:Could not print the BMI table as per expectation无法按预期打印 BMI 表
【发布时间】:2015-11-14 06:47:36
【问题描述】:

我刚刚完成了一个计算体重指数表的程序。但是,我无法按预期打印表格。我试图更改 for 循环位置,但它给了我相同的结果。 如果你执行代码,你就会明白我的意思。

实际输出:



预期输出:




我的代码:

#include <stdio.h>

int main(void){
    float kg;
    float m;
    float col;
    float bmi;
    float cm;

    printf(" BMI");
    for(kg=50; kg <= 105 ;kg=kg+5) {
        printf("  %.0fkg",kg);
    }
    printf("\n");
    for(cm=140; cm <= 220 ;cm=cm+5) {
        printf("%.0fcm\n",cm);
    }
    for(col=1; col <= 12 ;col++) {
        for(m=1.4; m <= 2.2 ;m=m+0.05) {
            for(kg=50 ;kg <= 105 ;kg=kg+5) {
                bmi = kg/(m*m);
                printf(" %.1f",bmi);
            }
            printf("\n");
        }
        break;
    }
    return 0;
}

【问题讨论】:

  • 只是对未来编辑问题的说明,标题应该总结您的问题并包含最重要的问题。不要将标题放在第一句话的前半部分,然后继续问题中的句子。标题和问题主体在语法上应该是独立的。
  • 打印完第一列后,不能返回。因此,您必须在外循环中作为第一件事打印行标签(高度)。您可能还想查看printf 格式的宽度规范。
  • 并在此处发布输出和预期输出。
  • @MOehm 我试过了,但它给了我另一个随机表

标签: c for-loop printf


【解决方案1】:

您想像这样打印 BMI 表:

   BMI          50kg      55kg      60kg      65kg       ...

 140cm         25.51     28.06     30.61     33.16       ...
 145cm         23.78     26.16     28.54     30.92       ...
 150cm         22.22     24.44     26.67     28.89       ...
 155cm         20.81     22.89     24.97     27.06       ...
 160cm         19.53     21.48     23.44     25.39       ...
   ...           ...       ...       ...       ...

当您打印到终端时,您必须从上到下、从左到右打印。当某些东西被打印出来时,就没有办法回去了。所以你必须相应地构建你的循环:

  • 打印“BMI”
  • 打印所有批量标签
  • 打印所有数据行:

    • 打印批量标签
    • 打印所有体重和当前身高的 BMI

其他注意事项:

  • col 上的外部循环是无用的,因为您在第一次迭代后就中断了它。
  • 如果您希望表格在使用固定宽度字体打印时保持整洁,您应该为printf 格式指定字段宽度。例如%10g 将用空格填充数字,使其占据 10 个空格。 (如果数字太大,则会溢出字段宽度。)

将这一切付诸实践,我们得到:

#include <stdio.h>

int main(void)
{
    int m;                  // mass in kg
    int h;                  // height in cm

    printf("%10s    ", "BMI");
    for (m = 50; m <= 105; m = m + 5) {
        printf("%8dkg", m);
    }
    printf("\n\n");

    for (h = 140; h <= 220; h += 5) {
        printf("%8dcm    ", h);

        for (m = 50; m <= 105; m = m + 5) {
            double bmi = 10000.0 * m / (h * h);

            printf("%10.2f", bmi);
        }
        printf("\n");
    }

    return 0;
}

(我使用整数表示离散的质量和高度,因为它们更容易迭代。在计算 BMI 时,必须将它们转换为浮点数才能获得 BMI 的小数部分。表达式10000.0 * m 使分子成为浮点数并确保除数是浮点除数。但是,您必须将比例因子作为带小数点的浮点字面量给出。)

【讨论】:

  • 如果你执行你的代码也是一样的,这不是我想要的......我没有得到它
  • 这个例子并没有完全做你想要的。在您发布所需的输出之前,我已经编写了我的示例。不过,原则上,输出就是您想要的。我使用更宽的场宽,这使得线条在狭窄的显示器上环绕。您可以通过在 printf 格式中进行 minro 更改来轻松调整此解决方案。如果您连这些都懒得做,请查看 milevyo 的解决方案;它更接近你想要的。
【解决方案2】:

您必须逐行打印,而不是逐列打印。

打印顶部标题,然后打印每一行及其标题

the top header

[BMI][...][...]

然后行

[xx cm] [....] <--- line data
  ^_________________<line header

#include <stdio.h>

int main(void) {
    float kg;
    float m;
    float col;
    float bmi;
    float cm=140.0;

    printf("BMI    ");
    for(kg=50; kg<=105; kg=kg+5) {
        printf("%.0fkg  ",kg);
    }
    printf("\n");

    //for(col=1; col<=12; col++) {
    for(m=1.4; m<=2.2; m=m+0.05) {
        printf("%.0fcm  ",cm);
        for(kg=50; kg<=105; kg=kg+5) {
                bmi=kg/(m*m);
                printf("%.1f  ",bmi);
            }
            cm+=5;
            printf("\n");
        }
   //     break;
   //}
    return 0;
}

输出:

【讨论】:

  • 你是最棒的人
  • @MahmoudAbosaleh:既然你已经得到了你想要的解决方案,为什么不承认 milevyo 的工作并接受甚至赞成答案呢?
  • @MOehm 实际上我是这个网站的新手,所以当我投票给某个人时,一般人不会觉得......如果有任何办法,请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多