Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
#1

Демонстрационная программа класса вектор - C++

09.01.2012, 18:13. Просмотров 1235. Ответов 11
Метки нет (Все метки)

Здравствуйте уважаемые эксперты! Вот пишу программу, которая демонстрирует работу класса вектор, получается следующее:
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
#include "Vector.h"
#include <clocale>
#include <fstream>
 
void main() {
    setlocale(LC_ALL, "Russian");
    unsigned int Choose = 0;
    do {
        cout << "Выберите тип с которым хотите работать:" << endl
        << "1. Целые числа" << endl
        << "2. Вещественные числа" << endl
        << "3. Выход" << endl
        << "Ваш выбор: ";
        cin >> Choose;
        switch(Choose) {
            case 1 : {
                int Number;
                system("CLS");
                Vector <int> VectorOfInt1;
                cin >> VectorOfInt1;
                system("CLS");
                cout << "Выберите действие которое хотите провести с вектором: " << endl
                << "1. Сложить с вектором" << endl
                << "2. Вычесть из данного вектора другой вектор" << endl
                << "3. Скалярное произведение векторов" << endl
                << "4. Сложить вектор с числом" << endl
                << "5. Вычесть из вектора число" << endl
                << "6. Умножить вектор на число" << endl
                << "7. Выход" << endl
                << "Ваш выбор: ";
                cin >> Choose;
                switch(Choose) {
                    case 1 : { 
                        Vector <int> VectorOfInt2(VectorOfInt1.get_Size());
                        cin >> VectorOfInt2;
                        system("CLS");
                        cout << "Вектора имеют вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << VectorOfInt2 << endl;
                        cout << "Результат сложения векторов: " << VectorOfInt1 + VectorOfInt2 << endl;
                    } break;
                    case 2 : {
                        Vector <int> VectorOfInt2(VectorOfInt1.get_Size());
                        cin >> VectorOfInt2;
                        system("CLS");
                        cout << "Вектора имеют вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << VectorOfInt2 << endl;
                        cout << "Результат вычитания векторов: " << VectorOfInt1 - VectorOfInt2 << endl;
                    } break;
                    case 3 : {
                        Vector <int> VectorOfInt2(VectorOfInt1.get_Size());
                        cin >> VectorOfInt2;
                        system("CLS");
                        cout << "Вектора имеют вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << VectorOfInt2 << endl;
                        cout << "Результат скалярного произведения векторов: " << VectorOfInt1 * VectorOfInt2 << endl;
                    } break;
                    case 4 : {
                        cout << "Введите число, которое вы хотите прибавить к вектору: ";
                        cin >> Number;
                        system("CLS");
                        cout << "Вектор имеет вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << "Результат сложения вектора с числом " << Number << " : " << VectorOfInt1.operator + (Number) << endl;
                    } break;
                    case 5 : {
                        cout << "Введите число, которое вы хотите вычесть из вектора: ";
                        cin >> Number;
                        system("CLS");
                        cout << "Вектор имеет вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << "Результат вычитания из вектора числа " << Number << " : " << VectorOfInt1.operator - (Number) << endl;
                    } break;
                    case 6 : {
                        cout << "Введите число, на которое вы хотите умножить вектор: ";
                        cin >> Number;
                        system("CLS");
                        cout << "Вектор имеет вид: " << endl;
                        cout << VectorOfInt1 << endl;
                        cout << "Результат умножения вектора на число " << Number << " : " << VectorOfInt1.operator * (Number) << endl;
                    } break;
                }
            } break;
                     }
    }
}
Можно ли ее "упростить"?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2012, 18:13     Демонстрационная программа класса вектор
Посмотрите здесь:

Наследование класса Вектор C++
C++ Насчет класса вектор
Шаблон класса вектор C++
C++ шаблон класса вектор
вектор элементов класса C++
Реализация класса и вектор C++
шаблон класса вектор C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
dimcoder
Полярный
451 / 424 / 66
Регистрация: 11.09.2011
Сообщений: 1,124
09.01.2012, 18:20     Демонстрационная программа класса вектор #2
Цитата Сообщение от S2dent Посмотреть сообщение
Можно ли ее "упростить"?
А смысл? Всё и так предельно понятно, самопальных граблей с кучей циклов и отсутствием табуляции нет, желаю всем такого программирования.
Jupiter
09.01.2012, 18:22
  #3

Не по теме:

Цитата Сообщение от S2dent Посмотреть сообщение
Можно ли ее "упростить"?
можно, выкиньте нафиг свой вектор

S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
10.01.2012, 00:57  [ТС]     Демонстрационная программа класса вектор #4
Цитата Сообщение от Jupiter Посмотреть сообщение

Не по теме:


можно, выкиньте нафиг свой вектор

Всмысле? Если б можно было использовать встроенный класс, то и вопроса бы не было.

Добавлено через 6 часов 29 минут
И снова здравствуйте уважаемые эксперты! Подскажите, а как можно сохранит в файл результат работы программы. Пытаюсь сделать так:
C++
1
2
3
4
5
6
7
8
template <class T>
void Vector<T>::SaveInFile(Vector<T> Result) {
    fstream FileOut;
    const string NameFile = "Result.txt";
    FileOut.open(NameFile.c_str(),ios::out)
    FileOut << "Результат: " << Result;
    FileOut.close();
}
Но в файл выводится мусор.. Подскажите что не так.
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.01.2012, 01:08     Демонстрационная программа класса вектор #5
S2dent, код вашего вектора где?
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
10.01.2012, 01:11  [ТС]     Демонстрационная программа класса вектор #6
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#ifndef Vector_h
#define Vector_h
 
#include <iostream>
#include <string>
 
using namespace std;
 
template <class T>
class Vector {
    unsigned int Size;
    T *ptrVector;
    friend ostream &operator << <> (ostream &output, const Vector <T> &Vect);
    friend istream &operator >> <> (istream &input, Vector <T> &Vect);
public: 
    Vector <T>();
    Vector <T>(unsigned int N);
    ~Vector <T>();
    unsigned int get_Size();
    void SaveInFile(Vector <T> Result);
    Vector <T> operator + (const Vector <T> &Vect); //сложение двух векторов
    Vector <T> operator - (const Vector <T> &Vect); //разность двух векторов
    T operator * (const Vector <T> &Vect); //скалярное произведение векторов
    Vector <T> operator + (T Number); //сложение вектора с числом
    Vector <T> operator - (T Number); // вычитание из вектора числа
    Vector <T> operator * (T Number); //умножение вектора на число
};
 
template <class T>
Vector <T>::Vector() {
    unsigned int N;
    do {
        cout << "Введите размерность вектора: ";
        cin >> N;
    } 
    while (N < 0);
    Size = N;
    try {
        ptrVector = new T[Size];
    }
    catch(bad_alloc) {
        cout << "Ошибка! Недостаточно памяти для вектора!";
        system("PAUSE");
    }
}
 
template <class T>
Vector <T>::Vector(unsigned int N) {
    Size = N;
    try {
        ptrVector = new T[Size];
    }
    catch(bad_alloc) {
        cout << "Ошибка! Недостаточно памяти для векторов!";
        system("PAUSE");
    }
}
 
template <class T>
Vector <T>::~Vector() {
    delete [] ptrVector;
}
 
template <class T>
unsigned int Vector <T>::get_Size() {
    return Size;
}
 
template <class T>
void Vector <T>::SaveInFile(Vector <T> Result) {
    fstream FileOut;
    const string NameFile = "Result.txt";
    FileOut.open(NameFile.c_str(),ios::out);
    FileOut << "Результат: " << Result;
    FileOut.close();
}
 
template <class T>
ostream &operator << <> (ostream &output, const Vector <T> &Vect) {
    for (unsigned int i = 0; i < Vect.Size; i++)
        output << Vect.ptrVector[i] << " ";
    return output;
}
 
template <class T>
istream &operator >> <> (istream &input, Vector <T> &Vect) {
    for (unsigned int i = 0; i < Vect.Size; i++) {
        cout << "Введите элемент №" << i+1 << ": ";
        input >> Vect.ptrVector[i];
    }
    return input;
}
 
template <class T>
Vector <T> Vector <T>::operator + (const Vector <T> &Vect) {
    Vector <T> tmp(Size);
    for (unsigned int i = 0; i < Size; i++)
        tmp.ptrVector[i] = ptrVector[i] + Vect.ptrVector[i];
    return tmp;
}
 
template <class T>
Vector <T> Vector <T>::operator - (const Vector <T> &Vect) {
    Vector <T> tmp(Size);
    for (unsigned int i = 0; i < Size; i++)
        tmp.ptrVector[i] = ptrVector[i] - Vect.ptrVector[i];
    return tmp;
}
 
template <class T>
T Vector <T>::operator * (const Vector<T> &Vect) {
    T Scalar = 0;
    for (unsigned int i = 0; i < Size; i++)
        Scalar += ptrVector[i] * Vect.ptrVector[i];
    return Scalar;
}
 
template <class T>
Vector <T> Vector <T>::operator + (T Number) {
    Vector <T> tmp(*this);
    for (unsigned int i = 0; i < Size; i++)
        tmp.ptrVector[i] += Number;
    return tmp;
}
 
template <class T>
Vector <T> Vector <T>::operator - (T Number) {
    Vector <T> tmp(*this);
    for (unsigned int i = 0; i < Size; i++)
        tmp.ptrVector[i] -= Number;
    return tmp;
}
 
template <class T>
Vector <T> Vector <T>::operator * (T Number) {
    Vector <T> tmp(*this);
    for (unsigned int i = 0; i < Size; i++)
        tmp.ptrVector[i] *= Number;
    return tmp;
}
#endif
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
10.01.2012, 01:59     Демонстрационная программа класса вектор #7
S2dent, а откуда вектору знать как там ваши данные писать в файл, лихо Вы так целиком весь вектор хотите запихнуть в файл, поэлементно запихивать же нужно.
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.01.2012, 00:42  [ТС]     Демонстрационная программа класса вектор #8
С выводом вчера разобрался.. И опять возник вопрос, а как можно считать данные из файла в объект класса?
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
11.01.2012, 00:49     Демонстрационная программа класса вектор #9
Только если объект не использует внутри себя динамическую память.

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

Добавлено через 49 секунд
Хотя есть реализации, позволяющие писать на диск контейнерные классы. Например, Qt так имеет.
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.01.2012, 00:59  [ТС]     Демонстрационная программа класса вектор #10
А как мне тогда лучше считывание организовать?
NoMasters
Псевдослучайный
1744 / 1087 / 71
Регистрация: 13.09.2011
Сообщений: 3,111
11.01.2012, 01:24     Демонстрационная программа класса вектор #11
По-моему задача записи вектора, содержащего данные произвольного типа, на диск не корректна. Если у вас там будут храниться, скажем, строки или просто какие-нибудь указатели, то чтение их в следующий запуск программы даст гору невалидных указателей...
Тем не менее, один из возможных вариантов организации информации в файле такой:
1. по нулевому смещению количество записанных в файл элементов(здесь в и следующем пункте надо применять типы фиксированной длинны, например int32_t)
2. дальше идет массив, описывающий смещения для каждого элемента(длину можно получить вычитание адреса интересующего элемента из следующего)
3. собственно данные, последовательно закатанные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 01:37     Демонстрационная программа класса вектор
Еще ссылки по теме:

Вектор, как поле класса C++
шаблон класса вектор C++
C++ Демонстрационная программа сортировки методом «пузырек»
C++ Переопределение класса вектор
C++ Вектор объектов класса

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

Или воспользуйтесь поиском по форуму:
S2dent
52 / 50 / 6
Регистрация: 10.05.2009
Сообщений: 216
11.01.2012, 01:37  [ТС]     Демонстрационная программа класса вектор #12
Ну считывать я собираюсь только числа.. Ладно, попытаюсь разобраться..
Yandex
Объявления
11.01.2012, 01:37     Демонстрационная программа класса вектор
Ответ Создать тему
Опции темы

Текущее время: 08:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru