我正在为网站做一个编码挑战,前提是:
在这个挑战中,写一个程序,它接受三个参数,一个起始温度(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;
}
答案 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
的大小比其他解决方案大。您的消息更详细,更易读,因此您可以大小点击。这更有效吗?也许如果尺寸很重要,但我个人认为可读性更重要,除非我们谈论嵌入式解决方案。
* - 你需要更多的运行和更灵敏的计时机制,但这只是一个简单的例子