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

Найти первый вход элемента - C++

Восстановить пароль Регистрация
 
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
16.10.2011, 02:48     Найти первый вход элемента #1
Задача: найти первый вход элемента массива В в массив А.
На входе подаются два массива: массив А и массив В.
Требуется вывести индекс массива В, где первый раз встретился похожий элемент.

Например:
А: 1 2 3 4 5 6
В: 1 2 3 4 5

Выведет ответ 0, т.к. первый вход массива В в массив А это 1, а она на нулевой позиции.
Вот моя функция, которая неправильно выводит ответ.
C++
1
2
3
4
5
6
7
8
9
10
int *find_first_of(int *first1, int *last1, int *first2, int *last2)
{
    for(int i=*first1; i < *last1; i++)
        for(int j = *first2; i < *last2; j++)
        {
            if(*first1==*first2)
                return first2;
            break;
        }
}
вот программа, которая реализована в функции:
C++
1
2
3
4
5
6
7
8
9
for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < m; j++)
            if(a[i] == b[j])
            {
                k=j; break;
            }
            break;
    }
Добавлено через 2 минуты
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
int *find_first_of(int *first1, int *last1, int *first2, int *last2)
{
    for(int i=*first1; i < *last1; i++)
        for(int j = *first2; i < *last2; j++)
        {
            if(*first1==*first2)
                return first2;
            break;
        }
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "");
    const int n = 6;
    const int m = 5;
    int a[n], b[m], k=0;
    
    cout << "Введите массив А из " << n << " чисел\n";
    for(int i = 0; i < n; i++)
        cin >> a[i];
 
    cout << "\nВведите массив B из " << m << " чисел\n";
    for(int i = 0; i < m; i++)
        cin >> b[i];     
                                                        
        cout << find_first_of(a,a+6,b,b+6) << endl;
        
    return 0;
}
Вот вся программа, она выводит ответ в виде: 0018FF14

помогите пожалуйста, где я сделал что-то не то?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.10.2011, 02:48     Найти первый вход элемента
Посмотрите здесь:

C++ В заданом одномерном масиве целого типа поменять местами следующие два элемента: первый минимальный и последний максимальный
Найти номер последнего максимального элемента среди элементов, лежащих в диапазоне [c,d] и расположенных до первого четного элемента. C++
C++ на вход интервал MN целочисленный, найти целые числа которые деляться на 3 или на 7, но при этом не одновременно(например число 21 нам не подходит.
Найти номер первого максимального элемента среди отрицательных элементов, расположенных до первого элемента, большего Т. C++
Массив: Найти первый максимум в этом массиве, а затем все числа до этого элемента упорядочить по возрастанию, а после — по убыванию. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
16.10.2011, 03:00     Найти первый вход элемента #2
ну во первых выводится адрес, а не значения.
да и во вторых в функции бред написан.
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
16.10.2011, 03:15  [ТС]     Найти первый вход элемента #3
1)
C++
1
cout << *find_first_of(a,a+6,b,b+6) << endl;
2) это мой второй опыт написания функции, если бред то это нормально) подскажите,будьте добры, в каком направлении мне идти, что бы правильно все было?
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
16.10.2011, 03:17  [ТС]     Найти первый вход элемента #4
1)
C++
1
cout << *find_first_of(a,a+6,b,b+6) << endl;
2) это мой второй опыт написания функции, если бред то это нормально) подскажите,будьте добры, в каком направлении мне идти, что бы правильно все было?
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
16.10.2011, 03:17  [ТС]     Найти первый вход элемента #5
1)
C++
1
cout << *find_first_of(a,a+6,b,b+6) << endl;
2) это мой второй опыт написания функции, если бред то это нормально) подскажите,будьте добры, в каком направлении мне идти, что бы правильно все было?
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 03:33     Найти первый вход элемента #6
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
void findOccurrence(int arrA[], int arrB[], const int sizeA, const int sizeB){
    for(int j = 0; j < sizeB; ++j){
        for(int i = 0; i < sizeA; ++i){
            if(arrB[j] == arrA[i]){
                cout << "Number "<< arrB[j] << " of arrB at position " << i << " in arrA" << endl;
                break;
            }
        }
    }
}
 
int main(){
 
    const int sizeA = 6;
    const int sizeB = 5;
 
    int arrA[sizeA] = {1,5,7,3,2,8};
    int arrB[sizeB] = {3,5,7,2,1};
 
    findOccurrence(arrA, arrB, sizeA, sizeB);
 
    system("pause");
    return 0;
}
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
16.10.2011, 03:41  [ТС]     Найти первый вход элемента #7
Цитата Сообщение от greeezz Посмотреть сообщение
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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
void findOccurrence(int arrA[], int arrB[], const int sizeA, const int sizeB){
    for(int j = 0; j < sizeB; ++j){
        for(int i = 0; i < sizeA; ++i){
            if(arrB[j] == arrA[i]){
                cout << "Number "<< arrB[j] << " of arrB at position " << i << " in arrA" << endl;
                break;
            }
        }
    }
}
 
int main(){
 
    const int sizeA = 6;
    const int sizeB = 5;
 
    int arrA[sizeA] = {1,5,7,3,2,8};
    int arrB[sizeB] = {3,5,7,2,1};
 
    findOccurrence(arrA, arrB, sizeA, sizeB);
 
    system("pause");
    return 0;
}
это конечно круто и спасибо Вам, но мне надо именно в таком виде функцию:
C++
1
int *find_first_of(int *first1, int *last1, int *first2, int *last2)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 04:09     Найти первый вход элемента #8
Оно ?
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 "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
 
int *find_first_of(int *first1, int *last1, int *first2, int *last2){
    int  *j;
    for(; first2 < last2 ; ++first2){
        j = first1;
        for(int i = 0; j <= last1; j++, i++){
            if(*j==*first2){
                cout <<"Number "<< *first2 << " of arrB at position " << i << " in arrA" << endl;
            }
        }
    }
 
    return 0;
}
 
int main(){
 
    const int sizeA = 6;
    const int sizeB = 5;
 
    int arrA[sizeA] = {1,5,7,3,2,8};
    int arrB[sizeB] = {3,5,7,2,1};
 
    find_first_of(arrA, (arrA+sizeA), arrB, (arrB+sizeB));
 
    system("pause");
    return 0;
}
silentnuke
Android Programmer
137 / 138 / 5
Регистрация: 08.12.2010
Сообщений: 421
16.10.2011, 04:22     Найти первый вход элемента #9
C++
1
    find_first_of(arrA, (arrA+sizeA), arrB, (arrB+sizeB));
ошибка как и в первом примере, конечные указатели, смотрят на мусор.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 04:50     Найти первый вход элемента #10
Цитата Сообщение от silentnuke Посмотреть сообщение
C++
1
    find_first_of(arrA, (arrA+sizeA), arrB, (arrB+sizeB));
ошибка как и в первом примере, конечные указатели, смотрят на мусор.
согласен. логичнее так: find_first_of1(arrA, (arrA+(sizeA-1)), arrB, (arrB+(sizeB-1)));

просто в самой функции я написал : for(; first2 < last2 ; ++first2). т.е. я не прохожу в цикле по мусору.
Но вы правы, так делать не хорошо.

Добавлено через 19 минут
xexew, ну и еще один вариант.

Не по теме:

учитывая что я сам всему этому только учусь, не могу сказать насколько все эти варианты хороши


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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
 
int *find_first_of(int *first1, int *last1, int *next){
    int  *j = first1;
       for(int i = 0; j <= last1; j++, i++){
        if(*j==*next){
            return &(*next = i);
        }
    }
return &(*next = -1);
}
 
int main(){
    const int sizeA = 6;
    const int sizeB = 5;
    int next;
    int arrA[sizeA] = {1,5,7,3,2,8};
    int arrB[sizeB] = {3,5,7,2,1};
    
    for(int i = 0 ; i < sizeB; i++){
        next = arrB[i];
        if(*find_first_of(arrA, (arrA+(sizeA-1)), &next) != -1){
            cout << "Number " << arrB[i] << " at position " << next << " in arrA" << endl;
        }
    }
    system("pause");
    return 0;
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.10.2011, 05:16     Найти первый вход элемента #11
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
#include <stdio.h>
#include <stdlib.h>
 
const int size = 10;
 
/***         comment         ***/
void init_arr(int *arr, const int size)
{
    int i = 0;
    while (i != size)
        *(arr + i++) = rand() % size + 1;
}
 
/***         comment         ***/
void print_arr(int *arr, const int size)
{
    int i = 0;
    while ( i != size )
        printf("%d ", *(arr + i++));
    printf("\n\n");
}
 
/***         comment         ***/
int find_iter(int *arr1, int *arr2, const int size)
{
    int i = 0, j = 0;
    while ( i != size ){
 
        j = 0;
 
        while ( j != size )
            if ( *(arr1 + i) == *(arr2 + j++))
                return j + 1;
        ++i;
    }
    return -1;
}
 
int main()
{
    int x[size], y[size], iter = -1;
 
    init_arr(x, size);
    init_arr(y, size);
 
    print_arr(x, size);
    print_arr(y, size);
 
    iter = find_iter(x, y, size);
    if ( iter < 0 )
        printf("\nвхождений нет\n");
    else printf("\nномер %d\n", iter);
 
    return 0;
}
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
16.10.2011, 05:42     Найти первый вход элемента #12
если я правильно понимаю то тут всегда будет создаваться массив с одними и теми же данными. может лучше srand() добавить.
C
1
2
3
4
5
6
void init_arr(int *arr, const int size)
{
    int i = 0;
    while (i != size)
        *(arr + i++) = rand() % size + 1;
}
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.10.2011, 13:50     Найти первый вход элемента #13
Цитата Сообщение от greeezz Посмотреть сообщение
может лучше srand() добавить.
почему бы и нет. только в мейн()
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
29.10.2011, 00:16  [ТС]     Найти первый вход элемента #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int *find_first_of(int *first1, int *last1, int *first2, int *last2){
    
         
    for(; first1 != last1; ++first1)
        for (int *j = first2; j!=first2; ++j)
                if(*j==*first1)
                   return first1;
 
return last1;
}
 
int main(){
        const int sizeA = 6;
        const int sizeB = 5;
        int arrA[sizeA] = {1,5,7,3,2,8};
        int arrB[sizeB] = {3,5,7,2,1};
        int *p=find_first_of(arrA,arrA+sizeA,arrB,arrB+sizeB);
        cout << p-arrA ;
        return 0;
}
посмотрите пожалуйста, почему-то совсем "левые" цифры возвращает
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
29.10.2011, 02:17     Найти первый вход элемента #15
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
#include <iostream>
 
int *find_first_of(int *first1, int *last1, int *first2, int *last2){      
    
    for(; first1 < last1; ++first1){
        for (; first2 < last2; ++first2){
            if(*first2==*first1){
                return first2;
            }
        }
    }
   
 
return last1;
}
 
int main(){
        const int sizeA = 6;
        const int sizeB = 5;
        int arrA[sizeA] = {1,5,7,3,2,8};
        int arrB[sizeB] = {3,5,7,2,1};
        int *p=find_first_of(arrA,arrA+sizeA,arrB,arrB+sizeB);
        std::cout <<(p-arrB);
 
        return 0;
}
по условию задачи требуется вывести индекс массива В
xexew
0 / 0 / 0
Регистрация: 22.02.2011
Сообщений: 76
29.10.2011, 03:14  [ТС]     Найти первый вход элемента #16
Ваша программа выводит ответ 4, хотя должна выводить 1. Здесь индекс какого массива выводить большой роли не играет, в моем случае программа просто не находила схожих элементов и выводила индекс последнего элемента+1.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.10.2011, 07:10     Найти первый вход элемента
Еще ссылки по теме:

C++ Массивы (найти сумму 1го 6го 11го элемента ,потом 2го 7го 12го элемента и так далее)
Найти номер первого максимального элемента среди отрицательных элементов, расположенных до первого элемента, большего заданного числа Т C++
Запароленный вход в программу - найти ошибку в коде авторизация пользователей C++

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

Или воспользуйтесь поиском по форуму:
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
29.10.2011, 07:10     Найти первый вход элемента #17
программа выводит 4 потому что это индекс в массиве B цифры 1.
Требуется вывести индекс массива В, где первый раз встретился похожий элемент.
прочитайте условие вашей задачи.

для проверки меняйте в массивах числа местами и смотрите за изменениями все станет ясно.

Добавлено через 3 часа 50 минут
возможно я конечно неверно понимаю условие задачи.
и верным ответам в массивах:
int arrA[sizeA] = {1,5,7,3,2,8};
int arrB[sizeB] = {3,5,7,2,1};

должен быть индекс 0. потому что цифра 3есть в массива arrA и она самая первая встречается в массиве arrB. если вопрос задачи в этом то поменяйте логику поиска. берегите элемент массива arrB и ищите его в массиве arrA. если нашли то возвращайте индекс массива arrB.
Yandex
Объявления
29.10.2011, 07:10     Найти первый вход элемента
Ответ Создать тему
Опции темы

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