求素数并求其平均值 代码存在死循环

提示遇见死循环;
但是我找不到。

img


####输入样例:

9
5 2 7 4 8 23 65 1 40
#include 
#include
using namespace std;
//请填入你的代码   
class Array
{
    private:
    int p[10];
    int k;
    float s;
    
    public:
    Array(int [],int );
    int fun(int n);
    void sum();
    void show();
    ~Array(){
        
        delete []p;
    }
};
Array::Array(int *ptr,int n)
{
    s=0;
    for(int i=0;i<=n;i++)
        p[i]=ptr[i];
}
int  Array::fun(int n)
{
    int cp=1;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0) cp=0;
    }
    return cp;
}
void Array::sum()
{
   int i=0,temp=0;
   for(;iif(fun(p[i]))
       {s+=p[i];temp++;}
   }
   s/=temp;
}
 void Array::show()
 {
     cout<<"数组个数为:"<"数组为:"<for(int i=0;i"    "<if((i+1)%5==0) cout<"和为:"<int main( )
{
    int p[10];
    
    int k;
    //请填入你的代码 
    cin>>k;
    for(int q=0;q>p[q];
    }
    Array arr(p,k);
    arr.sum();
    arr.show();
    return 0;  
}


在 Array::sum() 函数中,for循环的判断条件错误,应该是 i<k 而不是 k++。因为在for循环中已经进行了 i++ 操作,如果将 k++ 放在循环语句中,会导致 k 的值一直增加,最终导致数组越界和死循环。

{
   int i=0,temp=0;
   for(;i<k;i++)
   {
       if(fun(p[i]))
       {s+=p[i];temp++;}
   }
   s/=temp;
}

建议以后编写程序时要仔细检查循环条件,特别是for循环的语法是否正确。有用的话,给个关注,谢谢!


```c++


```

void Array::sum()
{
   int i=0,temp=0;
   for(;i<k;k++)//这里
   {
       if(fun(p[i]))
       {s+=p[i];temp++;}
   }
   s/=temp;
}

for(int q=0;q<k;k++)这里k++改为q++
for(;i<k;k++)这里k++改为i++
永远要循环变量进行++,而不要把判断条件自增

delete []p; p都不是new出来的,你delete干啥
for(int q=0;q<k;k++) k++不对啊,q++
25行也是错的,会越界
40行最后也应该是i++
给你改了一个好用的版本:

#include <iostream>
#include<math.h>
using namespace std;
//请填入你的代码   
class Array
{
    private:
    int *p;
    int n;
    float s;
    
    public:
    Array(int [],int );
    int fun(int n);
    void sum();
    void show();
    ~Array() {if(p!=NULL) delete []p;}
};
Array::Array(int *ptr,int n)
{
    s=0;
    this->n = n;
    p = new int[n];
    for(int i=0;i<n;i++)
        p[i]=ptr[i];
}
int  Array::fun(int n)
{
    if(n<2)
        return 0;
    int k = sqrt(n*1.0);
    for(int i=2;i<=k;i++)
    {
        if(n%i==0) 
            return 0;
    }
    return 1;
}
void Array::sum()
{
   int i=0,temp=0;
   s=0;
   for(;i<n;i++)
   {
       if(fun(p[i]))
       {s+=p[i];temp++;}
   }
   if(temp>0)
    s/=temp;
}
 void Array::show()
 {
     cout<<"数组个数为:"<<n<<endl;
     cout<<"数组为:"<<endl;
     for(int i=0;i<n;i++)
     {
         cout<<*(p+i)<<"    ";
         if((i+1)%5==0) cout<<endl;
     }
     
    cout<<"平均值为:"<<s;
 }
int main( )
{
    int p[100];
    
    int k;
    //请填入你的代码 
    cin>>k;
    for(int q=0;q<k;q++)
    {
        cin>>p[q];
    }
    Array arr(p,k);
    arr.sum();
    arr.show();
    system("pause");
    return 0;  
}

代码中有一个错误:在输入数组 p[q] 的时候,变量 q 没有被递增,导致一直在输入 p[0],出现了死循环。将第 43 行代码的 q++ 修改为 q 即可。

#include <iostream>
#include<math.h>
using namespace std;
class Array
{
private:
    int p[10];
    int k;
    float s;
public:
    Array(int [],int );
    int fun(int n);
    void sum();
    void show();
    ~Array(){
        delete []p;
    }
};
Array::Array(int *ptr,int n)
{
    s=0;
    for(int i=0;i<=n;i++)
        p[i]=ptr[i];
    k=n;
}
int  Array::fun(int n)
{
    int cp=1;
    for(int i=2;i<=sqrt(n);i++)
    {
        if(n%i==0) cp=0;
    }
    return cp;
}
void Array::sum()
{
    int i=0,temp=0;
    for(;i<k;i++)
    {
        if(fun(p[i]))
        {s+=p[i];temp++;}
    }
    s/=temp;
}
void Array::show()
{
    cout<<"数组个数为:"<<k<<endl;
    cout<<"数组为:"<<endl;
    for(int i=0;i<k;i++)
    {
        cout<<*(p+i)<<"    "<<endl;
        if((i+1)%5==0) cout<<endl;
    }
    cout<<"和为:"<<s;
}
int main( )
{
    int p[10];
    int k;
    cin>>k;
    for(int q=0;q<k;q++) // 将 q++ 修改为 q
    {
        cin>>p[q];
    }
    Array arr(p,k);
    arr.sum();
    arr.show();
    return 0;  
}