簡體   English   中英

刪除數組中的重復項(C ++)

[英]Deleting duplicates in an array (C++)

我在這里看到一個較舊的帖子,詢問如何做相對相同的事情,但是他們的方法不同,我很想知道我程序中的漏洞。

我正在嘗試編寫一個接受字符到10個字符長的數組的程序。 我希望程序評估第一個數組的位置,並通過標識重復項並將其右邊的所有值向左移動一個,來刪除它以后在數組中找到的所有重復項。 然后將數組的“大小”減小1。

我相信我用於刪除功能的邏輯是正確的,但是程序只為數組中的第一個值和第四個值打印一個“ 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;
}

好的,關於您的代碼,有些事情看起來很奇怪。

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開始,那會更容易,嘗試一下,也許所有其他索引都會變得簡單得多。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM