问题是删除所有最大的数字 例如: cin:1 2 3 4 5 cout:1 2 3 4
cin:5 1 2 3 5 判例:1 2 3cin: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我认为问题出在删除函数中,但是无论我重新检查了多少次,我都无法弄清楚出了什么问题,如果有人可以帮助我解决这个问题,我将非常高兴。 对不起,我的草率写作和英语不好 这是我的代码:
#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;
}
答案 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& n
中n
的引用传递给指针,而不是确保对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的相邻元素覆盖它们即可。