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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2009, 04:04   #1
anybkarnak
Пользователь
 
Аватар для anybkarnak
 
Регистрация: 27.11.2009
Сообщений: 12
По умолчанию Заполнение массива неповторяющимися числами

Извините у меня такой вопрос, задание:заполнить массив неповторяющимися числами, я пишу

Цитата:
#include <iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>
#include<conio.h>
void main ()
{
time_t t;
int mas1[12], ; //это например, размер массива в этом случае не важен

srand((unsigned) time(&t)); //привязал ко времени

for (int i=0; i<12; i++ )
{
mas1[i] = rand() ;
cout<<mas1[i];
}
выдаёт когда как, иногда повторяеться, иногда нет.
что делать?
anybkarnak вне форума Ответить с цитированием
Старый 28.11.2009, 08:23   #2
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

Сравнивать
Код:
for (int i=0; i<12; i++ ) 
{
flag=false;
a=rand() ;
for(j=0;j<i;j++)
 {
if(mas1[j] = =a)
 flag=true;
}
if(!flag)
mas1[i]=a;
cout<<mas1[i];
}
где-то так
Неприятности приходят и уходят, а жизнь продолжается!

Последний раз редактировалось Sweta; 28.11.2009 в 08:58.
Sweta вне форума Ответить с цитированием
Старый 28.11.2009, 08:52   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Sweta, +1
только после обнаружения совпадения числа и установки flag = true; уже можно выходить из цикла проверки. (я не знаю C, но, думаю, что так:
Код:
for(j=0;j<i;j++)
 {
if(mas1[i] = =a)
  { flag=true;
     break;
   }
}
или можно вместо for воспользоваться циклом while
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2009, 08:59   #4
Sweta
Форумчанин
 
Регистрация: 22.11.2007
Сообщений: 664
По умолчанию

В общем Да.
Неприятности приходят и уходят, а жизнь продолжается!
Sweta вне форума Ответить с цитированием
Старый 28.11.2009, 14:22   #5
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Не учтён один момент: если повторение найдётся, то будет пропущена ячейка массива с мусором внутри. Нужно либо делать декремент значения i для случая, когда найдено повторение, либо сделать условный инкремент i(то есть только когда flag == false, то i++).
Цитата:
Сообщение от anybkarnak
задание:заполнить массив неповторяющимися числами
Код:
for(int i = 0; i < 12; i++)
    m[i] = i;

Последний раз редактировалось netrino; 28.11.2009 в 14:25.
netrino вне форума Ответить с цитированием
Старый 28.11.2009, 15:17   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

netrino, точно. Вы безусловно правы. а я проглядел... Так увлёкся оптимизацией, что ошибочку в реализации упустил...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2009, 02:37   #7
anybkarnak
Пользователь
 
Аватар для anybkarnak
 
Регистрация: 27.11.2009
Сообщений: 12
По умолчанию

Прошу прощения ещё раз, переделал свой код
Код:
#include <iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>
#include<conio.h>
void main ()
{
	time_t t;
	int  a, j;
	bool flag;
	int mas1[12];
  srand((unsigned) time(&t));

for (int i=0; i<12; i++ ) 
{
flag=false;
a=rand()%14 ;
for(j=0;j<i;j++)
 {
if(mas1[j] ==a)
 flag=true;
}
if(!flag)
mas1[i]=a;
cout<<mas1[i]<<endl;
}

}
выскакивает почему-то 8-значный елемент с минусом..
anybkarnak вне форума Ответить с цитированием
Старый 29.11.2009, 03:55   #8
m0nax
Форумчанин
 
Аватар для m0nax
 
Регистрация: 25.09.2009
Сообщений: 525
По умолчанию

объединил все 3 идеи в теме
вроде даже работает
Код:
#include <iostream>
using namespace std;
#include<time.h>
#include<stdlib.h>
#include<conio.h>

void main ()
{
	srand((unsigned)time(NULL));

	int mas1[12];
	int a = 0 ;
	int i = 0 ;

	while(i<12)
	{
		a = rand()%14;
		for(int j=0; j<=i; ++j)
		{
			if(mas1[j] == a)
				break;
			else if (j==i)
			{
				++i;
				mas1[j] = a;
				cout << mas1[j] << endl ;
				break;
			}
		}
	}
}
хотя цикл можно сделать даже вот так, по идее должно быть еще быстрей
Код:
	while(i<12)
	{
		a = rand()%12;
		for(int j=i; j>=0; --j)
		{
			if(mas1[j] == a)
				break;
			else if (j==0)
			{			
				mas1[i] = a;
				cout <<mas1[i]<< endl;
				++i;
			}
		}
	}

Последний раз редактировалось m0nax; 29.11.2009 в 04:21.
m0nax вне форума Ответить с цитированием
Старый 30.11.2009, 22:31   #9
anybkarnak
Пользователь
 
Аватар для anybkarnak
 
Регистрация: 27.11.2009
Сообщений: 12
По умолчанию

Огромное спасибо, работает!
anybkarnak вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XML заполнение ячеек случайными числами. ViNcHeStEr Помощь студентам 0 13.10.2009 05:49
Заполнение массива. Небесный Общие вопросы C/C++ 3 01.09.2009 01:39
Заполнение массива случайными числами dee_lv Общие вопросы C/C++ 7 08.12.2008 21:22
Заполнение массива случайными числами Roomper Помощь студентам 4 12.05.2008 22:34
Заполнение массива числами Ermiss Общие вопросы C/C++ 7 25.11.2007 14:54