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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2010, 15:10   #1
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
Стрелка одинаковые элементы массива на си

Здрасте, здрасте!! ^_^V

Уважаемы господа программисты и те, кто сюда просто зашел полюбопытствовать,
очень прошу обратить внимаение на мою тему.

Итак, имеется задачка, которую срочно-и-нужно решить. Наработочки мои есть, но нужно дописать
некоторые ф-ции.

Вот задачка:
Цитата:
Задан массив а1, а2,…аn . Перенести в другой массив те элементы, которые встречаются один раз, исключив их из первого, а элементы, встречающиеся в массиве А более одного раза исключить, оставив по одному.
Вот мои наработки:
Код:
#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,gdriver=DETECT, gmode,errorcode,n;;
  massiv A;

 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");
A.vivod_2();
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");
A.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");
A.vivod();
A.udalenie();
printf("\n\n massiv posle udaleniya \n");
A.vivod();
getch();

break;

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

getch();

}
elka вне форума Ответить с цитированием
Старый 14.01.2010, 15:18   #2
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Но вот как создать второй массив. Может сделать класс, который наследуется? Или просто в конструкторе и деструкторе выделить память и сформировать массив?

А как еще найти нужные элементы? Вот я что-то попыталась сотворить, но что-то оно не работает и на нажатия кнопочек не реагигует.
Посмотрите, пожалуйста:
Код:
void massiv::poisk()
{
  int i, j;
  for (i=0;i<n;i++)
    for (j=0;i<n;j++)
  {
    if( *(a+i)==*(a+i+1))
   { *(b+j)==*(a+i);
     *m++;   }
   }
}
Правда, когда я включала эту ф-цию, то код был таким:
Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>

class massiv
{

  private:
    int n;int*m;
    int *a;
    int *b;
  public:
    massiv();
    void vvod_1();
    void vvod_2();
    void vvod_3();
    void vivod();
    void vivod_2();
    void poisk();
    void udalenie();

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

};

massiv::massiv()
{
  a=new int[n+1];

  b=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::vivod_2()
{
  int i;

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

}
void massiv::poisk()
{
  int i, j;
  for (i=0;i<n;i++)
    for (j=0;i<n;j++)
  {
    if( *(a+i)==*(a+i+1))
   { *(b+j)==*(a+i);
     *m++; printf("%3d",*m);   }
   }
}


void massiv::udalenie()
{

}


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

 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");
A.vivod_2();
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");
A.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");
A.vivod();
A.udalenie();
printf("\n\n massiv posle udaleniya \n");
A.vivod();
getch();

break;

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

getch();

}
Как исправлять? Посоветуйте что-то...
elka вне форума Ответить с цитированием
Старый 14.01.2010, 15:19   #3
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Пожалуйста))

Хоть на какую-нибудь мысль натолкните

Последний раз редактировалось Stilet; 18.01.2010 в 10:50.
elka вне форума Ответить с цитированием
Старый 14.01.2010, 21:18   #4
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

навожу на мысль: можно записать это всё намного короче.
Alex_FF вне форума Ответить с цитированием
Старый 14.01.2010, 22:23   #5
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Нельзя. По требованиям нельзя. Нужно несколько способов ввода массива. И выбор способа.
Или можно объединить поиск и удаление?

Так сложно ответить?

Последний раз редактировалось Stilet; 18.01.2010 в 10:50.
elka вне форума Ответить с цитированием
Старый 16.01.2010, 10:20   #6
Phantomus
 
Регистрация: 16.01.2010
Сообщений: 5
По умолчанию

В чем проблема? В выполнении требований задачи, в реализации алгоритма с использованием классов или в самом алгоритме?
Алгоритм элементарен:
Идем по исходному массиву для каждого i элемента проверяем все j элементы от i+1 до N на предмет совпадения с i. Если massiv[i]==massiv[j] то отмечаем это во флаге и j элемент затираем. Если проверели все элементы и совпадений не нашли (флаг) то i элемент отправляем во второй массив.
Дальше по желанию можно из первого массива убрать все дырки (то есть затертые элементы).
Phantomus вне форума Ответить с цитированием
Старый 17.01.2010, 03:51   #7
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

Цитата:
В чем проблема?
Как будет выглядеть реализация алгоритма с использованием классов?
Если впихнуть этот алгоритм в программку?
Вроде та, которая написана первой, рабочая и в нее можно впихнуть ф-цию обработки...

Как можно убрать дырки? И как затереть, а как отправить??

Можно это все написать с помощью методов класса?

Помогите, пожалуйста. Объясните как написать этот метод обработки объекта массивов

Последний раз редактировалось Stilet; 18.01.2010 в 10:52.
elka вне форума Ответить с цитированием
Старый 18.01.2010, 01:23   #8
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну вот сделал такое. Функцию main полностью делать не стал, т.к. там используется специфическая графика под DOS. Нет желания ставить. Если надо переделай свою функцию main под мой пример.

Вод код, предпочёл большую часть переделать чтобы было красиво.

Код:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <graphics.h>

class massiv
{
private:
	int* data;
	int dataSize;
public:
	massiv();
	~massiv();
    massiv(const massiv& a); // Конструктор копирования
	void SetSize(int value);
	int GetSize();
	int* GetDataRef();
	int GetDataByIndex(int index);
	void SetDataByIndex(int index,int value);

	void GetUniqElementsToMassiv(massiv &m);
	bool IsElementUnique(int index);

	void DeleteElementByIndex(int index);
	void DeleteElementByValue(int value);
	void DeleteElementsByValuesInMassiv(massiv &d);

	void DeleteDubles();


	void vvod_1();
	void vvod_2();
	void vvod_3();
	void vivod();
};

massiv::massiv()
{
	data = NULL;
	dataSize = 0;
}
massiv::~massiv()
{
	free(data);
}
massiv::massiv(const massiv& a)
{
	data = NULL;
	SetSize(a.dataSize);
	memcpy(data,a.data,a.dataSize*sizeof(int));
}
void massiv::SetSize(int value)
{
	dataSize = value;
	data = (int*) realloc(data,sizeof(int)*dataSize);
}
int massiv::GetSize()
{
	return (dataSize);
}

int* massiv::GetDataRef()
{
	return (data);
}

int massiv::GetDataByIndex(int index)
{
	return (data[index]);
}

void massiv::SetDataByIndex(int index,int value)
{
	if (index>=dataSize)
	{
		SetSize(index+1);
	}
	data[index] = value;
}

void massiv::GetUniqElementsToMassiv(massiv &m)
{
	m.SetSize(dataSize);
	int p = 0;
	for (int i=0;i<dataSize;i++)
	{
		if (IsElementUnique(i))
		{
			m.data[p] = data[i];
			p++;
		}
	}
	m.SetSize(p);
}

bool massiv::IsElementUnique(int index)
{
	bool isUnique = true;
	for (int j = 0;(j<index)&&(isUnique);j++)
	{
		if (data[j]==data[index]) { isUnique = false; }
	}
	for (int j = index+1;(j<dataSize)&&(isUnique);j++)
	{
		if (data[j]==data[index]) { isUnique = false; }
	}
	return (isUnique);
}

void massiv::DeleteElementByIndex(int index)
{
	for (int i=index;i<dataSize-1;i++)
	{
		data[i] = data[i+1];
	}
	SetSize(dataSize-1);
}
void massiv::DeleteElementByValue(int value)
{
	int i=0;
	while (i<dataSize)
	{
		if (data[i]==value)
		{
			DeleteElementByIndex(i);
		} else {
			i++;
		}
	}
}

void massiv::DeleteElementsByValuesInMassiv(massiv &d)
{
	for (int i=0;i<d.dataSize;i++)
	{
		DeleteElementByValue(d.data[i]);
	}
}

void massiv::DeleteDubles()
{
	for (int i=0;i<dataSize;i++)
	{
		int j = i+1;
		while (j<dataSize)
		{
			if (data[i]==data[j])
			{
				DeleteElementByIndex(j);
			} else {
				j++;
			}
		}
	}
}


void massiv::vvod_1()
{
	int n;
	printf("\n vvedite kol-vo elementov massiva:  ");
	scanf("%d",&n);
	SetSize(n);
	for (int i=0;i<n;i++)
		data[i]=-25+0.5*random(10);
}


void massiv::vvod_2()
{
  int n;
  printf("\n vvedite kol-vo elementov massiva:  ");
  scanf("%d",&n);
  SetSize(n);
  for (int i=0;i<n;i++)
  {
    printf("\n vvedite element massiva:  ");
    scanf("%d",&(data[i]));
  }
}

void massiv::vvod_3()
{
  FILE *f1;
  f1=fopen("massiv.txt","r");
  SetSize(0);
  while (!feof(f1))
  {
	  SetSize(dataSize+1);
	  fscanf(f1,"%d",&(data[dataSize-1]));
  }
  fclose(f1);
  
}

void massiv::vivod()
{
	printf("\n");
	for (int i=0;i<dataSize;i++)
		printf(" %3d",data[i]);
}


int main()
{
	massiv m1;
	massiv m2;
	m1.vvod_1();
	m1.vivod();

	m1.GetUniqElementsToMassiv(m2);
	m1.DeleteElementsByValuesInMassiv(m2);
	m1.DeleteDubles();
	m1.vivod();
	m2.vivod();

	getch();

}
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 18.01.2010, 11:00   #9
Phantomus
 
Регистрация: 16.01.2010
Сообщений: 5
По умолчанию

Код:
void massiv::poisk()
{
  int i, j;
  int k=-1;
  char flag;
  for (i=0;i<n;i++)
  {
    flag=0;
    for (j=i+1;j<n;j++) //проверяем совпадения i и j элементов
      if( *(a+i)==*(a+j)) { flag=1; *(a+j)=0; } //если совпадает то вместо j элемента записываем в первый массив 0 или другой элемент, которого не может быть в исходном массиве.
    if (flag==0) { k++; *(b+k)=*(a+i); } //если совпадений не нашлось записываем элемент в массив b
   }
}
Зачем у Вас такая индексация через адрес. К указателю можно обращаться как к простому массиву *a[i].
Phantomus вне форума Ответить с цитированием
Старый 25.01.2010, 21:57   #10
elka
Пользователь
 
Аватар для elka
 
Регистрация: 05.01.2010
Сообщений: 42
По умолчанию

спасибочки за помощь
elka вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
1.Найти в матрице первую строку, все элементы которой отрицательны 2.отсортировать элементы массива по в w0lf16 Помощь студентам 2 22.11.2009 15:47
Элементы массива Ximer Паскаль, Turbo Pascal, PascalABC.NET 5 26.04.2009 00:53
Одинаковые элементы kodov Общие вопросы Delphi 3 11.08.2008 14:03
переписать из массива в линейный двунаправленный список чётные элементы массива Black_Ak24 Помощь студентам 12 08.01.2008 00:44