Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2014, 19:01   #1
MixaelMitre
 
Регистрация: 19.10.2014
Сообщений: 5
По умолчанию C++ удаление элементов из целочисленного одномерного массива

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

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

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

Код:
 #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;
 }
}
MixaelMitre вне форума Ответить с цитированием
Старый 06.11.2014, 13:41   #2
MixaelMitre
 
Регистрация: 19.10.2014
Сообщений: 5
По умолчанию

Код:
#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;
}
что изменить в функции, что бы первый элемент (с которым сравнивают) массива не удалялся?
MixaelMitre вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск,удаление и вставка элементов одномерного массива.Delphi.Программа для курсовой работы. snord123 Помощь студентам 1 06.05.2014 18:22
нахождение всех совершенных чисел среди элементов целочисленного массива ( С++ ) Юлия10 Помощь студентам 2 06.02.2014 00:40
Найти сумму элементов одномерного массива TadyT Помощь студентам 1 23.01.2013 20:22
Как обнулить элементы строки двумерного массива, содержащей наибольшее количество элементов одномерного массива griignat Помощь студентам 1 22.11.2011 20:04
удаление элемента из одномерного массива V@mpire Общие вопросы C/C++ 1 02.06.2010 22:01