2011-06-23 4 views
0

1つの小さな関数にいくつかの問題があり、私は宿題に取り組んでいます。配列の目的の要素に挿入し、他のすべての要素をC++で1つ上にプッシュします。

私は20(shelfSize)の静的配列サイズを持っていますが、最大10個の要素を使用するだけです。だから私は境界外などについて心配する必要はありません(20の配列全体が0に初期化されます)。

私が探しているのは、入力として受け取る配列の要素にbooknumという整数を挿入することです。

この私の現在のロジック:私は8を挿入したい

[5,4,3,1,7]

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

それでは、私はこの配列を持っているとしましょう要素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は存在してはいけません。 – Staypuft

+0

@Staypuft:ようこそ:)私はちょうどそれが、コンピュータに棚に本を挿入するように指示する人間のようだと思っていました。そして、人間は、その書籍を21番目のインデックスに置くようコンピュータに依頼します。それは違法だから、できるだけ多くのエラーを処理するべきだと私は思う。 –

+0

@Staypuft:C++へようこそ!あなたが何かひどく間違ったことをしているときにあなたに決して言わない言葉!あなたは、コンパイラが配列の最後の後に置いたものを上書きしていました。これはセキュリティバグかもしれません。 –

1

例が正しい場合は、0ベースではなく1ベースのインデックスが仮定されています。代わりに以下を使用します。

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

しかし、私はあなただけで同じコードを使用することを好むだろう、と「要素1での」へのあなたの例では、「要素2で」変更。常に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:これを図で説明するのは簡単です。 –