алина20 > 01-12-2013 17:32:58 |
помогите пожалуйста. я начала изучать язык с++. мне нужно каждую строчку программы прокоментить что бы разобраться в этой теме.
скрытый текст #include "stdafx.h" #include<iostream> #include<cstdlib> #include<fstream> #include<time.h> #include "LIST.h" using namespace std; //Копирующий конструктор 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(); } |
X Strange > 02-12-2013 21:54:36 |
Изучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована. |
littleleshy > 03-12-2013 12:50:28 |
Начните с ввода-вывода, потом изучите массивы… Затем переходите к классам, проникнитесь инкапсуляцией, наследованием и полиморфизмом. Попробуйте реализовать списки, очереди Ну после этого можно уже переходить к графической среде навроде Visual Studio. У них очень хорошая справка на MSDN. |
Keepun > 03-12-2013 15:55:01 |
Лучше при таких темпах изучения с Java начинать или C#... |
X Strange > 03-12-2013 23:29:31 |
littleleshy пишетНу после этого можно уже переходить к графической среде навроде Visual Studio.
При чём здесь Visual Studio? Студией можно пользоваться и на начальном этапе изучения ввода-вывода и массивов. А уж справкой MSDN и подавно. Keepun пишетпопробуйте реализовать на них списки, очереди…Затем переходите к классам и проникнитесь инкапсуляцией, наследованием и полиморфизмом
Всё-таки списки и очереди реализуют обычно с помощью классов (как и приведено в самом первом сообщении в этой теме). Просто перед тем, как изучать классы, следует знать базовую часть языка C++ — ту, которая заимствована из C. Я имею в виду функции, операторы, работу с указателями и динамической памятью. Затем изучить структуры в смысле C. И уже после этого переходить к классам. |
littleleshy > 06-12-2013 14:49:12 |
X Strange пишетсписки и очереди реализуют обычно с помощью классов
Ну да, точно X Strange пишетСтудией можно пользоваться и на начальном этапе изучения
Можно-то оно можно, но зачем, когда чего нибудь типа C::B вполне хватит? |
алина20 > 07-12-2013 20:32:05 |
X Strange пишетИзучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована.
У меня времени нет анчинать сначала,перевелась вот на другую специальность,преподаватель понимает,поэтому сильно не спрашивает,надо ему не каждую функцию прокоментить а каждую строчку,а тут коментарии только к функции(( |
Keepun > 07-12-2013 20:56:34 |
алина20, такой код через отладчик по шагам прогонять надо, а не комментировать. Вряд ли кто-то вообще кинется комментировать каждую строку, потому что неизвестен ваш уровень знаний синтаксиса. При не понимании указателей тут вообще комментировать нечего. |
X Strange > 10-12-2013 23:54:53 |
Ответ на вопрос отсюда: http://forum.mozilla-russia.org/viewtop … 13#p635913 алина20 пишетв чем отличие строки и символьного массива?
Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'. |
littleleshy > 11-12-2013 13:49:37 |
Если речь идёт о, скажем, System::String, то это нечто большее, чем массив |
Dzirt > 11-12-2013 15:26:43 |
littleleshy пишетЕсли речь идёт о, скажем, System::String
В C++? И у тебя даже есть ссылка на стандарт, где такое написано? Ну-ну... PS: Перед тем как писать гневный ответ подумай хорошо о разнице между "в C++" и "в одной из библиотек, написанной на C++" |
littleleshy > 11-12-2013 15:59:07 |
Кто-то сегодня пишет на чистом C++? И гневным можно скорее Ваше сообщение назвать, а не моё |
Dzirt > 11-12-2013 16:41:45 |
littleleshy пишетКто-то сегодня пишет на чистом C++?
Ты вообще вопрос прочитал или как обычно - просто поболтать пришел? |
littleleshy > 11-12-2013 16:49:50 |
Dzirt Может быть, я что-то там написал не по теме? Кстати, std::string — тоже не массив. |
Dzirt > 11-12-2013 18:09:53 |
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() { ... } возвращающая указатель на тот самый массив символов, оканчивающийся нулем. |
X Strange > 11-12-2013 22:29:27 |
Dzirt пишет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 *). |
Dzirt > 11-12-2013 22:50:58 |
X Strange пишеттак как является частью стандарта C++ ...
Да. Но тем не менее, по прежнему встроенного типа "строка" нет. То, что теперь std фактически стандартная библиотека C++, не делает этот тип встроенным типом - это по прежнему объект определенного класса, реализованный в библиотеке. И кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово? |
X Strange > 11-12-2013 23:12:57 |
Dzirt пишетИ кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово?
Понимаю. Поэтому и ответил про char * |
Dzirt > 12-12-2013 11:26:50 |
X Strange пишетПонимаю. Поэтому и ответил про char *
Да, я видел эту часть ответа и полностью с ней согласен. Просто не придумал как еще отметить, что скорее всего именно это и имелось в виду, а не всякие std::string и иже с ним. |
littleleshy > 12-12-2013 13:28:25 |
Dzirt пишетэто не строки в терминах языка C++
В терминах языка C++ вообще нет понятия «строка», раз на то пошло «Ссылка», «указатель», «массив»… — есть. |
Dzirt > 12-12-2013 14:28:04 |
littleleshy пишетВ терминах языка C++ вообще нет понятия «строка», раз на то пошло «Ссылка», «указатель», «массив»… — есть.
И "строка" тоже есть. Нет встроенного типа "строка", это да. Но тем не менее, в терминах С++ X Strange пишетСтрока --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.
|