2016-03-10 101 views
1

所以我这里有这个简单的程序,我的导师是要求进行以下修改,我不能看到它:C++数组索引

对不起,你错过了点。由于您的所有函数都是 ,使用从1到n的索引,其中n可以是100,因此绝对不要使用数组索引为零的 元素。这意味着您将在阵列中使用的最大值为 99.如果用户确实想要输入100个值,您的解决方案将无法工作。

您能否再次修复您的解决方案?

#include <iostream> 
using namespace std; 
int readnums(int v[]); 
void findmaxmin(int v[],int n,int &mi,int &ma); 
int findmidsum(int v[],int n,int mi,int ma); 
int main() 
{ 
const int ARRAYVALUE=100; 
int v[ARRAYVALUE]; 
int n=readnums(v),mi,ma; 
findmaxmin(v,n,mi,ma); 
cout<<"Max= "<<ma<<endl; 
cout<<"Min= "<<mi<<endl; 
cout<<"Middle sum= "<<findmidsum(v,n,mi,ma)<<endl; 

} 
int readnums(int v[]) 
{ 
cout<<"How many numbers to enter: "; 
int n=0; 

cin>>n; 
for(int a=1;a<=n;a++) 
{ 
    cout<<"Enter no. "<<a<<": "; 
    cin>>v[a]; 
} 
return n; 
} 
void findmaxmin(int v[],int n,int &mi,int &ma) 
{ 
ma=v[1]; 
mi=v[1]; 
for(int a=1;a<=n;a++) 
{ 
    if(mi>v[a])mi=v[a]; 
    if(ma<v[a])ma=v[a]; 
} 
} 
int findmidsum(int v[],int n,int mi,int ma) 
{ 
int s=0; 
for(int a=1;a<=n;a++) 
    if(v[a]!=mi && v[a]!=ma) 
    s+=v[a]; 
return s; 
} 
+0

那么,什么是问题?如何检查提供的索引是否在'[0,99]'范围内? – NathanOliver

+1

您可以使用['assert()'](http://en.cppreference.com/w/cpp/error/assert)来检查传递给函数的参数。 –

+1

基本上他说我在我的函数中使用的索引范围从1到n,而n可能是100.并且该索引需要从0到99 – MSK

回答

3

正如我在我的评论中提到的,您必须重复从a=0a<n而不是从a=1a<=n。但你也必须修改以下行:

ma=v[1]; 
mi=v[1]; 

...是:

ma=v[0]; 
mi=v[0]; 

...不然,正如你所说,最大运算符(因为v[1]不存在当数组中只有一个索引时)。

下面是完整的更新代码:

#include <iostream> 
using namespace std; 
int readnums(int v[]); 
void findmaxmin(int v[],int n,int &mi,int &ma); 
int findmidsum(int v[],int n,int mi,int ma); 
int main() 
{ 
    const int ARRAYVALUE=100; 
    int v[ARRAYVALUE]; 
    int n=readnums(v),mi,ma; 
    findmaxmin(v,n,mi,ma); 
    cout<<"Max= "<<ma<<endl; 
    cout<<"Min= "<<mi<<endl; 
    cout<<"Middle sum= "<<findmidsum(v,n,mi,ma)<<endl; 
} 

int readnums(int v[]) 
{ 
    cout<<"How many numbers to enter: "; 
    int n=0; 

    cin>>n; 
    for(int a=0;a<n;a++) 
    { 
    cout<<"Enter no. "<<a+1<<": "; 
    cin>>v[a]; 
    } 
    return n; 
} 

void findmaxmin(int v[],int n,int &mi,int &ma) 
{ 
    ma=v[0]; 
    mi=v[0]; 
    for(int a=0;a<n;a++) 
    { 
    if(mi>v[a])mi=v[a]; 
    if(ma<v[a])ma=v[a]; 
    } 
} 

int findmidsum(int v[],int n,int mi,int ma) 
{ 
    int s=0; 
    for(int a=0;a<n;a++) { 
    if(v[a]!=mi && v[a]!=ma) 
    s+=v[a]; 
    } 
    return s; 
} 

您可以在这里测试上面的代码:http://cpp.sh/6ogo

+1

太棒了!欣赏它萌芽! – MSK

0

你的数组包含100 INT,因此,如果输入的n是大于99你的程序可能会崩溃。

int main() 
{ 
const int ARRAYVALUE=101; 
int v[ARRAYVALUE]; 
int n=readnums(v),mi,ma; 
findmaxmin(v,n,mi,ma); 
cout<<"Max= "<<ma<<endl; 
cout<<"Min= "<<mi<<endl; 
cout<<"Middle sum= "<<findmidsum(v,n,mi,ma)<<endl; 

} 
int readnums(int v[]) 
{ 
cout<<"How many numbers to enter: "; 
int n=0; 
Do{ 
cout << "Enter a number in the range 1 - 100 :" << endl 
cin>>n; 
} 
while (n > 100 || n < 1); 
for(int a=1;a<=n;a++) 
{ 
    cout<<"Enter no. "<<a<<": "; 
    cin>>v[a]; 
} 
return n; 
} 

固定解决方案,使用户可以输入100个值,您的数组包含101个整数。

+0

我明白了!我需要在任何其他功能检查吗? (n> 99 || n <0) – MSK

+0

从我所看到的你永远不会分配另一个值到n,因此只要你使用n来通过你的数组,你应该罚款只有这个检查 –

+0

对不起,你错过了点。由于您的所有函数都使用从1到n的索引,其中n可以是100,因此您绝对不要使用数组索引为零的元素。这意味着您将在数组中使用的最大值为99.如果用户真的想输入100个值,那么您的解决方案将无法工作。 您能否再次修复您的解决方案?所以我想这不是他想要的: – MSK