Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
1

Массивы. Найти неповторяющееся число

02.02.2014, 00:04. Показов 2770. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Задача взята с форума.
Дан целочисленный массив, наподобие такого {1, 7, 3, 7, 8, 1, 3}. Все его элементы, кроме одного повторяются ровно 2 раза (две 1, две 7, две 3, но одна 8). Найти это неповторяющееся число. Числа и размер массива могут быть любыми.
Непонятно, собственно, как передать параметры в функцию NotTwin(), которые, по идее она должна получать из функции Massiv(); Ну и эти функции вызываются в main(). Помогите быдлокодеру, пожалуйста.

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
 
 
int Massiv()
{
    int i;
    int num;
 
    cout << "Введите кол-во элементов" << endl;
    cin >> num;
 
    
    cout << "Введите числа, входящие в состав массива" << endl;
    int *A = new int[num];
        for (i = 0; i < num; i ++) 
            {
                cin >> A[i];
                // cout << A[i] << endl;
            }
    delete [] A;
    return A[i];
}
 
 
int NotTwin()
 
{
    int i , j;
    int *ptr1, *ptr2;
 
    for (i = 0; i < num; i ++)
        *ptr1 = A[i];
        for (j = 0; j < num; j ++)
            *ptr2 =  A[j];
            if (ptr1 != ptr2) {
                cout << *ptr1 << endl;
            }
    return 0; 
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Massiv();
    cout << endl << "А теперь попробуем выявить одно число, которое не повторяется в массиве" << endl;
    NotTwin();
 
    system("PAUSE");
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.02.2014, 00:04
Ответы с готовыми решениями:

найти неповторяющееся число
Существует энное количество цифр(динамический массив) в котором присутствуют цифры от 1 до 100. Все...

Найти неповторяющееся число в массиве
ан целочисленный массив, наподобие такого {1, 7, 3, 7, 8, 1, 3}. Все его элементы, кроме одного...

Найти число, входящее во все массивы
помогите ,пожалуйста решить задачу. уже неделю бьюсь. Элементами массива являются неубывающие...

Массивы. Найти четвертое отрицательное число
Дан одномерный массив. Найти в нем четвертое отрицательное число(если его нет то вывести на екран...

28
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
16844 / 6723 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
02.02.2014, 00:12 2
В голову приходит два способа решения:
1. Решение "в лоб", неоптимальное - в цикле пробегаться по массиву столько раз, сколько цифр в переданном массиве (для каждого символа - дополнительный цикл)
2. Альтернатива - динамические массивы (ну или векторы, например, раз уж c++). В цикле пробежаться сначала один раз по полученному массиву, добавить в динамический массив в качестве ключа, значение по умолчанию - ноль. (т.е., наподобие arr[8] = 0. После чего отдельным циклом пробежаться, если существует arr[9], то arr[9]++ Как-то так, код писать лень..

З.Ы. по-любому, есть и еще реализации (возможно, лучше этой)..
1
238 / 49 / 6
Регистрация: 10.06.2012
Сообщений: 268
Записей в блоге: 1
02.02.2014, 00:21 3
А в чём проблема? Вызывайте NotTwin с нужными параметрами из функции Massiv.
Ещё не понятно, куда функция Massiv возвращает значение последнего элемента массива - это значение нигде не используется. В таком случае вместо int тип функции должен быть void (т.к. она, фактически, процедура).
1
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:28 4
можно циклически посчитать сумму S1 всех чисел, при этом каждое число добавлять в контейнер "set"...в контейнере будут записаны числа в единичном экземпляре..находим сумму квадратов S2 каждого числа из set и от нее отнимаем сумму S1
num = S2 - S1
1
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 00:28  [ТС] 5
Цитата Сообщение от Craw Посмотреть сообщение
А в чём проблема? Вызывайте NotTwin с нужными параметрами из функции Massiv.
Ещё не понятно, куда функция Massiv возвращает значение последнего элемента массива - это значение нигде не используется. В таком случае вместо int тип функции должен быть void (т.к. она, фактически, процедура).
хм, черт, пробовал так до этого, но не получалось. Спасибо за волшебный пинок!)
Теперь ругается на неинециализированные ptr'ы, но мне главное с этим было разобраться, теперь уже схема работы...)
спасибо Вам большое)
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:30 6
в вашем коде в функции NotTwin() непонятно откуда появился int *A
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 00:33  [ТС] 7
кстати, ребят, а КАК посоветуете ООП изучать? вообще с чего начинают? курс каких-то базовых задач или же что-то более серьезное?

Добавлено через 1 минуту
Цитата Сообщение от Хулиган Посмотреть сообщение
в вашем коде в функции NotTwin() непонятно откуда появился int *A
ну создание динамического массива
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:34 8
или отсортировать массив и сравнивать соседние элементы
C++
1
2
3
4
5
for(int i = 0; i < size; ++i)
{
    if(A[i] != A[i+1])
    return A[i];
}
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 00:35  [ТС] 9
Цитата Сообщение от Хулиган Посмотреть сообщение
или отсортировать массив и сравнивать соседние элементы
C++
1
2
3
4
5
for(int i = 0; i < size; ++i)
{
    if(A[i] != A[i+1])
    return A[i];
}
да, идея хорошая, но хочу научиться использовать указатели...мечта детства
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:37 10
Цитата Сообщение от RayPas Посмотреть сообщение
ну создание динамического массива
int *A находится в области видимости функции int Massiv()

Добавлено через 1 минуту
Цитата Сообщение от RayPas Посмотреть сообщение
но хочу научиться использовать указатели...мечта детства
ну напишите тогда сортировку используя указатели
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 00:42  [ТС] 11
Цитата Сообщение от Хулиган Посмотреть сообщение
int *A находится в области видимости функции int Massiv()

Добавлено через 1 минуту

ну напишите тогда сортировку используя указатели
ну да...а почему нет? тем более теперь когда с массивом А работает только функ-я Massiv, которая передает ее в NotTwins...по крайней мере до этого заносилось и выводилось все правильно
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:48 12
Цитата Сообщение от RayPas Посмотреть сообщение
ну да...а почему нет? тем более теперь когда с массивом А работает только функ-я Massiv
откуда А в функции int NotTwin?? он в ней нигде не объявлен и не является аргументом функции? функция даже не знает что это.

Цитата Сообщение от RayPas Посмотреть сообщение
которая передает ее в NotTwins
в каком месте она что то передает? приведите тот участок кода
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 00:53  [ТС] 13
Цитата Сообщение от Хулиган Посмотреть сообщение
откуда А в функции int NotTwin?? он в ней нигде не объявлен и не является аргументом функции? функция даже не знает что это.


в каком месте она что то передает? приведите тот участок кода
так в том то и дело, у меня вопрос был в том, как правильно вызвать функции и передать параметры из Massiv в NotTwin(), поэтому в этом варианте кода нигде это еще и не происходит...
0
88 / 83 / 21
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:58 14
Цитата Сообщение от RayPas Посмотреть сообщение
ак в том то и дело, у меня вопрос был в том, как правильно вызвать функции и передать параметры из Massiv в NotTwin(), поэтому в этом варианте кода нигде это еще и не происходит...
почитайте в литературе при функции с параметрами
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
02.02.2014, 01:08 15
RayPas
Кликните здесь для просмотра всего текста

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
45
46
47
int NotTwin(int arr[], int size);
 
void Massiv()
{
    int i;
    int num;
 
    cout << "Ââåäèòå êîë-âî ýëåìåíòîâ" << endl;
    cin >> num;
 
    
    cout << "Ââåäèòå ÷èñëà, âõîäÿùèå â ñîñòàâ ìàññèâà" << endl;
    int *A = new int[num];
        for (i = 0; i < num; i ++) 
            {
                cin >> A[i];
                // cout << A[i] << endl;
            }
    
    cout << endl;
    
    int result = NotTwin(A, num);
    
    delete [] A;
    cout << result << endl;
}
 
 
int NotTwin(int arr[], int size)
 
{
    int counter = 0;
    for(int i = 0; i < size; i++)
    {
        for(int j = 0; j < size; j++)
        {
            if(arr[i] == arr[j])
                counter++;
        }
        if(counter > 1)
            counter = 0;
        else
        {
            return arr[i];
        }
    }
}

В main вызовите только функцию Massiv().
А с указателями можете поиграться.
1
Комп_Оратор)
Эксперт по математике/физике
8949 / 4703 / 629
Регистрация: 04.12.2011
Сообщений: 13,999
Записей в блоге: 16
02.02.2014, 02:17 16
RayPas, после этой инструкции:
Цитата Сообщение от RayPas Посмотреть сообщение
delete [] A;
уже и неважно, что и как возвращать.
Лучше всего, передать указатель на уже выделенную до места вызова память и размер массива (по ссылке можно), в функции сделать с этим всем, что-то приличное и вернуть void. А после вызова использовать и удалить.
1
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 02:21  [ТС] 17
Цитата Сообщение от IGPIGP Посмотреть сообщение
RayPas, после этой инструкции:

уже и неважно, что и как возвращать.
Лучше всего, передать указатель на уже выделенную до места вызова память и размер массива (по ссылке можно), в функции сделать с этим всем, что-то приличное и вернуть void. А после вызова использовать и удалить.
да-да, понял глупость, спасибо)
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
03.02.2014, 17:31  [ТС] 18
Ребят, а помогите собственно с продолжением. Не пойму несколько вещей(все внимания на функцию NotTwin() )
Идея в том моя, чтобы при сравнении значений двух указателей, цикл завершался как только встретит близнеца и первый переместится на следующее значение в массиве, т.е. продолжится внешний цикл for. но срабатывает неправильно.
И еще, когда прохожу прогу по шагам и смотрю, что лежит в значениях указателей, то вижу, что как указатель(*ptr2) пройдет по всем заданным элементам массива, он забивается мусором и какими-то непонятными значениями. Почему это происходит? Объясните пожалуйста. и укажите в чем ошибка, что срабатывает неправильно

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// ConsoleApplication2.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std;
 
 
int NotTwin(int arr[], int size)
 
{
    int *ptr1=0, *ptr2=0;
    
    for (ptr1 = arr; *ptr1 < size; *ptr1++){
        for (ptr2 = (ptr1+1); *ptr2 < size; *ptr2++)
            if (*ptr1 == *ptr2) {
                break; 
            } else cout << *ptr1;
    }
    return 0; 
}
 
 
int Massiv()
{
    int i;
    int num;
 
    cout << "Введите кол-во элементов" << endl;
    cin >> num;
 
    
    cout << "Введите числа, входящие в состав массива" << endl;
    int *A = new int[num];
        for (i = 0; i < num; i ++) 
            {
                cin >> A[i];
                // cout << A[i] << endl;
            }
    cout << endl << "А теперь мы попробуем выявить одно число, которое не повторяется в массиве" << endl;
    
        NotTwin(A, num);
        delete [] A;
    return 0;
 
}
 
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    Massiv();
    system("PAUSE");
    return 0;
}
Миниатюры
Массивы. Найти неповторяющееся число  
0
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 18:12 19
Цитата Сообщение от RayPas Посмотреть сообщение
*ptr1 < size
Не понял этот момент. Элемент массива сравнивется с размером массива?

Цитата Сообщение от RayPas Посмотреть сообщение
ptr2 = (ptr1+1);
ptr2 забъётся мусором, потому что ptr1 + 1 выйдет за границу массива.
0
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
03.02.2014, 18:20  [ТС] 20
ага спасибо за ptr2. понял.
но, таким образом, хотел сделать так, чтобы изначально указатели не стояли на одном и том же элементе, иначе цикл не имеет смысла. ptr1 будет равен ptr2
ну а ptr1<size...думал так как раз-таки не выйдем за границу массива, сравнивая указатель с длинной массива...
0
03.02.2014, 18:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2014, 18:20
Помогаю со студенческими работами здесь

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

Массивы: найти общее число съеденных пирожных и прогнозируемое число съеденных пирожных за 10 лет
Условие: Начать свои тренировки в статистике Алексей решил с членов собственной семьи. В семье...

Случайное, неповторяющееся число
Может кто поможет мне)) Вообщем мне надо, чтобы по нажатию кнопку у меня в переменную заносилось...

Одномерные массивы. Найти число, встречающееся наибольшее количество раз
Задан массив целых чисел от -100 до 100. Найти число, встречающееся наибольшее количество раз


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru