Структуры в С++

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Дали мне задание по структурам, но ничего не обьяснили, тему эту мы не проходили( но сделать надо(
помогите, мне хотя бы принцип сам работы, как это оформить. а то я чесно говоря хз. гугл что-то внятное выдать не может.

структура


Обьекты номера в гостиннице. Нужно посчитать суммарное количество мест и количество свободных мест в гостиннице, общую стоимость номеров.(Должно быть 10 обьеков. Нужны отдельные функции инициализирования объектов и вычислений. В функции main в цикле выводить меню пунктам инициализировать объект, вывести все объекты, подсчеты (в зависимости от варианта), выйти из программы). Работа с меню должна располагаться также в отдельной функции. .)
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
Дали мне задание по структурам, но ничего не обьяснили, тему эту мы не проходили( но сделать надо(
помогите, мне хотя бы принцип сам работы, как это оформить. а то я чесно говоря хз. гугл что-то внятное выдать не может.

структура
Нужна именно просто структура или можно из нее класс сделать?
 
F

flashkpi

#5
Пиши, сделаю без проблем
[контактные данные удалены]
 

DarkKnight

Well-known member
01.08.2010
653
0
#7
2 ксешенька, сегодня сделаю...
Но может у тебя уже есть какие то наработки? Может начала уже что то делать???
 
G

Guest

#8
начали делать, а преподователь сказал, что неправильно.
мы массив передали через константу. сказали, что бред
надо проще
// LAB9.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include "stdafx.h"
#pragma once
#include "iostream"
#include <Windows.h>
#include <math.h>
#include "stdafx.h"
using namespace std;

struct Otel
{
char nomer[40];
int miscia;
int vartist;
};

const Otel otel[]=
{
{"1 номер", 4, 3000},
{"2 номер", 3, 1700},
{"3 номер", 4, 3000},
{"4 номер", 2, 1500},
{"5 номер", 1, 1000},
{"6 номер", 4, 3000},
{"7 номер", 2, 1500},
{"8 номер", 3, 1700},
{"9 номер", 1, 1000},
{"10 номер", 6, 5000}
};


void Print()
{
int wc = sizeof(otel)/sizeof(otel[0]);
int i;
for(int i=0; i<wc; ++i)
{
cout<<otel.nomer<<" , Количество номеров: "<<otel.miscia
<<", Стоимость: "<<otel.vartist
<<'\n';
}
}
void rahunok()
{
int wc = sizeof(otel)/sizeof(otel[0]);
int sumnom = 0, i;
float sumvar = 0;
for(int i=0; i<wc; ++i)
{
sumnom += otel.miscia;
sumvar += otel.vartist;
}
cout<<'\n';
cout<<"Суммарное количество номеров : "<<sumnom<<'\n';
cout<<'\n';
cout<<"Суммарная стоимость: "<<sumvar<<'\n';
cout<<'\n';
}
int _tmain(int argc, _TCHAR* argv[])
{
SetConsoleOutputCP(1251);
//setlocale(LC_ALL, "Russian");
Print();
rahunok();
system("pause");
}

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

DarkKnight

Well-known member
01.08.2010
653
0
#9
мы массив передали через константу. сказали, что бред
надо проще
Конечно бред ;-)))) Но идея хорошая... [+] только за эту часть
C++:
const Otel otel[]=
{
{"1 номер", 4, 3000},
{"2 номер", 3, 1700},
{"3 номер", 4, 3000},
{"4 номер", 2, 1500},
{"5 номер", 1, 1000},
{"6 номер", 4, 3000},
{"7 номер", 2, 1500},
{"8 номер", 3, 1700},
{"9 номер", 1, 1000},
{"10 номер", 6, 5000}
};
 

DarkKnight

Well-known member
01.08.2010
653
0
#10
Пока что очень занят... Вот держи пока начало...
C++:
/*
Обьекты номера в гостиннице. Нужно посчитать суммарное количество мест и количество свободных мест в гостиннице, 
общую стоимость номеров.(Должно быть 10 обьеков. Нужны отдельные функции инициализирования объектов и вычислений. 
В функции main в цикле выводить меню пунктам инициализировать объект, вывести все объекты, подсчеты (в зависимости от варианта), выйти из программы). 
Работа с меню должна располагаться также в отдельной функции. .)
*/
#include <iostream>
#include <iomanip>

using namespace std;

//Сама структура
struct Nomer
{
char Nom[10]; //Номер (тип char, т.к. номер может быть 12а, 16b, 11Vip)
int kMest; //Кол-во мест в номере (типо Койка-Место)
int resMest; //Текущее рарезервированное кол-во мест (койка-мест)
int Price; //Цена 1 места
};

//Функция меню
int Menu(void)
{
cout<< endl<< "\t\t\t МЕНЮ" << endl;
cout<<"\t1. Инициализация номеров гостиницы" << endl;
cout<<"\t2. Заселение в номер" << endl;
cout<<"\t3. Выселение из номера" << endl;
cout<<"\t4. Статистика по номерам" << endl;
cout<<"\t5. Выход из системы" << endl;
cout<<"Ваш выбор : ";
int selection;
cin>>selection;
return selection;
}

//Функция заполнения информации по одному номеру
Nomer SetInfoNomer (char* Nom, int kMest, int resMest, int Price)
{
Nomer Result;
memset(Result.Nom,0,10);
strncpy(Result.Nom,Nom,9);
Result.kMest = kMest;
Result.resMest = resMest;
Result.Price = Price;
return Result;
}
//Функция инициализации номеров
void Init(Nomer *Arr, int &CountArr)
{
cout<<"Введите кол-во инициализируемых номеров : ";
cin>>CountArr;
for (int i = 0; i<CountArr; i++)
{
char sNom[10];
int kMest,resMest,Price;
getchar();
cout<<"Введите название номера : ";
gets(sNom);
cout<<"Введите кол-во мест в номере : ";
cin>>kMest;
cout<<"Введите кол-во уже заселенных мест в номере : ";
cin>>resMest;
if (resMest > kMest) resMest = kMest;
cout<<"Введите стоимость одного места в номере : ";
cin>>Price;
cout<<"------------------------------------------" << endl;
Arr[i] = SetInfoNomer(sNom,kMest,resMest,Price);
}
}

void ShowStatistic (Nomer *Arr, int CountArr)
{
cout<<endl << "\t\t\tСтатистика по номерам" << endl;
cout<<setw(12) << "Назв. номера" << setw(12) << "Кол-во мест" << setw(18) << "Кол-во рез. мест" << setw(12) << "Цена" << endl;
for (int i = 0; i<CountArr; i++)
{
cout << setw(12) << Arr[i].Nom<<setw(12) << Arr[i].kMest << setw(18) << Arr[i].resMest << setw(12) << Arr[i].Price<< endl;
}
cout<<"-------------------------------------------------------" << endl;


}
//Основная функция программы (точка входа)
void main(void)
{
setlocale(LC_ALL,"Russian"); //Установим локаль в .1251 кодовую страницу
Nomer Arr[10]; //Наш массив номеров
int CountArr = 0; //Переменная где мы учитываем проинициализированные номера
int Selection = 0; //Выбор меню
while (Selection != 5)
{
Selection = Menu(); //Получим результат меню
switch (Selection)
{
case 1:
Init(Arr,CountArr);
break;
case 2:
break;
case 3:
break;
case 4:
ShowStatistic(Arr,CountArr);
break;
case 5:
break;
default:
Selection = 0;
}

}
}
 

Вложения

DarkKnight

Well-known member
01.08.2010
653
0
#11
Вот конечная реализация :
C++:
/*
Обьекты номера в гостиннице. Нужно посчитать суммарное количество мест и количество свободных мест в гостиннице, 
общую стоимость номеров.(Должно быть 10 обьеков. Нужны отдельные функции инициализирования объектов и вычислений. 
В функции main в цикле выводить меню пунктам инициализировать объект, вывести все объекты, подсчеты (в зависимости от варианта), выйти из программы). 
Работа с меню должна располагаться также в отдельной функции. .)
*/
/*
codeby.net
Autor: DarkKnight125
*/
//(с)DarkKnight125: Но с классом все же было бы веселее
#include <iostream>
#include <iomanip>

using namespace std;

//Сама структура
struct Nomer
{
char Nom[10]; //Номер (тип char, т.к. номер может быть 12а, 16b, 11Vip)
int kMest; //Кол-во мест в номере (типо Койка-Место)
int resMest; //Текущее рарезервированное кол-во мест (койка-мест)
int Price; //Цена 1 места
};

//Функция меню
int Menu(void)
{
cout<< endl<< "\t\t\t МЕНЮ" << endl;
cout<<"\t1. Инициализация номеров гостиницы" << endl;
cout<<"\t2. Заселение в номер" << endl;
cout<<"\t3. Выселение из номера" << endl;
cout<<"\t4. Статистика по номерам" << endl;
cout<<"\t5. Выход из системы" << endl;
cout<<"Ваш выбор : ";
int selection;
cin>>selection;
return selection;
}

//Функция заполнения информации по одному номеру
Nomer SetInfoNomer (char* Nom, int kMest, int resMest, int Price)
{
Nomer Result;
memset(Result.Nom,0,10);
strncpy(Result.Nom,Nom,9);
Result.kMest = kMest;
Result.resMest = resMest;
Result.Price = Price;
return Result;
}
//Функция инициализации номеров
void Init(Nomer *Arr, int &CountArr)
{
cout<<"Введите кол-во инициализируемых номеров : ";
cin>>CountArr;
for (int i = 0; i<CountArr; i++)
{
char sNom[10];
int kMest,resMest,Price;
getchar();
cout<<"Введите название номера : ";
gets(sNom);
cout<<"Введите кол-во мест в номере : ";
cin>>kMest;
cout<<"Введите кол-во уже заселенных мест в номере : ";
cin>>resMest;
if (resMest > kMest) resMest = kMest;
cout<<"Введите стоимость одного места в номере : ";
cin>>Price;
cout<<"------------------------------------------" << endl;
Arr[i] = SetInfoNomer(sNom,kMest,resMest,Price);
}
}

void ShowStatistic (Nomer *Arr, int CountArr)
{
double SummaryPrice = 0.0; //Суммарный доход с номеров
double SummaryNotPrice = 0.0; //Не дополученная прибыль
int SumReserv = 0; //Кол-во заселенных номеров
int SumNotReserv = 0; //Кол-во свободных номеров
cout<<endl << "\t\t\tСтатистика по номерам" << endl;
cout<<setw(12) << "Назв. номера" << setw(12) << "Кол-во мест" << setw(18) << "Кол-во рез. мест" << setw(12) << "Цена" << endl;
for (int i = 0; i<CountArr; i++)
{
SummaryPrice += Arr[i].resMest * Arr[i].Price;
SummaryNotPrice += (Arr[i].kMest - Arr[i].resMest) * Arr[i].Price;
SumReserv += Arr[i].resMest;
SumNotReserv += Arr[i].kMest - Arr[i].resMest;

cout << setw(12) << Arr[i].Nom<<setw(12) << Arr[i].kMest << setw(18) << Arr[i].resMest << setw(12) << Arr[i].Price<< endl;
}
cout<<"-------------------------------------------------------" << endl;
cout<<"Суммарный доход с номеров : "<< SummaryPrice << "руб." << endl; 
cout<<"Недополученная прибыль с номеров : "<< SummaryNotPrice << "руб." << endl;
cout<<"Кол-во заселенных номеров : "<< SumReserv << " шт." << endl;
cout<<"Кол-во свободных номеров : "<< SumNotReserv << " шт." << endl;
cout<<"-------------------------------------------------------" << endl;
}

//Заселение (резервирование) номера
void ReservNomer (Nomer *Arr, int CountArr)
{
cout<<endl << "\t\t\tИнформация по свободным номера" << endl;
cout<<setw(5)<<"Код"<< setw(12) << "Назв. номера" << setw(12) << "Кол-во мест" << setw(18) << "Кол-во рез. мест" << setw(12) << "Цена" << endl;
for (int i = 0; i<CountArr; i++)
{
if (Arr[i].kMest - Arr[i].resMest > 0)
{
cout <<setw(5)<<i<< setw(12) << Arr[i].Nom<<setw(12) << Arr[i].kMest << setw(18) << Arr[i].resMest << setw(12) << Arr[i].Price<< endl;
}
}
int Selection; // Переменная выбора
int ReservCount; //Зарезервированное кол-во
cout<<"Введите код номера для заселения : ";
cin >> Selection;
cout<<"Введите кол-во мест для резерва : ";
cin >> ReservCount;
if (Arr[Selection].kMest - Arr[Selection].resMest - ReservCount < 0)
{
cout<<" Ошибка не хватает места для резерва" << endl;
return;
} 
Arr[Selection].resMest += ReservCount;
cout<< "Резервированние прошло успешно : " << endl;
cout <<"Стоимость номера в сутки : " << Arr[Selection].Price * ReservCount << endl;
cout <<"----------------------------------------"<< endl;
}

//Выселение из номера
void UnReservNomer (Nomer *Arr, int CountArr)
{
cout<<endl << "\t\t\tИнформация по заселенным номерам" << endl;
cout<<setw(5)<<"Код"<< setw(12) << "Назв. номера" << setw(12) << "Кол-во мест" << setw(18) << "Кол-во рез. мест" << setw(12) << "Цена" << endl;
for (int i = 0; i<CountArr; i++)
{
if (Arr[i].resMest > 0) //Если зарезервированое кол-во больше нуля то вывести номер
{
cout <<setw(5)<<i<< setw(12) << Arr[i].Nom<<setw(12) << Arr[i].kMest << setw(18) << Arr[i].resMest << setw(12) << Arr[i].Price<< endl;
}
}
int Selection; // Переменная выбора
int UnReservCount; //Сколько убрать из резерва
cout<<"Введите код номера для выселения : ";
cin >> Selection;
cout<<"Введите кол-во мест для выселения : ";
cin >> UnReservCount;
if (Arr[Selection].resMest - UnReservCount < 0)
{
cout<<" Ошибка: Не возможно выселить больше чем заселенно" << endl;
return;
} 
Arr[Selection].resMest -= UnReservCount;
cout<< "Выселение (Unreserving) прошло успешно : " << endl;
cout <<"Потери в прибыли от номера составляют (в сутки) : " << Arr[Selection].Price * UnReservCount << endl;
cout <<"----------------------------------------"<< endl;
}

//Основная функция программы (точка входа)
void main(void)
{
setlocale(LC_ALL,"Russian"); //Установим локаль в .1251 кодовую страницу
Nomer Arr[10]; //Наш массив номеров
int CountArr = 0; //Переменная где мы учитываем проинициализированные номера
int Selection = 0; //Выбор меню
while (Selection != 5)
{
Selection = Menu(); //Получим результат меню
switch (Selection)
{
case 1: //Инициализация начальных данных
Init(Arr,CountArr);
break;
case 2: //Резервирование (вселение) в номер
ReservNomer (Arr, CountArr);
break;
case 3: // Выселение из номера
UnReservNomer (Arr, CountArr);
break;
case 4: //Вывод статистики по всем номерам
ShowStatistic(Arr,CountArr);
break;
case 5: //Выход
break;
default: //Если не выбранно ни одного из вариантов продолжаем цикл
Selection = 0;
}

}
}
 

Вложения