0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
1

Удаление элементов из целочисленного одномерного массива

05.11.2014, 18:57. Показов 11343. Ответов 10
Метки нет (Все метки)

Доброго времени суток!
У меня возникла небольшая проблема и после нескольких дней безуспешных попыток найти ошибку я решил обратиться к вам.

Сначала задание:
Разработать и испытать функцию, которая удаляет из целочисленного одномерного массива все элементы, совпадающие по значению с его начальным элементом, и возвращает новый размер массива.

Далее код программы которую я написал, причем скажу сразу - у меня большое подозрение, что ошибка в разделе "//Удаление элементов массива равных первому элементу массива"
Так же (но это не столь критично) прошу найти ошибку в разделе "//Проверка на повторный запуск"
Заранее спасибо!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
bool iDel(int *array, int &lenAr, int nom)
{
    if ( nom > lenAr || nom < 1)
    {
        cout << "Ошибка удаления" << endl;
        return false;
    }
 
    for(int ix = nom - 1; ix < lenAr - 1; ix++)
    {
        array[ix] = array[ix + 1];
    }
    lenAr--;
    return true;
}
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 const int ogran = 10;
 int n;
 int *arr1=NULL;
 int *arr2;
 int i;
 int j;
 int temp;
 char answer[3];
 bool fl=1;
 n=0;
 
 //считывание прекращается после перехода на новую строку или по достижению 10 чисел
 while(fl) {
 cout<<"Введите массив целых чисел, их кол-во не более "<<ogran<<":"<<endl;
 while ((cin.peek()!=10)&&(n<ogran)) 
 {
  ++n;
  if (n>=ogran)
  {cout<<"\nОшибка! Программа завершает работу"<<endl;
   _getch();
   return (0);
  }
  arr2=new int [n];
  if (arr1!=NULL)
  {
   for (i=n-2; i>=0; --i)
   {
    arr2[i]=arr1[i];
   }
   delete [] arr1;
  }
  arr1=arr2;
  cin>>arr2[n-1]; //ввод элементов массива
 }
 
 int x = arr1[0];
 
 //Удаление элементов массива равных первому элементу массива
 for (i=1; i<=n; ++i) 
 {
   if (arr1[i]==x)
   {
    iDel(arr1, n, arr1[i]);
   }
 }
 
 //Вывод массива и его нового размера
 cout<<"\nSixe of array: "<< n <<endl;
 cout<<"\nNew array: "<<endl;
 for (i=0; i<n; ++i)
 {
  cout<<arr1[i]<<' ';
 }
 cout<<endl;
 
//Проверка на повторный запуск
 cout << "Запустить повторно? (Y\\N)" << endl;
        while(1){
            cin >> answer;
            fflush(stdin);
            if(((answer[0]=='N')||(answer[0]=='n'))&&(answer[1]=='\0')){    //Ответ отрицательный
                fl=0;
                break;
            }
            else{
                if(((answer[0]=='Y')||(answer[0]=='y'))&&(answer[1]=='\0')) //Ответ положительный
                    break;
                else                                                        //Некорректный ввод
                    cerr << endl << "Ошибка ввода! Запустить повторно? (Y\\N)";
            }
            cout << endl;
        }
 return 0;
 }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.11.2014, 18:57
Ответы с готовыми решениями:

Вычислить значения 42 элементов одномерного целочисленного массива
Вычислить значения 42 элементов одномерного целочисленного массива Y в интервале (-10, 6) с...

Найти сумму элементов одномерного целочисленного массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;Windows.h&gt; using namespace std; int...

Для одномерного целочисленного массива найти количество и процентное соотношение отрицательных элементов
Люди добрые, помогите! Для одномерного целочисленного массива из 10 элементов найти количество и...

Удаление элементов из одномерного массива
Как изменить программу, чтобы она удаляла нечетные элементы? #include&lt;iostream&gt; #include...

10
365 / 321 / 219
Регистрация: 21.02.2013
Сообщений: 756
05.11.2014, 19:48 2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
 
using namespace std;
int* f(int* a, size_t& size, const size_t& index)
{
 
    int* temp = new int[size - 1];
    for(size_t i = 0, j = 0; i != size; i++)
    {
        if(i == index)
          continue;
 
        temp[j] = a[i];
        j++;
 
    }
    delete[] a;
    size--;
    return temp;
 
}
 
int main()
{
    size_t size = 5;
    int* a = new int[size];
 
    for (size_t i = 0; i < size; i++)
    {
        cin >> a[i];
    }
 
    int x = a[0];
 
 
/////////Удаление элементов массива равных первому элементу массива
//только тут первый элемент всегда остается остается
//сильно не вникал в твой код но может пригодится
    for (size_t i = 1; i < size; i++)
    {
        if(a[i]== x)
       a = f(a, size, i);
    }
    for (size_t i = 0; i < size; i++)
    {
        cout << a[i] << " ";
    }
 
 
 
    return 0;
}
1
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
05.11.2014, 20:04 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
int delFirst(int arr1[], int arr2[], int n){
    int del = 1;
    arr2[0] = arr1[0];
    for (int i = 1, j = 0; i < n; i++){
        if (arr1[i] != arr1[0])
            arr2[j++] = arr1[i];
        else if (arr1[i] == arr1[0])
            del++;
    }
    return del;
}
 
int main(){
    const int LIM = 10;
    int array[LIM] = {1, 2, 3, 1, 5, 6, 1, 8, 9, 10};
    int resArray[LIM];
    for (int i = 0; i < LIM - delFirst(array, resArray, LIM); i++)
        std::cout << resArray[i] << ", ";
    std::cout << std::endl;
 
    return 0;
}
1
3 / 3 / 5
Регистрация: 01.11.2014
Сообщений: 19
05.11.2014, 22:03 4
Кликните здесь для просмотра всего текста
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
 
int size(int *a, int s)
{
    for(int i(1); i < s; i++){
        if(a[i] == a[0]) {
            for(int j(i); j < s-1; j++)
                a[j] = a[j+1];
            s--;
        }
    }
    return s;
}
 
int main(){
    srand(time(0));
    int N  = 10;
    int a = 1, b = 5;
    int *ar;
 
    ar = (int*) malloc(N * sizeof(int));
 
    for(int i(0); i < N; i++){
        ar[i] = rand() % (b - a + 1) + a;
        printf("%i ", ar[i]);
    }
    printf("\n");
 
    N = size(ar,N);
 
    ar = (int*) realloc(ar,N * sizeof(int));
 
    for(int i(0); i < N; i++){
        printf("%i ", ar[i]);
    }
 
    free(ar);
 
    system("pause > nul");
    return 0;
}
1
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
06.11.2014, 13:43  [ТС] 5
Спасибо всем огромное!
Дальше постараюсь доделать самостоятельно

Добавлено через 4 часа 53 минуты
Что изменить в функции, что бы первый элемент (с которым сравнивают) массива не удалялся?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
int size(int arr1[], int arr2[], int n){
    int del = 1;
    arr2[0] = arr1[0];
    for (int i = 1, j = 0; i < n; i++){
        if (arr1[i] != arr1[0])
            arr2[j++] = arr1[i];
        else if (arr1[i] == arr1[0])
            del++;
    }
    del = n - del;
    return del;
}
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 const int ogran = 10;
 int n,i,j;
 int *arr1=NULL;
 int *arr2;
 n=0;
 
 //считывание прекращается после перехода на новую строку или по достижению 10 чисел
 cout<<"Введите массив целых чисел, их кол-во не более "<<ogran<<":"<<endl;
 while ((cin.peek()!=10)&&(n<ogran+1)) 
 {
  ++n;
  if (n>=ogran+1)
  {cout<<"\nОшибка! Программа завершает работу"<<endl;
   _getch();
   return (0);
  }
  arr2=new int [n];
  if (arr1!=NULL)
  {
   for (i=n-2; i>=0; --i)
   {
    arr2[i]=arr1[i];
   }
   delete [] arr1;
  }
  arr1=arr2;
  cin>>arr2[n-1]; //ввод элементов массива
 }
 int *ar;
 
 ar = (int*) malloc(n * sizeof(int));
 n = size(arr1, ar, n);
 
 ar = (int*) realloc(ar,n * sizeof(int)); 
 //Вывод массива и его нового размера
 cout<<"\nРазмер нового массива: "<< n <<endl;
 cout<<"\nНовый массив: "<<endl;
 for (i=0; i<n; i++)
 {
  cout<<ar[i]<< " ";
 }
 cout<<endl;
 
    free(ar);
    system("pause > nul");
 return 0;
}
0
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
06.11.2014, 14:19 6
Попробуйте начальное значение j в цикле for установить 1. Скорее всего, придется изменить и начальное значение del. Возможно, еще что-то потянется) Пробуйте.
0
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
06.11.2014, 14:58  [ТС] 7
я пробовал уже, тогда первый элемент нового массива остается, но последний исчезает
0
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
06.11.2014, 15:52 8
MixaelMitre, в цикле for, который выводит полученный массив, увеличьте искусственно количество итераций на 1 (i <= n). Если последний элемент массива выведется, значит, скорее всего, функция неправильно определяет количество элементов в новом массиве. Можете подебажить, конечно, с трассировкой переменных, но, по мне, в таких коротеньких программах проще экспериментировать прямо с кодом и смотреть на результат.
0
16 / 16 / 6
Регистрация: 03.11.2014
Сообщений: 72
06.11.2014, 17:15 9
Предлагаю идею для реализации функции.пусть она принимает два параметра указатель на тип элементов массива и количество элементов в массиве.
Потом через цикл for идти от конца массива к началу и искать элементы равные первому .храня число значимых для нас элементов массива.если мы наткнулись на элемент равный первому то менять местами последний значимый с тем который равен первому и уменьшить количество значимых элементов на один а первый элемент не сравнивать с самим собой.потом выделить память уже измененной величины туда переписать данные, поменять местами указатели освободить данные по указателю созданному в функции и выйти из функции
В функцию пихать массив и его размер.
0
0 / 0 / 0
Регистрация: 19.10.2014
Сообщений: 22
06.11.2014, 18:57  [ТС] 10
Хм.. интересно получается...

Кстати, а не подскажите как очистить массивы и память для повторного использования программы?
Попробуйте пожалуйста прогнать прогу, я что-то совсем запутался

ЗЫ пробовал использовать memset но что-то не получается

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
using namespace std;
 
int size(int arr1[], int arr2[], int n){
    int del = 1;
    arr2[0] = arr1[0];
    for (int i = 1, j = 0; i < n; i++){
        if (arr1[i] != arr1[0])
            arr2[j++] = arr1[i];
        else if (arr1[i] == arr1[0])
            del++;
    }
    del = n - del;
    return del;
}
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 const int ogran = 10;
 int n,i,j;
 int *arr1=NULL;
 int *arr2;
 n=0;
 char answer[3];
bool fl=1;
while(fl)
    {
 //считывание прекращается после перехода на новую строку или по достижению 10 чисел
 cout<<"Введите массив целых чисел, их кол-во не более "<<ogran<<":"<<endl;
 while ((cin.peek()!=10)&&(n<ogran+1)) 
 {
  ++n;
  if (n>=ogran+1)
  {cerr<<"\nОшибка!!! Выход из программы!"<<endl;  
  _getch ();
  return 0;
  }
  
  arr2=new int [n];
  if (arr1!=NULL)
  {
   for (i=n-2; i>=0; --i)
   {
    arr2[i]=arr1[i];
   }
   delete [] arr1;
  }
  arr1=arr2;
  cin>>arr2[n-1];//ввод элементов массива
 }
 
 int *ar;
 ar = (int*) malloc(n * sizeof(int));
 n = size(arr1, ar, n);
 
 ar = (int*) realloc(ar,n * sizeof(int)); 
 //Вывод массива и его нового размера
 cout<<"\nРазмер нового массива: "<< n <<endl;
 cout<<"\nНовый массив: "<<endl;
 for (i=0; i<n; i++)
 {
  cout<<ar[i]<< " ";
 }
 cout<<endl;
    free(ar);
    //memset(arr2, 0, sizeof(arr2) / sizeof(arr2[0]));
    cout << "Запустить повторно? (Y\\N)" << endl;
        while(1){
            cin >> answer;
            fflush(stdin);
            if(((answer[0]=='N')||(answer[0]=='n'))&&(answer[1]=='\0')){    //Ответ отрицательный
                fl=0;
                break;
            }
            else{
                if(((answer[0]=='Y')||(answer[0]=='y'))&&(answer[1]=='\0')) //Ответ положительный
                    break;
                else                                                        //Некорректный ввод
                    cerr << endl << "Ошибка ввода! Запустить повторно? (Y\\N)";
            }
            cout << endl;
        }
 
    }
 return 0;
}
0
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
08.11.2014, 02:01 11
Цитата Сообщение от MixaelMitre Посмотреть сообщение
Попробуйте пожалуйста прогнать прогу, я что-то совсем запутался
прогнать не получится, ибо gcc.
Цитата Сообщение от MixaelMitre Посмотреть сообщение
Кстати, а не подскажите как очистить массивы и память для повторного использования программы?
new, delete? нет?

При беглом просмотре кода у вас new, delete, free(), malloc(), realloc() в одном флаконе + нулевые указатели. Мне кажется, многовато для такой задачки, очень лениво парсить ваш код. Попробуйте упростить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2014, 02:01
Помогаю со студенческими работами здесь

Удаление элементов целочисленного одномерного массива, кратных первому элементу этого массива
Составьте программу удаления элементов целочисленного одномерного массива A(N),кратных первому...

Вычислить значения 36 элементов одномерного целочисленного массива
программу записал, но нужно проверить, есть ошибка в нахождении максимального значения ...

Вычислить значения элементов одномерного целочисленного массива Y в интервале (-8 ,8)
Люди добрые, помогите пожалуйста решить это задание. Прошу многого, конечно, но всё же попытка не...

Вывести на экран содержимое элементов целочисленного одномерного массива
Ребята помогите! Нужно довести до ума исходник. Вывести на экран содержимое элементов буфера. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru