1

ここで比較的同じことを行う方法を尋ねる古い投稿を見ましたが、彼らのアプローチは異なっていたので、私のプログラムの穴を知りたいと思っています。

文字を 10 文字の長さの配列に受け入れるプログラムを作成しようとしています。プログラムで最初の配列位置を評価し、重複を特定し、その右側にあるすべての値を 1 つずつ左に移動することで、配列内で後で見つかった重複を削除します。次に、配列の「サイズ」が 1 減ります。

削除関数に使用したロジックは正しいと思いますが、プログラムは配列の最初の値と 4 番目の値に対してのみ「a」を出力します。

どんな助けでも大歓迎です、ここに私のコードがあります:

#include <iostream>
using namespace std;

int letter_entry_print(int size, char array[10]);
int delete_repeats(int& size, char array[10]);
int final_array_print(int size, char array[10]);

int main()
{
    char array[10];
    int size = 10;

    letter_entry_print(size,array);
    delete_repeats(size,array);
    final_array_print(size,array);

    cout<<"\n";
    system("pause");
}

int letter_entry_print(int size, char array[10])
{
    int i;

    for (i=0;i<size;i++)
    {
        cout << "Enter letter #" << i+1 << endl;
        cin >> array[i];
        cout << "\n";
    }

    cout << "\nYour array index is as follows:\n\n";

    for (i=0;i<size;i++)
    {
        cout << array[i];
        cout << " ";
    }

    cout <<"\n\n";
    return 0;
}

int delete_repeats(int& size, char array[10])
{
    int ans;
    int loc;
    int search;
    int replace;
    char target='a';

    cout << "Enter 1 to delete repeats.\n\n";
    cin >> ans;
    if(ans==1)
    {
        for(loc=0;loc<size;loc++)
        {
            array[loc]=target;
            for(search=1;search<(size-loc);search++)
            {
                if(target=array[loc+search])
                {
                    for(replace=0;replace<(size-(loc+search));replace++)
                    {
                        array[loc+search+replace]=array[loc+search+replace+1];
                        array[size-1]=0;
                        size=(size-1);
                    }
                }
            }
        }
    }else(cout<<"\nWhy didn't you press 1?\n\n");
    return 0;
}

int final_array_print(int size, char array[10])
{
    cout<<"\nYour new index is as follows:\n\n";
    int i;
    for(i=0;i<size;i++)
    {
        cout<<array[i];
        cout<<" ";
    }

    cout<<"\n";
    return 0;
}
4

1 に答える 1

1

わかりました、あなたのコードには奇妙に見える点がいくつかあります。

1) 合理的に変更する方法がないところまで 10 を繰り返しますが、サイズも渡します。すべての関数が 10 文字の配列を取る代わりに、次のように char へのポインターを渡すことを検討してください。

int final_array_print(int size, char *array)

配列のサイズをより簡単に変更できます。永遠に 10 個のアイテムに制限するつもりなら、どこにでもサイズを渡しても意味がありません。また、サイズを指定する場合に 10 個のアイテムの配列を渡す正当な理由はありません!

2) では、重複を探します。配列の最初の要素を「a」で上書きするのはなぜですか?

 char target='a';
...
array[loc]=target;

逆にやりたくない?

3) 次に、@Mahesh が指摘するように、次のような重複を探すときは、代入演算子 = ではなく比較演算子 '==' を使用することをお勧めします。

if(target=array[loc+search])

おそらくあるはずです

if(target == array[loc+search])

4) 次に、単語と句読点の間にわずかな空白を使用することを恐れないでください。

5) 実際に置換を実行するためのループには、信じられないほど複雑なインデックスがあります。replace = 0 で開始しない方が簡単ですが、replace = search + 1 で開始して試してみると、残りのすべてのインデックスがどれだけ簡単になるかがわかります。

于 2012-09-08T05:54:19.803 に答える