温度转换器挑战

时间:2013-02-04 17:15:22

标签: c

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

  

在这个挑战中,写一个程序,它接受三个参数,一个起始温度(in   摄氏度),最终温度(摄氏度)和步长。打印出来自>的表格。开始温度到最终温度,步长为步长;你不   实际上,如果步长不完全匹配,则需要打印最终结束温度。   您应该执行输入验证:不要接受低于较低的起始温度   限制(您的代码应指定为常量)或高于上限(其中   你的代码也应该指定)。您不应允许步长大于   温差。 (此练习基于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;

}

1 个答案:

答案 0 :(得分:0)

嗯,哪个更有效...在提出这个说法之前我们需要一些指标,我们在这里谈论什么?运行?二进制大小? 只是一个简单的例子......我们可以编译两个解决方案并使用“time”命令和最坏情况(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的大小比其他解决方案大。您的消息更详细,更易读,因此您可以大小点击。这更有效吗?也许如果尺寸很重要,但我个人认为可读性更重要,除非我们谈论嵌入式解决方案。

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