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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 05.01.2010, 18:38   #1
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
Подмигивание массив, с++

Человечки, с Новым Годом Вас !! И наступающим Рождеством !! Чудненькой жизни и чудесного настроения !!

И так, вот наступил 2010 год и почему-то стукнуло в голову продолжать изучать программирование!! Но почему-то как-то программку не получается написать...
Решила обратиться за помощью к профессионалам, которые еще очень отзывчивые и очень умные!!

Вот задачка, с которой у меня проблемка:
Задан массив а1, а2,…аn . Перенести в другой массив те элементы, которые встречаются один раз, исключив их из первого, а элементы, встречающиеся в массиве А более одного раза исключить, оставив по одному.

Последний раз редактировалось elka; 06.01.2010 в 18:36.
elka вне форума
Старый 05.01.2010, 19:36   #2
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Код:
#include <iostream>
#include <algorithm>
#include <iterator>
#include <functional>

template<typename T>
class func_: public std::unary_function<T, bool>{
public:
	func_(T *f, T *l){
		_size = std::distance(f, l);
		arr = new T[_size];
		std::copy(f, l , arr);
	}

	~func_() { delete[] arr; }

	bool operator () (const T x) const {
		return ( std::count(arr, arr + _size, x) == 1 );
	}
private:
	T *arr;
	unsigned _size;
};
int main()
{
	int arr_a[10] = {1,1,2,4,5,5,6,8,8,9};
	int arr_b[10] = {0};

	std::copy(arr_a, arr_a + 10, std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;

	std::remove_copy_if(arr_a, arr_a + 10, arr_b, std::not1(func_<int>(arr_a, arr_a + 10)));

	std::copy(arr_b, arr_b + 10, std::ostream_iterator<int>(std::cout, " "));
	std::cout << std::endl;


	int *lend = std::remove_if(arr_a, arr_a + 10, func_<int>(arr_a, arr_a + 10));
	lend = std::unique(arr_a, lend);

	std::fill(lend, arr_a + 10, 0);
	std::copy(arr_a, arr_a + 10, std::ostream_iterator<int>(std::cout, " "));

	return 0;
}
Цитата:
Сообщение от Result
1 1 2 4 5 5 6 8 8 9
2 4 6 9 0 0 0 0 0 0
1 5 8 0 0 0 0 0 0 0
Для продолжения нажмите любую клавишу . . .
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....

Последний раз редактировалось ISergeyN; 05.01.2010 в 20:20.
ISergeyN вне форума
Старый 05.01.2010, 19:48   #3
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Спасибочки, ISergeyN.

А как можно теперь выплнить еще вот это:
1) размер массива должен вводится с клавиатуры;
2) при формировании элементов массива необходимо предусмотреть выбор варианта: случайным образом, вводом с клавиатуры или вводом из файла;
3) при выборе ввода массива с клавиатуры, должен быть предусмотрен удобный интерфейс ввода данных;
4) при вводе из файла при недостаточном объеме данных элементы массива, для которых не хватило значений, заполняются нулями;
5) сформированный массив отобразить на экране;
6) предусмотреть вывод промежуточных результатов и результатов обработки на экран и /или в файл;
7) при выводе на экран выделять другим цветом элементы, удовлетворяющие условию обработки ?
elka вне форума
Старый 05.01.2010, 20:19   #4
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
7) при выводе на экран выделять другим цветом элементы, удовлетворяющие условию обработки ?
К С++ никакого отношения не имеет.. Нужно будет c WinApi ( если для Windows ) голову морочить..
Цитата:
1) размер массива должен вводится с клавиатуры;
Код:
	int size;
	std::cout << "Input Size: "; std::cin >> size;
	int *arr_a = new int[size];
	.....
	delete[] arr_a;
Цитата:
2) при формировании элементов массива необходимо предусмотреть выбор варианта: случайным образом, вводом с клавиатуры или вводом из файла;
Ввод с клавиатуры..
Код:
	for(int i = 0; i < size; ++i){
		std::cout << "Input arr[" << i + 1 << "]: ";
		std::cin >> arr_a[i];
	}
Для ввода с файла учимся сами Input/Output with files
Цитата:
4) при вводе из файла при недостаточном объеме данных элементы массива, для которых не хватило значений, заполняются нулями;
5) сформированный массив отобразить на экране;
Проще сначала нулями забить а потом считывать.
Код:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>

int main(){
	std::ofstream ofile("file.txt"); // для записи
	int arr[5] = {1,2,3,4,5};

	for(int i = 0; i < 5; ++i)
		ofile << arr[i] << ' ';

	// или так можно записать
	//std::copy(arr, arr + 5, std::ostream_iterator<int>(ofile, " "));

	ofile.close();

	//чтение файла

	std::ifstream ifile("file.txt");

	int arr_a[10] = {0}; // Запонен '0'
	if(ifile.is_open()){
		//Можно так
		std::copy(std::istream_iterator<int>(ifile), std::istream_iterator<int>(), arr_a);

		//или так

		/*
		int i = 0;
		while( !ifile.eof() ) ifile >> arr_a[i++];
		*/

		ifile.close();
	}
//Вывод на экран
	std::copy(arr_a, arr_a + 10, std::ostream_iterator<int>(std::cout, " "));
}
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума
Старый 05.01.2010, 20:32   #5
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

ISergeyN,
что-то я не могу понять как организован сам алгоритм переноса равных элементов. Объясните, пожалуйста.
elka вне форума
Старый 05.01.2010, 20:48   #6
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

Цитата:
что-то я не могу понять как организован сам алгоритм переноса равных элементов
Я не совсем понял что вам не понятно..
То как формулируется первый массив 2 4 6 9 0 0 0 0 0 0
Или второй 1 5 8 0 0 0 0 0 0 0
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума
Старый 05.01.2010, 21:08   #7
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

То, как получили первый массив без одиннаковых элементов и то, как получили второй с теми элеметами.
elka вне форума
Старый 05.01.2010, 21:29   #8
ISergeyN
Maniac
Форумчанин
 
Аватар для ISergeyN
 
Регистрация: 03.01.2009
Сообщений: 450
По умолчанию

хм.. Чтобы объяснить принцип работы вам необходимо знать как работают эти функции (иначе приведется писать целую поэму)
remove_if - удаляет (перемещает в конец) элементы по заданному условию
remove_copy_if - тоже самое что и выше только исходный контейнер не изменим (результат помещается в другой)
unique - удаляет (перемещает в конец) все повторяющие элементы..


По всём остальном вам необходимо немного почитать книги...
Например по STL можно взять "STL для программистов С++" Леен Аммерааль..
Просто по С++ думаю сами найдете.

Здесь куча литературы http://www.programmersforum.ru/showthread.php?t=31602

Дерзайте..
Стандартные библиотеки разработаны с учетом многолетнего опыта лучших программистов и они не больны "детскими болезнями крутизны в программизме"....
ISergeyN вне форума
Старый 05.01.2010, 22:09   #9
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Я думаю, автору будет полезнее самому поразвивать свой мозг и написать функции для редактирования, либо поразд\бираться в кодах таких функций, а не использовать библиотечные...
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума
Старый 06.01.2010, 18:53   #10
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Ой, а можно же без шаблончиков O_o решить эту задачку? А то мне что-то жутковато становится, когда я смотрю на программки такого уровня. >_<

Можно же с помощью классов, например, что-то такое:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>

class massiv
{

  private:
    int n;
    int *a;

  public:
    massiv();
    void vvod_1();
    void vvod_2();
    void vvod_3();
    void vivod();
    void poisk();
    void udalenie();

    ~massiv()
    {
      delete[]a;
      printf("\n\n  rabotal destructor");
    }

};

massiv::massiv()
{
  a=new int[n+1];
  printf("\n rabotal konstructor 1");
}


void massiv::vvod_1()
{
  int i;

  printf("\n vvedite kol-vo elementov massiva:  ");
  scanf("%d",&n);
  for (i=0;i<n;i++)
  *(a+i)=-25+0.5*random(500);
}


void massiv::vvod_2()
{
  int i;

  printf("\n vvedite kol-vo elementov massiva:  ");
  scanf("%d",&n);
  for (i=0;i<n;i++)
  {
    printf("\n vvedite element massiva:  ");
    scanf("%d",(a+i));
  }
}


void massiv::vvod_3()
{
  FILE *f1;
  int i,t=0,kol=0,l;

  printf("\n vvedite kol-vo elementov massiva:  ");
  scanf("%d",&n);

  f1=fopen("D:\\BC\\BIN\\massiv.txt","r");
  while (!feof(f1))
  {
    fscanf(f1,"%d",(a+kol));
    kol++;
  }
  fclose(f1);

  f1=fopen("massiv.txt","r");
  while (!feof(f1))
  {
    l++;
    if (l<=kol) 
      fscanf(f1,"%d",&t);
	else 
	  t=0;
	*(a+i)=t;
  }
  fclose(f1);
}


void massiv::vivod()
{
  int i;

  printf("\n");
  for (i=0;i<n;i++)
  printf(" %3d",*(a+i));

}

void massiv::poisk()
{

}


void massiv::udalenie()
{

}


void main()
{
  clrscr();
  int nom,B=100,gdriver=DETECT, gmode,errorcode,n;;
  massiv A,B;

 initgraph(&gdriver,&gmode,"D:/BC/BGI");
 errorcode=graphresult();
  if (errorcode!=grOk)
      {printf("osibka%d\n",errorcode);
      printf("press any key");

 getch();
 exit(1);
 }

   printf("\n massiv sform. slych. obrazom nagmi 1");
   printf("\n chtobi vvesti massiv s klaviatyri nagmi 2");
   printf("\n chtobi vivesti massiv iz fajla nagmi 3");
   met:
printf("\n");
 scanf("%d",&nom);
switch(nom)
 {
case 1:

printf("\n\n isxodnij massiv\n");

A.vvod_1();
A.vivod();
A.poisk();
printf("\n\n massiv raznih elementov \n");
B.vivod();
A.udalenie();
printf("\n\n massiv posle udaleniya \n");
A.vivod();
getch();

break;

case 2:

A.vvod_2();
A.vivod();
A.poisk();
printf("\n\n massiv raznih elementov \n");
B.vivod();
A.udalenie();
printf("\n\n massiv posle udaleniya \n");
A.vivod();
getch();

break;

case 3:

printf("\n\n isxodnij massiv\n");

A.vvod_3();
A.vivod();
A.poisk();
printf("\n\n massiv raznih elementov \n");
B.vivod();
A.udalenie();
printf("\n\n massiv posle udaleniya \n");
A.vivod();
getch();

break;

default:
{printf("neverniy variant");
goto met;
}
}

getch();

}
Но, может, лучше описать другой массив, как наследник первого? И помогите, пожалуйста, написать ф-ции, которые выполняют нужные в задании действия.
Cначала нужно найти те элементы массива А, которые встречаются один раз и выполнить это в ф-ции void poisk(), затем как-то перенести их в другой массив В и его вывести, а потом удалить их из первого ф-цией void udalenie(), но, наверное нужно передать как-то эти элементы в ф-цию, но как? Потом найти элементы массива А, встречающиеся более одного раза ф-цией void poisk(), затем исключить их, оставив по одному, ф-цией void udalenie().
Правельный ход решения или нет? Если да, то как написать ф-ции void poisk() и void udalenie()? Жду ваших комментариев. ^_^
elka вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40
МАССИВ Artom Паскаль, Turbo Pascal, PascalABC.NET 0 13.05.2009 13:05
Массив юра 3 Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2008 18:15
Упорядочить массив в порядке возрастания и напечатать входной и исходный массив. TheVenny Помощь студентам 3 26.11.2008 15:06
Массив в С++ !!!!! Общие вопросы C/C++ 3 10.11.2008 10:07