-1

我正在为一个网站做一个编码挑战,前提是:

在这个挑战中,编写一个接受三个参数的程序,一个起始温度(摄氏度)、一个结束温度(摄氏度)和一个步长。以步长为单位打印从 > 开始温度到结束温度的表格;如果步长不完全匹配,您实际上不需要打印最终结束温度。您应该执行输入验证:不接受低于下限(您的代码应指定为常数)或高于上限(您的代码也应指定)的起始温度。您不应允许步长大于温差。(本练习基于 C 编程语言中的一个问题)。

我得到了与解决方案相同的结果,但我很好奇为什么他们的解决方案更有效(我想是这样)。有谁能给我解释一下吗?他们的解决方案首先是我的。

#include <stdio.h>

#define LOWER_LIMIT 0
#define HIGHER_LIMIT 50000

int main(void) {
    double fahr, cel;
    int limit_low = -1;
    int limit_high = -1;
    int step = -1;
    int max_step_size = 0;

    /* Read in lower, higher limit and step */
    while(limit_low < (int) LOWER_LIMIT) {
       printf("Please give in a lower limit, limit >= %d: ", (int) LOWER_LIMIT);
       scanf("%d", &limit_low);
    }
while((limit_high <= limit_low) || (limit_high > (int) HIGHER_LIMIT)) {
    printf("Please give in a higher limit, %d < limit <= %d: ", limit_low, (int) HIGHER_LIMIT);
    scanf("%d", &limit_high);
}
max_step_size = limit_high - limit_low;
while((step <= 0) || (step > max_step_size)) {
    printf("Please give in a step, 0 < step >= %d: ", max_step_size);
    scanf("%d", &step);
}

/* Initialise Celsius-Variable */
cel = limit_low;

/* Print the Table */
printf("\nCelsius\t\tFahrenheit");
printf("\n-------\t\t----------\n");
while(cel <= limit_high) {
    fahr = (9.0 * cel) / 5.0 + 32.0;
    printf("%f\t%f\n", cel, fahr);
        cel += step;
    }
    printf("\n");

    return 0;
}

我的解决方案:

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

#define LOW 0
#define HIGH 50000


int main(void)
{
int lower, higher, step, max_step;
float cel, fahren;

printf("\nPlease enter a lower limit, limit >= 0: ");
scanf("%d", &lower);

if (lower < LOW)
{
    printf("\nERROR: Lower limit must be >= 0.");
    exit(1);
}


printf("\nPlease enter a upper limit, limit <= 50000: ");
scanf("%d", &higher);

if (higher > HIGH)
{
    printf("\nERROR: Upper limit must be <= 50,000.");
    exit(1);
}

printf("\nPlease enter an increment amount, 0 < step <= 10: ");
scanf("%d", &step);

max_step = higher - lower;

if (step > max_step)
{
    printf("\nERROR: Step size cannot exceed difference between higher and lower limit.");
    exit(1);
}

printf("Celsuis \tFahrenheit\n");
printf("------- \t-----------\n\n");

cel = (float)lower;

while (cel < higher)
{
    fahren = cel * 9/5 + 32;
    printf("%f \t%f\n", cel, fahren);
    cel = cel + step;
}

return 0;

}

4

1 回答 1

0

嗯,哪个更有效......在做出这个声明之前,我们需要一些指标,我们在这里谈论什么?运行?二进制大小?只是一个简单的例子......我们可以编译这两个解决方案并使用“时间”命令和最坏的情况(0-50000,步长为 1)运行它们,以查看我们使用的时间类型:


“他们的”解决方案大小:

text       data     bss     dec     hex filename
1937        276       8    2221     8ad a.out

“他们的”解决方案运行时间:

user  0m 0.024s
sys   0m 0.601s

您的解决方案尺寸:

text       data     bss     dec     hex filename
2054        276       8    2338     922 a.out

您的解决方案运行时间:

user   0m 0.025s
sys    0m 1.047s

因此,您的解决方案需要更长的时间并且图像尺寸更大。我们现在可以说“他们”有一个更有效的程序吗?不是真的,time在这个规模上并不完全准确(以及系统中发生的其他事情),所以我们需要多次运行。平均四次*运行:

// you
user    0.0178
system  0.9015
// "them"
user    0.016
system  0.914

所以不,它们并没有真正比你更“高效”。

我们可以做一些琐碎的事情来提高这里的“效率”,但是因为解决方案非常相似,而且代码非常简单(单步遍历),我不确定它是否有那么重要。

就“有效”代码大小而言,您会注意到您的.text大小大于其他解决方案。您的消息更加冗长和可读,因此您会受到影响。这样更有效率吗?也许如果大小很重要,但我个人认为可读性更重要,除非我们谈论的是嵌入式解决方案。

* - 你需要更多的运行和更敏感的计时机制,但这只是一个简单的例子

于 2013-02-04T18:06:22.210 回答