Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
29.10.2011, 16:54     Выяснить, сколько чисел входит в последовательность по одному разу #1
Условие задачи написано в шапке кода программы. Я написал эту программу, программа работает. Но есть одно ключевое но: преподаватель мне сказал, что то, работает или нет программа его волнует в последнюю очередь. Он анализирует код и задаёт мне постоянно один и тот же вопрос: "какой смысл сравнивать с незаданным b[j]?". Я задавал b[j], равный 0, программа тоже работала, но тогда он мне задал вопрос: "ты сравниваешь все числа с b[j], равным нулю. Какой в этос смысл?". Вот код написанной мною программы:

Код
//Даны натуральное n, целые числа a1, ..., an. Внутри данной последовательности могут быть поваторяющиеся члены. 
//Выяснить, сколько чисел входит в последовательность по одному разу
#include <stdio.h>
const int N=100;
void inMas1(int &n, int a[N])
{
        //ввод размерности массива
        printf ("Vvedite razmernost pervogo 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, int b[])
{
        //начальное присвоение
        k=0;
        //Просмотр массива a[N] с занесением всех неповторяющихся элементов этого массива в b[N]
        for (int i=0; i<n; i++)
        {
                //начальное присвоение
                bool flagNo=true;
                int j=0;
                while ((flagNo)&&(j<n))
                {
                        //цикл сравнения
                        if (a[i]==b[j])
                        {
                                flagNo=false;
                        }
                        j++;
                }
                if (flagNo)
                {
                        //добавление a[i] в b[k]
                        b[k]=a[i];
                        k++;
                }
        }
}
void main()
{
        //определение переменных
        int n, k, a[N], b[N];
        //ввод исходных данных
        inMas1(n, a);
        //вычисление b
        MasNoPovtor(n, a, k, b);
        //вывод результата
        if (n>0)
        {
        printf ("%d", k);
        printf ("\n");
        }
}
Собсно, нужно обосновать этот момент. Либо же, писать программу по-другому. Буду благодарен за помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 16:54     Выяснить, сколько чисел входит в последовательность по одному разу
Посмотрите здесь:

C++ Дана последовательность чисел. Выяснить , сколько раз в ней встречается максимальное число.
Выяснить, входит ли в последовательность S1 ,. . ., Sm буква Ю C++
Для каждого из чисел массива выяснить, сколько раз каждое из них входит в этот массив C++
C++ Сформировать список L включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в то же время не входит во второй из них
Дана последовательность чисел. Выяснить , сколько раз в ней встречается максимальное число. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
31.10.2011, 12:47     Выяснить, сколько чисел входит в последовательность по одному разу #21
Цитата Сообщение от Glam_Man Посмотреть сообщение
Либо же, писать программу по-другому. Буду благодарен за помощь
- Вот по другому, принцип следующий вводим числа и в выходной массив записываем только неодинаковые (при каждом вводем проверяем вхождение введеного в выходной массив, если числа там нет то дописываем его)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h> //printf scanf
#include <stdlib.h>//malloc realloc
 
//Ïðîâåðÿåò âõîäèò ëè ÷èñëî val Гў Г¬Г*Г±Г±ГЁГў arr
//åñëè Г*ГҐГІ ГІГ® Гў arr äîáГ*âëåòñÿ ГЅГІГ® Г§Г*Г*Г·ГҐГ*ГЁГҐ 
//ГЁ óâåëè÷èâГ*ГҐГІГ±Гї ÷èñëî ýëåìåГ*òîâ n
//ÂîçâðГ*Г№Г*åìîå Г§Г*Г*Г·ГҐГ*ГЁГҐ Г¬Г*Г±Г±ГЁГў Г°Г*Г§Г*ûõ 
//Г·ГЁГ±ГҐГ« èñõîäГ*îé ïîñëåäîâГ*òåëüГ*îñòè
int * isValueInArray(int &m, int * arr, int val)
{
    for(int i = 0; i < m; i++)
    {
        if(arr[i] == val)
            break;
    }
    if(m == i)
    {
        //Óâåëè÷èâГ*ГҐГ¬ ГЇГ*ìÿòü îòâåäåГ*Г*ГіГѕ ïîä Г¬Г*Г±Г±ГЁГў
        arr = (int *)realloc(
            (void *)arr,
            (1 + (m = m + 1))*sizeof(int)
        );
        arr[i] = val;
    }
    return arr;
}
 
int main()
{   
    int m = 1, val, i = 0, * arr = (int *)malloc(sizeof(int));
    printf("Enter n : ");int n;scanf("%d",&n);
    printf("arr[%d] = ",i + 1);scanf("%d",&arr[i]);
    for(i = 1; i < n; i++)
    {
        printf("arr[%d] = ",i + 1);scanf("%d",&val);
        arr = isValueInArray(m, arr, val);
    }
    printf("\tDifferent nums in sequence\n");
    for(i = 0; i < m; i++)
        printf("%d ",arr[i]);
    printf("\nNnumber of different values : %d\n",m);
    system("pause");
    return 0;
}
Миниатюры
Выяснить, сколько чисел входит в последовательность по одному разу  
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
31.10.2011, 12:49     Выяснить, сколько чисел входит в последовательность по одному разу #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если числа там нет то дописываем его
Это уже обсудили, повторяющиеся числа даже по 1 разу писать не надо.
-=ЮрА=-
Заблокирован
Автор FAQ
31.10.2011, 12:55     Выяснить, сколько чисел входит в последовательность по одному разу #23

Не по теме:

mimicria, хоть я с Вами тоже на ножах, но в вашем споре с alkagolik, поддержу Вас!Вы ему всё равно ничего не докажите, человек убеждён что уже экспертен во всём, а приводить код для него у меня желания нет, он всё равно ничему не учится, только пылит...



Добавлено через 1 минуту
Цитата Сообщение от mimicria Посмотреть сообщение
повторяющиеся числа даже по 1 разу писать не надо.
- не вчитывался в сам топик, т.е нужны только числа которые всего 1 раз встретились, так понял?
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
31.10.2011, 12:58     Выяснить, сколько чисел входит в последовательность по одному разу #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
т.е нужны только числа которые всего 1 раз встретились, так понял?
Да, но ТС уже видимо решил вопрос и самоустранился, так что тут уже только наш интеллектуальный спор с алкоголиком
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
31.10.2011, 12:59     Выяснить, сколько чисел входит в последовательность по одному разу #25
Цитата Сообщение от mimicria Посмотреть сообщение
В случае & оба условия вычисляются. В случае && второе условие вычисляется только если результат вычисления первого = 1.
может так понятней будет
функция высокоуровневого языка программирования "логическое И" - &&
z - результат
x, y - операнды
z = f(x) & f(y) - где f(n) есть мультиплексирование "n" в младший бит "n" и обнуление всех остальных битов "n". В случае f(n) = машинный нуль - нулевой сигнал пойдет на воход из КС.

Функция (реальная) логическое И
z - результат
x, y - оп еранды
z = x & y
И всё! Т. е. нету дополнительных телодвижений на уровне КС. В случае x = машинный нуль нулевой сигнал точно так же пойдет на выход из КС.
Я специально подчеркнул в #7 что мы имеем дело с двоичным множеством {0, 1}, а следовательно функция && неуместна в силу своей "громадскости" (ресурсозатрат). В рамках данной задачи это мелочи, но в других задачах это может стать серьезным камнем предкновения.
-=ЮрА=-
Заблокирован
Автор FAQ
31.10.2011, 13:08     Выяснить, сколько чисел входит в последовательность по одному разу #26
Цитата Сообщение от mimicria Посмотреть сообщение
повторяющиеся числа даже по 1 разу писать не надо.
С учётом этого, ниже моя не самая быстрая и не самая экономная реализация, но простенькая
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h> //printf scanf
#include <stdlib.h>
 
int main()
{   
    
    printf("Enter n : ");int n;scanf("%d",&n);
    int i, j, k, m = 0,* arr = (int *)malloc(n*sizeof(int));
    //Ââîäèì ïîñëåäîâГ*òåëüГ*îñòü
    for(i = 0; i < n; i++)
    {
        printf("arr[%d] = ",i + 1);
        scanf("%d",&arr[i]);
    }
    printf("\tDifferent nums in sequence\n");
    for(i = 0; i < n; i++)
    {
        for(j = 0,k = 0; j < n; j++)
        {
            if(arr[i] == arr[j])
                k++;
        }
        if(k == 1)
        {
            //Г±ГѕГ¤Г* ïîïГ*ä¸ì òîëüêî åñëè arr[i] 
            //åäèГ*Г±ГІГўГҐГ*ГҐГ* Гў Г¬Г*Г±Г±ГЁГўГҐ
            printf("%d ",arr[i]);
            m++;
        }
    }
    printf("\nNnumber of different values : %d\n",m);
    system("pause");
    return 0;
}
Миниатюры
Выяснить, сколько чисел входит в последовательность по одному разу  
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
31.10.2011, 13:10     Выяснить, сколько чисел входит в последовательность по одному разу #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
mimicria, хоть я с Вами тоже на ножах, но в вашем споре с alkagolik, поддержу Вас!Вы ему всё равно ничего не докажите, человек убеждён что уже экспертен во всём, а приводить код для него у меня желания нет, он всё равно ничему не учится, только пылит...
Юрец, вы уже всем известный хулиган и дебошир. Вам сюда. Я с человеком говорю по делу, а Вы вставляете личные эмоции. Моя мысль в итоге сводится к тому что в дискретной ВТ существуют ТОЛЬКО логические операции и нету смысла их усложнять.
-=ЮрА=-
31.10.2011, 13:13
  #28

Не по теме:

Цитата Сообщение от alkagolik Посмотреть сообщение
Я с человеком говорю по делу, а Вы вставляете личные эмоции.
- дружище я привёл уже два алгоритма, а ты???

mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
31.10.2011, 13:25     Выяснить, сколько чисел входит в последовательность по одному разу #29
Цитата Сообщение от alkagolik Посмотреть сообщение
z = x & y
И всё!
Вы меня либо совсем не понимаете? Откуда взялись x и y в данном случае?
Говоря вашими буковками, Вам для получения результата надо вычислить/получить/узнать оба значения, и x и y. В случае с && экономия достигается тем, что y может не вычисляться
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
31.10.2011, 13:50     Выяснить, сколько чисел входит в последовательность по одному разу #30
Цитата Сообщение от mimicria Посмотреть сообщение
В случае с && экономия достигается тем, что y может не вычисляться
так и я о том же говорю, сигнал о невычислении y выходит из f(x). Вто время как вцыполнение x & y производится независимо. Т.е. f(x) - 1 операция. В случае f(x) == 1 - еще две операции, в то время как x & y - одна операция на каждом входе.
Цитата Сообщение от mimicria Посмотреть сообщение
Откуда взялись x и y в данном случае?
Я же специально подчеркнул в #7 что речь идет о двоичном множестве {0, 1}
функция && на уровне процессора:
1. x = ( arr[ i ] == arr[ k ] )
2. мультиплексирование "х" в "х"
3. разрешительный сигнал = х
4. разрешительный сигнал = 1 - y = что -то, иначе 0 на выход.

функция & на уровне процессора:
1. x = ( arr[ i ] == arr[ k ] )
2. y = ( i != k )
3. выход = x & y

Подчеркиваю, в случае с множеством {0, 1} битовые функции незаменимы ничем.
Задумайтесь над тем как машина вычисляет что (2 && 4) == 1 и (2 & 4) == 0
- дружище я привёл уже два алгоритма, а ты???
детсад... а я сегодня девку жахнул и 4 пистолета бахнул и сейчас редлейбел потягиваю, а ты???
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2011, 17:35     Выяснить, сколько чисел входит в последовательность по одному разу
Еще ссылки по теме:

Дана последовательность чисел. Выяснить, сколько раз в ней встречается максимальное число C++
Даны натуральное n и целые a1, a2, ., an. Найти сколько чисел входят в последовательность более чем по 1 разу C++
Символьный тип данных, выяснить входит ли в последовательность s1, s2, …, sn буква j C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
04.11.2011, 17:35  [ТС]     Выяснить, сколько чисел входит в последовательность по одному разу #31
Вот новый код, работающий. Но проблема осталась той же. Кто подскажет, что нужно изменить в коде программы, чтобы препод не ругался?
Код
//Даны натуральное 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] с занесением всех неповторяющихся элементов этого массива в b[N]
	for (int i=0; i<n; i++)
	{
		//начальное присвоение
		bool flagNo=true;
		while ((flagNo)&&(j<k))
		{
			//цикл сравнения
			if (a[i]==a[j])
			{
				//Если a[i] равен b[j], то продолжаем выполнять цикл без занесения в b текущего элемента
				flagNo=false;
			}
			j++;
		}
		if (flagNo)
		{
			//добавление a[i] в b[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");
	}
}
Добавлено через 37 минут
Нужно как-то сделать так, чтобы a[i] для i от 0 до n<=100 (n задаётся пользователем в пределах 100) сравнивался со всеми элементами массива a[N], и при нахождении элемента, равного текущему элементу этот a[j] не заносился в массив a[k]. Я пока что не догоняю, как

Добавлено через 1 час 46 минут
Извиняюсь за ошибочные комментарии в коде, вот исправленный вариант кода:
Код
//Даны натуральное 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] равен ф[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");
	}
}
Yandex
Объявления
04.11.2011, 17:35     Выяснить, сколько чисел входит в последовательность по одному разу
Ответ Создать тему
Опции темы

Текущее время: 12:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru