0

私は私のプログラムを持っています:

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

int main (int argc, char *argv[])
{
    int r, line = 0, found = 0;
    float temp, t_tot = 0;
    char loc[32];


    FILE *fp;

    fp = fopen(argv[1], "r");

    if (fp == NULL)
    {
        printf ("Error opening the file\n\n'");
        exit(EXIT_FAILURE);
    }

    if (argc == 3)
    {
        while ((r = fscanf(fp, "%f %s\n", &temp, loc)) != EOF)
        {
            line++;

            if (r == 2)
            {
                if(strcmp(argv[2], loc) == 0)
                {
                    t_tot += temp;
                    found++;
                }
            }
            else
                printf ("Error, line %d in wrong format!\n\n", line);
        }

        printf ("The average temperature in %s is: %.1f\n\n", argv[2], (t_tot/found));
    }

    fclose(fp)

    return 0;

}

プログラムはすべての行を読み取り、argv[2] に書いた都市を見つける必要があります。ファイル内の行の形式が間違っている場合は、その都市の平均気温を教えてくれます。

このコードをより効率的に「最適化」し、同じことをより「コンパクト」な方法で書くにはどうすればよいのでしょうか。私は学生なので、すべての提案が受け入れられます。

4

3 に答える 3

3

GNUGProfやおそらくAMDCodeAnalystのようなプロファイラーを入手してください。

「 Windows用の最高の無料C++プロファイラーは何ですか?」も参照してください。

次に、最高の最適化でプログラムをコンパイルし、どの部分に時間がかかる傾向があるかを調べてみてください。

プロファイラーなしでの最適化は、通常は避けてください。


私たちがそれに取り組んでいる間、あなたのプログラムは実際には多くの時間を要する計算を行わず、そのパフォーマンスはI / Oによって制限される可能性があります(私の推測)。

最適化する代わりにできるもう1つの方法は、安全で正しいものにすることです。たとえば、入力ファイルの文字列が32文字より長い場合にクラッシュしないようにします。

于 2012-06-23T11:01:14.053 に答える
1

コンパイラ最適化オプションを使用してオブジェクト コードを最適化することもできます。gccの場合は、(最適化のレベルに応じて、-O3または-O1または) パラメータを追加するだけです。-O2

于 2012-06-23T13:31:03.243 に答える
0

変更はどうですか

if (r == 2)
{
    if(strcmp(argv[2], loc) == 0)
    {
        t_tot += temp;
        found++;
    }
} else {
    printf ("Error, line %d in wrong format!\n\n", line);
}

これに、ネストされたifブロックを回避するには:

if (r == 2 && strcmp(argv[2], loc) == 0) {
    t_tot += temp;
    found++;
} else if (r != 2) {
    printf ("Error, line %d in wrong format!\n\n", line);
}

私にはとてもきれいに見えます!

于 2012-06-23T10:24:44.587 に答える