Для домашней работы мне нужно было спроектировать массив в c ++, используя только 1d массивы и указатели, чтобы сделать массив динамическим. Я провел достаточное тестирование, и мои функции работают правильно, но когда я использую основную часть, предоставленную мне учителем, я получаю эту ошибку с плавающей запятой. Смысл этой домашней работы — создать класс, который будет работать для учителей основного без изменения кода в основном
вот главное:
#include "ArrayList.h"#include <iostream>
using namespace std;
int main(int argc,char *argv[])
{
ArrayList arr;
for (int i=1;i<=50;i++)
{
arr.push_back(i);
}
cout << "Should contain numbers 1..50, is ";
cout << arr.toString() << endl;
for (int i=arr.size()-1;i>=1;i--)
{
arr.erase(arr[i]);
}
cout << "Should contain only 1, is ";
cout << arr.toString() << endl;
arr.erase(arr[0]);
for (int i=1;i<=50;i++)
{
if (i<=2)
arr.push_back(i);
else
{
int j=1;
while ((j<arr.size()) && (i%arr[j]!=0))
j++;
if (j==arr.size())
{
arr.push_back(i);
}
}
}
cout << "Prime numbers between 1 and 50 are: " << arr.toString() << endl;
}
вот мой cpp:
#include<iostream>
#include<string>
#include<sstream>
#include "ArrayList.h"
using namespace std;
void ArrayList:: intialArr(int arr[])
{
for(int i = 0; i < length; i++)
{
arr[i] = 0;
}
}
string ArrayList:: toString()
{
std::ostringstream ss;
for(int i = 0; i < capacity; i++)
{
if(arr[i]>0 || arr[i] <0)
{
ss << arr[i] << " ";
}
}
return ss.str();
}
ArrayList::ArrayList()
{
length = 1;
capacity=0;
arr = new int[length];
intialArr(arr);
}
int& ArrayList:: operator[] (unsigned int i)
{
return arr[i];
}
void ArrayList:: push_back(int m)
{
if(capacity>=length)
{
int oldlength = length;
length = length*2;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i < oldlength; i++)
{
curArr[i] = arr[i];
}
delete [] arr;
arr = curArr;
}
arr[capacity] = m;
capacity++;
}void ArrayList:: erase(int m)
{
if(capacity == length/2)
{
length = length/2;
int* curArr = new int[length];
intialArr(curArr);
for (int i = 0; i<capacity; i++)
{
curArr[i] = arr[i];
}
delete [] arr;
arr = curArr;
}
for(int i = 0; i < capacity; i++)
{
if(arr[i]==m)
{
for(int j = i; j<length; j++)
{
arr[j] = arr[j+1];
}
capacity--;
break;
}
}
cout << "length = " << length << " capacity = " << capacity << " capacity/length = " << capacity*2 << endl;
}
из того, что я прочитал в Интернете, исключения с плавающей запятой обычно генерируются, когда вы пытаетесь разделить на ноль или возникает бесконечное значение, но я не понимаю, как я получаю возникновение любой из этих проблем.
Мой код проходит через главное, где числа 1-50 добавляются и удаляются, но я получаю ошибку, как только я начинаю настройку массива для хранения простых чисел (после arr.erase (arr [0]) в главном)
Я просто установил пару тегов в основном, чтобы найти, как мой номер выглядит в while ((j<arr.size()) && (i%arr[j]!=0))
и я обнаружил, что мои цифры до аварии
j = 1 and arr[j] = 2
i = 5 and arr.size() = 4
Задача ещё не решена.