-1

私はウェブサイトのコーディングチャレンジをしていました。前提は次のとおりです。

このチャレンジでは、開始温度(摂氏)、終了温度(摂氏)、およびステップサイズの3つの引数をとるプログラムを作成します。ステップサイズのステップで、開始温度から終了温度までの表を印刷します。ステップサイズが完全に一致しない場合は、実際に最終終了温度を印刷する必要はありません。入力検証を実行する必要があります。下限(コードで定数として指定する必要があります)未満または上限(コードでも指定する必要があります)より高い開始温度を受け入れないでください。温度差よりも大きいステップサイズを許可しないでください。(この演習は、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

うーん、これはより効率的です...その主張をする前に、いくつかのメトリックが必要です、ここで何について話しているのですか?実行時間?バイナリサイズ?簡単な例…両方のソリューションをコンパイルし、「time」コマンドとワーストケース(ステップ1で0-50000)を使用して実行し、使用している時間のタイプを確認できます。


「彼らの」ソリューションサイズ:

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このスケールでは(そしてシステムで他のことが起こっている場合)完全に正確ではないため、何度も実行する必要があります。4回の実行の平均:

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

ですから、彼らはあなたよりも実際には「効率的」ではありません。

ここで「効率」を高めるためにできることはいくつかありますが、ソリューションは非常に似ており、コードは非常に簡単であるため(シングルステップトラバーサル)、それがそれほど重要かどうかはわかりません。

.text「効率的な」コードサイズに関しては、サイズが他のソリューションよりも大きいことに気付くでしょう。メッセージはより冗長で読みやすいので、サイズに打撃を与えます。それはより効率的ですか?サイズが重要な場合もありますが、個人的には、組み込みソリューションについて話していない限り、読みやすさがより重要だと思います。

*-より多くの実行とより敏感なタイミングメカニズムが必要ですが、これは簡単な例です

于 2013-02-04T18:06:22.210 に答える