Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
interpol
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
#1

Совет по оформлению кода - C++

24.01.2015, 13:38. Просмотров 419. Ответов 16
Метки нет (Все метки)

Есть программа, работает нормально. Обрабатывает из файла двумерный массив и выводит измененный (минимальный элемент ниже главной диагонали меняется с максимальным выше главной диагонали) в другой файл. Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
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
#include <iostream>
#include <clocale>
#include <fstream>
#include <cstdlib>
 
struct OpenClose
{
    std::ifstream fin;
    std::ofstream fout;
};
 
void OpenFile_1(OpenClose &c)
{
    c.fin.open("array.txt");
    if (!c.fin.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
 
void OpenFile_2(OpenClose &c)
{
    c.fout.open("new_array.txt");
    if (!c.fout.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
 
int** CreateArray(int** arr, int &size)
{
    for (int j = 0; j < size; j++)
    {
        arr[j] = new int[size];
    }
    return arr;
}
 
void InPutArray(OpenClose &c, int** arr, int &size)
{
    
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            c.fin >> arr[i][j];
        }
    }
 
}
 
void ChangeArray(int** arr, int &size)
{
    int min = arr[1][0];
    int max = arr[0][size];
    int points[4];
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            if (i != j && j < i)
            {
                if (arr[i][j] < min)
                {
                    min = arr[i][j];
                    points[0] = i;
                    points[1] = j;
                }
            }
            else if (i != j && j>i)
            {
                if (arr[i][j] > max)
                {
                    max = arr[i][j];
                    points[2] = i;
                    points[3] = j;
                }
            }
        }
    }
    int tmp = arr[points[2]][points[3]];
    arr[points[2]][points[3]] = arr[points[0]][points[1]];
    arr[points[0]][points[1]] = tmp;
}
 
void OutPutArray(OpenClose &c, int** arr, int &size)
{
    for (int i = 0; i < size; i++)
    {
        for (int j = 0; j < size; j++)
        {
            c.fout << arr[i][j] << " ";
        }
        c.fout << "\n";
    }
}
 
void CloseFile_1(OpenClose &c)
{
    c.fin.close();
}
 
void CloseFile_2(OpenClose &c)
{
    c.fout.close();
}
 
void DeleteArray(int** arr, int &size)
{
    for (int i = 0; i < size; i++)
    {
        delete[] arr[i];
    }
}
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    OpenClose m;
    m.fin;
    m.fout;
    OpenFile_1(m);
    OpenFile_2(m);
 
    int size;
    std::cout << "Введите размерность квадратной матрицы ";
    std::cin >> size;
    int **arr = new int*[size];
    CreateArray(arr, size);
    InPutArray(m, arr, size);
    ChangeArray(arr, size);
    OutPutArray(m, arr, size);
    CloseFile_1(m);
    CloseFile_2(m);
    DeleteArray(arr, size);
 
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2015, 13:38
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Совет по оформлению кода (C++):

Нужна конструктивная критика по оформлению и читабельности кода (Game Trainer C++) - C++
Относительно недавно начал изучать C++. Для обучения решил написать трейнер попутно изучая язык/читая необходимую литературу разного рода. ...

нужен совет по написанию кода - C++
Здравствуйте уважаемые программисты начинающие и специолисты у меня к вам очень волнующий для меня вопрос мне нужна информация по переводу...

Спрашиваю совет по стилю написания кода - C++
#include &lt;vector&gt; #include &lt;string&gt; class Errors { private: size_t i; //Глобальный счетчик циклов. std::string...

Нужен совет по оформлению - C# ASP.NET
Добрый день господа разработчики. Хочу спросить совета по оформлению странички. Имеются 4 ListBox в котором отображается нужная информация,...

Нужен совет по оформлению страницы - HTML, CSS
Вопрос - как создать эффект помех на странице сайта? Что нужно использовать? Обращаться к CSS таблицам? или уже работать с js? О_о Я...

Рекомендации по оформлению PHP кода - PHP
Часто читая темы новичков я встречаю очень ужасного вида код, это пугает и отбивает желание дальнейшого разбора. Я хотел бы составить не...

16
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,161
24.01.2015, 13:52 #2
Ну если функции слишком простые и вызываются по одному разу, то можно и без них.
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,999
Записей в блоге: 17
24.01.2015, 14:02 #3
Цитата Сообщение от interpol Посмотреть сообщение
Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
Все это делается на случай необходимости в дальнейшем поддерживать код, вносить изменения, доработки.

Да и твой код есть куда улучшать.

К примеру мне не понятно чем обосновано наличие двух ф-ций OpenFile_1() и OpenFile_2() ну и структуры OpenClose.
Кроме того ф-ции это хорошо но в инструментарии с++ есть еще классы.

Цитата Сообщение от interpol Посмотреть сообщение
Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
Все это делается на случай необходимости в дальнейшем поддерживать код, вносить изменения, доработки.

Да и твой код есть куда улучшать.

К примеру мне не понятно чем обосновано наличие двух ф-ций OpenFile_1() и OpenFile_2() ну и структуры OpenClose.
Кроме того ф-ции это хорошо но в инструментарии с++ есть еще классы. Т.е твой код написан больше в стиле Си нежели С++


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Array
{
   public:
       Array(std::size_t size);
       ~Array();
 
       bool loadFromStream(const std::istream& stream);
       bool saveToStream(std::ostream& stream);
 
       bool loadFromFile(std::string fileName);
       bool saveToFile(std::string fileName);
 
        // ....
    private:
       int ** data_;
       // ...
}
 
void changeArray(Array& array);
1
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,983
Завершенные тесты: 1
24.01.2015, 14:52 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от interpol Посмотреть сообщение
Но меня смущает количество функций. Насколько целесообразно вырабатывать привычку к разбиению на большое число функций, когда этого вроде бы можно избежать.
1. Не делать без необходимости.
2. Монолитная простыня текста хуже читается, нежели разбитая на абзацы-функции.

В вашем случае реализацию функций можно даже и не смотреть.
Глаза сразу же находят main()

А дальше пробегаются по названиям функций:
говорящие имена подсказывают программисту, что происходит.

В итоге, несколько строчек в main дают полное представление о том, что делает программа.

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

В общем, бить код на функции - хорошая практика.

Единственное, на что можно ещё обратить внимание:
Техники копипасто-ориентированного программирования рекомендуют бить на функции таким образом,
что бы функционал легко можно было бы откопировать.

В монолитной простыне что то откопировать проблематично - зачастую, там образуется гороховый суп.
Но если переборщить с мелкими функциями, то тоже проблематично: заколебешься искать каждую.
И нужно вчитываться в код, что бы понять от каких функций он зависит.

Поэтому, техника копипасто-ориентированного программирования рекомендует: "истина где то там, а гармония как всегда в золотой середине".
2
interpol
0 / 0 / 0
Регистрация: 06.11.2014
Сообщений: 27
24.01.2015, 14:54  [ТС] #5
До классов, к сожалению, я еще не дошел. Но скоро с ними столкнусь. Можете посоветовать какой-нибудь конкретный источник, где достаточно внятно описаны самые основы по классам?
0
Avazart
Эксперт С++
7586 / 5571 / 330
Регистрация: 10.12.2010
Сообщений: 24,999
Записей в блоге: 17
24.01.2015, 15:36 #6
Одной "книгой" не ограничится, как в прочем и одним "чтением"
Шилд, Дейтелы, Страуструп собственно все есть тут Литература C++

Что такое анти-паттерны?

Добавлено через 26 минут
Можно писать и без классов тогда у твоего кода такие проблемы:
1. Вероятно все функции стоило вынести в отдельный модуль (*.h +*.cpp)
2. Объединение файловых потоков в OpenClose не логично, да и само название структуры сам понимаешь...
3. Нет необходимости в OpenFile_1 и OpenFile_2. Во первых можно было бы написать одну ф-цию и избежать дублирования.
C++
1
2
3
4
5
6
7
8
9
void openFile(std::fstream& fStream,const std::string& fileName)
{
    fStream.open(fileName.c_str());
    if (!fStream.is_open())
    {
        std::cout << "Файл не может быть открыт";
        exit(-1);
    }
}
И вызывать ее для каждого файла. Но это так для размышления, вряд ли вообще стоит писать ф-ции в "две строчки" что бы вызывать их всего дважды да и как бы назначение ф-ций немного различное (типы потоков разные - один для чтения другой для записи)
4.
C++
1
int** CreateArray(int** arr, int &size)
Зачем size передавать по ссылке если ты его не меняешь?
Зачем возвращать int** ?
1
The535
26 / 26 / 10
Регистрация: 16.01.2014
Сообщений: 161
24.01.2015, 19:30 #7
Не стал читать код, отвечу сразу на вопрос.
Старайтесь писать больше функций. Понадобится в ООП и в общем в будущем.
0
rocknrolla1
Заблокирован
24.01.2015, 20:06 #8
Цитата Сообщение от nmcf Посмотреть сообщение
Ну если функции слишком простые и вызываются по одному разу, то можно и без них.
Плохой совет, имхо, т.к. код будет выглядеть ужасно.
SOLID принципы никто не отменял в хорошем проектировании, пусть проектируются не классы, но учиться нужно на маленьком.
Да и, если захочется вызвать функцию повторно или задача немного изменится, то придется все оформлять в функции.
Короче говоря, одна функция - одна задача.
0
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,161
24.01.2015, 21:40 #9
Цитата Сообщение от rocknrolla1 Посмотреть сообщение
Плохой совет
А какой совет хороший? Каждый оператор в свою функцию выносить? В приведённой программе функций больше, чем нужно. А расширять эту учебную программу никто не будет.
0
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,983
Завершенные тесты: 1
24.01.2015, 21:49 #10
Цитата Сообщение от nmcf Посмотреть сообщение
А какой совет хороший?
не пренебрегать SOLID.
0
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,161
24.01.2015, 21:50 #11
SOLID? А где классы?
0
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,983
Завершенные тесты: 1
24.01.2015, 21:51 #12
Цитата Сообщение от nmcf Посмотреть сообщение
SOLID? А где классы?
А что, обязательно должны быть?
0
rocknrolla1
Заблокирован
24.01.2015, 21:52 #13
Цитата Сообщение от nmcf Посмотреть сообщение
А расширять эту учебную программу никто не будет
Вот так и "рождаются" плохие программисты.
Знаете, при работе над проектами часто слышишь такого рода высказывания. А потом все переписывать приходится, как только руководство захотело расширить функционал.
0
nmcf
6207 / 5518 / 1932
Регистрация: 14.04.2014
Сообщений: 23,161
24.01.2015, 21:56 #14
SOLID относится к ООП.
Я пишу о конкретной программе, в которой даже закрытия файлов вынесены в функции и это лишнее.
0
hoggy
6862 / 3069 / 525
Регистрация: 15.11.2014
Сообщений: 6,983
Завершенные тесты: 1
24.01.2015, 22:13 #15
Цитата Сообщение от nmcf Посмотреть сообщение
SOLID относится к ООП.
SOLID - это просто пятерка принципов, следование которым позволяет сохранять оопнутый проект в более менее приличном состоянии.

Однако, если бы вы дали себе труда с ними ознакомиться, вы бы верно заметили, что его можно (и нужно) применять по отношению к любой парадигме, как минимум, которую включает в себя ООП.

Например, по отношению к процедурной.

Цитата Сообщение от nmcf Посмотреть сообщение
Я пишу о конкретной программе, в которой даже закрытия файлов вынесены в функции и это лишнее.
Конкретно в этой программе само разделение кода на "абзацы" не вполне оптимальное.
Но в целом, автор этого кода мыслит в правильном направлении.
0
24.01.2015, 22:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2015, 22:13
Привет! Вот еще темы с ответами:

Подскажите книги по оформлению кода - C (СИ)
Всем привет! Подскажите книги по оформлению кода т.е. по правилам написания годного, читаемого кода на Си....может сайты какие есть....

Дайте совет в написании кода - VBA
Задание про подпрограммы, функции. vba Не получается написать код. Помогите с написанием программы, дайте совет. Для...

нужен совет в редактировании кода - Pascal
Привет , написал программу для задачи , но совершил в ней ошибку . Можете пояснить в чем ошибся и как исправить ? код: program...

Совет по оптимизации кода PHP - PHP БД
Здравтвуйте, уважаемые пользователя форума, прошу вашего совета, по более коректному наисанию нижеследующего кода: &lt;? require...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru