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

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

Войти
Регистрация
Восстановить пароль
 
 
RayPas
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
#1

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

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

Задача взята с форума.
Дан целочисленный массив, наподобие такого {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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.02.2014, 00:04     Массивы. Найти неповторяющееся число
Посмотрите здесь:

C++ Простое число и массивы
C++ Найти число в двоичной записи которого максимальное число единиц
C++ Найти неповторяющееся число в массиве
C++ Двумерные массивы. Сумма элементов не превышающих число
C++ Массивы. Найти четвертое отрицательное число
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число C++
C++ Двумерные массивы. Подсчитать число элементов матрицы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KOPOJI
Модератор
 Аватар для KOPOJI
16613 / 6554 / 408
Регистрация: 12.06.2012
Сообщений: 19,637
Завершенные тесты: 1
02.02.2014, 00:12     Массивы. Найти неповторяющееся число #2
В голову приходит два способа решения:
1. Решение "в лоб", неоптимальное - в цикле пробегаться по массиву столько раз, сколько цифр в переданном массиве (для каждого символа - дополнительный цикл)
2. Альтернатива - динамические массивы (ну или векторы, например, раз уж c++). В цикле пробежаться сначала один раз по полученному массиву, добавить в динамический массив в качестве ключа, значение по умолчанию - ноль. (т.е., наподобие arr[8] = 0. После чего отдельным циклом пробежаться, если существует arr[9], то arr[9]++ Как-то так, код писать лень..

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

Добавлено через 1 минуту
Цитата Сообщение от Хулиган Посмотреть сообщение
в вашем коде в функции NotTwin() непонятно откуда появился int *A
ну создание динамического массива
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 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];
}
RayPas
 Аватар для RayPas
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];
}
да, идея хорошая, но хочу научиться использовать указатели...мечта детства
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:37     Массивы. Найти неповторяющееся число #10
Цитата Сообщение от RayPas Посмотреть сообщение
ну создание динамического массива
int *A находится в области видимости функции int Massiv()

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

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

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

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


в каком месте она что то передает? приведите тот участок кода
так в том то и дело, у меня вопрос был в том, как правильно вызвать функции и передать параметры из Massiv в NotTwin(), поэтому в этом варианте кода нигде это еще и не происходит...
Хулиган
 Аватар для Хулиган
85 / 80 / 12
Регистрация: 08.08.2012
Сообщений: 737
02.02.2014, 00:58     Массивы. Найти неповторяющееся число #14
Цитата Сообщение от RayPas Посмотреть сообщение
ак в том то и дело, у меня вопрос был в том, как правильно вызвать функции и передать параметры из Massiv в NotTwin(), поэтому в этом варианте кода нигде это еще и не происходит...
почитайте в литературе при функции с параметрами
GuGo1991
267 / 261 / 93
Регистрация: 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().
А с указателями можете поиграться.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6346 / 2993 / 295
Регистрация: 04.12.2011
Сообщений: 8,028
Записей в блоге: 3
02.02.2014, 02:17     Массивы. Найти неповторяющееся число #16
RayPas, после этой инструкции:
Цитата Сообщение от RayPas Посмотреть сообщение
delete [] A;
уже и неважно, что и как возвращать.
Лучше всего, передать указатель на уже выделенную до места вызова память и размер массива (по ссылке можно), в функции сделать с этим всем, что-то приличное и вернуть void. А после вызова использовать и удалить.
RayPas
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
02.02.2014, 02:21  [ТС]     Массивы. Найти неповторяющееся число #17
Цитата Сообщение от IGPIGP Посмотреть сообщение
RayPas, после этой инструкции:

уже и неважно, что и как возвращать.
Лучше всего, передать указатель на уже выделенную до места вызова память и размер массива (по ссылке можно), в функции сделать с этим всем, что-то приличное и вернуть void. А после вызова использовать и удалить.
да-да, понял глупость, спасибо)
RayPas
 Аватар для RayPas
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;
}
Миниатюры
Массивы. Найти неповторяющееся число  
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 18:12     Массивы. Найти неповторяющееся число #19
Цитата Сообщение от RayPas Посмотреть сообщение
*ptr1 < size
Не понял этот момент. Элемент массива сравнивется с размером массива?

Цитата Сообщение от RayPas Посмотреть сообщение
ptr2 = (ptr1+1);
ptr2 забъётся мусором, потому что ptr1 + 1 выйдет за границу массива.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2014, 18:20     Массивы. Найти неповторяющееся число
Еще ссылки по теме:

найти неповторяющееся число C++
C++ Ввести число n, разбить число на цифры, и найти сумму этих цифр
C++ Получить из массива случайное неповторяющееся значение
C++ Найти число, входящее во все массивы
C++ Циклически сдвигать заданное число вправо пока не найдется большее число (массивы)

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

Или воспользуйтесь поиском по форуму:
RayPas
 Аватар для RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
03.02.2014, 18:20  [ТС]     Массивы. Найти неповторяющееся число #20
ага спасибо за ptr2. понял.
но, таким образом, хотел сделать так, чтобы изначально указатели не стояли на одном и том же элементе, иначе цикл не имеет смысла. ptr1 будет равен ptr2
ну а ptr1<size...думал так как раз-таки не выйдем за границу массива, сравнивая указатель с длинной массива...
Yandex
Объявления
03.02.2014, 18:20     Массивы. Найти неповторяющееся число
Ответ Создать тему
Опции темы

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