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

Разбить массив строк на две равные группы так, чтобы однофамильцы оказались в разных группах

15.04.2018, 22:15. Показов 3759. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу никак решить задачу. Вот условие: запросить у пользователя количество студентов, ввести их фамилии в произвольном порядке и разбить их на две равные группы так, чтобы однофамильцы обязательно оказались в разных группах. Кто-то может помочь с программой?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2018, 22:15
Ответы с готовыми решениями:

Разбить предметы на две группы так, чтобы массы в обеих группах были максимально одинаковые
Дано N предметов различной массы. Массы предметов записаны в массиве A . Нужно разбить их на две группы таким образом, чтобы массы в обеих...

Разбить массив на две равные части (или приблизительно равные)
Задали задание. Нужно разбить одномерный массив на две почти равные части(если на равные не получается). Написал программу, однако...

Ввести массив из n чисел, разбить массив на две примерно равные части и вывести числа в отдельном окне
Ввести массив из n чисел, разбить массив на две примерно равные части и вывести числа из каждой части в отдельном окне, получив два окна с...

41
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
16.04.2018, 22:24  [ТС]
Студворк — интернет-сервис помощи студентам
axela002, вот я невнимательный дурачёк. Такая примитивная ошибка из-за невнимательности. Выражаю огромную благодарность.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
16.04.2018, 22:25
Цитата Сообщение от diaroman Посмотреть сообщение
вот я невнимательный дурачёк. Такая примитивная ошибка из-за невнимательности
Бывает
Цитата Сообщение от diaroman Посмотреть сообщение
Выражаю огромную благодарность.
Pад помочь!
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
16.04.2018, 22:45  [ТС]
axela002, снова ошибка. Снова вылетает в хедере. Правда, в другом. Условия в циклах проверил. Операнды соответствуют ожидаемым. Собственно, вот сам текст ошибки: "Вызвано исключение по адресу 0x6F7850B9 (vcruntime140d.dll) в project14.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0xDDDDDDDD.". Здесь я уже пытался ввести некий способ сортировки, предполагаемый задачей. Т.е., однофамильцы обязательно должны оказаться в разных группах. Такая же ошибка останавливала меня и раньше. Не понимаю, в чём дело. Если нетрудно, посмотрите пожалуйста. Вот код:
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
#include <iostream>
#include <string>
using namespace std;
 
 
void main()
{
    setlocale(LC_ALL, "Russian");
    int count_student, num1, num2;
    cout << "Здравствуйте. Введите пожалуйста количество студентов: ";
    cin >> count_student;
    cout << endl;
    string *name_student = new string[count_student];
    cout << "Введите имена всех " << count_student << " студентов.\n";
    for (int i = 0; i < count_student; i++) {
        cout << "- ";
        cin >> name_student[i];
    }
    cout << "\n\n";
    if (count_student % 2 == 0) {
        num1 = count_student / 2;
        num2 = num1;
    }
    else {
        num1 = count_student / 2 + 1;
        num2 = num1 - 1;
    }
    for (int i = 0; i < num1; i++) {
        cout << name_student[i] << endl;
    }
    cout << "=========================\n";
    for (int i = num1; i < count_student; i++) {
        cout << name_student[i] << endl;
    }
    cout << endl << endl;
    string *first_group = new string[num1];
    string *second_group = new string[num2];
    for (int i = 0; i < count_student; i++) {
        for (int j = 0; j <= num1; j++) {
            if (name_student[i] == name_student[i + 1]) {
                second_group[i] = name_student[i];
            }
            else {
                first_group[i] = name_student[i];
            }
        }
    }
 
    system("pause");
}
Добавлено через 1 минуту
axela002, думаю, ошибка начинается примерно со строки 36-ой. Правда, не знаю в чём заключается ошибка.

Добавлено через 5 минут
axela002, т.е., тут я хотел создать ещё два динамических массива строк, в которые бы сортировал имеющиеся строки из заданного пользователем массива.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 00:23
Секунду,щас гляну

Добавлено через 1 час 32 минуты
Вот pабочий код.
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
#include <iostream>
#include <string>
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    int count_student, num1, num2;
    cout << "Здравствуйте. Введите пожалуйста количество студентов: ";
    cin >> count_student;
    cout << endl;
    string *name_student = new string[count_student];
    cout << "Введите имена всех " << count_student << " студентов.\n";
    for (int i = 0; i < count_student; i++) {
        cout << "- ";
        cin >> name_student[i];
    }
    cout << "\n\n";
    if (count_student % 2 == 0) {
        num1 = count_student / 2;
        num2 = num1;
    }
    else {
        num1 = count_student / 2 + 1;
        num2 = num1 - 1;
    }
    for (int i = 0; i < num1; i++) {
        cout << name_student[i] << endl;
    }
    cout << "=========================\n";
    for (int i = num1; i < count_student; i++) {
        cout << name_student[i] << endl;
    }
    cout << endl << endl;
 
    string *first_group = new string[count_student];
    string *second_group = new string[count_student];
    int a = 0;
    int b = 0;
    int count = 0;
    int count_f = 0;
    for (int i = 0; i < count_student; i++) 
    {
        count_f = 0;
        for (int j = i; j < count_student - 1; j++) 
        {
            count = 0;
                if (name_student[i] == name_student[j + 1])
                {
                    
                    second_group[a] = name_student[j + 1];
                    a++;
                    second_group[a] = name_student[j + 1];
                    a++;
                    count++;
                    break;
 
                }
 
            
            
        }
 
        for (int k = 0; k < (*second_group).length(); k++) 
        {
        
            if (second_group[k] == name_student[i])
                count_f++;
        
        }
        if (count == 0 && count_f == 0)
        {
            first_group[b] = name_student[i];
            b++;
        }
 
    }
 
 
    for (int i = 0; i < (*first_group).length(); i++)
        cout << first_group[i] << " ";
 
    cout << endl;
 
    for (int i = 0; i < (*second_group).length(); i++)
        cout << second_group[i] << " ";
 
 
    system("pause");
    return 0;
}
В общем , дебажил твой код минут 30. Потом плюнул и написал свой код, и додумывал логику pаботы пpогpаммы.
Много ушло вpемени,но зато всё качественно.
Pад помочь!

Добавлено через 1 минуту
Так что половина оценки за эту pаботу моя!)
P.S Шутка!)
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
17.04.2018, 00:27  [ТС]
axela002, и снова ошибка. :с Выводит: "Вызвано исключение по адресу 0x0FF16956 (msvcp140d.dll) в project14.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xDDDDDDDD.".

Добавлено через 21 секунду
axela002, я не понимаю. Что за ошибка?
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 00:32
Цитата Сообщение от diaroman Посмотреть сообщение
axela002, я не понимаю. Что за ошибка?
Именно в том коде , котоpый я скинул?

Добавлено через 40 секунд
Цитата Сообщение от diaroman Посмотреть сообщение
и снова ошибка. :с Выводит: "Вызвано исключение по адресу 0x0FF16956 (msvcp140d.dll) в project14.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xDDDDDDDD.".
Эта ошибка означает,что тот или иной элемент(пеpеменная,указатель и т.д) пытается обpатится к участку памяти , котоpого нет.

Добавлено через 24 секунды
Скажи какие входные данные ты вводишь
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
17.04.2018, 00:42  [ТС]
axela002, вот часть

Здравствуйте. Введите пожалуйста количество студентов: 5

Введите имена всех 5 студентов.
- Nikita
- Sergey
- Nikita
- Dima
- Tatyana

После нажатия, происходит ошибка. По всей видимости, только нечётное кол-во студентов вызывает данный сбой, потому что на чётный всё исправно работает.

Добавлено через 1 минуту
axela002, и Вы снова перепутали малясь задание. Вы отделяете однофамильцев в одну группу, остальных же в другую. А нужно, чтобы группы были равные и однофамильцы обязательно находились по разные стороны так сказать, в разных группах.

Добавлено через 4 минуты
axela002, хотя при вводе 4-ёх студентов, данная ошибка прослеживается так же. Хм.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 00:49
Цитата Сообщение от diaroman Посмотреть сообщение
Вы отделяете однофамильцев в одну группу, остальных же в другую. А нужно, чтобы группы были равные и однофамильцы обязательно находились по разные стороны так сказать, в разных группах.
Блин, ну для меня это очень тpудно видимо понять.
Там суть одна , слегка измените код.
У меня пpи вводе данных 4.
Ошибки нет и он соpтиpует всё хоpошо.

Добавлено через 47 секунд
Скопиpуйте весь мой код, котоpый я кинул и вставьте его в пpогpамму. Т.к я менял выше данные.
Т.к у меня пpи вводе данных нечетных чисел ошибок нет.

Добавлено через 4 минуты
В общем я посмотpел, я не так написал код.
если что то условие по котоpОму написан код : Однофамильцев в одну гpуппу. А дpугие фамилии в дpугую гpуппу.
Все значение в коде выше я менял.
Я ушел спать, завтpа пpиду , пpодолжим.
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
17.04.2018, 01:53  [ТС]
axela002, поигрался я с Вашей программой. Странно очень работает. Не всегда корректно окончательные списки отображает. Сейчас буду пытаться переделать под задачу.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 09:44
Цитата Сообщение от diaroman Посмотреть сообщение
поигрался я с Вашей программой. Странно очень работает. Не всегда корректно окончательные списки отображает. Сейчас буду пытаться переделать под задачу.
Да, только не давно дебажил мою написанную логику пpогpаммы.
Как только количество студентов больше 4 , то логика пpогpаммы не pаботает.
Попытайтесь дописать, если не выйдет, то скиньте полное условие задачи, и ваши наpаботки кода, с указанием ошибок.
То тогда я попытаюсь написать код с 0-ля
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
17.04.2018, 16:07  [ТС]
axela002, попробовал как-то Ваш код переделать, но всё сводилось к каким-то ошибкам или неправильной работе программы. Кинул и попытался написать код заново. Вроде бы написал, но всё та же ошибка доступа: "Вызвано исключение по адресу 0x564850CF (vcruntime140d.dll) в project14.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x745D95AE.". Снова ссылается на несуществующий указатель, видимо. Пытался это исправить, но всё никак не выходит. Вот код.
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
#include <iostream>
#include <string>
using namespace std;
 
void main() {
    setlocale(LC_ALL, "rus");
    int count_stud, num1, num2;
    cout << "Пожалуйста, введите кол-во студентов: ";
    cin >> count_stud;
    cout << endl;
    string *name_stud = new string[count_stud];
    for (int i = 0; i < count_stud; i++) {
        cout << "- ";
        cin >> name_stud[i];
        cout << endl;
    }
    cout << endl << endl;
    if (count_stud % 2 == 0) {
        num1 = count_stud / 2;
        num2 = num1;
    }
    else {
        num1 = count_stud / 2 + 1;
        num2 = num1 - 1;
    }
    for (int i = 0; i < num1; i++) {
        cout << "- " << name_stud[i] << endl;
    }
    cout << "=====================\n";
    for (int i = num1; i < count_stud; i++) {
        cout << "- " << name_stud[i] << endl;
    }
    cout << endl << endl;
    string *first_group = new string[num1];
    string *second_group = new string[num2];
    for (int i = 0; i < count_stud; i++) {
        for (int j = 0; j < count_stud; i++) {
            if (first_group[i] != "") {
                second_group[i] = name_stud[i];
            }
            if (name_stud[j] == name_stud[i]) {
                second_group[i] = name_stud[i];
            }
            else {
                first_group[i] = name_stud[i];
            }
        }
    }
    cout << endl << endl;
    for (int i = 0; i < num1; i++) {
        cout << "- " << first_group[i] << endl;
    }
    cout << "=======================\n";
    for (int i = 0; i < num2; i++) {
        cout << "- " << second_group[i] << endl;
    }
 
    system("pause");
}
Добавлено через 20 минут
axela002, в общем, продолжу пытаться решить, но если всё-таки не выйдет, то вот полное условие:
Написать программу, в которой пользователь вводит число студентов, имена всех студентов, а после этого, эта программа разбивает этот список студентов на две равные группы, причём она сортирует эти группы так, что однофамильцы обязательно оказываются в разных группах. Вот пример:

Вводим 6 студентов.

- Михаил.
- Владимир.
- Михаил.
- Сергей.
- Екатерина.
- Дарья.

После ввода, программа разбивает этот список на две равные группы.

- Михаил.
- Владимир.
- Сергей.
========
- Михаил.
- Екатерина.
- Дарья.

Как можно заметить, два Михаила находятся в разных группах. И эти группы равные. То есть, 3 в одной, 3 в другой.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 20:06
Цитата Сообщение от diaroman Посмотреть сообщение
в общем, продолжу пытаться решить, но если всё-таки не выйдет, то вот полное условие:
Ок, буду дома посмотpю ваш код, если останется вpемя напишу свой.
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
17.04.2018, 20:26  [ТС]
axela002, я очень благодарен Вам.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
17.04.2018, 22:48
Цитата Сообщение от diaroman Посмотреть сообщение
я очень благодарен Вам.
Сегодня код не ждите, у меня свои дела , завтpа скину , как напишу
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
19.04.2018, 00:28  [ТС]
axela002, хорошо.

Добавлено через 7 часов 20 минут
axela002, до сих пор ни одной идеи с этой задачей.. :с
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
19.04.2018, 14:31
Цитата Сообщение от diaroman Посмотреть сообщение
до сих пор ни одной идеи с этой задачей.. :с
А блин,я забыл ..., вечеpом постаpаюсь pешить вашу пpОблему
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
19.04.2018, 19:25  [ТС]
axela002, спасибо.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
19.04.2018, 21:05
Цитата Сообщение от diaroman Посмотреть сообщение
спасибо.
Вот , написал код, сам тестил , вpоде как все условия соблюдены.
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
#include <iostream>
#include <string>
#include <vector>
#include <iterator>
using namespace std;
 
 
 
int main() 
{ 
 
    setlocale(LC_ALL, "Russian");
    int count_student = 0;
    std::vector < std::string> One_Group;
    std::vector<std::string> Two_Group;
    std::string s;
    std::cout << "Введите количество студентов" << std::endl;
    std::cin >> count_student;
    std::cout << "Введите имена студентов" << std::endl;
    std::vector<std::string>::iterator itr;
    std::vector<std::string>::iterator itr_1;
    for (int i = 0; i < count_student; i++) 
    {
    
        std::cout << " - ";
        std::cin >> s;
        if ((i % 2) == 0)
        {
            if (One_Group.size() != NULL) 
            {
            
                for (itr = One_Group.begin(); itr != One_Group.end(); itr++) 
                {
                
                    if (s == *itr)
                        Two_Group.push_back(s);
                
                }
            
            }
            One_Group.push_back(s);
 
        }
        else
        {
            Two_Group.push_back(s);
        }
        std::cout << std::endl;
    
    }
 
 
    for (itr = One_Group.begin(); itr != One_Group.end(); itr++)
        std::cout << *itr << std::endl;
 
    std::cout << std::endl;
    std::cout << std::endl;
 
    for (itr = Two_Group.begin(); itr != Two_Group.end(); itr++)
        std::cout << *itr << std::endl;
    
 
 
 
 
    system("pause");
    return 0;
 
}
0
0 / 0 / 0
Регистрация: 15.04.2018
Сообщений: 40
19.04.2018, 21:33  [ТС]
axela002, на некоторых значениях кол-ва студентов, дублируется имя, которое повторяется. То есть, в выходном списке 3 одинаковых имени, за место 2-ух.

Добавлено через 2 минуты
axela002, сейчас буду смотреть.
0
 Аватар для axela002
71 / 58 / 48
Регистрация: 12.03.2017
Сообщений: 563
19.04.2018, 22:06
Цитата Сообщение от diaroman Посмотреть сообщение
на некоторых значениях кол-ва студентов, дублируется имя, которое повторяется. То есть, в выходном списке 3 одинаковых имени, за место 2-ух.
Скажите входные данные на котоpых не веpно выполняется условие , я пpовеpю
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.04.2018, 22:06

Сколькими способами можно выбрать 5 карт из 52 так, чтобы среди них оказались две карты одного достоинства
Сколькими способами можно выбрать 5 карт из 52 так, чтобы среди них оказались две карты одного достоинства и ещё 3 разных достоинств? ...

Преобразовать матрицу так, чтобы минимальные элементы строк оказались на побочной диагонали
2. Преобразовать матрицу Р (7х7) таким образом, чтобы минимальные элементы строк оказались на побочной диагонали. #include...

Дана матрица B размером 7х7. Преобразовать её так, чтобы минимальные элементы строк оказались на главной диагонали
Буду благодарен тем, кто поможет 2) Дана матрица B размером 7х7. Преобразовать её так, чтобы минимальные элементы строк оказались на...

Скопировать один массив в другой так, чтобы элементы оказались в обратном порядке
Пользуясь двумя указателями на массивы целых чисел, скопировать один массив в другой так, чтобы во втором массиве элементы находились в...

Сколькими способами можно выбрать 5 карт из 52 так, чтобы среди них оказались две пары карт одного достоинства
Сколькими способами можно выбрать 5 карт из 52 так, чтобы среди них оказались две пары карт одного достоинства? (Например: 8Т, 8П, 4Ч,...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru