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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
Glam_Man
6 / 6 / 0
Регистрация: 15.10.2011
Сообщений: 73
#1

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

29.10.2011, 16:54. Просмотров 2731. Ответов 30
Метки нет (Все метки)

Условие задачи написано в шапке кода программы. Я написал эту программу, программа работает. Но есть одно ключевое но: преподаватель мне сказал, что то, работает или нет программа его волнует в последнюю очередь. Он анализирует код и задаёт мне постоянно один и тот же вопрос: "какой смысл сравнивать с незаданным 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");
        }
}
Собсно, нужно обосновать этот момент. Либо же, писать программу по-другому. Буду благодарен за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.10.2011, 16:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выяснить, сколько чисел входит в последовательность по одному разу (C++):

Выяснить, сколько чисел входит в последовательность более чем по одному разу - C++
Даны целые числа а1,...,аn (в этой последовательности могут быть повторяющиеся члены). Выяснить, сколько чисел входит в последовательность...

Даны целые числа x1, ., xn. Определить количество чисел, входящих в последовательность по одному разу - C++
Помогите,вроде идея есть,но не могу написать правильно Даны целые числа x1, ..., xn. Определить количество чисел, входящих в...

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

Для каждого из чисел массива выяснить, сколько раз каждое из них входит в этот массив - C++
Задача Дан массив целых чисел. Для каждого из этих чисел выяснить сколько раз каждое число входит в этот массив. Результат представить в...

Даны натуральное n и целые a1, a2, ., an. Найти сколько чисел входят в последовательность более чем по 1 разу - C++
Нужна помощь в написании задачи с массив. Условие: Даны натуральное n и целые a1, a2, ..., an. Внутри последовательности могут быть...

Сформировать список L включив в него по одному разу элементы, которые входят в один из списков L1 и L2, но в то же время не входит во второй из них - C++
Добрый вечер! Помогите, пожалуйста, начинающей программистке решить следующую задачу: Разработать шаблон класса для работы с...

30
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 10:11 #16
Цитата Сообщение от alkagolik Посмотреть сообщение
Кроме того вы пытаетесь ввести меня(или себя) в заблуждение лексемами "if false &" "if false &&", что любыми компилятороми преобразуется в нуль.
Я Вам еще раз повторю. Если мы используем логическое И, то второе выражение НЕ вычисляется, если результат вычисление первого ложь. В случае оператора & вычисление будет в любом случае производиться. Тест это доказывает. Я и пишу false для проверки. Можете написать там любое другое выражение, которое будет ложным.
И не надо лечить про транзисторы.
0
alkagolik
Заблокирован
31.10.2011, 10:57 #17
Цитата Сообщение от mimicria Посмотреть сообщение
Если мы используем логическое И
а что такое логиечкое И, и как оно реализовано техникой? В то время как операнды представлены 8 битами. Сигнал о дальнейшем продолжении операции тоже вычисляется...

Добавлено через 17 минут
эот код демонстрирует логику работы процессора.
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main ()
{
    printf("%i\n", 2 && 4);
    printf("%i\n", 2 & 4);
    printf("%i\n", 4 && 4);
    printf("%i\n", 4 & 4);
 
    return 0;
}
из него видно, что в случае функции && сначала мультиплексируются операнды, а после производится векторная функция между ними, в то время как в функции "&" только производится бинарная операция "логическое И". Из чего следует вывод что функция "&&" требует дополнительных вычислений, которые заключаются в мультиплексировании операндов в младший бит и обнулении всех остальных битов. Следовательно при точном определении множеств (т.е. мы точно знаем что оперируем двоичным множеством) {0, 1} не стоит усугублять процесс дополнительными ресурсами ("&&").
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 11:08 #18
Цитата Сообщение от alkagolik Посмотреть сообщение
а что такое логиечкое И, и как оно реализовано техникой?
Я не понимаю, что Вы хотите этим сказать или доказать. Сколько раз нужно повторить, что разница между ними есть? Вот разница в ассемблере, если вы переживаете за оптимизацию компилятором.
Исходник, отличается в 1 и 2 случае только количеством амперсандов:
C++
1
2
 int test=5,d=10;
 if(d>50 && test++>10) d=100;
Вариант &:
Выяснить, сколько чисел входит в последовательность по одному разу
Явно виден всего один условный переход после вычисления ОБОИХ условий. Т.е. независимо от того, что первое условие ложно, второе всё равно вычисляется


Вариант &&:
Выяснить, сколько чисел входит в последовательность по одному разу
Первый переход на выход СРАЗУ после вычисления первого условия. БЕЗ вычисления второго.
Вобщем-то я больше не буду ничего доказывать, если Вам этого недостаточно.
0
alkagolik
Заблокирован
31.10.2011, 11:46 #19
Цитата Сообщение от mimicria Посмотреть сообщение
Т.е. независимо от того, что первое условие ложно, второе всё равно вычисляется
глупость. никакие "условия" в битовых операциях не вычисляются. "условия" вычисляются в "псевдологическоих" операциях, и то только потому что сами "условия" тоже надо вычислить. Пример:
"Псевдологическая операция (логическое И)":
имеем 2 операнда: x, y;
пусть х = 0;
для того чтобы машина знала что х = 0, ей надо произвести ряд определенных инженером (программистом) действий, а именнно - совершить мультиплексироание логического ИЛИ каждодго бита с самим собой, и на выходе получить результат. Этот результат пройдет по отдельному каналу (опять же определенному инженером), и в случае низкого тока откроет выдачу машинного нуля.

Пусть х = 1.
Для того чтобы машина знала что х > 0 или x < 0 - ей надо произвести ряд определенных инженером (программистом) действий, а именнно - совершить мультиплексироание логического ИЛИ каждодго бита с самим собой, и на выходе получить результат. Результат записать в младший бит операнда и при этом обнулить все остальные биты.

Сколько операций??? а если первое условие все таки - истина, сколько тогда операций?

бинарная векторная функция "&".

не зависит от операндов (0 & 1; 5 & 6; 8 & 4). Что это значит? Это значит то, что мы избавлены от дополнительных вычислений (при "псевдологических" операциях именно эти вычисления и совершаются) - мультиплексирования положительного бита в младший, и обнуления остальных. Просто два регистра пропускают свои биты через КС, которая выходит в шину данных.
З.Ы не пугайте меня ассемблерами... Я говорю вам лишь о том что условия переходов тоже вычисляются... этого вам ни один дизасм(тем более DOS) не покажет.
0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 12:22 #20
Цитата Сообщение от alkagolik Посмотреть сообщение
никакие "условия" в битовых операциях не вычисляются
У нас есть составное условие if ((первое_условие)&&(второе_условие))
В случае & оба условия вычисляются. В случае && второе условие вычисляется только если результат вычисления первого = 1.
Цитата Сообщение от alkagolik Посмотреть сообщение
Сколько операций???
Судя по листингу (считаю до выхода)
для &: 15 операций, из них 2 сравнения и 1 условный переход
для &&:
- лучший случай: 7 операций, из них 1 сравнение и 1 условный переход
- худший случай: 11 операций, из них 2 сравнения и 2 условных перехода
Выигрыш налицо. А чем свою психоделическую теорию докажете Вы?

Не по теме:

Предлагаю тогда уж вынести эту тему на отдельное общее обсуждение за рамки данного топика.

0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Выяснить, сколько чисел входит в последовательность по одному разу  
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 12:49 #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
если числа там нет то дописываем его
Это уже обсудили, повторяющиеся числа даже по 1 разу писать не надо.
0
-=ЮрА=-
Заблокирован
Автор FAQ
31.10.2011, 12:55 #23

Не по теме:

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



Добавлено через 1 минуту
Цитата Сообщение от mimicria Посмотреть сообщение
повторяющиеся числа даже по 1 разу писать не надо.
- не вчитывался в сам топик, т.е нужны только числа которые всего 1 раз встретились, так понял?
1
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 12:58 #24
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
т.е нужны только числа которые всего 1 раз встретились, так понял?
Да, но ТС уже видимо решил вопрос и самоустранился, так что тут уже только наш интеллектуальный спор с алкоголиком
0
alkagolik
Заблокирован
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}, а следовательно функция && неуместна в силу своей "громадскости" (ресурсозатрат). В рамках данной задачи это мелочи, но в других задачах это может стать серьезным камнем предкновения.
0
-=ЮрА=-
Заблокирован
Автор 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;
}
0
Миниатюры
Выяснить, сколько чисел входит в последовательность по одному разу  
alkagolik
Заблокирован
31.10.2011, 13:10 #27
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
mimicria, хоть я с Вами тоже на ножах, но в вашем споре с alkagolik, поддержу Вас!Вы ему всё равно ничего не докажите, человек убеждён что уже экспертен во всём, а приводить код для него у меня желания нет, он всё равно ничему не учится, только пылит...
Юрец, вы уже всем известный хулиган и дебошир. Вам сюда. Я с человеком говорю по делу, а Вы вставляете личные эмоции. Моя мысль в итоге сводится к тому что в дискретной ВТ существуют ТОЛЬКО логические операции и нету смысла их усложнять.
0
-=ЮрА=-
31.10.2011, 13:13
  #28

Не по теме:

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

0
mimicria
return (true);
1958 / 1095 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
31.10.2011, 13:25 #29
Цитата Сообщение от alkagolik Посмотреть сообщение
z = x & y
И всё!
Вы меня либо совсем не понимаете? Откуда взялись x и y в данном случае?
Говоря вашими буковками, Вам для получения результата надо вычислить/получить/узнать оба значения, и x и y. В случае с && экономия достигается тем, что y может не вычисляться
0
alkagolik
Заблокирован
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 пистолета бахнул и сейчас редлейбел потягиваю, а ты???
0
31.10.2011, 13:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.10.2011, 13:50
Привет! Вот еще темы с ответами:

Дана последовательность чисел. Выяснить, сколько раз в ней встречается максимальное число - C++
#include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;stddef.h&gt; // ------------ size_t index_of_max(int* a,...

Дана последовательность чисел. Выяснить , сколько раз в ней встречается максимальное число. - C++
помогите решить задачу для зачета,а то я совсем ничего не понимаю(((( Дана последовательность чисел. Выяснить , сколько раз в ней...

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

Выяснить, входит ли в последовательность S1 ,. . ., Sm буква Ю - C++
Даны натуральное число n, символы S1 ,..., Sn . Известно, что символ S1 отличен от символа * и что среди S2 , S3 ,. . ., Sn ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru