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

Классы строк, массивы преобразование и т.д - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Вводится последовательность целых чисел, 0 её конец http://www.cyberforum.ru/cpp-beginners/thread896381.html
Очень прошу помощи в решении данной задачи : Вводится последовательность целых чисел, 0 конец последовательности. Для каждого числа последовательности найти сумму его простых делителей (нахождение суммы простых делителей числа оформить как функцию). Буду очень признателен тем, кто не откажет в помощи.
C++ Перегрузка функций (Создать класс Set ) Создать класс Set – множество целых чисел, используя динамическую память. Определить операторы работы с множествами: "+" – объединение, "*" – пересечение, "-" вычитание, как дружественные функции, а "+=" – включение нового элемента в множество, "==" – сравнения на равенство, и др. как методы класса. Определить операторы "<<" и ">>". Также определить функцию определения принадлежности элемента... http://www.cyberforum.ru/cpp-beginners/thread896374.html
C++ Сосчитать количество слов в файле с русским текстом ; количество слов, которые начинаются с заданного буквосочетания.
Нужна программа чтобы нормально работала через Borland c++ Сосчитать количество слов в файле с русским текстом ; количество слов, которые начинаются с заданного буквосочетания.
Описать структуру с именем NOTE C++
Описать структуру с именем NOTE, содержащую поля: - фамилия и имя; - номер телефона; - дата рождения (массив из трех чисел). Написать программу, выполняющую следующие действия: - ввод с клавиатуры данных в массив, состоящий из 5 структур типа NOTE; - вывод на экран информации о людях, чьи дни рождения совпадают с введенными с клавиатуры; - если таких людей нет, вывести соответствующее...
C++ Завтра курсовая! Составить команду из четырёх лучших бегунов для участия в эстафете 4х100 http://www.cyberforum.ru/cpp-beginners/thread896360.html
Элементы вещественного массива размером N содержат результаты забега на 100 м N спортсменов, измеренные в сек. Составить команду из четырёх лучших бегунов для участия в эстафете 4х100 (указать номера четырёх спортсменов). Помогите мне, пожааалуйста.
C++ MPI сложение матриц Здравствуйте, вот такое задание, посчитать сумму матриц, распараллелив на кластере. Я не могу понять как правильно реализовать этот случай так, что бы автоматически считалось на разном количестве подключаемых узлов, при этом распределить вручную я могу. У меня есть 2 варианта реализации, распределить с помощью функции MPI_Bcast (в этом случае не пойму как можно будет... подробнее

Показать сообщение отдельно
VLK
193 / 162 / 12
Регистрация: 05.05.2013
Сообщений: 1,225

Классы строк, массивы преобразование и т.д - C++

09.06.2013, 17:53. Просмотров 402. Ответов 8
Метки (Все метки)

У меня в учебнике есть такой пример:

Кликните здесь для просмотра всего текста
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
157
158
159
#include <iostream> 
 #include <string.h> 
 using namespace std; 
 
 // Rudimentary string class 
 class String 
 { 
 public: 
 // constructors 
 String(); 
 String(const char *const); 
 String(const String &); 
 ~String(); 
 
 // overloaded operators 
 char & operator[](unsigned short offset); 
 char operator[](unsigned short offset) const; 
 String operator+(const String&); 
 void operator+=(const String&); 
 String & operator= (const String &); 
 
 // General accessors 
 unsigned short GetLen()const { 
 return itsLen; 
} 
 const char * GetString() const { 
 return itsString; 
} 
 
 private: 28: String (unsigned short); // private constructor 
 char * itsString; 
 unsigned short itsLen; 
}; 
 // default constructor creates string of 0 bytes 
 String::String() 
 { 
 itsString = new char[1]; 
 itsString[0] = '\0'; 
 itsLen=0; 
} 
 // private (helper) constructor, used only by 
 // class methods for creating a new string of 
 // required size. Null filled. 
 String::String(unsigned short len) 
 { 
 itsString = new char[len+1]; 
 for (unsigned short i = 0; i<=len; i++) 
 itsString[i] = '\0'; 
 itsLen=len; 
} 
 // Converts a character array to a String 
 String::String(const char * const cString) 
 { 
 itsLen = strlen(cString); 
 itsString = new char[itsLen+1]; 
 for (unsigned short i = 0; i itsString[i] = cString[i]; 
 itsString[itsLen]='\0'; 
} 
 63:// copy constructor 
 String::String (const String & rhs) 
 { 
 itsLen=rhs.GetLen(); 
 itsString = new char[itsLen+1]; 
 for (unsigned short i = 0; i itsString[i] = rhs[i]; 
 itsString[itsLen] = '\0'; 
} 
 // destructor, frees allocated memory 
 String::~String () 
 { 
 delete [] itsString; 
 itsLen = 0; 
} 
 // operator equals, frees existing memory 
 // then copies string and size 
 String& String::operator=(const String & rhs) 
 { 
 if (this == &rhs) 
 return *this; 
 delete [] itsString; 
 itsLen=rhs.GetLen(); 
 itsString = new char[itsLen+1]; 
 for (unsigned short i = 0; i itsString[i] = rhs[i]; 
 itsString[itsLen] = '\0'; 
 return *this; 
} 
 //nonconstant offset operator, returns 
 // reference to character so it can be 
 // changed! 
 char & String::operator[](unsigned short offset) 
 { 
 if (offset > itsLen) 
 return itsString[itsLen-1]; 
 else 
 return itsString[offset]; 
} 
 // constant offset operator for use 
 // on const objects (see copy constructor!) 
 char String::operator[](unsigned short offset) const 
 { 
 if (offset > itsLen) 
 return itsString[itsLen-1]; 
 else 
 return itsString[offset]; 
} 
 // creates a new string by adding current 
 // string to rhs 
 String String::operator+(const String& rhs) 
 { 
 unsigned short totalLen = itsLen + rhs.GetLen(); 
 String temp(totalLen); 
 unsigned short i; 
 for ( i= 0; i temp[i] = itsString[i]; 
 for (unsigned short j = 0; j temp[i] = rhs[j]; 
 temp[totalLen]='\0'; 
 return temp; 
} 
 // changes current string, returns nothing 
 void String::operator+=(const String& rhs) 
 { 
 unsigned short rhsLen = rhs.GetLen(); 
 unsigned short totalLen = itsLen + rhsLen; 
 String temp(totalLen); 
 unsigned short i; 
 for (i = 0; i temp[i] = itsString[i]; 
 for (unsigned short j = 0; j temp[i] = rhs[i-itsLen]; 
 temp[totalLen]='\0'; 
 *this = temp; 
} 
 int main() 
 { 
 String s1("initial test"); 
 cout << "S1:\t" << s1.GetString() << endl; 
 
 char * temp = "Hello World"; 
 s1 = temp; 
 cout << "S1:\t" << s1.GetString() << endl; 
 
 char tempTwo[20]; 
 strcpy(tempTwo, "; nice to be here!"); 
 s1 += tempTwo; 
 cout << "tempTwo:\t" << tempTwo << endl; 
 cout << "S1:\t" << s1.GetString() << endl; 
 
 cout << "S1[4]:\t" << s1[4] << endl; 
 s1[4]='x'; 
 cout << "S1:\t" << s1.GetString() << endl; 
 
 cout << "S1[999]:\t" << s1[999] << endl; 
 
 String s2(" Another string"); 
 String s3; 
 s3 = s1+s2; 
 cout << "S3:\t" << s3.GetString() << endl; 
 
 String s4; 
 s4 = "Why does this work?"; 
 cout << "S4:\t" << s4.GetString() << endl; 
 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
#include <iostream> 
 
class LINE
 
{
public:
LINE()
{
stroka = new char[1];
stroka[0] = '\0';
dlinna_stroki = 0;
}
 
LINE(char *massiv)
{
dlinna_stroki = strlen(massiv);
stroka = new char[dlinna_stroki + 1];
 
for (int a = 0; a < dlinna_stroki; a++)
{ stroka[a] = massiv[a]; }
stroka[dlinna_stroki] = '\0';
}
 
~LINE()
{
delete[] stroka;
dlinna_stroki = 0;
}
 
int get_dlinna_stroki() const 
{  
return dlinna_stroki;
}
 
char *get_stroka() const 
{ 
return stroka; 
}
 
LINE operator= (const LINE & rhs)
{
delete[] stroka;
int w = rhs.get_dlinna_stroki();
stroka = new char[w];
for(int i=0; i < w; i++)
{
stroka[i] = rhs.stroka[i];
}
return stroka;
}
 
 
private:
 
char *stroka;
int dlinna_stroki;
 
};
 
 
 
int main()
 
{
LINE strOne("Hello world");
 
std::cout << strOne.get_stroka() << "\n";
 
LINE strTwo("Nice day");
std::cout << strTwo.get_stroka() << "\n";
strTwo = strOne;
std::cout << strTwo.get_stroka() << "\n";
 
system("pause");
return 0;
}


Проблема у меня возникла с operator=, сам метод описан в строках 40-50, а применяется он в строках 69-72.
По моему разумению мой operator= работает следующим образом:

42. Удаляется существующий массив stroka т.е. массив stroka объекта strOne
43. Создаем переменную и присваиваем ей значение равное длине элементов во втором массиве, т.е. в массиве stroka объекта strTwo
44. Выделяем память под новый массив stroka объекта strOne, длинна этого массива равна длине массива stroka объекта strTwo
45-48. Мы копируем из массива stroka объекта strTwo в новый массив stroka объекта strOne каждый элемент.
49. Возвращаем новый массив.

Программа работает, но не совсем корректно, после Hello world появляются какие то непонятные символы, вот скриншот:

Классы строк, массивы преобразование и т.д

я менял метод operator= на вот такое:

Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
LINE &operator= (const LINE & rhs)
{
delete[] stroka;
int w = rhs.get_dlinna_stroki();
stroka = new char[w];
for(int i=0; i < w; i++)
{
stroka[i] = rhs.stroka[i];
}
return *this;
}


результат тот же, в чем проблема?

PS я не силен в терминах, если можно объясните пожалуйста попроще.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru