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

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

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

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

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

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

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

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

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

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

Циклически сдвигать заданное число вправо пока не найдется большее число (массивы) - C++
Есть исходный массив mas ={1,1,0,1,0,1} в котором представлено число 2 СС необходимо циклически сдвигать его вправо пока не найдется...

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

уже и неважно, что и как возвращать.
Лучше всего, передать указатель на уже выделенную до места вызова память и размер массива (по ссылке можно), в функции сделать с этим всем, что-то приличное и вернуть void. А после вызова использовать и удалить.
да-да, понял глупость, спасибо)
0
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;
}
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 выйдет за границу массива.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
03.02.2014, 18:20  [ТС] #20
ага спасибо за ptr2. понял.
но, таким образом, хотел сделать так, чтобы изначально указатели не стояли на одном и том же элементе, иначе цикл не имеет смысла. ptr1 будет равен ptr2
ну а ptr1<size...думал так как раз-таки не выйдем за границу массива, сравнивая указатель с длинной массива...
0
AlexOpryshko1
1 / 1 / 0
Регистрация: 31.01.2013
Сообщений: 41
03.02.2014, 18:23 #21
Проще всего сложить все элементы массива, используя "исключающее или" (XOR)
Все повторяющееся уйдут, останется только уникальный.
1
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
03.02.2014, 19:11 #22
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
void NotTwin(int arr[], int size)
{
    int* end = &arr[size];
    int *ptr1=0, *ptr2=0;
    int counter = 0;
    
    for(ptr1 = arr; ptr1 < end; ptr1++)
    {
        for(ptr2 = arr; ptr2 < end; ptr2++)
        {
            if (*ptr1 == *ptr2)
            {
                counter++;
            }
            if(counter > 1)
            {
                break;
            }
        }
        if(counter == 1)
        {
            cout << *ptr1 << endl;
        }
        counter = 0;
    }
}
1
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
03.02.2014, 20:02  [ТС] #23
усвоил как не выйти за рамки массива, и за одно, что счетчик решает проблему, спасибо Вам огромное.
А посоветуйте, по каким задачам лучше всего научится пользоваться указателями - по арифметическим или строчным?
как я уже понял, просто читать что-либо нет смысла, только практика...
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
04.02.2014, 01:06 #24
RayPas, не знаю даже что посоветовать, всё имеет место.
Если брать практику, то можно попытаться переписать готовую рабочую программу с
использованием указателей. Чем больше проблем встретится на пути, тем больше опыта.
1
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
04.02.2014, 14:42  [ТС] #25
GuGo1991, а Вы по чему учились?
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
04.02.2014, 15:42 #26
RayPas, я и сейчас учусь ) Раньше в основном читал, но в книге всё понятно, только часто задаёшься вопросом
"а зачем мне оно надо?" потому что не знаешь применения и многое не запоминается.
А помогает запомнить случай, когда при решении задачи сталкиваешься с проблемой, возвращаешься к книге,
решаешь проблему, возвращаешься снова к книге, перечитываешь и всё становится ясно.
Пройдя весь этот цикл, точно ничего не забудется ) Получается я учусь проблемами.
Форум отличная практика, к тому же можно ещё и пообщаться с опытными людьми, выслушать критику,
терпеть упрёки (самое главное!) и стараться не забрасывать учёбу по каким-либо причинам.
ИМХО, конечно, может кто-нибудь посоветует иначе.
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
04.02.2014, 15:59  [ТС] #27
GuGo1991 , Вы знаете узнаю в Вас себя. Только на более ранней стадии, когда тупо читаю книги и только сейчас появилось время именно взяться за практику. Я вообще больше по паскалю, как-то мне он до некоторого времени логичнее казался. Но, надо следить за трендами, а Си++ и вообще ООП, насколько мне известно - сейчас самый популярные методы разработки. Хочется углубиться в написании приложенек для телефонов, но пока не совсем понятно, как мне в этом помогут указатели)) В общем на самой-самой ранней стадии я еще.
оо да...упреки...было было и такое, не то что упреки, но и оскорбления)
0
TrueBit
95 / 95 / 12
Регистрация: 19.11.2012
Сообщений: 195
04.02.2014, 18:49 #28
Можно так(выводит эл-ты массива int, которые встречаются ровно 1 раз):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <map>
 
int main() {
    int array[] = { 1, 7, 3, 7, 8, 1, 3 };
    std::map<int,int> counter;
 
    for(int i=0; i < sizeof(array)/sizeof(int); i++)
        counter[ array[i] ]++;
 
    std::cout << "Elements: ";
    for(size_t i=0; i<counter.size(); i++)
        if( counter[i] == 1 )
            std::cout << ' ' << i;
 
    getchar();
    return 0;
}
0
RayPas
2 / 0 / 0
Регистрация: 18.01.2013
Сообщений: 370
04.02.2014, 19:00  [ТС] #29
TrueBit ,спасибо, конечно , но с объектами map еще не знаком...
0
04.02.2014, 19:00
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 19:00
Привет! Вот еще темы с ответами:

Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число - C++
Некоторое число оканчивается на 2. Если же эту его последнюю цифру переставить на первое место, то число удвоится. Найти это число.

Простое число и массивы - C++
есть задача: Дан массив n целых чисел. Если в массиве есть хотя бы одно простое число, то создается новый массив, в котором все члены...

Одномерные массивы - самое большое по модулю число - C++
Доброе время суток! Ребята, задачка такая интересная, что крышу срывает!!! Описать массив типа double с количеством элементов 25. ...

Двумерные массивы. Подсчитать число элементов матрицы - C++
помогите пожалуйста написать программы 2.Подсчитать число элементов матрицы Q(9x11), остаток от деления которых на пять равен единице.


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

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

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