2014-05-15 27 views
0

我有陣A[9]= {1,2,3,4,5,6,7,8,9},我需要刪除未通過2.代碼劃分的數字我試圖做的:C++數組不能得到正確的陣列

int main() 
{ 
    int n; 
    ifstream fd(Cdf); 
    fd>>n; // read how many numbers are in the file. 
    int A[n]; 
    for(int i = 0; i < n; i++) 
    { 
     fd >> A[i]; //read the numbers from file 
    } 
    for(int i = 0; i < n; i ++) // moving the numbers. 
    { 
     if(A[i] % 2 !=0) 
     { 
      for(int j = i; j < n; j++) 
      { 
       A[i] = A[i+1]; 
      } 
     } 
    } 
    fd.close(); 
    return 0; 
} 

但我得到這樣224466888號。我需要做什麼來獲得2,4,6,8?

我需要刪除相同數組中的數字。

+0

第一條評論:有意義的變量名使代碼更容易閱讀。 – Almo

+0

爲什麼不使用更好的數據結構,比如'std :: vector'或'std :: list'? – crashmstr

+0

@crashmstr因爲學習。 – molbdnilo

回答

0

你去除循環與錯誤的變量索引:

for(int j = i; j < n; j++) 
{ 
    A[i] = A[i+1]; 
} 

您使用i,它不會在循環改變。
將其更改爲j。您還需要從上限中減去1,因爲在訪問A[j + 1]時,您會遇到陣列外的其他位置。

for(int j = i; j < n - 1; j++) 
{ 
    A[j] = A[j + 1]; 
} 
+0

這仍然沒有刪除任何 – sp2danny

+0

謝謝,幫助我:) – Julius

0

數組不能用於您的目的。它在堆棧上分配,其大小不能動態改變(不能一般改變數組的大小,不能在堆棧中分配)。

您可以分配第二個數組,每次添加一個新元素時都會使用realloc重新分配,但這不是一個好辦法。您與工作C++這樣只需使用一個std::vector<int>和你的問題將得到解決:

std::vector<int> evenArray; 
evenArray.reserve(sizeof(A)/sizeof(A[0])/2); 

if (number is even) { 
    evenArray.pushBack(number); 
} 

記住,向量存儲元件連續,所以這是合法的:

int *evenA = &evenArray[0]; 
+0

我不能使用矢量。因爲我在學校學習。和我的老師給我這樣做的陣列.. – Julius

2

首先,你應該使用std ::矢量用於動態大小的數組。 其次,用於去除甚至在一個向量號,你可以這樣做:

std::vector<int> inf = {12,0,5,6,8}; 
auto func = [](int i){return i % 2 != 0;}; 
inf.erase(std::remove_if(inf.begin(),inf.end(),func), inf.end()); 

編輯:

好了,你仍然可以做到這一點沒有的std ::載體,但是這將是醜陋:

#include <algorithm> 

int res[] = {2,5,9,8,6,7}; 
int size = 6; 
auto func = [](int i){return i % 2 != 0;}; 
int new_size = std::remove_if(res,res + size, func) - res; 

所有你想要的是在[0,new_size [範圍內的數據,你的陣列的另一部分是現在的垃圾。

+0

我不能使用矢量。因爲我在學校學習。和我的老師給我這樣做的陣列... – Julius

+0

@ user3609104編輯陣列版本 – Kiroxas

+0

#包括 //爲std :: remove_if – playful

0

對於你的內心for循環,你應該引用j,不i

for(int j = i; j < n - 1; j++) 
{ 
    A[j] = A[j+1]; 
} 

否則,創建j有什麼意義?

當然,這也意味着如果你讀完整個數組,你將顯示所有被移位的字符(這將等於最後一個數字)。所以,你應該跟蹤數組的新長度,並且只是迭代到數組的末尾而不是數組的末尾。

編輯:
在內for循環中,您需要循環到n - 1否則,當你有A[j + 1]它會關閉陣列的結尾,當你改變它,這可能會或可能不會給你一個運行時錯誤。

+0

所以你說我只需要A [i] = A [i + 1]寫在沒有For循環的If語句中? – Julius

+0

不,你需要改變內部'for'循環來訪問數組時使用'j'而不是'i'。否則,你只是使用'i'的值,它沒有改變。所以,每次你輸入一個奇數時,你所做的就是直接用數字替換它。將它改爲'j'而不是'i'會使它重複這個過程。雖然,molbdnilo有一點,你需要使它成爲'n - 1',所以你不會結束。 –