Удаление/вставка/объединение массивов на C++
После добавления цикла while() код начал плохо выполняться: при использовании функции 3 удаляется нужный элемент, но ещё и крайний, а если попытаться использовать после этого функцию объединения массивов 4, то вылетает консоль; если изначально использовать функцию 4 сначала, в дальнейших вызовах функций используется стартовый массив, а не тот, что получили после объединения.
Код:
#include <iostream>
#include <conio.h>
#include <time.h>
#include <cstdlib>
#include <iterator>
#include <algorithm>
using namespace std;
// Ф-ция заполнения массива числами
void fillArr(int* arr, int size, int d1, int d2);
// Сортировка массива
void sortArr(int* arr, int size);
// Вывод массива на консоль
void printArr(int* arr, int size, char* name);
// Поиск индекса
int findPos(int* arr, int size, int x);
void printFunc1(int* arr, int size);
// Вставка элемента в массив
void addToArr(int* arr, int size, int x);
void printFunc2(int* arr, int size);
// Удаление элемента с массива
void delFromArr(int* arr, int size, int x);
void printFunc3(int* arr, int size);
// Объединение массивов
void mergeArrs(int* arr, int* arr2, int size, int size2);
void printFunc4(int* arr, int size);
int main()
{
int size, d1, d2;
cout << "Enter the size of array: ";
cin >> size;
int *array = new int[size];
int *arr=array;
cout << "Enter limitation with using space: ";
cin >> d1 >> d2;
fillArr(arr, size, d1, d2);
sortArr(arr, size);
char* name = "Standart array: ";
printArr(arr, size, name);
while(True){
char key;
cout << "Choose function" << endl;
cout << "1. Find element" << endl;
cout << "2. Paste element in array" << endl;
cout << "3. Delete element from array" << endl;
cout << "4. Combining two arrays" << endl;
cout << "\nFunction #";
cin >> key;
switch (key) {//вибір між функціями
case'1':
printFunc1(arr, size);
break;
case'2':
printFunc2(arr, size);
break;
case'3':
printFunc3(arr, size);
break;
case'4':
printFunc4(arr, size);
break;
}
}
delete[]arr;
}
void fillArr(int* arr, int size, int d1, int d2) {
srand(time(NULL));
for (int i = 0; i < size; i++)
arr[i] = rand() % (d2 - d1) + d1;
}
void sortArr(int* arr, int size) {
for (int k = 1; k < size; k++) {
for (int i = 1; i < size; i++) {
if (arr[i] > arr[i - 1])
swap(arr[i], arr[i - 1]);
}
}
}
void printArr(int* arr, int size, char* name) {
cout << name << " " << endl;
for (int i = 0; i < size; i++)
cout << arr[i] << ' ';
cout << endl;
}
int findPos(int* arr, int size, int x) {
for (int i = 0; i < size; i++)
if (x == arr[i])
return i;
}
void printFunc1(int* arr, int size) {
int x;
cout << "Enter any element from array: ";
cin >> x;
cout << "Index - " << findPos(arr, size, x) << " (In order - " << findPos(arr, size, x) + 1 << ")" << endl;
}
void addToArr(int* arr, int size, int x) {
int left = 0, right = size - 1;
while (left <= right) {
int pos = (right + left) / 2;
if (x > arr[pos])
right = pos - 1;
else left = pos + 1;
}
int i;
for (i = size; i > right; i--)
arr[i + 1] = arr[i];
arr[i + 1] = x;
}
void printFunc2(int* arr, int size) {
int x;
cout << "Enter element for pasting: ";
cin >> x;
addToArr(arr, size, x);
size++;
char* name = "New array: ";
printArr(arr, size, name);
}
void delFromArr(int* arr, int size, int x) {
int pos = findPos(arr, size, x);
for (int i = pos; i < size; i++) {
arr[i] = arr[i - 1];
}
}
void printFunc3(int* arr, int size) {
int x;
cout << "Enter any element fro array to delete ";
cin >> x;
delFromArr(arr, size, x);
size--;
char* name = "New array: ";
printArr(arr, size, name);
}
void mergeArrs(int *arr, int *arr2, int size, int size2){
int newSize = size+size2, i=0, j=0, k=0;
int *newArr = new int[newSize];
int *arr1=newArr;
while(i<size && j<size2){
if(arr[i]>arr2[j])
newArr[k++]=arr[i++];
else newArr[k++]=arr2[j++];
}
for(i=i; i<size; i++, k++)
newArr[k]=arr[i];
for(j=j; j<size2; j++, k++)
newArr[k]=arr2[j];
char* name = "Completed array: ";
printArr(arr1,newSize,name);
}
void printFunc4(int* arr, int size) {
int size2, d1, d2;
cout << "Enter size of second array: ";
cin >> size2;
int *array2 = new int[size2];
int *arr2=array2;
cout << "Enter limitation: ";
cin >> d1 >> d2;
fillArr(arr2, size2, d1, d2);
sortArr(arr2, size2);
char* name = "Standar array 2: ";
printArr(arr2, size2, name);
mergeArrs(arr, arr2, size, size2);
}
Заранее спаибо.
Ответы (1 шт):
Первое, что отмечу: вместо char* намного лучше, удобнее и полезнее использовать string. Просто поменяйте char* на string и всё.
Далее по вопросу, в вашей функции delFromArr вы делаете это
for (int i = pos; i < size; i++) {
arr[i] = arr[i - 1];
но как я понимаю, вы хотите именно удалить элемент из массива, а не заменить с определённой позиции элементы на предыдущие, так как именно это и выполняет функция.
Лучше используйте это:
void dell(int*& arr, int size, int x) {
int pos = findPos(arr, size, x);
int* arr2 = new int[size-1];
for (int i = 0, j = 0; i < size; i++, j++) {
if (i == pos)
i++;
arr2[j] = arr[i];
}
arr = arr2;
}
Надеюсь вопрос был мною понят правильно и ответ будет полезен.