1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

Выяснить, сколько чисел входит в последовательность по одному разу

Тема в разделе "C/C++", создана пользователем Glam_Man, 4 ноя 2011.

  1. Glam_Man

    Glam_Man Новичок

    Регистрация:
    24 окт 2011
    Сообщения:
    0
    Симпатии:
    4
    Баллы:
    0
    Условие задачи написано в шапке программы. Проблема в том, что моя программа сравнивает только предыдущий элемент со следующим. Нужно как-то сделать так, чтобы a для i от 0 до n<=100 (n задаётся пользователем в пределах 100) сравнивался со всеми элементами массива a[N], и при нахождении элемента, равного текущему элементу поднимался флаг false и этот a[j] не заносился в массив a[k]. Я пока что не догоняю, как это реализовать. Кто-нибудь подскажет?

    Код:
    //Даны натуральное n, целые числа a1, ..., an. Внутри данной последовательности могут быть поваторяющиеся члены. 
    //Выяснить, сколько чисел входит в последовательность по одному разу
    #include <stdio.h>
    const int N=100;
    void inMas1(int &n, int a[N])
    {
    	//ввод размерности массива
    	printf ("Vvedite razmernost massiva n=");
    	scanf ("%d", &n);
    	//проверка на корректность введённой размерности массива
    	if (n<=0)
    	{
    		printf ("Nekorrektniy vvod \n");
    	}
    	for (int i=0; i<n; i++)
    	{
    		//ввод a[i]
    		printf ("a[%d]=", i);
    		scanf ("%d", &a[i]);
    	}
    }
    void MasNoPovtor(int n, int a[], int &k)
    {
    	//начальное присвоение
    	k=0;
    	int j=0;
    	//Просмотр массива a[N] с занесением всех неповторяющихся элементов этого массива в a
    	for (int i=0; i<n; i++)
    	{
    		//начальное присвоение
    		bool flagNo=true;
    		while ((flagNo)&&(j<k))
    		{
    			//цикл сравнения
    			if (a[i]==a[j])
    			{
    				//Если a[i] равен a[j], то продолжаем выполнять цикл без занесения в a текущего элемента
    				flagNo=false;
    			}
    			j++;
    		}
    		if (flagNo)
    		{
    			//добавление a[i] в a[k]
    			a[k]=a[i];
    			k++;
    		}
    	}
    }
    void main()
    {
    	//определение переменных
    	int n, k, a[N];
    	//ввод исходных данных
    	inMas1(n, a);
    	//вычисление b
    	MasNoPovtor(n, a, k);
    	//вывод результата
    	if (n>0)
    	{
    	printf ("%d", k);
    	printf ("\n");
    	}
    }
     
    Последнее редактирование: 5 ноя 2011
  2. ~|~евто|-|

    ~|~евто|-| Silentium ..::V.I.P::..

    Регистрация:
    26 май 2007
    Сообщения:
    30
    Симпатии:
    377
    Баллы:
    0
    Glam_Man, функция MasNoPovtor крайне неправильно реализованa.
    Зачем что-то куда-то переносить?
    Нужно:
    1. Организовать основной цикл i=0; i<n; i++
    2. Внутри этого цикла, еще одни цикл j=0;j<n; j++
    3. Сравнивать a со всеми a[j] и считать количество где a = a[j]
    4. Если после цикла j=0;j<n; i++ это количество(a = a[j]) равно 1, значит элемент уникален. И увеличивать общий счетчик уникальных на 1. Если нет, то соответственно не увеличивать)

    Код я думаю сам напишешь, дело 1 минуты :)
     
  3. Glam_Man

    Glam_Man Новичок

    Регистрация:
    24 окт 2011
    Сообщения:
    0
    Симпатии:
    4
    Баллы:
    0
    Искренне благодарю! Сейчас закодю...
     
  4. ~|~евто|-|

    ~|~евто|-| Silentium ..::V.I.P::..

    Регистрация:
    26 май 2007
    Сообщения:
    30
    Симпатии:
    377
    Баллы:
    0
    Glam_Man, на будущее, это не самый удачный способ поиска уникальных значений в наборе.
    Если набор большой, и значения примерно детерминированны, я бы рекомендовал делать специфичную, для данного набора, сортировку, а уже после, в отсортированном наборе, сравнивал соседние значение: предыдущее, текущее, следующее)
    В целом это задача построения неуникальных индексов в БД и сбора статистики по этим индексам) Когда наберешься знаний и опыта, думаю почитаешь)
     

Поделиться этой страницей