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

Что к чему? (объяснить каждую строчку из данной программы) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как инициализировать указатель произвольным адресом? http://www.cyberforum.ru/cpp-beginners/thread833311.html
Как инициализировать указатель произвольным адресом? int *ptr; ptr = ? ; // КАК ЭТО СДЕЛАТЬ?
C++ Что происходит с освободившейся от указателей памятью? [gcc-4.7.2] Что происходит в следующих случаях с памятью выделенную под переменные? 1) Объявление в операторных скобках: { int variable; } 2) Присвоение адреса указателю: int *i_var; { int variable = 5; http://www.cyberforum.ru/cpp-beginners/thread833310.html
C++ Передача Указателя На Двумерный Массив В Функцию
Как изменить код, чтобы массив объявлялся в main() и передавался в input_strings(). Код: #define MAXLENGTH 129 #define MAXSIZE 20 char arr_str; int input_strings(){ int i,n;
C++ Не сортирует.В чем ошибка?
и ещё нужно добавить средний бал по каждому студенту #include <iostream> #include <string.h> #include <cstring> #include <stdio.h> #include <fstream> #include <sstream> #include <conio.h> using namespace std; class table
C++ Как зная площадь треугольника установиться его координаты. http://www.cyberforum.ru/cpp-beginners/thread833277.html
Как зная площадь треугольника установиться его координаты. Естественно любые. Например площадь = 5 тогда координаты : 0 0 4 2 5 0
C++ Функции. Написать функцию, удаляющую элемент массива Написать функцию, удаляющую элемент массива. Все элементы после него сдвигаются на один влево, а последний равен нулю. подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
10.04.2013, 11:09     Что к чему? (объяснить каждую строчку из данной программы)
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
/*Следующие 6 строк делают другие файлы как бы частями этого*/
#include <stdafx.h>
#include <iostream>
#include <list>
#include <algorithm>
#include <clocale>
#include <locale>
using namespace std; // Эта строка неявно подставляет std:: ко всем идентификаторам в пространстве имён std, например, если дальше будет cout, то неявно подставится std:: и получится std::cout
/*пустые строки значения не имеют*/ 
struct Print{// эта строка начинает декларацию типа структуры. struct означает, что следующие слово будет идентификатором этого типа, Print - имя нового типа, а символ { начинает блок, в котором будут расположены члены структуры
    template <typename T> // template начинает шаблон, <typename означает, что следующий идентификатор будет локальным в пределах шаблона именем существующего (возможно, объявленного после шаблона, но не в самом шаблоне) типа. То есть на место T может быть подставлен любой тип символ > просто парный к <
    void operator() (T &elem) // void означает специальный тип без данных, на плюсах значения этого типа возвращают процедуры, так как на этом язык они формально функции, после типа пойдёт новый идентификатор функции, или переменной, если после идентификатора стоят круглые скобки, то это функция. operator - общий идентификатор функций, которые будут неявно заменять операторы языка, далее ставится обозначение самого заменяемого оператора. Если оператор совпадает с типом (в донном случае T), то это ЕМНИП оператор приведения к указанному типу. То есть создаётся функция приведения структуры print к типу T, а T - любой тип. 
    {// начало тело функции
        cout << elem << ' ';//cout - поток вывода, при применении к потоку << - составной иероглиф "вывести в поток", иначе эти же символы - составной иероглиф "сдвинуть биты левого операнда влево на величину правого операнда, а если он отрицателен, то взять модуль и двигать вправо пробел между апострофами - просто символ пробела, означающий сам себя Строка выведет elem и потом пробел в cout
    }// конец тела функции
};// конец блока с членами структуры
 
template <typename T>
void addToFront(list<T> &_coll, const T value)  Функции зовут addToFront, первый её параметр имеет тип ссылки на тип, созданный шаблоном list при подстановке T вместо идентификиктора, который в нём указан после <typename, а зовут этот параметр _coll, второй параметр зовут value и тип его T. T - любой тип, но один и тот же в обоих случаях, но не обязательно тот же, как в операторе приведения структуры print.
{
    _coll.push_front(value); // вызывается с параметром value функция-член push_front объекта _coll
}
 
template <typename T>
void dellist(list<T> &_coll)
{
    _coll.pop_front();// вызывается без параметров функция-член pop_front объекта _coll
}
 
template <typename T>
void showlist(list<T> &_coll)
{
    if(!_coll.empty()) // вызывается без параметров функция-член empty объекта _coll, потом результат становится операндом оператора ! (не), который лож превращает в истину, а истину в лож
    {// начало блока, выполняемого, если истина
        for_each(_coll.begin(), _coll.end(), Print());// А чёрт его знает, что это такое
    }// конец блока, выполняемого, если истина
    else
        wcout << L"The list is cleared\n"; // эта строка выполняется, если лож. wcout - поток вывода, принимающий многобайтные символы
}
 template <typename T>
void dubllist(list<T> &_coll, const T value)
{
    list<T>::iterator pos;// декларация иттератора pos для типа list<T>, тип этого иттератора - тип-член iterator типа list<T>
    for(pos = _coll.begin(); pos != _coll.end(); ++pos)// цикл со счётчиком, а в данном случае с иттератором. for - оператор цикла, в скобках 3 позиции, разделённые точкой с запятой. В первой оператор, выполняемый один раз на старте цикла, во второй условие его продолжения, а в третьей оператор, выполяемый после каждого прохода по циклу pos = _coll.begin() присваивает pos значение члена-функции begin объекта _coll, вызванной без параметра и вернувшей начальное значение иттератора pos != _coll.end() - pos не равно значению члена-функции end объекта _coll, вызываемой без параметра и вовзращающей значение иттератора, говорящее о том, что весь объект перебран и надо выйти из цикла, ++, применяемый к иттератору означает переход к следующему значению
    {// начало тела цикла
        if(*pos == value){ // *pos означает доступ к данному, идентифицируемому значением pos., данная строка значит: "если pos указывает на объект, равный value символ {начинает блок, выполняемый, если истина
            if(pos == _coll.begin())
                _coll.push_front(value);
            else if(pos != (--_coll.end())){// --, применяемый к иттератору, означает переход к предыдущему
                _coll.insert(pos, value); вызывает функцию-член insert объекта _coll с параметрами pos и value
            }
            else if(pos == (--_coll.end())){
                _coll.push_back(value);
                ++pos;
            }
        }
    }
}
 
template <typename T>
void menu(list<T> &); предекларация функции menu, параметр один и пока безымянный, тип его list<T>
void instructions();предекларация функции instructions без параметров
 
int main(int argc, char *argv[])// заголовок функции, в начале тела которой находится точка входа программы
{
    std::locale::global(std::locale("Russian"));// вызывается функция-член global пространства имён locale, являющегося членом std, можно было std:: опустить, параметр - значение функции-члена locale пространства имён std, можно было std, а её параметр - нуль-терминальная строка "Russian"
    printf("Написать программу для работы с двунаправленным нециклическим списком: \n добавление/удаление элементов в голову, просмотр списка,\n реализовать дублирование списка с заданным значением \n");// Здесь вызывается функция printf, чёрт её знает, что и как она делает
    
    
    wcout.imbue(locale(".866"));
 
    list<int> coll;
 
    menu(coll);
 
    if(coll.empty())
        coll.clear();
 
    cout << "\n\n";
    return 0;
}
 
void instructions()
 
{
    wcout << L"Select menu item: " <<
        L"\n1 - To add an element in the beginning" <<
        L"\n2 - To remove an element from the beginning" <<
        L"\n3 - duplication" <<
        L"\n4 - Exit.\n";
}
 
template <typename T>
void menu(list<T> &coll)
{
    int punkt_menu, value;
 
    instructions();
 
 
    do{
        wcout << L"\n What do you want to make? \n ";
            cin >> punkt_menu;
 
            switch(punkt_menu)
            {
                case 1:
                    wcout << L"\n Enter numbers which you want to add in the list: ";
                        cin >> value;
 
                    addToFront(coll, value);
                    showlist(coll);
                    break;
                case 2:
                    dellist(coll);
                    showlist(coll);
                    break;
                    
                case 3:
                    wcout << L"Write numbers: ";
                        cin >> value;
 
                    dubllist(coll, value);
                    showlist(coll);
                    break;
            }
 
    }while(punkt_menu != 4);
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru