结果并非我所期望的

时间:2019-03-15 06:28:21

标签: c++

问题是删除所有最大的数字 例如: cin:1 2 3 4 5 cout:1 2 3 4

cin:5 1 2 3 5 判例:1 2 3

cin:5 5 1 2 5 判例:1 2

cin:5 5 5 1 5 提示:1

这是出问题的地方: 每当我最大的号码位于其他位置的第一个和最后一个位置时,代码都会打印出错误的结果 请查看以下示例以更好地理解: cin:5 5 1 2 5 预期cout:1 2 但它却提示:5 1

cin:5 5 1 5 5 预期提示:1
但它却提示:5

我认为问题出在删除函数中,但是无论我重新检查了多少次,我都无法弄清楚出了什么问题,如果有人可以帮助我解决这个问题,我将非常高兴。 对不起,我的草率写作和英语不好 这是我的代码:

#include <iostream>

using namespace std;
void Insert(int a[] ,int n)
{
    for (int i=0; i<n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
}
void Delete(int a[], int n, int Biggestt)
{
    int BiggestLocation;
    for (int i=0; i<n-1; i++)
    {
        if (a[i]==Biggestt)
        {
            BiggestLocation=i;
        }
    }
    for (int i=BiggestLocation; i<n-1; i++)
    {
        a[i]=a[i+1];
    }
}
int Biggest(int a[],int n)
{
    int Biggesttt=a[0];
    for (int i=0; i<n; i++)
    {
        if (Biggesttt<a[i])
        {
            Biggesttt=a[i];
        }
    }
    return Biggesttt;
}
void PrintOut(int a[],int n)
{
    for (int i=0; i<n; i++)
    {
        cout << a[i] << " ";
    }
}
int main()
{
    int n,OriginalCount;
    int Count=0;
    cout << "Insert n: ";
    cin >>n;
    int a[100];
    Insert(a,n);
    int Biggestttt=Biggest(a,n);
    for (int i=0; i<n-1; i++)
    {
        if(a[i]==Biggestttt)
        {
            Count++;
        }
    }
    OriginalCount=Count;
    while(Count!=0)
    {
        {
            Delete(a,n,Biggestttt);
        }
        Count--;
    }
    if (a[n-1]==Biggestttt && OriginalCount==0)
    {
        PrintOut(a,n-1);
    }
    else if (a[n-1]!=Biggestttt && OriginalCount!=0)
    {
        PrintOut(a,n-OriginalCount);
    }
    else if (a[n-1]==Biggestttt && OriginalCount!=0)
    {
        PrintOut(a,n-OriginalCount-1);
    }

return 0;
}

2 个答案:

答案 0 :(得分:1)

您并不遥远。您遇到的最大问题与所有功能都使用void function ()有关。通过使用void作为类型,您将失去return有效(和所需)信息的能力。

例如,在void Delete(int a[], int n, int Biggestt)中,a[]中保留的元素数量将随着与Biggestt匹配的每个元素从数组中删除而发生变化,但是您无法返回移除后数组中元素的最终数量。您可以将返回类型从void更改为int并返回更新的n,也可以将n用作指针参数,以便在函数中对其进行更新,则Delete()返回时,其更新值可在调用函数中使用。

此外,您在main()中的逻辑非常混乱。您已经创建了满足您需求的函数,因此main()应该相对干净一些,最多只能处理几个变量。您可以执行以下操作:

int main (void)
{
    int n, b,
        a[MAXINT];

    cout << "Insert n: ";
    if (!(cin >> n)) {      /* validate ALL user input */
        cerr << "(invalid conversion or user canceled)\n";
        return 1;
    }

    Insert (a, n);          /* insert all array values */
    cout << "original: ";   /* output the original */
    PrintOut (a, n);

    b = Biggest (a, n);     /* find the biggest number in the arry */
    Delete (a, &n, b);      /* delete all occurrences in array */

    cout << "big deleted: ";    /* output array with biggest removed */
    PrintOut (a, n);

    return 0;
}

注意:,因为您的Delete()函数已被void保留,指向n的指针作为参数被传递,所以{{1 }}元素删除后,将可以在调用函数中重新使用(此处为n

将其全部放入并调整main()中的逻辑,您可以执行以下操作:

Delete()

大量使用/输出

#include <iostream>

using namespace std;

#define MAXINT 100

void Insert (int a[], int n)
{
    for (int i=0; i<n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
}

void Delete(int *a, int *n, int Biggestt)
{
    for (int i = 0; i < *n;)
    {
        if (*n > 1 && a[i] == Biggestt)
        {
            for (int j = i + 1; j < *n; j++)
                a[j-1] = a[j];
            (*n)--;     /* if biggest removed, decrement n */
        }
        else
            i++;        /* only advance if biggest not removed at index */
    }
}

int Biggest(int a[],int n)
{
    int Biggesttt=a[0];
    for (int i=1; i<n; i++)
    {
        if (Biggesttt<a[i])
        {
            Biggesttt=a[i];
        }
    }
    return Biggesttt;
}

void PrintOut(int a[],int n)
{
    for (int i=0; i<n; i++)
    {
        cout << " " << a[i];
    }
    cout << '\n';
}

int main (void)
{
    int n, b,
        a[MAXINT];

    cout << "Insert n: ";
    if (!(cin >> n)) {      /* validate ALL user input */
        cerr << "(invalid conversion or user canceled)\n";
        return 1;
    }

    Insert (a, n);          /* insert all array values */
    cout << "original: ";   /* output the original */
    PrintOut (a, n);

    b = Biggest (a, n);     /* find the biggest number in the arry */
    Delete (a, &n, b);      /* delete all occurrences in array */

    cout << "big deleted: ";    /* output array with biggest removed */
    PrintOut (a, n);

    return 0;
}

如果$ ./bin/remove_biggest Insert n: 5 a[0]= 5 a[1]= 1 a[2]= 2 a[3]= 3 a[4]= 5 original: 5 1 2 3 5 *n: 3 *n: 3 *n: 3 big deleted: 1 2 3 $ ./bin/remove_biggest Insert n: 4 a[0]= 5 a[1]= 5 a[2]= 1 a[3]= 5 original: 5 5 1 5 *n: 1 big deleted: 1 中的所有数字都相同怎么办?您必须能够处理这种情况。如果a[...]中的逻辑全部相同,则现在保留1。您也可以选择将它们全部保留,因为没有Delete()。同时是最大和最小。处理方式取决于您。

Biggestt

如果它们都是相同的大数字,我们只是删除了所有它们而留下了1,因为它也是最小值。

使用引用$ ./bin/remove_biggest Insert n: 4 a[0]= 5 a[1]= 5 a[2]= 5 a[3]= 5 original: 5 5 5 5 *n: 1 big deleted: 5 代替指针

为响应您的评论和费翔的建议,C ++允许您将对int& nn的引用传递给指针,而不是确保对Delete()的更改可见的指针在调用函数中(此处为n)。问题的症结在于,当您简单地将参数传递给函数时,该函数将收到一个副本,并且对该函数内的变量所做的任何更改都会在返回时丢失。 C ++提供了一个引用(例如main),该引用本质上将别名传递给原始文件,并且对该引用所做的任何更改都是对原始文件所做的更改。这是对传递变量的地址的一种改进,因为它确实避免了必须取消引用指针的情况。

使用参考,可以int& n进行如下重写:

Delete()

void Delete (int *a, int& n, int Biggestt) { for (int i = 0; i < n;) { if (n > 1 && a[i] == Biggestt) { for (int j = i + 1; j < n; j++) a[j-1] = a[j]; n--; /* if biggest removed, decrement n */ } else i++; /* only advance if biggest not removed at index */ } } 中对Delete()的呼叫将是:

main()

您已经摆脱了所谓的Delete (a, n, b); /* delete all occurrences in array */ 标记'*'(那个飞)

答案 1 :(得分:-1)

#include <iostream>

using namespace std;
void Insert(int a[] ,int n)
{
    for (int i=0; i<n; i++)
    {
        cout << "a[" << i << "]= ";
        cin >> a[i];
    }
}
void Delete(int a[], int n, int Biggestt)
{
    int BiggestLocation;
    for (int i=0; i<n-1; i++)
    {
        if (a[i]==Biggestt)
        {
            a[i]=-1;
        }
    }
    for (int i=1; i<n; i++)
    {
        if(a[i-1]==-1)
        a[i-1]=a[i];
    }
}
int Biggest(int a[],int n)
{
    int Biggesttt=a[0];
    for (int i=0; i<n; i++)
    {
        if (Biggesttt<a[i])
        {
            Biggesttt=a[i];
        }
    }
    return Biggesttt;
}
void PrintOut(int a[],int n)
{
    for (int i=0; i<n; i++)
    {
        cout << a[i] << " ";
    }
}
int main()
{
    int n,OriginalCount;
    int Count=0;
    cout << "Insert n: ";
    cin >>n;
    int a[100];
    Insert(a,n);
    int Biggestttt=Biggest(a,n);
    for (int i=0; i<n-1; i++)
    {
        if(a[i]==Biggestttt)
        {
            Count++;
        }
    }
    OriginalCount=Count;
    while(Count!=0)
    {
        {
            Delete(a,n,Biggestttt);
        }
        Count--;
    }
    if (a[n-1]==Biggestttt && OriginalCount==0)
    {
        PrintOut(a,n-1);
    }
    else if (a[n-1]!=Biggestttt && OriginalCount!=0)
    {
        PrintOut(a,n-OriginalCount);
    }
    else if (a[n-1]==Biggestttt && OriginalCount!=0)
    {
        PrintOut(a,n-OriginalCount-1);
    }

return 0;
}

请尝试此代码。 只需将所有最大数量的实例都等于-1,然后用不等于-1的相邻元素覆盖它们即可。