2011-06-23 51 views
0

對於我正在處理作業分配的一個小函數有一些問題。插入數組中的所需元素,並將所有其他元素在C++中推送一個點

我有一個20(shelfSize)的靜態數組大小,但是,我只需要使用最多10個元素。所以我不必擔心超出界限等(整個數組20被初始化爲0)。

我正在做的是將一個整數booknum插入到它作爲輸入接收的數組的元素中。

這是我目前的邏輯:

void insert_at(int booknum, int element){ 
for(int i=element+1; i < shelfSize; i++) 
    bookshelf[i+1]=bookshelf[i] 
bookshelf[element]=booknum; 
} 

讓我們說我有此數組:

[5,4,3,1,7]

我要插入一個8在元件1和具有該陣列轉到:

[5,8,4,3,1,7]

技術上,一切最後一個元素7是0,但是,我有一個單獨的打印功能,只打印到某個元素。

無論我多少次拿一些鉛筆和紙張並手工寫出自己的邏輯,我都無法得到這個工作。

任何幫助,將不勝感激,謝謝。

回答

1

您應該從數組的末尾開始,這個詞應該爲你:

void insert_at(int booknum, int element) 
{ 
    for (int i = shelfsize-1;i>element;i--) 
     bookshelf[i] = bookshelf[i-1]; 
    bookshelf[element] = booknum; 
} 

此外,我建議你習慣了處理非法值,例如,如果有什麼用戶輸入21?

優化代碼將是:

bool insert_at(int booknum, int element) 
{ 
    if (element>=shelfsize-1) 
     return false; 
    for (int i = shelfsize-2;i>element;i--) 
     bookshelf[i] = bookshelf[i-1]; 
    bookshelf[element] = booknum; 
    return true; 
} 
+0

謝謝!奇怪的是,在我看到@ Simon-Buchan的評論後,我開發了適當的for循環。但是,我忘了在「shelfSize-1」處啓動它,但是我沒有得到超出界限的錯誤...數組的元素20不應該存在hmmmm。 – Staypuft

+0

@Staypuft:歡迎:),我只是覺得它就像一個人告訴電腦插入一本書到一個書架上,人會要求電腦把這本書放在第21個索引處,然後電腦應該告訴他這是非法的,我認爲你應該儘可能多地處理錯誤。 –

+0

@Staypuft:歡迎來到C++!這種語言永遠不會告訴你什麼時候你正在做一些可怕的錯誤!你覆蓋了數組結尾後編譯器的任何東西,這可能是一個安全漏洞。 –

1

如果你的例子是正確的,那麼你假設基於1的索引而不是基於0的索引。改用以下內容:

void insert_at(int booknum, int element){ 
for(int i=element; i < shelfSize; i++) 
    bookshelf[i]=bookshelf[i-1]; 
bookshelf[element-1]=booknum; 
} 

不過,我寧願你只需要使用相同的代碼,變「在要素2」在你的榜樣,以「爲元素1」。永遠記得C++數組是基於0的。

也就是說,請告訴你的教授,這就是爲什麼製作矢量(和其他標準容器),以及C++數組是邪惡的。

http://www.parashift.com/c++-faq-lite/containers.html#faq-34.1

+0

感謝。它實際上是一個基於0的數組,我只是犯了一個錯字。我希望我可以使用矢量,但教授只是喜歡使用非現實世界的編程限制,讓你的頭受傷! – Staypuft

+1

@Staypuft:這個想法不是教你如何編寫程序,而是教你如何編程,如果這種區別有意義的話。 –

1

只注意到,您複製了,這意味着你的函數做到這一點:

[5,4,3,1,7] 
    --^ 
[5,4,4,1,7] 
     --^ 
[5,4,4,4,7] 
     --^ 
[5,4,4,4,4] 
      --^ 
[5,4,4,4,4,4] 

對於陣列移動值,你總是希望在相反的方向複製到您正在移動,所以要向上移動,你想從上往下複製每個項目:

[5,4,3,1,7] 
      --^ 
[5,4,3,1,7,7] 
     --^ 
[5,4,3,1,1,7] 
     --^ 
[5,4,3,3,1,7] 
    --^ 
[5,4,4,3,1,7] 

然後你可以覆蓋你釋放的索引。

+0

謝謝!這從來沒有真正向我明確解釋過。你讓我遇到很多問題變得更加清晰! – Staypuft

+0

@Staypuft:好吧,用圖解釋這個更容易:) –

相關問題