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

Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 - C++

Восстановить пароль Регистрация
 
Chrom1996
0 / 0 / 0
Регистрация: 06.05.2014
Сообщений: 16
23.08.2014, 17:13     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #1
Получил задание на летнюю практику вот, собственно содержание: "Заданы два перечня фамилий. Перечень 1 содержит n1 фамилию, перечень 2 - n2 фамилии. Выяснить, содержится ли каждая из фамилий списка 2 в списке 1. Если фамилия списка 2 присутствует в списке 1, то напечатать её позицию. Если же фамилии нет, то напечатать сообщение о том, что фамилия не найдена.Указание: Поиск фамилии в списке реализовать подпрограммой."
В целом идея мне понятна, что и как сделать. Не могли бы вы помочь с реализацией?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.08.2014, 17:13     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1
Посмотрите здесь:

C++ Из списка фамилий упорядочить их по алфавиту
C++ Построить класс для работы с односвязным списком. Создать два списка: List1 и List2. Проверить, содержатся ли элементы списка List1 в списке List2 в у
Поиск под списка в списке C++
C++ Перемешивание списка фамилий
C++ Задача со строками (ввод списка фамилий через запятую в виде строки. Фамилии должны быть отсортированы по-алфавиту)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Pingvinoff
 Аватар для Pingvinoff
60 / 60 / 11
Регистрация: 20.08.2014
Сообщений: 593
23.08.2014, 17:33     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #2
C++
1
2
      std::list<std::string> list;
     std::list<std::string> list2;
делаем поиск по списку с помощью итераторов и радуемся жизни
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
23.08.2014, 17:33     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #3
Глубоких знания данное задание не требует, сможешь без проблем и сам реализовать, я тебе напишу псевдокод, и как я бы в общем решил бы эту задачу.

Во первых для хранения данных, я бы взял 2 вектора(массива) типа string, и объявил бы их как глобальные переменные, дабы доступ к вектору у нас был прямо из функции(подпрограммы).

Второй вопрос, который стоит, так это как ты их будешь заполнять? Через входной файл будет красивее.

И в третьих сам псевдокод:

(основной блок программы)
ЦИКЛ С ПОМОЩЬЮ КОТОРОГО ПРОХОДИШЬ ВСЕ ЭЛЕМЕНТЫ ВТОРОГО ВЕКТОРА
КАЖДЫЙ ЭЛЕМЕНТ ОТПРАВЛЯЕШЬ В ФУНКЦИЮ В КОТОРОЙ МЫ БУДЕМ ОПРЕДЕЛЯТЬ СОДЕРЖИТСЯ ЛИ ЭТОТ ЭЛЕМЕНТ В ПЕРВОМ ВЕКТОРЕ.(псевдокод ниже)
ЕСЛИ ФУНКЦИЯ ВОЗВРАЩАЕТ TRUE ТО ВЫВЕСТИ ТЕКУЩИЙ ИНДЕКС ( то есть индекс элемента, который ты только что отправил в функцию)
ИНАЧЕ ВЫВЕСТИ ЧТО ФАМИЛИЯ НЕ НАЙДЕНА

(подпрограмма, в нашем случае функция, т.к. будем возвращать значение true/false)

bool function(string str)
{
ПРОХОДИМСЯ ПО ПЕРВОМУ ВЕКТОРУ, И ЕСЛИ КАКОЙ-ТО ИЗ ЭЛЕМЕНТОВ ЭКВИВАЛЕНТЕН ПАРАМЕТРУ, КОТОРЫЙ НАШЕ ФУНКЦИЯ ПРИНИМАЕТ ТО - return true
В КОНЦЕ return false, ЕСЛИ НЕ БУДЕТ НАЙДЕН ЭЛЕМЕНТ ТО ВЕРНЕТ FALSE
}

Как-то так, если что-то не ясно, пиши!

P.S. Смысла писать в тупую тебе код не вижу, все же, это твои знания и опыт, а не мои, в будущем за тебя никто работу делать не будет = )
Pingvinoff
 Аватар для Pingvinoff
60 / 60 / 11
Регистрация: 20.08.2014
Сообщений: 593
23.08.2014, 17:49     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #4
Цитата Сообщение от NanoBreaker Посмотреть сообщение
Во первых для хранения данных, я бы взял 2 вектора(массива) типа string, и объявил бы их как глобальные переменные, дабы доступ к вектору у нас был прямо из функции(подпрограммы).
А это то зачем? Не проще/правильнее подавать вход функции два вектора/списка? И зачем поиск выносить в отдельную функцию? Там же три строки кода.
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
23.08.2014, 17:56     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #5
Цитата Сообщение от Pingvinoff Посмотреть сообщение
А это то зачем? Не проще/правильнее подавать вход функции два вектора/списка? И зачем поиск выносить в отдельную функцию? Там же три строки кода.
Какое задание, такое и решение, я бы не использовал функцию и вовсе но цитирую : "Поиск фамилии в списке реализовать подпрограммой".

К тому же, если автор не может реализовать данную программу лично, зачем выдавать всякие выкрутасы, для начала пусть научится решать проблемы такого рода самым элементарным путём. Я мог выстрелить лямдо-функцией и всё вообще в 2 строки впихнуть, но имеет ли это смысл?
Pingvinoff
 Аватар для Pingvinoff
60 / 60 / 11
Регистрация: 20.08.2014
Сообщений: 593
23.08.2014, 18:18     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #6
NanoBreaker, понял, спасибо.
Не по теме:
вот почему в России так мало нормальных программистов. Это из-за таких вот заданий. Скорее всего это из учебника наподобие Лаптева.
Chrom1996
0 / 0 / 0
Регистрация: 06.05.2014
Сообщений: 16
23.08.2014, 18:35  [ТС]     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #7
Пока что осмысляю, как напишу скину для критики. а то мало ли оптимизировать можно
NanoBreaker
 Аватар для NanoBreaker
23 / 23 / 7
Регистрация: 11.07.2013
Сообщений: 82
23.08.2014, 22:15     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #8
Как напишешь код, можешь взглянуть на то, как я его реализовал в 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
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
61
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
//Процедура для счтитывания фамилий с файла.
void readFile(vector<string> &input_vector, string file_name)
{
    ifstream FILE_IN(file_name);
 
    while (!FILE_IN.eof())
    {
        string buff_string;
        getline(FILE_IN, buff_string);
        input_vector.push_back(buff_string);
    }
 
    FILE_IN.close();
}
 
//Процедура(подпрограмма) для нахождения фамилии из второго списка в первом.
void findFile(vector<string> &input_vector, string str)
{
    for (int j = 0; j < input_vector.size(); j++)
    {
        if (str == input_vector[j])
        {
            cout << "Фамилия \"" << str << "\" найдена в первом списке фамилий, её порядковый номер - " << j + 1 << endl;
            return;
        }
    }
    cout << "Фамилия \"" << str << "\" не найдена в первом списке фамилий" << endl;
}
 
//Основной блок
int main()
{
    //Иницилизируем русский язык, дабы можно было писать на нём в консоли
    setlocale(LC_ALL, "Russian");
 
    //Иницилизируем контейнеры типа string, в них мы будем хранить наши фамилии.
    vector<string>  Surname_First_Vector;
    vector<string> Surname_Second_Vector;
 
    //Считываем фамилии из 2-х файлов, названия которых я передаю в функцию
    readFile(Surname_First_Vector,  "familii_1.txt");
    readFile(Surname_Second_Vector, "familii_2.txt");
 
    //И дальше осуществляем наш поиск, как и сказано в условие задачи, через подпрограмму!
    for (int i = 0; i < Surname_Second_Vector.size(); i++)
    {
        findFile(Surname_First_Vector, Surname_Second_Vector[i]);
    }
 
    system("PAUSE");
    return EXIT_SUCCESS;
}


Второй вариант, это то, как бы я решил эту задачу:

Кликните здесь для просмотра всего текста

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
#include <fstream>
#include <string>
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
void readFile(vector<string> &input_vector, string file_name)
{
    ifstream FILE_IN(file_name);
 
    while (!FILE_IN.eof())
    {
        string buff_string;
        getline(FILE_IN, buff_string);
        input_vector.push_back(buff_string);
    }
 
    FILE_IN.close();
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    vector<string>  Surname_First_Vector;
    vector<string> Surname_Second_Vector;
 
    readFile(Surname_First_Vector,  "familii_1.txt");
    readFile(Surname_Second_Vector, "familii_2.txt");
 
    for (auto element : Surname_Second_Vector)
    {
        vector<string>::iterator it = find(Surname_First_Vector.begin(), Surname_First_Vector.end(), element);
        if (it == Surname_First_Vector.end()){
            cout << "Фамилия \"" << element << "\" не найдена в первом списке фамилий." << endl;
        }else{
            cout << "Фамилия \"" << *it << "\" найдена в первом списке фамилий, её порядковый номер - " << distance(Surname_First_Vector.begin(), it) + 1 << endl;
        }
    }
 
    system("PAUSE");
    return EXIT_SUCCESS;
}


Заметь, я данные беру из файлов, "familii_1.txt" и "familii_2.txt", так что не забудь их создать и заполнить в корне проекта!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.08.2014, 11:41     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1
Еще ссылки по теме:

Задача на ветвления (С++) Выяснить, верно ли, что первый прямоугольник целиком содержится во втором C++
процедуру формирования списка и функцию, подсчитывает количество чисел в списке C++
В списке Р заменить первое вхождение списка Р1 (если такое есть) на список Р2 C++

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

Или воспользуйтесь поиском по форуму:
Chrom1996
0 / 0 / 0
Регистрация: 06.05.2014
Сообщений: 16
29.08.2014, 11:41  [ТС]     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1 #9
Примерно так

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Практика
//Заданы два перечня фамилий. Перечень 1 содержит n1 фамилию, перечень 2 - n2 фамилии. 
//Выяснить, содержится ли каждая из фамилий списка 2 в списке 1. 
//Если фамилия списка 2 присутствует в списке 1, то напечатать её позицию. 
//Если же фамилии нет, то напечатать сообщение о том, что фамилия не найдена.
//Указание: Поиск фамилии в списке реализовать подпрограммой.
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <locale.h>
#include <cwchar>
using namespace std;
 
struct familiya
{   wchar_t mas[50];
    int nomer;
    familiya* next;//указатель для связи элементов.
};
    familiya*network=new familiya; //конечный элемент.
    familiya*work=new familiya;
    int chislo=1;
    int chislo_2=1;
 
familiya* select_spisok_1(familiya*vision,int &cifra)//адресация конечного элемента.
{   char spec2[50];
    CharToOem(L"Введите фамилию : ",spec2);
    cout<<spec2;
    familiya* future;//тек элемент.
    future=new familiya;
    wcin>>future->mas;
    future->nomer=cifra;
    cifra++;
    future->next=vision;
    vision=future;
    return vision;
}
void print_spisok_1(familiya*vision)
{   familiya* konec=new familiya;
    konec=vision;
    char spec3[50];
    CharToOem(L"Фамилии в списке: ",spec3);
    cout<<spec3<<"\n";
    for(;konec->nomer>=1;)
    {   wcout<<konec->mas<<"\n";
        konec=konec->next;
    }
}
void search()
{   familiya*konec=new familiya;
    familiya*konchick=new familiya;
    konec=work;
    for(;konec->nomer>=1;)
    {   konchick=network;
        int b=0;
        for(;konchick->nomer>=1;)
        {   if(wcslen(konec->mas)==wcslen(konchick->mas))
            {   int a;
                for(a=0;a<wcslen(konec->mas);a++)   
                {   if(konec->mas[a]!=konchick->mas[a])
                    {   a=-1;
                        break;
                    }
                }
                if(a!=-1)
                {   if(!b)
                    {   b=1;
                        wcout<<konchick->mas<<": ";
                    }
                    wcout<<konchick->nomer<<" ";
                }
            }
            konchick=konchick->next;    
        }
        if(b)
        {   wcout<<"\n";
        }
        konec=konec->next;
    }
}
int _tmain(int argc, _TCHAR* argv[])
{   wcout.imbue(locale("rus_rus.866"));
    wcin.imbue(locale("rus_rus.866"));
        for(;;)
        {   int a;
            char spec1[50];
            CharToOem(L"***МЕНЮ***",spec1);
            cout<<"\t"<<spec1<<"\n";
            CharToOem(L"1.Добавить фамилию в список 1 ",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"2.Добавить фамилию в список 2 ",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"3.Распечатка списка 1 ",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"4.Распечатка списка 2 ",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"5.Проверка на совпадение фамилии",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"6.Выход ",spec1);
            cout<<spec1<<"\n";
            CharToOem(L"Введите пунк меню: ",spec1);
            cout<<spec1;
            cin>>a;
            switch(a)
            {   case 1:system("cls");network=select_spisok_1(network,chislo);break;
                case 2:system("cls");work=select_spisok_1(work,chislo_2);break;
                case 3:system("cls");print_spisok_1(network);break;
                case 4:system("cls");print_spisok_1(work);break;
                case 5:system("cls");search();break;
                case 6:return 0;
                
            }
        }
}
Yandex
Объявления
29.08.2014, 11:41     Выяснить, содержится ли каждая из фамилий списка 2 в списке 1
Ответ Создать тему
Опции темы

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