2015-10-20 82 views
0

我有與該是這樣的練習很難陣列:搜索用C

寫計數在每一個陣列不同數量的外觀量的計劃。整數0之間的數 - 9.取出此陣列爲例:

int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 

創建指向該陣列的第一個元素的指針。循環訪問數組並計算指向數字的出現數量。在計算出數字1的出現數量之後,指針將指向數字5.計算出現的數量5等等。在循環幾次後,指針再次指向1(數組的元素4),程序可能不會再次計數1,因此您需要將得分保持在您已計算的數字的某個位置。

輸出應看起來像這樣:

的出場1的量:4

的出場3的量爲:1

出場的量4是:2

5的出現數量是:3

的出場7次的量爲:2

代碼我現在有計算每一個元素的外觀:

int main() 
{ 
    int getallen[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 
    int i , j, *aimedNumber, appearance = 0, arraySize = sizeof(getallen)/sizeof(int); 

    for(i=0;i<arraySize;i++)       
    { 
     aimedNumber = getallen[i];     // every loop, the pointer points to the next element 

     for(j=0; j<arraySize; j++)     // loops through the array comparing the pointer 
     { 
      if(getallen[j]==aimedNumber)   // if the element of the array == pointer 
      { 
       appearance++;      // +1 to the appearance 
      } 
     } 

     printf("the appearance of %i in the array is: %i\n", aimedNumber, appearance); 
     appearance = 0;        // after checking the appearance of the pointed number... 
    }            // reset the appearance variable 

    return 0; 
} 

但我仍然需要有東西,如果我是檢查已經計算了一個數字,如果我確定了,請確保該數字不會再被計算在內。

在此先感謝!

+0

如果你可以使用一組,那麼你的問題解決了,但它是stl和C++ – macroland

+1

你的外部循環應該運行所有可能的數字,例如從0到9,你的情況是'targeNumber'等於'i'。 (當然,如果你知道可能值的範圍,你可以遍歷內循環一次,並填充從0到9的每個數字的計數數組。) –

+0

你最近的問題是什麼? – Roushan45

回答

0

你的程序看起來應該像下面這樣:

#include <stdio.h> 

int main(void) 
{ 
    //Original array of numbers 
    int numbers[] = {1, 5, 4, 7, 1, 4, 1, 7, 5, 5, 3, 1}; 

    //array of 10 integers to count the number of occurences 
    int num_of_occ[10] = {0}; 

    int *ptr = numbers; 

    //tmp variable to hold the value of numbers array in the loop 
    int tmp ,n = 0 ; 

    while(n < 12) 
    { 
     tmp = *ptr; 
     num_of_occ[tmp]++; 
     ptr++; 
     n++; 
    } 

    //print the occurences 
    for(int n = 0 ; n < 10 ; n++) 
    { 
     if(num_of_occ[n] != 0) 
     { 
      printf("The ammount of appearences of %d : %d\n", n , num_of_occ[n]); 
     } 
    } 
} 
+0

是的!謝謝!這樣你仍然可以使用指針(如assignement所說),並且你得到正確的輸出! – arnofrederiks

+0

查看最後的edit.thanks。@ arnofrederiks –

+0

非常感謝@ machine_1!我對編輯進行了很好的審視,這真是太棒了! – arnofrederiks

0

由於您在計數後似乎不需要getallen陣列,因此您可以在計數時對其進行修改,即當您在陣列中查找所有1時,每次讀取1時都可以將其設置爲,讓我們說,-1(你知道你的所有號碼將在[0,9]範圍內),這樣,當你回到外循環,可以跳過與-1

編輯值的條目:這就是,如果你的答案必須遵循你的例子中描述的那種行爲;否則帶有額外陣列的解決方案,比如Joachim Pileborg的解決方案更好。

1

你有這樣的限制,即數組中的數字只能在0到9之間(包括0和9),並且實際上使它簡單得多,因爲那麼你可以有一個由10個整數組成的「counter」數組您搜索的數組中的數字),並且對於主數組中的每個數字,可以在計數器數組中增加相應的值(使用數字作爲索引)。然後只需輸出非零的計數器數組值。

像下面

int count[10] = { 0 }; // Initialize all to zero 

for (i = 0; i < arraySize; ++i) 
    ++count[getallen[i]]; 

// Now print out all non-zero values from count, 
// and the index is the number in getallen 
+0

開始非常感謝你,這種方式也可以工作,但是assignement說它必須使用指針。但是,無論如何,我也從中學到了很多! – arnofrederiks

0

您將需要另一個數組稱爲tempArr例如與getallen數組的大小,初始化它有10個(因爲getallen數組中的數字在0-9之間),並在計算下一個數字之前,掃描tempArr並檢查數字是否已經存在,如果是,則跳至下一個數字。

0

我只是把另一個循環設置aimedNumber之後,但在進入內循環之前檢查陣列的前值對aimedNumber

skip = 0; 
for (j=0; j < i; j++) { 
    if (getallen[j] == aimedNumber) { 
    skip = 1; 
    break; 
    } 
} 
if (skip) { 
    continue; 
}