2016-10-02 16 views
1

私は3つの数字を加えてその合計を印刷するコードを書いています。初期化や各変数の導入など、このコードをより効率的に書く方法がありますか?次のようにあなたのプログラムをより効率的に書く方法

コードが行く:

#include <stdio.h> 

int main() 
{ 
    int firstNumber; 
    firstNumber = 0; 
    printf("Enter firstNumber"); 
    scanf("%d", &firstNumber); 

    int secondNumber; 
    secondNumber = 0; 
    printf("Enter secondNumber"); 
    scanf("%d", &secondNumber); 

    int thirdNumber; 
    thirdNumber = 0; 
    printf("Enter thirdNumber"); 
    scanf("%d", &thirdNumber); 

    int sum; 
    sum = firstNumber + secondNumber + thirdNumber; 
    printf("%d", sum); 
} 
+2

'int firstnumber = 0;' ...等 –

+2

定義時に変数を初期化して3行を保存することができます。また、 'sum'変数を全く持たないことで別の2行を保存し、' printf'呼び出しで追加することもできます。しかし、それは生成されたコードをより効率的にするでしょうか?いいえ、それは叶わない。 –

+0

int firstNumberとfirstNumber = 0を1行に書く方法 –

答えて

5

は一緒に各変数を初期化し、導入のような、より効率的にこのコードを書くことができます。

がアレイを使用:

int numbers[3] = {0}; 

を上記線は、三のint Sを定義し、0にそれらのすべてを初期化します。あなたのコードは、「最初」を参照してくださいする必要があるすべての理由で

numbers[0] 

場合は、「」と「第三」列挙を作成する:第1回の使用にアクセスするには

配列の要素に次のようにアクセスします。

enum Numbers 
{ 
    FirstNumber, 
    SecondNumber, 
    ThirdNumber 
} 

次にth第二番号にアクセスするための電子のソースコードは次のようになります。

numbers[SecondNumber] 

あなたはNumbersenum Numbersのエントリ数をたどるの大きさを持っている上記の例を修正好きにしたい場合は、次のとおりです。

enum Numbers 
{ 
    FirstNumber, 
    SecondNumber, 
    ThirdNumber, 
    MaxNumbers 
} 

、その後

int Numbers[MaxNumbers] = {0}; 
のような数字を定義あなたは今、ユーザーが定義した番号の入力を促し定義することができ、同じ概念に続き3210

const char * prompts[MaxNumbers] = { 
    "firstNumber", 
    "secondNumer", 
    "thirdNumber" 
}; 

今、すべてはまた、大幅に入力関数の周りにループ(の代わりに符号化することにより、ソースコードの行を減らすために整備されています各番号について多かれ少なかれ同じもの):

for (enum Numbers n = 0; n < MaxNumbers; ++n) 
{ 
    printf("Please enter %s:\n", prompts[n]); 
    scanf("%d", &Numbers[n]); 
} 

足す::

読みます最後の注意と同様に

for (enum Numbers n = 0; n < MaxNumbers; ++n) 
{ 
    printf("Please enter %s:\n", prompts[n]); 
    scanf("%d", &Numbers[n]); 
    sum += Numbers[n]; 
} 

、およびscanf()は非常によく失敗するかもしれないことに注意して、自分の研究のために左:

int sum = 0; 

for (enum Numbers n = 0; n < MaxNumbers; ++n) 
{ 
    sum += Numbers[n]; 
} 

printf("The sum is: %d\n", sum); 

二つのループは、しかし、一つにマージすることができます。これは戻り値でこれを示します。このコードは、読み込み可能な障害を検出し、それに応じて動作します。

+0

うわー、それはあまりにも少しですか? – neoaggelos

+1

@neoaggelos:あまりにも多くのものはどうですか? – alk

+0

無礼に見えることを意味しなかった、友人の鉱山。私はちょうど列挙子とヘルパー配列を使用して3つの数値を読むことは時間の価値がないと思った。 – neoaggelos

0
#include <stdio.h> 

int main() 

{ 
    int i;  
    int Numbers[3]= {0}; 
    int sum; 
    /*int numberCount; if the count should be dynamic*/ 
    /*printf("Enter the count of numbers: ");*/ 
    /*scanf("%d",&numberCount);*/ 

    for(i=0; i<3;i++) /*use numberCount instead of 3*/ 
    { 
     printf("Enter Number %d",i); 
     scanf("%d", &Number[i]); 
     sum += Number[0]; 
    } 
    printf("%d", sum); 

} 
+0

適切な字下げがいいでしょう。 – alk

+1

"*' ... + = Number [0]; '*":本当ですか? ;-) – alk

+0

@alkあなたは問題を釘付けにした..... ..... 私はもう一度コードをチェックした... それらの多くがあるかどうか私に教えてください... –

0

私は、生成されたコードをhttps://gcc.godbolt.orgにチェックすることは、オールウェイ-O3または-Ofastを使用すると非常に便利です。

要件を変更することなく(一度に1つの数値を正確に同じテキストで尋ねる)。それは実際には非常に小さくなり、インテルのGCC 6.2の唯一の2つの命令を有するとARMのgcc 4.82を使用して終わる:

// Type your code here, or load an example. 
#include <stdio.h> 

static inline int readNum(const char * const msg) 
{ 
    int num; 
    (void)printf(msg); 
    (void)scanf("%d", &num); 
    return num; 
} 

int main() 

{ 
    (void)printf("%d", readNum("Enter firstNumber") + readNum("Enter secondNumber") + 
       readNum("Enter tirdNumber")); 

} 

仕様を少し変更することにより、我々はもっと(この場合はIntelと腕の両方に利益をもたらすことができますよりコンパクトなコードを生成する)。

// Type your code here, or load an example. 
#include <stdio.h> 

static inline int readNum(void) 
{ 
    int num; 
    (void)printf("Enter a number"); 
    (void)scanf("%d", &num); 
    return num; 
} 

int main() 

{ 
    (void)printf("%d", readNum() + readNum() + 
       readNum()); 

} 

最後にすべての番号を一度に聞くことができます。これにより、元のコードで43行に対してx86-64 gcc 6.2でのみ26行出力が生成されます。

#include <stdio.h> 

int main() 

{ 
    int num1; 
    int num2; 
    int num3; 
    (void)printf("Enter 3 numbers:"); 
    (void)scanf("%d %d %d", &num1, &num2, &num3); 
    (void)printf("%d", num1 + num2 + num3); 

} 
+0

これらの ' ) 's、please? – alk

+0

潜在的UB - **常に** scanfによって返された値をチェック! – 4386427

+0

は、リターンが無視されていることを指摘しています(元のコードのように)。私は最後のコードでそれらを追加することを忘れてしまった。 –

3

すべてのコードの大部分で、結果のプログラムの効率は、可読性、保守性、最も重要な正しさなどの要素ほど重要ではありません。

まず、そのようなことに集中する必要があります。結果のプログラムにパフォーマンスの問題がある場合にのみ、ソースコードを再検討する必要があります。現代のコンパイラは最適化を非常にうまく行っているので、ソースコードがどのように見えるか効率性があまり重要ではありません。

あなたの場合、つまり標準入力から読み込んだプログラムでは、より効率的なプログラムを得るためにコードを変更する必要はありません。

ただし、メンテナンス性を向上させるために変更を検討することもできます。たとえば、3つではなく5つの値を追加するようにプログラムを変更する必要がある場合、それはどれくらい簡単ですか?現在のコードでは容易ではありません。和の-Nに和の-3から変更することは簡単です、このコードで

#include <stdio.h> 

#define NUMBER_OF_VARS_TO_ADD 3 // Here you decide how many numbers to add 

int main() 
{ 
    int j; 
    int d = 0; 
    int sum = 0; 

    for (j=0; j<NUMBER_OF_VARS_TO_ADD; ++j) 
    { 
     printf("Enter Number: "); 
     scanf("%d", &d);  // This is not good - se later 
     sum += d; 
    } 
    printf("Sum: %d", sum); 
} 

:のようなループを使用して

は、それははるかに容易になるだろう。それは効率性を考えるよりもはるかに重要です。このコードはstdinから読み込まれた各値を格納しないことに注意してください。値を読み取っている間に合計を計算するだけです。

正しいことが重要です。値を読み取る方法は良くありません。まず、scanfによって返された値をチェックしません。あなたはいつもそうするべきです!

あなたはscanfによって返された値のチェックを追加し5 d 3のようなユーザタイプの何かが、あなたはすぐにあなたが1を返さなかった場合scanfscanf後に標準入力をフラッシュする必要があることがわかります場合は、あなたの現在のプログラムは、予期しない結果が得られますそのようなコードを追加する必要があります。もう一度効率を考えるよりも重要です。

scanfの代わりに、より良い/より簡単な方法は、fgetssscanfです。

関連する問題