Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
 Аватар для anakonda3247gm
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 2

Повторное использование кода в C++

08.04.2013, 14:30. Показов 3397. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго дня! Прошу помочь начинающему. В данный момент обучаюсь по книге Прата С.. Застрял на задаче про использование класса valarray. Прошу помочь разобраться в создании конструкторов.

Имеется:
Класс Wine (Вино) содержит объект-член типа string для названия вина и объект Pair из объектов valarray<int>. Первый член каждого объекта Pair содержит год сбора винограда, а второй член — количества бутылок с вином урожая этих лет. Например, первый объект valarray объекта Pair содержит годы 1988, 1992 и 1996, а второй объект valarray — количества бутылок: 24, 48 и 144.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template <class T1, class T2>
class Pair
{
private:
    T1 a;
    T2 b;
public:
    T1 & first();
    T2 & second();
    T1 first() const { return a; }
    T2 second() const { return b; }
    Pair(const T1 & aval, const T2 & bval) : a(aval), b(bval) { }
    Pair() {}
};
Для упрощения кода могут быть полезными следующие объявления typedef:
C++
1
2
typedef std::valarray<int> Arraylnt; 
typedef Pair<ArrayInt, Arraylnt> PairArray;
Класс Wine должен иметь конструктор по умолчанию и, как минимум, следующие
конструкторы:

C++
1
2
3
4
5
// Инициализация label значением l, количество лет - у,  годы урожая - уг[], количество бутылок - bot [ ] 
Wine (const char * l, int у, const int yr[], const int bot[]); 
 
// Инициализация label значением 1, количество лет - у, создаются объекты массива размером у 
Wine (const char * l, int у);
Так же класс Wine должен иметь некоторые методы:
GetBottles(); - предлагает ввод соотв. значений для года урожая и количества бутылок.
Show(); -
Label(); - возвр. ссылку на название вина.
sum (); - возвр. общее количество бутылок во втором бъекте valarray<int> из объекта Pair.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Wine
{
    string name;
    PairArray p;
public:
    Wine();
    Wine (const char * l, int у, const int yr[], const int bot[]); 
    Wine (const char * l, int у); 
 
    GetBottles();
    Show();
    Label();
    sum ();
}
Программа должна предлагать пользователю ввести название вина, количество элементов в массиве, а также год и количество бутылок для каждого элемента массива. Программа должна использовать эти данные для создания объекта Wine и вывода информации, хранимой в объекте.

Так же приведен пример тестовой программы и вывод на экран.

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
int main ( void ) 
{ 
    using std::cin;
    using std::cout;
    using std::endl;
 
    cout << "Enter name of wine: "; // ввод названия вина 
    char lab[50];
    cin.getline(lab, 50);
 
    cout << "Enter number of years: "; // ввод количества годов сбора винограда 
    int yrs; 
    cin >> yrs;
 
    Wine holding(lab, yrs); // сохранение названия, лет, 
    // создание массивов из yrs элементов 
 
    holding.GetBottles (); // предложение ввести год и количество бутылок 
    holding.Show (); // вывод содержимого объекта 
 
    const int YRS = 3; 
    int y[YRS] = {1993, 1995, 1998}; 
    int b[YRS] = { 48, 60, 72}; 
 
    // Создание нового объекта, инициализация 
    // с использованием данных из массивов у и b 
    Wine more("Gushing Grape Red",YRS, y, b) ; 
    more.Show(); 
 
    cout << "Total bottles for " << more.Label() // используется метод Label() 
         << ": " << more, sum () << endl; // используется метод sum() 
    cout << "Bye\n"; 
    return 0; 
}
А так может выглядеть вывод программы:

Enter name of wine: Gully Wash
Enter number of years: 4
Enter Gully Wash data for 4 year(s) :
Enter year: 1988
Enter bottles for that year: 42
Enter year: 1994
Enter bottles for that year: 58
Enter year: 1998
Enter bottles for that year: 122
Enter year: 2001
Enter bottles for that year: 144
Wine: Gully Wash
Year Bottles
1988 42
1994 58
1998 122
2001 144
Wine: Gushing Grape Red
Year Bottles
1993 48
1995 60
1998 72
Total bottles for Gushing Grape Red: 180
Bye
2.

Очень прошу объяснить, как создать конструкторы класса Wine на основе шаблона Pair и valarray.
Подозреваю, что туплю "не по-детски", но банально застрял. Надеюсь на довольно вразумительный "пинок" с вашей стороны.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.04.2013, 14:30
Ответы с готовыми решениями:

Повторное использование кода
Предположим для класса перегружен oператор+ который принимает либо строку в стиле С, или такой же объект. myString...

Как не допустить повторное использование кода
Здравствуйте. У меня есть один заголовочный файл, и в нем присутствует пара констант и функция: #ifndef H_H #define H_H ...

Повторное использование кода и инкапсулирование. Внимание, много букв)
Всем привет. Хотелось бы обсудить очень важный вопрос, а именно инкапсуляцию встроенных типов. Допустим у нас в программе есть две...

5
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
08.04.2013, 20:21
На мой взгляд, использовать пару массивов - не логично. Более правильно - массив пар. Кстати, в STL уже есть класс pair. А по вашему вопросу, я бы сделал так (описаны только конструкторы и перегрузка перенаправления вывода):

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
#include <iostream>
#include <string>
#include <vector>
 
class Wine
{
   public:
      typedef std::pair<int, int> Info;
      typedef std::vector<Info> InfoArray;
 
   private:
      std::string name;
      InfoArray info;
 
   public:
      Wine(const std::string& theName): name(theName) { ; };
 
      Wine(const std::string& theName, const Info& theInfo)
         : name(theName), info(&theInfo, &theInfo + 1) { ; }
 
      Wine(const std::string& theName, const Info theInfo[], size_t count)
         : name(theName), info(theInfo, theInfo + count) { ; }
 
      Wine(const std::string& theName, const InfoArray& theInfoArray)
         : name(theName), info(theInfoArray) { ; }
 
      friend std::ostream& operator << (std::ostream& out, const Wine& wine)
      {
         out << "Wine = " << wine.name << std::endl;
 
         Wine::InfoArray::const_iterator it;
         for (it = wine.info.begin(); it != wine.info.end(); ++it)
         {
            out << it->first << " " << it->second << std::endl;
         }
 
         return out;
      }
};
 
int main()
{
   Wine first("first");
 
   Wine second("second", Wine::Info(1970, 20));
 
   const Wine::Info info[] = {Wine::Info(1970, 25),
                              Wine::Info(1975, 50),
                              Wine::Info(1960, 11)};
 
   Wine last("last", info, sizeof(info) / sizeof(*info));
 
   std::cout << first  << std::endl
             << second << std::endl
             << last   << std::endl;
 
   return 0;
}
Название: image.PNG
Просмотров: 267

Размер: 4.2 Кб

Результат на codepad.org
1
 Аватар для anakonda3247gm
0 / 0 / 0
Регистрация: 08.04.2013
Сообщений: 2
09.04.2013, 10:15  [ТС]
Спасибо! Ситуация стала проясняться))
0
0 / 0 / 1
Регистрация: 25.04.2013
Сообщений: 67
23.06.2013, 09:18
Вряд ли получу ответ, но просто учусь по этой же книге и столкнулся с этой же проблемой.

@anmartex, у вас нормально скомпилировалась программа, дело в том что у меня появляется ошибка про

невозможно преобразовать параметр 2 из "int" в "Pair::Type_year &"

это из-за этого
C++
1
2
3
int yrs;
cin >> yrs;
Wine holding(lab, yrs);
Если бы yrs был valarray то нормально, но он int, такое условие задачи.
0
...
 Аватар для anmartex
1910 / 1329 / 966
Регистрация: 12.02.2013
Сообщений: 2,172
23.06.2013, 09:37
@faradej, конструктора принимающего вторым параметром int в моей реализации нет.
C++
1
2
3
int year;
cin >> year;
Wine holding(lab, Wine::Info(year, 1));
0
2 / 2 / 0
Регистрация: 26.12.2012
Сообщений: 17
31.12.2014, 13:45
Вот мой вариант, полностью написан по условию задачи. То же по этой книге учусь
Основной код программы:
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
#include <locale>    // Строчка для Русского языка
#include "H_task_1.h"
 
int main()
{
    setlocale(LC_ALL,"Russian"); // Строчка для Русского языка
    
    cout<<"Enter name of wine: "; // ввод названия вина
    char lab[50];
    cin.getline(lab, 50);
    cout<<"Enter number of years: "; // ввод количества годов сбора винограда
    int yrs;
    cin>>yrs;
    Wine holding(lab, yrs); // сохранение названия, лет, создание массивов из yrs элементов
    holding.GetBottles();   // предложение ввести год и количество бутылок
    holding.Show();         // вывод содержимого объекта
    const int YRS=3;
    int у[YRS]={1993, 1995, 1998};
    int b[YRS]={48, 60, 72}; 
    // Создание нового объекта, инициализация с использованием данных из массивов у и b
    Wine more("Gushing Grape Red", YRS, у, b);
    more.Show();
    cout<<"Total bottles for "<<more.Label() // используется метод Label()
        <<": "<<more.sum()<<endl; // используется метод sum()
    cout<<"Bye\n";
    
    system("pause");
    return 0;
}
Заголовочный файл:
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// H_task_1.h -- класс Wine
#ifndef H_TASK_1_H_
#define H_TASK_1_H_
 
#include <iostream>
#include <string>
#include <valarray>
#include <iomanip>
using std::cout;
using std::endl;
using std::cin;
 
 
// Шаблон с несколькими параметрами типа:
template <class T1, class T2>
class Pair
{
private:
    T1 a; // Значение вида 1
    T2 b; // Значение вида 2
public:
    Pair() {} // Конструктор по умолчанию
    Pair(const T1 &aval, const T2 &bval) : a(aval), b(bval) { } // Конструктор
    // Методы присвоения хранимым величинам новых значений:
    T1 & first();  // Ввод значения 1-го вида
    T2 & second(); // Ввод значения 2-го вида
    // Методы печати хранимых значений:
    T1 first() const { return a; }  // Печать значения 1-го вида
    T2 second() const { return b; } // Печать значения 2-го вида
};
 
// Методы присвоивания хранимым величинам новых значений:
// Ввод значения 1-го вида
template<class T1, class T2>
T1 & Pair<T1,T2>::first()
{
    return a;
}
 
// Ввод значения 2-го вида
template<class T1, class T2>
T2 & Pair<T1,T2>::second()
{
    return b;
}
 
 
// Основной класс (использует включение):
class Wine
{
private:
    std::string label; // Используется объект string для имени
    // Объект Pair состоит из объектов valarray<int>. Для упрощения введем объявления typedef:
    typedef std::valarray<int> ArrayInt;
    // Первый член объекта Pair содержит год сбора винограда, а второй член — количества бутылок с вином урожая этих лет:
    typedef Pair<ArrayInt, ArrayInt> PairArray;
    PairArray wine_inf;
    int years; // Количество лет (размерность двух массивов)
public:
    Wine() : label("Empy name"), wine_inf() {} // #0: Коструктор по умолчанию - во 2-ом операнде вызывает конструктор класа Pair по умолчанию, который создает два массива int нулевого размера
    // Коструктор #1: Инициализация label значением l, количество лет (размерность двух массивов) - у, годы урожая - yr[], количество бутылок - bot[]:
    Wine(const char *l, int y, const int yr[], const int bot[]) : label(l), years(y), wine_inf(ArrayInt(yr, y), ArrayInt(bot, y)) {}
    // Коструктор #2: Инициализация label значением l, количество лет - у, т.е. создаются 2 массива int размером y:
    Wine (const char *l, int y) : label(l), years(y), wine_inf(ArrayInt(y), ArrayInt(y)) {}
    void GetBottles(); // Запрашивает у пользователя количество лет и предлагает пользователю ввести соответствующие значения для года урожая и количества бутылок
    const std::string & Label() const { return label; }; // Возвращает название вина
    const void Show() const; // Вывод содержимого объекта
    int sum(); // Возвращает общее количество бутылок во втором объекте valarray<int> из объекта Pair
};
 
// Предлагает пользователю ввести соответствующие значения для года урожая и количества бутылок
void Wine::GetBottles()
{
    cout<<"Enter "<<Label()<<" data for "<<years<<" year(s):\n";
    for (int i=0; i<years; i++)
    {
        cout<<"Enter year: ";
        cin>>wine_inf.first()[i];
        cout<<"Enter bottles for that year: ";
        cin>>wine_inf.second()[i];
    }
    cout<<endl;
}
 
// Вывод содержимого объекта
const void Wine::Show() const
{
    cout<<"Wine: "<<Label()<<endl;
    cout<<std::setw(10)<<"Year"<<"    "<<"Bottles"<<endl;
    for (int i=0; i<years; i++) // или можно wine_inf.first().size()
        cout<<std::setw(10)<<wine_inf.first()[i]<<"    "<<wine_inf.second()[i]<<endl;
    cout<<endl;
}
 
// Возвращает общее количество бутылок во втором объекте valarray<int> из объекта Pair
int Wine::sum()
{
    return wine_inf.second().sum();
}
#endif
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
31.12.2014, 13:45
Помогаю со студенческими работами здесь

Повторное выполнение кода
Здравствуйте! Ребята как я могу сделать так чтобы эта программа т.е Калькулятор повторил свою работу каждый раз когда я получаю свой...

Повторное выполнение кода
Только на прошлом уроке прошли 3 цикла, сказали сделать задачу-Дан числовой ряд a-b(от а до б),пользователь вводит кол-во элементов...

Использование кода на Си в Си++
Здравствуйте,я использую сторонний проект написанный на C в своем проекте на C++,файлы стороннего проекта имеют расширение .c,так вот в...

Оптимизация кода с использование SIMD
Есть код inline double dot(const float* v1, const float* v2) { return v1 * v2 + v1 * v2 + v1 * v2; } Переписал его вот...

Использование кода символа внутри строки?
Как должна выглядеть стока, содержащая символ с определённым кодом? Можно как то вместо...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru