Всем доброго времени суток! Помогите пожалуйста решить задачку на C++ Builder 6. Саму прогу то я накидал,вот в методах класса запутался немного ...буду очень признателен!
Не уверен, что оказываю помощь, скорее это можно назвать "не смог пройти мимо".
Начну с критики формулировки задачи. Это шедевр! Не стоит передавать мою критику преподавателю, если это его формулировка. Может быть в качестве уточняющих вопросов...
задача -
Создайте класс, имитирующий работу биллинговой системы сотового оператора.
Биллинговые системы сотовых операторов достаточно громмоздки, что бы даже имитировать их работу одним лишь классом. Классов там должно быть предостаточно.
Объектом
данного класса является лицевой счет абонента.
На фразе "объектом данного класса" меня перемкнуло. Объект - это сущность, поведение которой определяется типом. Класс - это способ описания типа в языке C++.
Создайте 3 объекта класса.
Опять! Нет такого "объект класса". Если на то пошло, говорят "экземпляр класса", и "объект типа". Но это не всегда одно и то же.
Полем класса
является баланс, на котором имеется изначальная сумма (стартовый баланс).
Если буквоедничать до конца, то баланс не может являться полем. Поле оно само по себе поле. Это место в памяти. У поля есть тип. Поле некоторого типа может хранить величину баланса. Но не являться им.
Абонент может
расходовать деньги на SMS, голосовую связь и мобильный интернет.
До сих пор никакого Абонента не было. Это что, еще один класс? Но в условии сказано что класс должен быть один - лицевой счет абонента. В программировании нужна точность. Абонент и его счет - это не одно и то же.
Реализуйте в классе методы
для уменьшения баланса (каждый из которых запрашивает, сколько и чего сделал абонент,
например, сколько он отправил СМС).
Вот беда, единственное поле класса призвано хранить баланс на счете. Как же методы смогут отвечать на запрос о том сколько и чего сделал абонент? Может быть методам надо указать, сколько и чего сделал абонент, а эти методы бы соответственно уменьшили значение баланса? Мне кажется, что так было бы логичнее. Но я не берусь утверждать что такая формулировка устроит преподавателя.
Или речь о том, что метод запрашивает у пользователя сколько и чего он сделал? А кто решает, какой метод вызывать? Нужен ли такой класс в биллинге, если он будет ждать ввода от пользователя, блокируя работу биллинга?
Вижу, что код все-таки запрашивает у пользователя, а не у метода класса.
Стоимость одного сообщения, одной минуты разговора и
одного мегабайта известны и заданы константно. В случае достижения нулевого баланса,
программа сообщает пользователю о невозможности предоставления услуги.
Кто такой пользователь, откуда взялся, какова его роль в программе? Это не тот самый абонент, нет? Если это абонент, то какова вероятность что он сидит и смотрит в консоль биллинговой программы при отправке СМС? Наверное не он.
Обычно в биллинге стоимость услуги можно посчитать до достижения нулевого баланса лишь для SMS. По поводу всего остального типичный биллинг позволяет уйти в минуса, и лишь при получении очередной услуги отказывает. Но таки ладно, для тестового задания можно допустить что время звонка и объем трафика определены до оказания услуги.
Теперь о том, что не прояснено в формулировке.
Как правило, техническое задание содержит информацию о том, что программа должна сделать, как она поможет быть пользователю счастливым. Эта же содержит информацию о том, сколько объектов и какое поле у них должно быть. И совершенно не дает представление о том, как должна работать программа, какие данные принимать.
Вобщем, если писать программу буквально по заданию, то вряд ли что хорошего получится. Я бы не справился.
По поводу кода:
1) назвать класс Account (счет ведь)
2) вынести из класса любое взаимодействие с пользователем (ввод/вывод). Ваш класс никто в систему биллинга бы не вставил, т.к. биллинг прекратил бы работу и ждал бы ввода от пользователя. Это недопустимо для биллинга.
3) взаимодействие с пользователем перенести куда-нибудь. Можно в main, можно в специальный метод, который будет спрашивать, какое именно дейстиве собирается выполнить владелец аккаунта. (1-СМС, 2-трафик,...) После того как действие будет определено, запросить число СМС, объем трафика, время звонка в соответствии. И после этого вызывать соответствующий метод класса Account.
4) три экземпляра Account наверное надо таки завести, и спрашивать, какой именно экземпляр хочет что-либо сделать.