Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с использованием класса 
:(
    Опции темы
TBIKC
  Дата 22.8.2011, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 22
Регистрация: 30.8.2010

Репутация: нет
Всего: нет



Задача
Водителям не безразличен пробег их авто. Один водитель записал свои данные о нескольких заправках, записывая пройденные км и число залитых в бак литров бензина
Разработайте программу, которая используя оператор while вводила бы пробег в км. и объём бензина в каждой заправке( пока не будет введено контрольное значение "-1" ). 
Программа должна показывать общий пробег и сколько потрачено бензина

Я реализовал интерфейс и класс, а как задействовать в самом цикле что то не могу понять  
Ведь если я напишу в main.cpp так savings One(2,16);
То у меня уже будут введены значения ...

Помогите пожалуйста
Код

class savings
{
private:
        float Run; // Пробег в километрах
        float Gasoline; // Число залитых литров бензина
        float GenRun; // Всего литров
        float GenGasoline; // Всего бензина
 
savings(float Run,float Gasoline);//Конструктор
 
float getRun();
float getGasoline();
float getGenRun();
float getGenGasoline();
void setRun(float);
void setGasoline(float);
};

Код


#include "stdafx.h"
#include <iostream>
#include "lang.h"
#include "savings.h"
 
using namespace std;
 
savings::savings(float run,float gasoline)
{
        setRun(run);
        setGasoline(gasoline);
}
void savings::setRun(float r)
{
        Run = r;
}
void savings::setGasoline(float g)
{
        Gasoline = g;
}
 
float savings::getRun()
{
        return Run;
}
float savings::getGasoline()
{
        return Gasoline;
}
float savings::getGenRun()
{
        return GenRun;
}
float savings::getGenGasoline()
{
        return GenGasoline;
}

PM MAIL   Вверх
Чoо
  Дата 22.8.2011, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



если с этим классом (не переделывая его), то примерно так можно сделать (может ошибки будут, пишу навскидку, но мысль думаю будет понятна):
Код

   savings **s=0;
    int s_size=0;
    while(1){
        printf("sdf");
        float r,g;

        scanf("%f %f",&r, &g);
        if(r==-1)
            break;
        else{
            ++s_size;
            s = (savings**)realloc((savings**)s,s_size*4);
            s[s_size-1] = new savings(r,g);
        }
    }
    for(int i=0; i<s_size; ++i){
        float r = s[i]->getRun();
        float g = s[i]->getGasoline();
        printf("Run: %f, Gusoline: %f",r,g);
    }
    delete []s;

только пара моментов:
 - конструктор ни при каких условиях не должен, да и не может быть приватным
 - в вашем классе все методы приватны, толку от него?
 - там где я вызываю из своего кода методы, эти методы сделайте паблик, иначе не вызовутся

ну и потом.. Класс, который бы решал задачу должен быть самодостаточным, тоесть вся прогармма должна выглядеть примерно так (модуль маин):

Код

int main(){
    savings s;
    s.add();
    s.report;
    return 0;
}


все остальное, по заполнению, выделению и освобождению памяти должен делать класс. ну я так думаю

Добавлено @ 20:54
да... и еще такой момент.. не думаю, что вызов методов класса из его же конструктора - хорошая идея. Поправьте меня пожалуйста, так как не уверен.. 

Это сообщение отредактировал(а) Чoо - 22.8.2011, 20:57


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 22.8.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  19:53 Найти цитируемый пост)
все остальное, по заполнению, выделению и освобождению памяти должен делать класс.

не учите плохому smile

Добавлено через 2 минуты и 39 секунд

Цитата(TBIKC @  22.8.2011,  18:37 Найти цитируемый пост)
дин водитель записал свои данные о нескольких заправках, записывая пройденные км и число залитых в бак литров бензина

 не согласуется с 
Цитата(TBIKC @  22.8.2011,  18:37 Найти цитируемый пост)
        float Run; // Пробег в километрах
        float Gasoline; // Число залитых литров бензина
        float GenRun; // Всего литров
        float GenGasoline; 




--------------------
PM MAIL WWW   Вверх
Чoо
Дата 22.8.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



mes, почему это плохо?


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 22.8.2011, 23:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(TBIKC @  22.8.2011,  18:37 Найти цитируемый пост)
 
float getRun();
float getGasoline();
float getGenRun();
float getGenGasoline();
void setRun(float);
void setGasoline(float);

и ни капли логики внутри.. что толку то (в данном случае) от этих сетеров и гетеров ? только лишняя писанина..

Добавлено через 2 минуты и 13 секунд
Цитата(Чoо @  22.8.2011,  22:08 Найти цитируемый пост)
почему это плохо? 

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

Добавлено через 5 минут и 19 секунд
Цитата(Чoо @  22.8.2011,  19:53 Найти цитируемый пост)
не думаю, что вызов методов класса из его же конструктора - хорошая идея. Поправьте меня пожалуйста, так как не уверен.. 

это относится к виртуальным методам из за особенностей их поведения..

Добавлено через 10 минут и 46 секунд
Цитата(Чoо @  22.8.2011,  19:53 Найти цитируемый пост)
savings **s=0;
    int s_size=0;
    while(1){
        printf("sdf");
        float r,g;
        scanf("%f %f",&r, &g);
        if(r==-1)
            break;
        else{
            ++s_size;
            s = (savings**)realloc((savings**)s,s_size*4);
            s[s_size-1] = new savings(r,g);
        }
    }
    

явно не C++ .. smile


--------------------
PM MAIL WWW   Вверх
Чoо
Дата 22.8.2011, 23:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



соглашусь.. 
Однако, применительно этой задаче, для хранения инфомрации заправка/пробег, можно было бы создать внутри класса указатель на массив этих данных и методами этого же класса выделять память под данные. 
Сам же указатель, для гибкости, оставить в секции public. 
ввод данных - да.. можно и вынести в основное приложение.. Всё остальное (впринципе что там, остается только вывести суммарные затраты бензина и суммарный пробег) оставить внутри класса. 
При необходимости что дополнить, создать класс/наследник, хотя дл яэтого примера это наврядли нужно..

Добавлено через 9 минут и 17 секунд
Цитата(mes @  22.8.2011,  23:12 Найти цитируемый пост)
явно не C++ .. smile 

ну вместо printf можно и std::in >> r >> g  использовать  smile

Добавлено через 9 минут и 46 секунд
вместо malloc/realloc  - new

Добавлено через 14 минут и 16 секунд
Цитата(mes @  22.8.2011,  23:12 Найти цитируемый пост)

это относится к виртуальным методам из за особенностей их поведения..

будут вызваны при несуществующем объекте?

Это сообщение отредактировал(а) Чoо - 22.8.2011, 23:26


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 22.8.2011, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  22:24 Найти цитируемый пост)
ну вместо printf можно и std::in >> r >> g  использовать  

дело не в printfe, а в подходе..

Добавлено через 57 секунд
Цитата(Чoо @  22.8.2011,  22:24 Найти цитируемый пост)
ввод данных - да.. можно и вынести в основное приложение..

можно и не в опсновное, главное что раздные задачи должны осуществляться разными сущностями..

Добавлено через 1 минуту и 36 секунд
Цитата(Чoо @  22.8.2011,  22:24 Найти цитируемый пост)
При необходимости что дополнить, создать класс/наследник, хотя дл яэтого примера это наврядли нужно..

для этого примера вообще классы не нужны..


--------------------
PM MAIL WWW   Вверх
Чoо
Дата 22.8.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(mes @  22.8.2011,  23:42 Найти цитируемый пост)
дело не в printfe, а в подходе..  

честно говоря с данным классом ничего другого я не увидел :(


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 22.8.2011, 23:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  22:24 Найти цитируемый пост)

будут вызваны при несуществующем объекте?

он (метод) в конструкторе и деструкторе будет вызван "не виртуально"



--------------------
PM MAIL WWW   Вверх
Чoо
Дата 22.8.2011, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



единственное что, только то, что память можно было бы выделять не  по 4 байта, а скажем по 400, а потом лишнюю вернуть
(realloc вроде выделяет новую память, копирует содержимое старой и удаляет старую)

Это сообщение отредактировал(а) Чoо - 22.8.2011, 23:51


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 22.8.2011, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  22:44 Найти цитируемый пост)
честно говоря с данным классом ничего другого я не увидел :( 

начиная от того, что зачем с объявлена как указатель на указатель, и кончая realoc`ом и  фактически каждая другая строчка не свойственна С++.. 



--------------------
PM MAIL WWW   Вверх
Чoо
Дата 23.8.2011, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



в принципе да.. можно было обойтись просто указателем.. данные все-равно последовательно размещаются.. что-то я не подумал.. соответственно каждые 16 байт будет новая пара пробег/расход


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 23.8.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  23:01 Найти цитируемый пост)
в принципе да..


ну так по условию, массив совсем не нужен.. 

Цитата(TBIKC @  22.8.2011,  18:37 Найти цитируемый пост)
Разработайте программу, которая используя оператор while вводила бы пробег в км. и объём бензина в каждой заправке( пока не будет введено контрольное значение "-1" ). 
Программа должна показывать общий пробег и сколько потрачено бензина

записывал то водитель у себя на листочке, а не в программе  smile

Добавлено @ 00:22
т.е. нужно всего лишь что то типа :
Код

int main ()
{
  unsigned total_milage =0;
  unsigned total_tank   =0;

  for (;;)
  {
     int a, b;
     std::cout << "milage: ";
     std::cin >> a;
     if (a == -1) break;
     
     std::cout << "tank: ";
     std::cin >> b;
     if (b == -1) break;
     
     total_milage += milage;
     total_tank += tank;
  } 

  std::cout << "total_milage : " << total_milage << std::endl;
  std::cout << "total_tank : "   << total_tank << std::endl;

}


Это сообщение отредактировал(а) mes - 23.8.2011, 08:39


--------------------
PM MAIL WWW   Вверх
Чoо
Дата 23.8.2011, 00:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 22.9.2009

Репутация: 4
Всего: 4



Цитата(mes @  23.8.2011,  00:21 Найти цитируемый пост)
записывал то водитель у себя на листочке, а не в программе  smile

вот же ж  smile  smile 
совсем я думать разучился


--------------------
user posted image

OS: Debian Squeeze (kernel 3.8.2)
IDE: qtCreator 1.3.1; Eclipse SDK 3.5.2
PM MAIL   Вверх
mes
Дата 23.8.2011, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(Чoо @  22.8.2011,  23:47 Найти цитируемый пост)
вот же ж 

можно и с накоплением результата, например так :
Код

#include <iostream>
#include <vector>
#include <numeric>

int main ()
{
  
  std::vector<unsigned> milage_vec;
  std::vector<unsigned> tank_vec;  
  
  for (;;)
  {
     int a,b;
     std::cout << "milage: ";
     std::cin >> a;
     if (a == -1) break;
     
     std::cout << "tank: ";
     std::cin >> b;
     if (b == -1) break;
     
     milage_vec.push_back(a);
     tank_vec.push_back(b);
  } 
  
  unsigned total_milage = std::accumulate(milage_vec.begin(),milage_vec.end(),0);
  unsigned total_tank   = std::accumulate(tank_vec.begin(),tank_vec.end(),0);  
  
  std::cout << "total_milage : " << total_milage << std::endl;
  std::cout << "total_tank : "   << total_tank << std::endl;
}



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1469 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.