C/C++

Всем привет. знаю что до меня трудно доходит но я стараюсь:)

Создайте систему управления складом, которая может хранить следующие данные для ящиков:
• уникальный номер для идентификации каждой отдельной коробки,
• ширина, длина и высота каждого ящика, а также
• объем ящика
вот то что я смог соорудить

#include
using namespace std;
const int MAX = 50;

struct korobka
{
int dlinna;
int shirina;
int wisota;
int nomer;
int razmer;

};

korobka sapis(korobka wmeste[MAX])
{
cout << "Bitte KistenNr. eingeben: " << endl;
cin >> wmeste[MAX].nomer;

if (wmeste[MAX].nomer <= 50)
{
cout << "Bitte laenge von " << wmeste[MAX].nomer << " Kiste eingeben" << endl;
cin >> wmeste[MAX].dlinna;

cout << "Bitte breite von " << wmeste[MAX].nomer << " Kiste eingeben" << endl;
cin >> wmeste[MAX].shirina;

cout << "Bitte hoehe von " << wmeste[MAX].nomer << " Kiste eingeben" << endl;
cin >> wmeste[MAX].wisota;

wmeste[MAX].razmer = wmeste[MAX].dlinna * wmeste[MAX].shirina * wmeste[MAX].wisota;
cout << "Volumen von " << wmeste[MAX].nomer << " Kiste ist " << wmeste[MAX].razmer << endl;

}
else
{
cout << "nesushestwujet " << endl;
}
return wmeste[MAX];
}

korobka pokazat(korobka wmeste[MAX])
{
cout << "Bitte KistenNr. eingeben um Daten zu sehen: " << endl;
cin >> wmeste[MAX].nomer;

if(wmeste[MAX].nomer > 0 && wmeste[MAX].nomer <= 50)
{
cout << "nomer.: " << wmeste[MAX].nomer << endl;
cout << "dlinna: " << wmeste[MAX].dlinna << endl;
cout << "shirina: " << wmeste[MAX].shirina << endl;
cout << "wisota: " << wmeste[MAX].wisota << endl;
wmeste[MAX].razmer = wmeste[MAX].dlinna * wmeste[MAX].shirina * wmeste[MAX].wisota;
cout << "razmer: " << wmeste[MAX].razmer << endl;

}
else
{
cout << "nesushestwujet!" << endl;
}
return wmeste[MAX];

}

int main()
{
int auswahlmenue;
korobka wmeste[MAX];

do
{

cout << "\t\t\t\t Menu " << endl;
cout << "wibiraij " << endl;
cout << "1 nowaja sapis " << endl;
cout << "2 pokasatj " << endl;
cout << "6 exit " << endl;
cin >> auswahlmenue;

switch (auswahlmenue)
{
case 1:
sapis(wmeste);
break;
case 2:
pokazat(wmeste);
break;
case 6:
cout << "programma exit." << endl;
exit(0);
break;

}
} while (auswahlmenue);

return 0;
}

кто нибудь может меня ткнуть мордой в мои ошибки
почему эта херня не работает если я пытаюсь считать коробку то оно выдаёт совсем не то что надо и не могу задать много разных коробокю.
заранее блогодарю
#include <iostream>
#include <vector>
#include <iomanip>
#include <conio.h>
using namespace std;
enum class Menu {
EXIT = 48,
RECORD,
SHOW
};
struct Box {
unsigned id;
double width;
double length;
double height;
double volume()const {
return width * length * height;
}
friend istream& operator>>(istream& inp, Box& box) {
cout << " ID: ";
inp >> box.id;
cout << " Width box: ";
inp >> box.width;
cout << " Length box: ";
inp >> box.length;
cout << " Height box: ";
inp >> box.height;
return inp;
}
friend ostream& operator<<(ostream& out, const Box& box) {
return out
<< box.id << ". "
<< fixed << setprecision(2)
<< box.width << " x "
<< box.length << " x "
<< box.height << " = "
<< setprecision(4) << box.volume();
}
};
void menu() {
cout
<< setw(14) << "MENU\n"
<< " Press key 1 to Record\n"
<< " Press key 2 to Show\n"
<< " Press key 0 to Exit\n\n";
}
int main() {
vector<Box> storage;
Box box;
while (true) {
menu();
switch (Menu(_getch())) {
case Menu::RECORD:
cin >> box;
storage.emplace_back(box);
break;
case Menu::SHOW:
for (const auto& next : storage) cout << next << '\n';
break;
case Menu::EXIT: exit(0);
default: puts("Error!");
}
cin.ignore(cin.rdbuf()->in_avail());
}
}
ДМ
Дмитрий Мальковский
54 437
Лучший ответ
Александр Орлов Вот только conio делает программу непереносимой. ★
   Скорее всего стек переполняется при передаче в функцию массива структур. А также на передачу тратится много времени.
   Если требуется передать в функцию очень много данных одним параметром, то лучше передавать по ссылке. Но в таком случае фвнкция сможет изменять то, что объявлено за её пределами.
   А возврат из функции фактически не используется, поэтому функцию лучше объявить с типом void.

☀ Кроме того, вместо массивов лучше передавать в функцию указатель на первый элемент массива (то есть просто имя массива) и, отдельно, размер массива. ☀

void sapis (korobka * wmeste, int size) // в теле функции следует использовать параметр size
Viktor Habarov
Viktor Habarov
16 172
Viktor Habarov Вот как у Вас определяется MAX:

const int MAX = 50;

И ни в каких блоках это имя не переопределяется!!!

Значит, везде, где указано это имя подставляется число 50.

Вот объявление массива в теле функции main:

korobka wmeste[MAX];

Стало быть, у Вас массив из 50 элементов, каждый типа struct korobka. Индексы этих элементов изменяются от 0 до 49 включительно.

★ А в Ваших функциях прописано обращение к элементу с индексом MAX. Конечно, такого элемента не существует, происходит выход за пределы памяти массива!!!
Вам нужно объявить вспомогательную переменную, в которую пользователь будет вводить номер коробки. А индекс соответствующего элемента массива ровно на 1 меньше номера коробки!
Viktor Habarov И ещё, Вам стоит вынести объявление массива korobka wmeste[MAX]; из тела функции main, поскольку для него может не хватaть памяти в стеке. Разместите этот массив выше заголовка main. И хорошо бы объявить его статическим, это позволит ему быть огромным.

static korobka wmeste[MAX];
Viktor Habarov В обеих функциях длинная цепь ошибок, всё из-за употребления имени MAX.

Но начинается всё с этой строки:

cin >> wmeste[MAX].nomer;

НЕ ТАК!!!

Сначала объявить вспомогательную переменную, например, int Nommer;

Потом — ввод в эту переменную: cin >> Nommer;

Ниже проверка номера на допустимось: if (Nommer > 0 && Nommer <= MAX) {

И только внутри блока if можно присвоить: wmeste[Nommer-1].nomer = Nommer;

Вот так будет правильно!
Viktor Habarov Если у Вас объём коробки определяется через произведение её габаритов, то Вы можете и не хранить этот объём в записи о коробке, а вычислять всякий раз, когда это понадобится.

Но уж если Вы решили сохранять объём коробки в самой записи о коробке, то зачем вычислять его повторно? Просто выведите то, что уже хранится в соответствующем поле!
Viktor Habarov Хорошо бы поле razmer сделать типа long или даже long long, а то произведение трёх величин может не поместиться в int.