2016-12-12 13 views
0

この例C帳をプログラムする方法から調査を要約する配列を使用すると、

四十学生は(1がひどい意味1〜10のスケールの 学生食堂で食品の品質を評価してもらった結果10は平均で を意味します)。 40個の応答を整数配列に置き、 を投票結果に要約します。


私はあなたが事前に

// Analyzing a student poll. 
#include <stdio.h> 
#define RESPONSES_SIZE 40 // define array sizes 
#define FREQUENCY_SIZE 11 
int main(void) { 
size_t answer; // counter to loop through 40 responses 
size_t rating; // counter to loop through frequencies 1-10 
// initialize frequency counters to 0 
int frequency[ FREQUENCY_SIZE ] = { 0 }; 
// place the survey responses in the responses array 
int responses[ RESPONSES_SIZE ] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 
1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 
5, 6, 7, 5, 6, 4, 8, 6, 8, 10 }; 
// for each answer, select value of an element of array responses 
// and use that value as subscript in array frequency to 
// determine element to increment 
for (answer = 0; answer < RESPONSES_SIZE; ++answer) 
{ 
    frequency[ responses [ answer ] ]=frequency[ responses [ answer ] ]+1; 
} // end for 
// display results 
printf("%s%17s\n", "Rating", "Frequency"); 
// output the frequencies in a tabular format 
for (rating = 1; rating < FREQUENCY_SIZE; ++rating) 
{ 
    printf("%6d%17d\n", rating, frequency[ rating ]); 
} // end for 
// end main 
return 0; 
} 
+0

これはかなり自明です。コードは役に立つコメントで埋められています。私はあなたがもっと良い説明を得ることはできないと思います。誰でも試してみると、最高でコメントに書かれていることを繰り返すだろう。 –

+0

あなたが理解していないのは正確には何ですか?この部分 "頻度[応答[回答]] =頻度[応答[回答]] +1; ? – dreamcrash

+0

ちょうどこれは、@ dreamcrashを理解するために必要な説明です。 – Elhaw

答えて

2

をit.thanksを簡素化することができます親切場合、これはそれを取得と同じくらい簡単です、この例で使用されるアルゴリズムを理解する上で立ち往生していますし、それを理解できませんでした。

for (answer = 0; answer < RESPONSES_SIZE; ++answer) 
{ 
    frequency[ responses [ answer ] ]=frequency[ responses [ answer ] ]+1; 
} 

は... answer配列をループし、そこに各値について、その値のfrequency要素を更新します。

for (answer = 0; answer < RESPONSES_SIZE; ++answer) 
{ 
    int response = responses[answer]; 
    frequency[response]=frequency[response]+1; 
} 

(これは「ローカル変数を抽出する」リファクタリングと呼ばれます)で少し鮮明にすることができます。

responsesの最初の値が5の場合、最初に行うことはfrequency[5]の0を0 + 1 == 1に置き換えます。そして

は事実でfrequencyを充填した:

for (rating = 1; rating < FREQUENCY_SIZE; ++rating) 
{ 
    printf("%6d%17d\n", rating, frequency[ rating ]); 
} 

は...インデックスと各要素の内容を印刷frequencyをループ。

+0

それを取得するために時間を費やしました。コード効率によると、お返事 – Elhaw

0

ただ、このループ

for (answer = 0; answer < RESPONSES_SIZE; ++answer) 
{ 
    frequency[ responses [ answer ] ]=frequency[ responses [ answer ] ]+1; 
} // end for 

に次のようにコードの書き換えを理解する:)

for (answer = 0; answer < RESPONSES_SIZE; ++answer) 
{ 
    rating = responses[ answer ]; 

    switch (rating) 
    { 
    case 1: 
     frequency[1] = frequency[1] + 1; 
     break; 
    case 2: 
     frequency[2] = frequency[2] + 1; 
     break; 
    case 3: 
     frequency[3] = frequency[3] + 1; 
     break; 
    case 4: 
     frequency[4] = frequency[4] + 1; 
     break; 
    case 5: 
     frequency[5] = frequency[5] + 1; 
     break; 
    case 6: 
     frequency[6] = frequency[6] + 1; 
     break; 
    case 7: 
     frequency[7] = frequency[7] + 1; 
     break; 
    case 8: 
     frequency[8] = frequency[8] + 1; 
     break; 
    case 9: 
     frequency[9] = frequency[9] + 1; 
     break; 
    case 10: 
     frequency[10] = frequency[10] + 1; 
     break; 
    } 
} 
+0

。何が良いですか?スイッチケースや配列表記を使用していますか?@Vlad from Moscow – Elhaw

+0

@Elhaw特に、このような高度なプログラマにとって、私は「コードを理解するだけです」と書かれています。 –

関連する問題