Страницы: 1
помогите пожалуйста. я начала изучать язык с++. мне нужно каждую строчку программы прокоментить что бы разобраться в этой теме.
//Копирующий конструктор
template<class Type>
LIST<Type>::LIST(LIST<Type> &o): begin(0),end(0),size(0){
Node<Type> *p.get_begin();
while(p){
push_back(p->Value());
p=p->Next();
}
}
//Конструктор с параметрами 1
template<class Type>
LIST<Type>::LIST(float n, float min, float max): begin(0),end(0),size(0){
srand( (unsigned)time( NULL ) );
for(int i=0;i<n;i++) push_back(rand()%(max-min+1)+min);
}
//Конструктор с параметрами 2
template<class Type>
LIST<Type>::LIST(float n, float mode): begin(0),end(0),size(0){
srand( (unsigned)time( NULL ) );
for(int i=1;i<=n;i++)
if(mode)
push_pop(i);
else
push_back(i);
}
//Перегрузка оператора присваивания
template<class Type>
LIST<Type> & LIST<Type>::operator = (LIST<Type> &o) {
Node<Type> *p.get_begin();
while(p){
push_back(p->Value());
p=p->Next();
}
return *this;
}
//Перегрузка оператора сложения (Задание по варианту)
template<class Type>
LIST<Type> & LIST<Type>::operator + (LIST<Type> &o) {
LIST<Type> *temp;
Node<Type> *p.get_begin();
while(p){
if(searchByVal(p->Value())==0) temp->push_back(p->Value());
p=p->Next();
}
return *temp;
}
//Поиск узла по индексу
template<class Type>
void LIST<Type>::fill() {
Type p;
while(!cin.eof()){
cout<<">>";
cin>>p;
push_back(p);
}
delete_last();//Т.к добавился лишний элемент
cin.clear();
}
//Добавление элемента в начало списка
template<class Type>
void LIST<Type>::push_pop(Type v){
Node<Type> *p=new Node<Type>(v);
if(!begin) {
begin=end=p;
p->Next()=0;
p->Prev()=0;
}
else {
p->Next()=begin;
p->Prev()=0;
begin->Prev()=p;
begin=p;
}
size++;
}
//Добавление элемента в конец списка
template<class Type>
void LIST<Type>::push_back(Type v) {
Node<Type> *p=new Node<Type>(v);
if(!begin){
begin=end=p;
p->Next()=0;
p->Prev()=0;
}
else {
end->Next()=p;
p->Prev()=end;
p->Next()=0;
end=p;
}
size++;
}
//Добавление элемента в заданную позицию
template<class Type>
void LIST<Type>::insert(int pos, Type v){
if(pos<1||pos>size){
cout<<"Выход за границы списка";
return;
}
Node<Type> *pnew=new Node<Type>(v);
if(size==0) {
begin=end=pnew;
pnew->Next()=0;
pnew->Prev()=0;
}
else if(pos==1)
push_pop(v);
else if(pos==size)
push_back(v);
else
{
Node<Type> *p=begin,*p2;
for(int i=2;i<=pos;i++)
p=p->Next();
p2=p->Next();
p->Next()=pnew;
p2->Prev()=pnew;
pnew->Next()=p2;
pnew->Prev()=p;
size++;
}
}
//Удаление элемента из начала списка
template<class Type>
void LIST<Type>::delete_first(){
if(size==1){clear();return;}
Node<Type>* p;
if(begin){
p=begin;
begin=p->Next();
begin->Prev()=0;
size--;
delete p;
}
}
//Удаление элемента из конца списка
template<class Type>
void LIST<Type>::delete_last(){
if(size==1){clear();return;}
Node<Type>* p;
if(end){
p=end;
end=p->Prev();
end->Next()=0;
size--;
delete p;
}
}
//Удаление элемента с позиции pos
template<class Type>
void LIST<Type>::delete_from(int pos){
if(size==0||pos<1||pos>size){
cout<<"Выход за границы списка";
return;
}
if(pos==1)
delete_first();
else if(pos==size)
delete_last();
else
{
Node<Type> *p=begin,*p2;
for(int i=2;i<=pos;i++)
p=p->Next();
//Будем удалять p узел
p2=p; //Рабочая переменная
p=p->Prev(); //Вторая рабочая переменная для хранения предыдущего узла
p->Next()=p2->Next(); //Для предыдущего элемента следующим будет следующий элемент относительно удаляемоего
(p2->Next())->Prev()=p; //А для следующего предыдущим будет предыдущий относительно удаляемоего
size--;
delete p2;
}
}
//Вывод списка (по умолчанию - на экран)
template<class Type>
void LIST<Type>::print(ostream& os=cout) {
Node<Type> *p;
p=begin;
if(!p)cout<<"Список пуст!";
while(p){
os<<p->Value()<<" ";
p=p->Next();
}
cout<<endl;
}
template<class Type>
void LIST<Type>::printPlus(ostream& os=cout) {
Node<Type> *p;
float v=0;
cout<<"Введите значение, на которое необходимо увеличить элементы списка:"<<endl;
cin>>v;
p=begin;
if(!p)cout<<"Список пуст!";
while(p){
os<<p->Plus(v)<<" ";
p=p->Next();
}
cout<<endl;
}
//Удаление всех элементов из списка
template<class Type>
void LIST<Type>::clear(){
Node<Type> *p,*p1;
if(begin){
p=begin;
while(p){
p1=p->Next();
delete p;
p=p1;
}
begin=end=0;
size=0;
}
}
//Деструктор (Очищаем список)
template<class Type>
LIST<Type>::~LIST(){
this->clear();
}
//Поиск узла по значению
template<class Type>
float LIST<Type>::searchByVal (Type s) {
int count=0;
Node<Type> *p=begin;
while(p){
if(p->Value()==s) count++;
p=p->Next();
}
return count;
}
//Поиск узла по индексу
template<class Type>
float LIST<Type>::searchByIndex (int pos) {
if(size==0||pos<1||pos>size){
cout<<"Выход за границы списка"<<endl;
return -1;
}
Node<Type> *p=begin;
int i=0;
while(++i<pos){
p=p->Next();
}
return p->Value();
}
Отсутствует
Изучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована.
Отредактировано X Strange (02-12-2013 21:55:48)
# rm -rf /
Отсутствует
Начните с ввода-вывода, потом изучите массивы…
Затем переходите к классам, проникнитесь инкапсуляцией, наследованием и полиморфизмом. Попробуйте реализовать списки, очереди
Ну после этого можно уже переходить к графической среде навроде Visual Studio.
У них очень хорошая справка на MSDN.
Отредактировано littleleshy (06-12-2013 14:46:55)
Отсутствует
Ну после этого можно уже переходить к графической среде навроде Visual Studio.
При чём здесь Visual Studio? Студией можно пользоваться и на начальном этапе изучения ввода-вывода и массивов. А уж справкой MSDN и подавно.
попробуйте реализовать на них списки, очереди…Затем переходите к классам и проникнитесь инкапсуляцией, наследованием и полиморфизмом
Всё-таки списки и очереди реализуют обычно с помощью классов (как и приведено в самом первом сообщении в этой теме). Просто перед тем, как изучать классы, следует знать базовую часть языка C++ — ту, которая заимствована из C. Я имею в виду функции, операторы, работу с указателями и динамической памятью. Затем изучить структуры в смысле C. И уже после этого переходить к классам.
Отредактировано X Strange (03-12-2013 23:29:47)
# rm -rf /
Отсутствует
списки и очереди реализуют обычно с помощью классов
Ну да, точно
Студией можно пользоваться и на начальном этапе изучения
Можно-то оно можно, но зачем, когда чего нибудь типа C::B вполне хватит?
Отсутствует
Изучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована.
У меня времени нет анчинать сначала,перевелась вот на другую специальность,преподаватель понимает,поэтому сильно не спрашивает,надо ему не каждую функцию прокоментить а каждую строчку,а тут коментарии только к функции((
Отредактировано алина20 (07-12-2013 20:45:57)
Отсутствует
алина20, такой код через отладчик по шагам прогонять надо, а не комментировать.
Вряд ли кто-то вообще кинется комментировать каждую строку, потому что неизвестен ваш уровень знаний синтаксиса. При не понимании указателей тут вообще комментировать нечего.
Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?
Отсутствует
Ответ на вопрос отсюда:
http://forum.mozilla-russia.org/viewtop … 13#p635913
в чем отличие строки и символьного массива?
Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.
# rm -rf /
Отсутствует
Если речь идёт о, скажем, System::String, то это нечто большее, чем массив
Отсутствует
Если речь идёт о, скажем, System::String
В C++? И у тебя даже есть ссылка на стандарт, где такое написано? Ну-ну...
PS: Перед тем как писать гневный ответ подумай хорошо о разнице между "в C++" и "в одной из библиотек, написанной на C++"
Отсутствует
Кто-то сегодня пишет на чистом C++?
И гневным можно скорее Ваше сообщение назвать, а не моё
Отсутствует
Dzirt
Может быть, я что-то там написал не по теме?
Кстати, std::string — тоже не массив.
Отсутствует
Может быть, я что-то там написал не по теме?
Не по теме. И std::string - тоже не по теме. Вопрос был о C++ как языке. В котором нет встроенного типа "строка" и поэтому она всю жизнь была:
Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.
А твои примеры System::String или std::string - это не строки в терминах языка C++, это объекты некоторых классов, которые для преобразования в строку символов в терминах C++ всегда имеют некоторую функцию, как в std::string например
const char *c_str() { ... }
возвращающая указатель на тот самый массив символов, оканчивающийся нулем.
Отредактировано Dzirt (11-12-2013 18:10:24)
Отсутствует
littleleshy пишетМожет быть, я что-то там написал не по теме?
Не по теме. И std::string - тоже не по теме. Вопрос был о C++ как языке. В котором нет встроенного типа "строка" и поэтому она всю жизнь была:
X Strange пишетСтрока --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.
А твои примеры System::String или std::string - это не строки в терминах языка C++, это объекты некоторых классов, которые для преобразования в строку символов в терминах C++ всегда имеют некоторую функцию, как в std::string например
const char *c_str() { ... }
возвращающая указатель на тот самый массив символов, оканчивающийся нулем.
На самом деле про std::string можно сказать, что он по теме, так как является частью стандарта C++ в отличие от System::String, CString, QString, и т.п.
Действительно, char * --- это строка в стиле C, унаследованная языком C++. Однако я думаю, что вопрос был именно про char *, тем более, что строковая контанта "hello" --- это именно char * (точнее, const char *).
# rm -rf /
Отсутствует
так как является частью стандарта C++ ...
Да. Но тем не менее, по прежнему встроенного типа "строка" нет. То, что теперь std фактически стандартная библиотека C++, не делает этот тип встроенным типом - это по прежнему объект определенного класса, реализованный в библиотеке.
И кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово?
Отсутствует
И кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово?
Понимаю. Поэтому и ответил про char *
# rm -rf /
Отсутствует
Понимаю. Поэтому и ответил про char *
Да, я видел эту часть ответа и полностью с ней согласен. Просто не придумал как еще отметить, что скорее всего именно это и имелось в виду, а не всякие std::string и иже с ним.
Отсутствует
это не строки в терминах языка C++
В терминах языка C++ вообще нет понятия «строка», раз на то пошло
«Ссылка», «указатель», «массив»… — есть.
Отсутствует
В терминах языка C++ вообще нет понятия «строка», раз на то пошло
«Ссылка», «указатель», «массив»… — есть.
И "строка" тоже есть. Нет встроенного типа "строка", это да. Но тем не менее, в терминах С++
Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.
Отсутствует
Страницы: 1