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

Создать стек тарелок и структуру данных для него

01.12.2022, 14:18. Показов 566. Ответов 17

Author24 — интернет-сервис помощи студентам
Структура данных "Тарелка" имеет следующие поля: тип (для супа / салата /десерта), размер, цена. Выполнить следующие задачи:
1) Создать стопку (стек) тарелок, размер стопки 10.
2) Добавить в нее 7 разных тарелок.

Вот мой код: стек создал, но я не могу понять как мне сгенерировать разные тарелки. По сути для цены и размера можно взять рандом, но что делать с типом? Задавать семь тарелок самому или тоже как-то генерировать? Подскажите этот момент, пожалуйста.

И вообще, можете, пожалуйста, сказать правильно ли я понимаю логику добавления новых тарелок (функция push), и pop?

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
#include <iostream>
#include <stdio.h>
#define N 10
using namespace std;
 
struct plates
{
    string type;
    int size;
    double price;
};
 
struct Stack
{
    plates plates[N];
    int top;
    int is_empty() {
        if (top == 0) return 1;
        return 0;
    }
    void push(int count) {
        top = top + 1;
        if (top > N) cout << "\noverflow";
        else N[&top] = count;
    }
 
    int pop() {
        if (is_empty()) cout << "\noverflow";
        else {
            top = top - 1;
            return N[&top + 1];
        }
    }
};
 
//int generatePlate(* num) {
//    plates num;
//    num.type = "soup";
//
//    int plateType;
//    if (plateType == 1) {
//        num.type = "soup";
//    }
//}
int main()
{
    plates plate1;
    plate1.price = 1 - rand() % 301;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
01.12.2022, 14:18
Ответы с готовыми решениями:

Реализуйте структуру данных, представляющую собой расширенную структуру стек
Реализуйте структуру данных, представляющую собой расширенную структуру стек. Необходимо...

Изучить структуру данных стек, разработать класс TStack для работы с ней
Написал программу в С++ Builder 2007 такую !!!--Цель работы: изучить структуру данных стек,...

Как создать структуру данных "стек"?
подскажите как создать в cu стек? на с++ делал так #include &lt;iostream&gt; #include...

Не открывается текстовый файл для записи данных из него в структуру
Здравствуйте! У меня проблема в том, что текстовый файл просто напросто не открывается. Хочу его...

17
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
01.12.2022, 15:02 2
N[&top] N[&top + 1];
в чём тут смысл оператора & по всем смыслам он тут не подходит.
Вы что просто наугад в программе операторы расставляете?

Добавлено через 9 секунд
Короче, убери

Добавлено через 20 минут
Вот изучай, тут просто тонну доработок пришлось сделать, чтобы хоть как-то заработало. И случайные строки добавил
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
#include <iostream>
#include <stdio.h>
#include <ctime>
#define N 10
using namespace std;
struct plates
{
    string type;
    int size;
    double price;
    void print () {
      cout<<"{type:\""<<type<<"\", size:"<<size<<", price:"<<price<<"}"<<endl;
    }
 
}; 
struct Stack
{
    plates storage[N];
    int top;
    int is_empty() {
        if (top == 0) return 1;
        return 0;
    }
    void push(plates item) {
        top = top + 1;
        if (top > N) cout << "\noverflow";
        else storage[top] = item;
    }
 
    plates pop() {
        if (is_empty()) {
              cout << "\noverflow";
              return plates();
        }
        else {
            top = top - 1;
            return storage[top + 1];
        }
    }
};
plates getRand() {
    plates retval;
    retval.price = rand() % 1201 * 0.25;
    retval.size = rand() % 30;
const char* parts[3][4] ={
{"пере", "спелый ", "гиппо", "потам"},
{"недо", "росший ", "голово", "ног"},
{"вы",    "крашенный ""руко", "хват"}
};
for (int i=0;i<4; ++i)
  retval.type += parts[rand()%3][i];
  return retval;
}
int main()
{
    srand(time(NULL));
    plates plate1;
    Stack clean_plates;
    clean_plates.top=0;
    for (int i=0;i<4; ++i) {
        plate1 = getRand();
        plate1.print();
        clean_plates.push(plate1);
    }
    cout<<"************"<<endl;
    while (!clean_plates.is_empty()) {
       plate1 =  clean_plates.pop();
        plate1.print();
    }
}
1
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
02.12.2022, 12:16  [ТС] 3
Kuzia domovenok, Можете подсказать? У меня есть задача добавить 7 тарелок, потом убрать 3 верхние и потом добавить еще 10 новых, но как добавить 10, если массив уже заполнен, выходит, четырьмя тарелками из двух прошлых изменений? Заменять весь массив новыми или как-то иначе?
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
02.12.2022, 13:23 4
Цитата Сообщение от drake4 Посмотреть сообщение
но как добавить 10, если массив уже заполнен,
ну значит увеличь константу N. в чём проблема?
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
02.12.2022, 13:27  [ТС] 5
изначально в define, имеете ввиду?
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
02.12.2022, 13:33 6
drake4, я имею в виду, что ты весь этот код написал сам, а не стырил где-то и соответственно разговаривать пытаюсь как программист с программистом, а не как со школьником, списавшем домашку.

Если ты код писал сам, то у тебя должны отложиться в голове все нюансы его создания: где ты объявлял N, как ты объявил буфер(массив), зачем ты изменяешь top в одной функции до добавления в буфер, а в другой тоже до, тем самым теряя только что добавленный элемент. И.т.д. и.т.п. во всё это творец кода вкладывает какой-то смысл, если он действительно творец.
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
02.12.2022, 14:07  [ТС] 7
так это все я понимаю, загвоздка в том, что у меня изначальное N должно быть = 10, но в ходе задания мне придется это число превысить и все эти элементы либо просто добавляются для вида: выходит ошибка overflow, когда всего элементов станет больше 10, либо N нужно увеличивать уже в ходе работы, но с константой же, вроде как, делать такого нельзя..
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
02.12.2022, 14:10 8
Цитата Сообщение от drake4 Посмотреть сообщение
так это все я понимаю, загвоздка в том, что у меня изначальное N должно быть = 10, но в ходе задания мне придется это число превысить и все эти элементы либо просто добавляются для вида: выходит ошибка overflow, когда всего элементов станет больше 10, либо N нужно увеличивать уже в ходе работы, но с константой же, вроде как, делать такого нельзя..
так 10 это максимум, а не изначальное число! никто тебе не запрещает добавить сначала 5 потом 3 потом убрать 1 и добавить 3
Повторяю вопрос, в чём проблема написать #define N 1000?
0
118 / 86 / 35
Регистрация: 07.11.2022
Сообщений: 355
02.12.2022, 14:13 9
Цитата Сообщение от drake4 Посмотреть сообщение
загвоздка в том, что у меня изначальное N должно быть = 10,
нет такого в задании. где? покажите.


стек изначально пустой, а далее выполнить задачи:
Цитата Сообщение от drake4 Посмотреть сообщение
Выполнить следующие задачи:
1) Создать стопку (стек) тарелок, размер стопки 10.
2) Добавить в нее 7 разных тарелок.
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
08.12.2022, 17:55  [ТС] 10
Y меня там еще приписка : "реализовать стек на основе статического массива, т.е. стек фиксированной длины N (#define N)", а раз потом написано про размер стека равному 10, то это и есть этот #define N, нет ? Я читал, что не все элементы, что в массиве могут быть в стеке, значит размер массива может быть больше 10.

Я так понял, но не знаю, насколько это правильно, вот часть кода, я еще добавил как следующее задание убрать 8 тарелок, оно их убирает из тех, которые были в overflow при предыдущем шаге :

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
#define N 10
struct Stack
{
    plates storage[100];
    ...
        void push(plates item) {
        top = top + 1;
        if (top >= N) cout << "\noverflow ";
        else storage[top] = item;
    }
    ...
}
int main()
{
    for (int i = 0; i < 7; i++) {
        plate1 = generatePlate();
        plate1.print();
        clean_plates.push(plate1);
    }
    cout << "**************\n";
    for (int i = 0; i < 3; i++) {
        plate1 = clean_plates.pop();
        plate1.print();
    }
    cout << "**************\n";
    for (int i = 0; i < 10; i++) {
        plate1 = generatePlate();
        plate1.print();
        clean_plates.push(plate1);
    }
    for (int i = 0; i < 8; i++) { //убрать 8 тарелок 
        plate1 = clean_plates.pop();
        plate1.print();
    }
}
Подкажите, у меня вообще логика верна или все еще нет и что тогда желательно исправить?
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.12.2022, 19:30 11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ну значит увеличь константу N. в чём проблема?
ты увеличил N до 100? Что смущает-то?

Добавлено через 57 секунд
Цитата Сообщение от drake4 Посмотреть сообщение
Подкажите, у меня вообще логика верна или все еще нет и что тогда желательно исправить?
всё правильно.
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
08.12.2022, 19:43  [ТС] 12
смущает то, что N, как я понял, должен быть именно 10, раз это дано в задании.
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.12.2022, 19:48 13
drake4, ты неправильно понял, N это зарезервированное с запасом свободное место в твоём стеке
а количество твоих циклов ввода вывода добавления удаления так и остаётся до 10 или сколько там у тебя
+10 push
-3 pop
+7 push
-5 pop
+2 push
получили 11 тарелок!
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
08.12.2022, 20:54  [ТС] 14
тоесть надо чтобы везде здесь было 100 (N), а где тогда использовать 10?

C++
1
2
3
4
5
6
7
#define N 100
...
      plates storage[N];
...
      if (top >= N) cout << "\noverflow ";
        else storage[top] = item;
    }
и "количество циклов" это вы имеет ввиду, что больше 10-ти тарелок за один цикл нельзя положить/забрать?

простите, если задалбываю, я просто хочу разобраться и понять
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
08.12.2022, 21:36 15
Цитата Сообщение от drake4 Посмотреть сообщение
и "количество циклов" это вы имеет ввиду, что больше 10-ти тарелок за один цикл нельзя положить/забрать?
да где в моих словах хотя бы двусмысленный намёк на это?
Я правда не понимаю, как фразу "сделай #define N 100 и plates storage[N];"
можно интерпретировать как "а давайте-ка сделаем везде N то есть во всех циклах for и при этом больше 10 тарелок за раз не положить"...?
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
09.12.2022, 13:18  [ТС] 16
но я не ставил N в циклах for, там свои числа стоят, как и должны.
тогда можете объяснить, что вы имели ввиду, говоря "количество циклов"? И как тогда создавать стек размером в 10, если у меня есть пока только место в N (100) под него ?
0
4063 / 3317 / 924
Регистрация: 25.03.2012
Сообщений: 12,483
Записей в блоге: 1
09.12.2022, 13:30 17
Цитата Сообщение от drake4 Посмотреть сообщение
И как тогда создавать стек размером в 10, если у меня есть пока только место в N (100) под него ?
C++
1
2
    Stack clean_plates;
    clean_plates.top=0;
Это стек размера ноль, но в нём есть место под 100 тарелок
C++
1
2
3
4
5
    for (int i = 0; i < 7; i++) {
        plate1 = generatePlate();
        plate1.print();
        clean_plates.push(plate1);
    }
теперь стал стек размера 7, но в нём есть место ещё под 93 тарелки.

так понятно? Количество тарелок в стеке зависит только от того, сколько раз ты вызвал push
А N это просто забронированные места "на всякий случай".

Добавлено через 2 минуты
Цитата Сообщение от drake4 Посмотреть сообщение
но я не ставил N в циклах for, там свои числа стоят, как и должны.
я не знаю, что у тебя менялось, а что нет. я сужу по фразе "а где тогда 10 должно быть", что десяток у тебя даже в циклах не осталось
0
0 / 0 / 0
Регистрация: 28.09.2022
Сообщений: 36
09.12.2022, 13:55  [ТС] 18
Если после добавления 7 тарелок мы убираем 3 из них, то размер стека становится 4?
все действия это:
+7 тарелок
-3
+10
-8
-4 и в конце выходит 2 тарелки.

Если изначально в стеке 0, то потом его размер при последующих добавлениях увеличивается сам. И тогда никаких действий по отдельному созданию стека размером 10 делать не надо или как?

вот весь код, нет, 10 есть только в одном месте: там, где нужно эти 10 тарелок добавить.

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
#include <iostream>
#include <stdio.h>
#include <ctime>
#define N 100
using namespace std;
 
struct plates
{
    string type;
    int size;
    double price;
    void print() {
      cout << "type: " << type << "\t size: " << size << "\t price: " << price << "" << endl;
    }
};
 
struct Stack
{
    plates storage[N];
    int top;
    int is_empty() {
        if (top == 0) return 1;
        return 0;
    }
    void push(plates item) {
        top = top + 1;
        if (top >= N) cout << "\noverflow ";
        else storage[top] = item;
    }
 
    plates pop() {
        if (is_empty()) {
            cout << "\noverflow";
            return plates();
        }
        else {
            top = top - 1;
            return storage[top + 1];
        }
    }
};
 
plates generatePlate() {
    plates retval;
    retval.price = rand() % 2001 * 0.5;
    retval.size = 1 + rand() % 30;
    const char* parts[3] = {"soup", "dessert ", "salad"};
    retval.type = parts[rand() % 3];
    return retval;
}
int main()
{
    srand((unsigned)time(NULL));
    plates plate1;
    Stack clean_plates;
    clean_plates.top = 0;
    for (int i = 0; i < 7; i++) {
        plate1 = generatePlate();
        plate1.print();
        clean_plates.push(plate1);
    }
    cout << "**************\n";
    for (int i = 0; i < 3; i++) {
        plate1 = clean_plates.pop();
        plate1.print();
    }
    cout << "**************\n";
    for (int i = 0; i < 10; i++) {
        plate1 = generatePlate();
        plate1.print();
        clean_plates.push(plate1);
    }
    cout << "**************\n";
    for (int i = 0; i < 8; i++) {
        plate1 = clean_plates.pop();
        plate1.print();
    }
    cout << "**************\n";
    for (int i = 0; i < 4; i++) {
        plate1 = clean_plates.pop();
        plate1.print();
    }
}
0
09.12.2022, 13:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.12.2022, 13:55
Помогаю со студенческими работами здесь

Как создать стек для ввода данных
Данные ниже правильно написаны для добавления в стринггрид? p^.fio:=edi1.text; stringgrid1.cells;...

Реализовать структуру данных стек
Реализовать структуру данных стек/.

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

Реализовать структуру данных дерево и реализовать несколько методов для него
Нужно в консольном приложении реализовать структуру данных дерево и реализовать несколько методов...

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

Создать структуру, реализующую стек целых чисел типа LIFO
Создать структуру, реализующую стек целых чисел типа LIFO. Данные структуры: массив стека,...


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

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

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