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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Halva
23 / 23 / 2
Регистрация: 02.11.2008
Сообщений: 118
#1

Написать два класса с методами. Без использования STL - C++

21.05.2011, 00:55. Просмотров 1269. Ответов 9
Метки нет (Все метки)

Надеюсь на вашу помощь, т.к. с С++ не знаком. Думаю новичкам будет отличной задачей для разминки...

Задача 1. Создать 2 объекта разработанного класса. Одной из компонент класса является символьная строка. В результате выполнения программы в обоих объектах исключить лишние пробелы между словами (оставить только по одному). Содержимое объектов (их строки) до и после обмена вывести на экран. Функцию вывода содержимого объекта реализовать как внешнюю по отношению к классу
*******
Задача 2. Для созданного объекта А, разработанного класса – вектор (одномерный массив), реализовать перегрузку оператора new. Содержимое объекта (А, его вектора) вывести на экран.
_________________

!Необходимо наличие:
а) конструктор по умолчанию;
б) конструктор с параметрами;
в) конструктор копирования;
г) деструктор;
д) методы класса для работы с данными.
Компоненты данные класса должны иметь атрибут private или protected.

!!! Без использования методов STL (vector, string, queue)...
______________

Буду очень благодарен за помощь!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2011, 00:55     Написать два класса с методами. Без использования STL
Посмотрите здесь:
C++ Работа с векторами без использования STL и библиотеки <vector>
C++ Реализовать (без использования контейнеров STL) Б-дерево со вставкой и удалением элементов
C++ Как скопировать массив в вектор одной строкой без использования циклов и алгоритмов STL?
C++ Контейнерный класс типа "Список" без использования STL
C++ Структура программы или наследование, без использования конструктора базового класса
Алгоритм удаления гласных букв из строки без использования методов класса String C++
C++ Std::vector добавить новый элемент собственного класса без использования конструктора копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
21.05.2011, 01:03
  #2

Не по теме:

Halva, Как бэ, намек.

lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
21.05.2011, 13:41     Написать два класса с методами. Без использования STL #3
Ну, типа, 2.
Вывод отдельно можно организовать через шаблонную функцию ForEach.
В чем сакральный смысл переписывать оператор new? Без сакрального смысла я просто выделил память.
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#include <cstdlib>
#include <cstdio>
 
template <class Container>
class BackInsertIterator {
protected:
  Container* container_;
public:
  typedef Container          container_type;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;
 
  explicit BackInsertIterator(Container& container) : container_(&container) {}
  BackInsertIterator<Container>&
  operator=(const typename Container::ValueType& value) { 
    container_->PushBack(value);
    return *this;
  }
  BackInsertIterator<Container>& operator*() { return *this; }
  BackInsertIterator<Container>& operator++() { return *this; }
  BackInsertIterator<Container>& operator++(int) { return *this; }
};
 
 
template <class Tp_>
class Vector {
 public:
  typedef Tp_ ValueType;
  typedef ValueType *Iterator;
  Vector() : start_(0), finish_(0), end_of_storage_(0) {}
  explicit Vector(size_t capacity)
    : start_(0), finish_(0), end_of_storage_(0) {
    start_ = finish_ = new ValueType[capacity];
    end_of_storage_ = start_ + capacity;
  }
  Vector(const Vector &other)
    : start_(0), finish_(0), end_of_storage_(0) {
    for (Iterator source = other.Begin(); source != other.End(); ++source)
      PushBack(*source);
  }
  ~Vector() {
    delete start_;
  }
  const ValueType &At(int position) const { return start_[position]; }
  ValueType &At(int position) { return start_[position]; }
  const ValueType &Back() const { return *(finish_ - 1); }
  ValueType &Back() { return *(finish_ - 1); }
  const ValueType &Front() const { return *start_; }
  ValueType &Front() { return *start_; }
  Iterator Insert(Iterator position, const ValueType &value) {
    if (position == End()) {
      return PushBack(value);
    } else {
      if (finish_ == end_of_storage_)
        Reserve(Capacity() + 5);
      for (Iterator source = finish_ - 1,
           destination = finish_;
           source != position - 1; --source, --destination)
        *destination = *source;
      ++finish_;
      *position = value;
      return position;
    }
  }
  size_t Capacity() {
    return end_of_storage_ - start_;
  }
  void Clear() {
    finish_ = start_;
  }
  size_t Size() const { return finish_ - start_; }
  bool Empty() const { return finish_ == start_; }
  Iterator PushBack(const ValueType &value) {
    if (finish_ == end_of_storage_)
      Reserve(Capacity() + 5);
    *finish_ = value;
    return finish_++;
  }
  Iterator Erase(Iterator position) {
    if ((position + 1) != End()) {
      for (Iterator source = position + 1,
           destination = position;
           source != finish_; ++source, ++destination)
        *destination = *source;
    }
    --finish_;
    return position;
  }
  void Reserve(size_t new_size) {
    if (Capacity() < new_size) {
      ValueType *new_start = new ValueType[new_size];
      ValueType *new_finish = new_start;
      ValueType *old_start = start_;
      while (old_start < finish_)
        *(new_finish++) = *(old_start++);
      delete start_;
      start_ = new_start;
      finish_ = new_finish;
      end_of_storage_ = new_start + new_size;
    }
  }
  const Iterator Begin() const { return start_; }
  const Iterator End() const { return finish_; }
  Iterator Begin() { return start_; }
  Iterator End() { return finish_; }
  ValueType &operator[](size_t position) {
    return start_[position];
  }
  Vector &operator=(const Vector &other) {
    if (this != &other) {
      Clear();
      for (Iterator source = other.Begin(); source != other.End(); ++source)
        PushBack(*source);
    }
    return *this;
  }
  void *operator new(size_t size) {
    return malloc(size);
  }
  void operator delete(void *p) {
    return free(p);
  }
 private:
  ValueType *start_;
  ValueType *finish_;
  ValueType *end_of_storage_;
};
 
template<class IteratorOne, class IteratorTwo, class Functor>
void ForEach(IteratorOne begin, IteratorTwo end, Functor functor) {
  while (begin != end) functor(*(begin++));
}
 
template <typename ValueType>
struct Print {
  void operator()(ValueType &value) {
    printf("%4d", value);
  }
};
 
int main(int argc,char *argv[]) {
  Vector<int> vector;
  BackInsertIterator<Vector<int> > j(vector);
  for (int i = 0; i < 100; j = i++);
  vector.Erase(vector.End() - 2);      // erase  #98
  vector.Insert(vector.End() - 1, 98); // insert #98  
  vector.Erase(vector.Begin());        // erase  #0
  vector.Insert(vector.Begin(), 0); // insert #0
  Vector<int> *vector2 = new Vector<int>(vector);
  ForEach(vector2->Begin(), vector2->End(), Print<int>());
 
  delete vector2;
  return 0;
}
Добавлено через 39 минут
Ну и первая.
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
#include <cstdlib>
#include <cstdio>
// Вместо следующих двух функций можно просто включить ctring
//#include <cstring>
 
size_t strlen(const char *value) {
  size_t result = 0;
  for (const char *symbol = value; *symbol != '\0'; ++symbol)
    ++result;
  return result;
}
 
char *strcpy(char *destination, const char *source) {
  char *result = destination;
  while (*source != '\0')
    *(destination++) = *(source++);
  *destination = *source;
  return result;
}
 
class String {
 public:
  typedef char* Iterator;
  String() : data_(NULL) {}
  String(const char *value)
    : data_(strcpy(new char[
                  strlen(value) + 1],
                  value)) {}
  String(const String &other) : data_(NULL) {
    Set(other);
  }
  ~String() { delete [] data_; }
  char *Set(const char *value) {
    delete [] data_;
    return data_ = strcpy(new char[strlen(value) + 1], value);
  }
  String &Set(const String &other) {
    Set(other.CStr());
    return *this;
  }
  void Normalize() {
    // вот тут нужно сделать функцию, которая удалит лишние пробелы
    for (char *i = data_; *i != '\0'; ++i)
      if (*i == ' ' && *(i - 1) == ' ') {
        char *j = i;
        while (*j == ' ') ++j;
        while (*j != '\0')
          *(i++) = *(j++);
        *i = *j;
      }
  }
  char *CStr() const { return data_; }
  size_t Size() const { return strlen(data_); }
  char &operator[](size_t position) { return data_[position]; }
  String &operator=(const String &other) {
    if (this != &other)
      return Set(other);
    return *this;
  }
 private:
  char *data_;
};
 
template <class Type>
void Swap(Type &a, Type &b) {
  Type c = a;
  a = b;
  b = c;
}
 
int main(int argc, char *argv[]) {
  String first = "This is the first     string.";
  String second = "This is  the second string..";
  printf("'%s' / '%s'\n", first.CStr(), second.CStr());
  first.Normalize();
  second.Normalize();
  Swap(first, second);
  printf("'%s' / '%s'\n", first.CStr(), second.CStr());
}
Добавлено через 10 минут
Цитата Сообщение от Halva Посмотреть сообщение
Надеюсь на вашу помощь, т.к. с С++ не знаком.
Подобные задачи "незнакомым с С++" не дают. Это задача институтская. Такие задачи дают где-то на третьем или четвертом курсе специализированной профессии. На учебу был положен балшой болт где-то два семестра назад, я угадал?
Halva
23 / 23 / 2
Регистрация: 02.11.2008
Сообщений: 118
21.05.2011, 14:44  [ТС]     Написать два класса с методами. Без использования STL #4
lemegeton, Ничего себе, для "новичков". Тут я перегнул) Да действительно, задачка институтская, болт был положен не мной, я спокойно работаю в своем направлении, а вот девушкам такие задачки действительно интересно было бы доверить!)
Ещё раз огромное спасибо...
ValeryLaptev
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
21.05.2011, 17:02     Написать два класса с методами. Без использования STL #5
Цитата Сообщение от lemegeton Посмотреть сообщение
Подобные задачи "незнакомым с С++" не дают. Это задача институтская. Такие задачи дают где-то на третьем или четвертом курсе специализированной профессии. На учебу был положен балшой болт где-то два семестра назад, я угадал?
Это типичная задача для нашего 2 курса при изучении ООП на С++. Второй семестр - реализация динамических контейнеров. То есть они уже три семестра к тому времени варятся в С++
lemegeton
2918 / 1347 / 134
Регистрация: 29.11.2010
Сообщений: 2,721
21.05.2011, 21:15     Написать два класса с методами. Без использования STL #6
ValeryLaptev, довольно необычно. Это какой институт?
"Два курса обучения" это в смысле конкретно языка и после еще трех общеобразовательных?
ValeryLaptev
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,658
22.05.2011, 01:26     Написать два класса с методами. Без использования STL #7
Цитата Сообщение от lemegeton Посмотреть сообщение
ValeryLaptev, довольно необычно. Это какой институт?
"Два курса обучения" это в смысле конкретно языка и после еще трех общеобразовательных?
Это Астраханский технический универ.
Первый курс, 2 семестр - программирование на языке высокого уровня.
Второй курс, 1 семестр - программирование на языке высокого уровня, курсовая, ООП
Второй курс, 2 семестр - ООП, курсовая, Структуры данных и алгоритмы.

Все - С++ в среде VS 2010.
То есть, 2 семестра - программирование на ЯВУ+курсовая, 2 семестра - ООП+курсовая, 1 семестр - алгоритмы и структуры данных (здесь лектор отвлекается и на C#, и на Pithon).

Еще на 2-м - Организация ЭВМ, которую правильней было бы назвать Архитектура ЭВМ.
А на 3-м - Операционные системы, Базы данных и Системное ПО.
Jupiter
22.05.2011, 01:33
  #8

Не по теме:

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
ООП+курсовая
везет же людям) не дай им бог курсач по численным методам...

Kastaneda
22.05.2011, 09:45
  #9

Не по теме:

Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Это Астраханский технический универ.
Первый курс, 2 семестр - программирование на языке высокого уровня.
Второй курс, 1 семестр - программирование на языке высокого уровня, курсовая, ООП
Второй курс, 2 семестр - ООП, курсовая, Структуры данных и алгоритмы.

Все - С++ в среде VS 2010.
То есть, 2 семестра - программирование на ЯВУ+курсовая, 2 семестра - ООП+курсовая, 1 семестр - алгоритмы и структуры данных (здесь лектор отвлекается и на C#, и на Pithon).

Еще на 2-м - Организация ЭВМ, которую правильней было бы назвать Архитектура ЭВМ.
А на 3-м - Операционные системы, Базы данных и Системное ПО.
Здорово!

НГТУ (новосибирский гос.тех) (заочно)
1 семестр - ничего
2 семестр - ничего
3 семестр - FORTRAN
4 семестр - основы языка C
дальше я пока не знаю...

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2011, 11:36     Написать два класса с методами. Без использования STL
Еще ссылки по теме:
C++ Реально ли написать программы С++ без использования библиотек ?
C++ Как написать генератор чисел без использования стандартных функций?
Написать аналог шаблонной функции без использования стандартной (и других библиотек) C++
Написать программу, которая возводит число в соответствующую степень(без использования стандартных функций) C++
Написать функцию которая копирует строку S1 в строку S2 N раз, без использования Strcopy C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
22.05.2011, 11:36     Написать два класса с методами. Без использования STL
  #10

Не по теме:

Цитата Сообщение от Maxwe11 Посмотреть сообщение
не дай им бог курсач по численным методам
А мне нравилось)))

Yandex
Объявления
22.05.2011, 11:36     Написать два класса с методами. Без использования STL
Ответ Создать тему
Опции темы

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