Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№101-12-2013 17:32:58

алина20
Участник
 
Группа: Members
Зарегистрирован: 01-12-2013
Сообщений: 12
UA: Chrome 31.0

программирование с++.

помогите пожалуйста. я начала изучать язык с++. мне нужно каждую строчку программы прокоментить что бы разобраться в этой теме.

скрытый текст
#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=o.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=o.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=o.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();
}

Отсутствует

 

№202-12-2013 21:54:36

X Strange
Участник
 
Группа: Members
Зарегистрирован: 21-02-2010
Сообщений: 103
UA: Opera 12.1

Re: программирование с++.

Изучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована.

Отредактировано X Strange (02-12-2013 21:55:48)


# rm -rf /

Отсутствует

 

№303-12-2013 12:50:28

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 28.0

Re: программирование с++.

Начните с ввода-вывода, потом изучите массивы…
Затем переходите к классам, проникнитесь инкапсуляцией, наследованием и полиморфизмом. Попробуйте реализовать списки, очереди :)
Ну после этого можно уже переходить к графической среде навроде Visual Studio.
У них очень хорошая справка на MSDN.

Отредактировано littleleshy (06-12-2013 14:46:55)

Отсутствует

 

№403-12-2013 15:55:01

Keepun
Участник
 
Группа: Extensions
Зарегистрирован: 08-12-2007
Сообщений: 591
UA: Firefox 24.0
Веб-сайт

Re: программирование с++.

Лучше при таких темпах изучения с Java начинать или C#...


Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?

Отсутствует

 

№503-12-2013 23:29:31

X Strange
Участник
 
Группа: Members
Зарегистрирован: 21-02-2010
Сообщений: 103
UA: Opera 12.1

Re: программирование с++.

littleleshy пишет

Ну после этого можно уже переходить к графической среде навроде Visual Studio.

При чём здесь Visual Studio? Студией можно пользоваться и на начальном этапе изучения ввода-вывода и массивов. А уж справкой MSDN и подавно.

Keepun пишет

попробуйте реализовать на них списки, очереди…Затем переходите к классам и проникнитесь инкапсуляцией, наследованием и полиморфизмом

Всё-таки списки и очереди реализуют обычно с помощью классов (как и приведено в самом первом сообщении в этой теме). Просто перед тем, как изучать классы, следует знать базовую часть языка C++ — ту, которая заимствована из C. Я имею в виду функции, операторы, работу с указателями и динамической памятью. Затем изучить структуры в смысле C. И уже после этого переходить к классам.

Отредактировано X Strange (03-12-2013 23:29:47)


# rm -rf /

Отсутствует

 

№606-12-2013 14:49:12

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 28.0

Re: программирование с++.

X Strange пишет

списки и очереди реализуют обычно с помощью классов

Ну да, точно:)

X Strange пишет

Студией можно пользоваться и на начальном этапе изучения

Можно-то оно можно, но зачем, когда чего нибудь типа C::B вполне хватит?

Отсутствует

 

№707-12-2013 20:32:05

алина20
Участник
 
Группа: Members
Зарегистрирован: 01-12-2013
Сообщений: 12
UA: Chrome 31.0

Re: программирование с++.

X Strange пишет

Изучение языка C++ вряд ли стоит начинать с подобных конструкций. Более того, каждая функция и так прокомментирована.

У меня времени нет анчинать сначала,перевелась вот на другую специальность,преподаватель понимает,поэтому сильно не спрашивает,надо ему не каждую функцию прокоментить а каждую строчку,а тут коментарии только к функции((

Отредактировано алина20 (07-12-2013 20:45:57)

Отсутствует

 

№807-12-2013 20:56:34

Keepun
Участник
 
Группа: Extensions
Зарегистрирован: 08-12-2007
Сообщений: 591
UA: Firefox 24.0
Веб-сайт

Re: программирование с++.

алина20, такой код через отладчик по шагам прогонять надо, а не комментировать.
Вряд ли кто-то вообще кинется комментировать каждую строку, потому что неизвестен ваш уровень знаний синтаксиса. При не понимании указателей тут вообще комментировать нечего.


Зачем вашему компу оперативная память, если вы сами не хотите, чтобы софт ее всю использовал?

Отсутствует

 

№910-12-2013 23:54:53

X Strange
Участник
 
Группа: Members
Зарегистрирован: 21-02-2010
Сообщений: 103
UA: Opera 12.1

Re: программирование с++.

Ответ на вопрос отсюда:
http://forum.mozilla-russia.org/viewtop … 13#p635913

алина20 пишет

в чем отличие строки и символьного массива?

Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.


# rm -rf /

Отсутствует

 

№1011-12-2013 13:49:37

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 28.0

Re: программирование с++.

Если речь идёт о, скажем, System::String, то это нечто большее, чем массив :)

Отсутствует

 

№1111-12-2013 15:26:43

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

littleleshy пишет

Если речь идёт о, скажем, System::String

В C++? И у тебя даже есть ссылка на стандарт, где такое написано? ;) Ну-ну...

PS: Перед тем как писать гневный ответ подумай хорошо о разнице между "в C++" и "в одной из библиотек, написанной на C++"

Отсутствует

 

№1211-12-2013 15:59:07

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 29.0

Re: программирование с++.

Кто-то сегодня пишет на чистом C++?
И гневным можно скорее Ваше сообщение назвать, а не моё :)

Отсутствует

 

№1311-12-2013 16:41:45

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

littleleshy пишет

Кто-то сегодня пишет на чистом C++?

Ты вообще вопрос прочитал или как обычно - просто поболтать пришел? ;)

Отсутствует

 

№1411-12-2013 16:49:50

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 29.0

Re: программирование с++.

Dzirt
Может быть, я что-то там написал не по теме?
Кстати, std::string — тоже не массив.

Отсутствует

 

№1511-12-2013 18:09:53

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

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() { ... }

возвращающая указатель на тот самый массив символов, оканчивающийся нулем.

Отредактировано Dzirt (11-12-2013 18:10:24)

Отсутствует

 

№1611-12-2013 22:29:27

X Strange
Участник
 
Группа: Members
Зарегистрирован: 21-02-2010
Сообщений: 103
UA: Opera 12.1

Re: программирование с++.

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 *).


# rm -rf /

Отсутствует

 

№1711-12-2013 22:50:58

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

X Strange пишет

так как является частью стандарта C++ ...

Да. Но тем не менее, по прежнему встроенного типа "строка" нет. То, что теперь std фактически стандартная библиотека C++, не делает этот тип встроенным типом - это по прежнему объект определенного класса, реализованный в библиотеке.

И кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово? ;)

Отсутствует

 

№1811-12-2013 23:12:57

X Strange
Участник
 
Группа: Members
Зарегистрирован: 21-02-2010
Сообщений: 103
UA: Opera 12.1

Re: программирование с++.

Dzirt пишет

И кроме того, ты же понимаешь, что вопрос "какая разница между std::string и символьным массивом" звучит несколько бредово?

Понимаю. Поэтому и ответил про char * :)


# rm -rf /

Отсутствует

 

№1912-12-2013 11:26:50

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

X Strange пишет

Понимаю. Поэтому и ответил про char *

Да, я видел эту часть ответа и полностью с ней согласен. Просто не придумал как еще отметить, что скорее всего именно это и имелось в виду, а не всякие std::string и иже с ним. :)

Отсутствует

 

№2012-12-2013 13:28:25

littleleshy
________
 
Группа: Members
Откуда: Москва
Зарегистрирован: 13-12-2008
Сообщений: 2504
UA: Firefox 29.0

Re: программирование с++.

Dzirt пишет

это не строки в терминах языка C++

В терминах языка C++ вообще нет понятия «строка», раз на то пошло :)
«Ссылка», «указатель», «массив»… — есть.

Отсутствует

 

№2112-12-2013 14:28:04

Dzirt
Участник
 
Группа: Members
Зарегистрирован: 26-02-2012
Сообщений: 1892
UA: Firefox 26.0

Re: программирование с++.

littleleshy пишет

В терминах языка C++ вообще нет понятия «строка», раз на то пошло :)
«Ссылка», «указатель», «массив»… — есть.

И "строка" тоже есть. Нет встроенного типа "строка", это да. Но тем не менее, в терминах С++

X Strange пишет

Строка --- это символьный массив, заканчивающийся символом с кодом 0. Например, строка "hello" --- это массив из 6-ти символов: 'h', 'e', 'l', 'l', 'o', '\0'.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]