0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 9
1

Определить какому студенту какой достался билет при выборе из кольцевого списка

19.12.2022, 23:29. Показов 683. Ответов 8

Author24 — интернет-сервис помощи студентам
Здраствуйте, помогите сделать задание. Есть создание кольцевого списка, нужна помощь с функцией по заданию.

Даны 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
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 <stdlib.h>
using namespace std;
 
struct  Node
{
    int x;
    Node *Next;
};
 
class List
{
    Node *Head, *Tail; //Первый элемент и тот что последний
    int size; //Число элементов в списке
public:
    List() :Head(NULL), Tail(NULL), size(0) {}; //Инициализация элементов в ноль с помощью конструктора
    ~List(); //Деструктор для освобождения памяти
    void Add(int x); //Функция добавления элементов в списов
    void Show(int size); //Функция отображения элементов списка
    int Count(); //Функция возвращающая число элементов в списке
};
 
List::~List()
{
    while (size != 0) //Пока размерность списка не станет нулевой
    {
        Node *temp = Head->Next;
        delete Head; //Освобождаем память от активного элемента
        Head = temp; //Смена адреса начала на адрес следующего элемента
        size--; //Один элемент освобожден. корректируем число элементов
    }
}
 
int List::Count()
{
    return size; //Возвращаем число элементов списка
}
 
void List::Add(int x)
{
    size++; //При каждом добавлении элемента увеличиваем число элементов в списке
    Node  *temp = new Node; //Выделение памяти для нового элемента списка
    temp->Next = Head; //Замыкание контура. Последний элемент - это начало списка
    temp->x = x; //Записываем в выделенную ячейку памяти значение x
 
    if (Head != NULL) //В том случае если список не пустой
    {
        Tail->Next = temp; //Запись данных в следующее за последним элементом поле
        Tail = temp; //Последний активный элемент=только что созданный.
    }
    else Head = Tail = temp;//Если список пуст то создается первый элемент.
}
 
void List::Show(int temp)
{
    Node *tempHead = Head; //Указываем на голову
 
    temp = size; //Временная переменная равная числу элементов в списке
    while (temp != 0) //Пока не выполнен признак прохода по всему списку
    {
        cout << tempHead->x << '\n' ; //Очередной элемент списка на экран
        tempHead = tempHead->Next; //Указываем, что нужен следующий элемент
        temp--; //Один элемент считан, значит осталось на один меньше
    }
}
 
int main()
{
    system("CLS");
    List lst1;
    List lst2;
    int z, N1, N2, x;
    cout << "Enter the size of the list 1:";
    cin >> N1;
    for (int i=0;i<N1;i++)
    {
        cout << "Enter  elements of the list:";
        cin >> x;
        lst1.Add(x);
    }
    cout << "Enter the size of the list 1:";
    cin >> N2;
    for (int i=0;i<N2;i++)
    {
        cout << "Enter  elements of the list:";
        cin >> x;
        lst2.Add(x);
    }
    lst1.Show(lst1.Count());
    lst2.Show(lst2.Count()); //Показываем список на экране.
    cout << endl;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.12.2022, 23:29
Ответы с готовыми решениями:

Определить какому студенту какой достался билет
Даны 2 кольцевых списка, содержащих фамилии учащихся и номера экзаменационных билетов. Число...

Кольцевые списки: определить, какому студенту достался какой билет
Написать программу на С++. Даны 2 кольцевых списка, содержащих фамилии учащихся и номера...

Какова вероятность того, что студенту достался плохой билет?
Из 20 билетов студент знает хорошо 15 и о пяти имеет лишь общее представление. Вероятность...

Определить, кто куда купил билет и по какой цене?
Добрый день уважаемые форумчане. Только начал изучать пролог, в инете полно задач про пап и мам и...

Скрытие\отображение нового списка при выборе значения из списка
Например при выборе option(1,2,3,5) должен появиться другой список который указывает количество...

8
2797 / 2307 / 701
Регистрация: 29.06.2020
Сообщений: 8,544
20.12.2022, 01:36 2
Цитата Сообщение от Doub Посмотреть сообщение
Node *Head, *Tail; //Первый элемент и тот что последний
И тут я поплыл
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 9
20.12.2022, 11:49  [ТС] 3
Так сможете помочь? Сам не могу понять как написать, а на форуме похожих решений не нашел
0
2797 / 2307 / 701
Регистрация: 29.06.2020
Сообщений: 8,544
20.12.2022, 15:45 4
Цитата Сообщение от Doub Посмотреть сообщение
Даны 2 кольцевых списка
Каких кольцевых списка ?
Можно зациклить все что угодно.
Я не вижу в задании, необходимость создания кольцевого списка аля односвязный список.

Как бы там ни было. Вам нужно описать АТД вашего списка. Его необходимый функционал для решения вашей задачи.
Что нам нужно :
- добавление.
- удаление.
- итерирование, доступ к N - у элементу от текущего.

Еще раз вернемся к нашим баранам.
Вам нужен какой-то мифический "кольцевой список" ?
Или максимально эффективно решить поставленную задачу ?
0
0 / 0 / 0
Регистрация: 26.04.2022
Сообщений: 9
20.12.2022, 15:50  [ТС] 5
Мне нужно разработать программу на языке С++, реализующую алгоритмы работы с кольцевым списком.
Программа должна формировать и выводить на экран исходные списки, производить с ними действия согласно варианту и выводить результат.

Я понимаю, что любую задачу можно реализовать эффективнее, но в данном случае обязательно использовать кольцевые списки.
0
501 / 396 / 88
Регистрация: 05.08.2022
Сообщений: 2,193
20.12.2022, 16:19 6
Люди добрые, скажите: что такое "Число пересчета" ?
гугл не помог

Добавлено через 31 секунду
Зато гугл подсказал, что студням из года в год задают одни и те же задачи.
Объединить два кольцевых списка в один кольцевой список

Добавлено через 55 секунд
В задании:
Цитата Сообщение от Doub Посмотреть сообщение
содержащих фамилии учащихся и номера экзаменационных билетов
В программе:
Цитата Сообщение от Doub Посмотреть сообщение
struct Node
{
int x;
Node *Next;
};
Где фамилия??
0
2797 / 2307 / 701
Регистрация: 29.06.2020
Сообщений: 8,544
20.12.2022, 21:25 7
Цитата Сообщение от KSergey9 Посмотреть сообщение
Где фамилия??
Это, наверное, для билета

Добавлено через 1 минуту
Цитата Сообщение от Doub Посмотреть сообщение
но в данном случае обязательно использовать кольцевые списки.
Кольцевой список на односвязном узле, как машине пятое колесо, если требуется удаление элементов.
А у нас требуется.
Удалять студента и билет, который ему выдали из списков.
0
6085 / 3445 / 1400
Регистрация: 07.02.2019
Сообщений: 8,755
20.12.2022, 21:57 8
Лучший ответ Сообщение было отмечено Doub как решение

Решение

Doub,
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>
#include <cassert>
 
template<class T>
class linked_ring
{
    struct node
    {
        T val;
        node* next;
    } *tail;
public:
    linked_ring() : tail(nullptr) {}
    linked_ring(const linked_ring&) = delete;
    linked_ring& operator=(const linked_ring&) = delete;
 
    void push_front(T const &val)
    {
        if (!tail)
        {
            tail = new node{ val };
            tail->next = tail;
        }
        else
            tail->next = new node{ val, tail->next };
    }
 
    void push_back(T const &val)
    {
        push_front(val);
        rotate(1);
    }
 
    void pop_front()
    {
        if (tail == tail->next)
        {
            delete[] tail;
            tail = nullptr;
            return;
        }
        node* to_del = tail->next;
        tail->next = to_del->next;
        delete[] to_del;
    }
 
    T const& front() const
    {
        return tail->next->val;
    }
 
    void rotate(unsigned n)
    {
        while(n--)
            tail = tail->next;
    }
 
    void clear()
    {
        while (tail) pop_front();
    }
 
    bool empty() const
    {
        return !tail;
    }
 
    ~linked_ring()
    {
        clear();
    }
};
 
int main()
{
    linked_ring<int> tickets;
    linked_ring<std::string> students;
    // заполнение списков сам сделай, там все нужные методы есть
    //...
    unsigned E, K;
    std::cin >> E >> K;
    assert(E > 0 && K > 0);
    while (!tickets.empty() && !students.empty())
    {
        tickets.rotate(E - 1);
        students.rotate(K - 1);
        std::cout << students.front() << "->" << tickets.front() << '\n';
        students.pop_front();
        tickets.pop_front();
    }
}
2
2797 / 2307 / 701
Регистрация: 29.06.2020
Сообщений: 8,544
20.12.2022, 22:17 9
Лучший ответ Сообщение было отмечено Doub как решение

Решение

Не отлаживал, такая вот крутилка.
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
#include <iostream>
#include <string>
using namespace std;
 
template<class T>
class CircleList{
    struct Node;
public:
    void push_back(T data){
        if (curr==nullptr){
            curr = new Node(data);
            curr->next = curr;
            last = curr;
        }
        else{   
            last->next = new Node(data, curr);
            last = last->next;
        }
        ++size_m;
    }
    /*
    // spin - прокрутка списка без удаления
    // for empty list = UB    
    const T& spin_n(size_t n){
        n = n%size_m;
        Node *tmp;
        while(n--){
            tmp = curr;
            curr = curr->next;
            last = tmp;
        }
        return curr->data;
    };
    */
    // for empty list = UB
    T remove_n(size_t n){
        n = n%size_m;
        Node *tmp;
        while(n--){
            tmp = curr;
            curr = curr->next;
            last = tmp;
        }
        T res = curr->data;
        if (last == curr){
            delete curr;
            curr = nullptr;
            last = nullptr;
        }else{
            tmp = curr->next;
            delete curr;
            curr = tmp;
            last->next = curr;
        }
        --size_m;
        return res;
    }
    size_t size(){
        return size_m;
    }
    bool empty(){
        return size_m == 0;
    }
private:
    Node *curr  = nullptr;
    Node *last  = nullptr;
    size_t size_m = 0;
    struct Node{
        T data;
        Node *next;
        Node(T data = T{}, Node *next = nullptr):data{move(data)}, next{next}{
        }
    };
};
 
int main()
{
    CircleList<string> students;
    CircleList<size_t> tickets;
    
    students.push_back("Vasya");
    students.push_back("Petya");
    students.push_back("Vitya");
    students.push_back("Lilya");
    students.push_back("Kirya");
    
    for(size_t i = 1; i<=10; ++i)
        tickets.push_back(i);
        
    const size_t K = 5; // каждый K-ый студент
    const size_t E = 3; // получает E-ый билет
    // крутим
    while(!students.empty() && !tickets.empty()){
        auto student = students.remove_n(K);
        auto ticket  = tickets.remove_n(E);
        cout << "Student " << student << " got ticket # " << ticket << endl;
    }
}
Добавлено через 1 минуту
zayats80888, будет два, пусть крутит спиннеры с двух рук
1
20.12.2022, 22:17
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.12.2022, 22:17
Помогаю со студенческими работами здесь

Скрытие\отображение нового списка при выборе значения из списка с выбором одного элемента
Добрый день!Существует список из которого нужно выбрать один элемент, с выбором элемента...

Найти вероятность того, что билет, который достанется студенту, будет состоять из вопросов, среди которых он не выучил один
Если возможно и не затруднит прошу пожалуйста помощи в решении этих заданий на сложение и умножение...

Структура: Определить, к какой стране, какому предприятию и товару принадлежит заданный код.
Код товара (например, 048777111) условно можно разделить на три части: код страны-производителя...

Сортировка кольцевого списка. Разделить на 2 списка
Здравствуйте, форумчане! Прошу помочь мне со следующей задачей. Дан кольцевой список, содержащий...

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru