45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114

Прошу оценить стиль программы

14.02.2019, 17:16. Показов 4130. Ответов 73

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

Программа реализует Зоомагазин, который периодически на просторах киберфорума встречается. Присутствуют функции добавления, редактирования, удаления, отображения БД(если это можно так назвать (да простит меня Нео)...), а также записи всего этого добра в файл и чтение из него.

Я не студент, это не моя курсовая, экзамен и т.д. Я не оказываю кому-либо медвежью или финансовую услугу. Я самоучка стремящийся к Зеленому Бегущему Свету

Сначала я кину .h, затем .cpp

Если нужно кину на почту .zip с проектом (среда VS 2017)!

Спасибо!

pch.h - основной заголовок.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#ifndef PCH_H
#define PCH_H
#include <iostream>
#include <fstream>
#include <ios>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <conio.h>
#include <windows.h>
int menu();
#endif
Class.h - заголовок класса petshopБ в котором реализуются все звери
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
#pragma once
#include <fstream>
 
class petshop {
    char animal[20];
    char name[20];
    char gender[7];
    int cost;
    int count;
public:
    petshop();
    petshop(const petshop &ob);
    void set_name();
    void set_animal();
    void set_gender();
    void set_cost();
    void set_count();
    void show_sample();
    char *get_animal();
    char *get_name();
    char *get_gender();
    int *get_cost();
    int *get_count();
    petshop operator=(petshop ob);
    friend std::ostream &operator<<(std::ostream &stream, const petshop ob);
    friend std::istream &operator>>(std::istream &stream, petshop &ob);
    ~petshop();
};
draw.h - заголовок функции раскраски активной строки меню
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
#pragma once
#include "Class.h"
enum ConsoleColor
{
    Black = 0,
    Blue = 1,
    Green = 2,
    Cyan = 3,
    Red = 4,
    Magenta = 5,
    Brown = 6,
    LightGray = 7,
    DarkGray = 8,
    LightBlue = 9,
    LightGreen = 10,
    LightCyan = 11,
    LightRed = 12,
    LightMagenta = 13,
    Yellow = 14,
    White = 15
};
 
void draw(const char str[15]);
void draw(petshop ob);
update.h - заголовок функционала редактирования зверей в магазине
C++
1
2
3
4
5
6
7
8
9
#include "Class.h"
#include <vector>
 
#ifndef UPDATE
#define UPDATE
int menu_update();
int choose_animal(std::vector<petshop> &v);
void update_animal(std::vector <petshop> &v);
#endif
remove.h - заголовок функционала удаления зверей
C++
1
2
3
4
5
6
7
8
#include "Class.h"
#include <vector>
 
#ifndef REMOVE
#define REMOVE
void remove_animal(std::vector<petshop> &v);
int choose_animal2(std::vector<petshop> &v);
#endif
write_file.h - заголовок функции записи БД в файл
C++
1
2
3
4
#pragma once
#include "Class.h"
#include <vector>
void write_to_file (std::vector<petshop> &v);
read_file.h - заголовок функции чтения данных из файла и переноса данных в БД
C++
1
2
3
4
#pragma once
#include "Class.h"
#include <vector>
void read_from_file(std::vector<petshop> &v);





main.cpp - Главная функция
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
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include "update.h"
#include "remove.h"
#include "write_file.h"
#include "read_file.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
 
int main()
{
    int answer;
    char r1[20];
    vector <petshop> v;
    v.reserve(1000);
    petshop *s;
    int i;
 
    for (;;) {
        answer = menu();
        switch (answer)
        {
        case 0: {
            s = new petshop;
            s->set_animal();
            s->set_name();
            s->set_gender();
            s->set_cost();
            s->set_count();
            v.emplace_back(*s);
            delete s;
            break;
        }
        case 1: {
            for (i = 0; i < v.size(); i++) {
                v[i].show_sample();
            }
            cin.get();
            break;
        }
        case 2: {
            update_animal(v);
            break;
        }
        case 3: {
            remove_animal(v);
            break;
        }
        case 4: {
            write_to_file(v);
            break;
        }
        case 5: {
            read_from_file(v);
            break;
        }
        case 6: {
            return 0;
        }
        }
    }
}
    
int menu()
    {
    static int key = 0;
    int code;
    do {
        system("cls");
        if (key == 0) draw("Add animal");
        else cout << "Add animal\n";
        if (key == 1) draw("Display");
        else cout << "Display\n";
        if (key == 2) draw("Update animal");
        else cout << "Update animal\n";
        if (key == 3) draw("Remove animal");
        else cout << "Remove animal\n";
        if (key == 4) draw("Write to file");
        else cout << "Write to file\n";
        if (key == 5) draw("Read file");
        else cout << "Read file\n";
        if (key == 6) draw("Close program");
        else cout << "Close program\n";
        cout << endl;
            if (key == key)
        {
            code = getch();
            if (code == 80) {
                key++;
                if (key == 7) key = 0;
            }
            if (code == 72) {
                key--;
                if (key == -1) key = 6;
            }
        }
    } while (code != 13);
    return key;
}
class.cpp - описание класса
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
#include "pch.h"
#include "Class.h"
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
 
petshop::petshop()
{
    strcpy(animal, "");
    strcpy(name, "");
    strcpy(gender, "");
    cost = 0;
    count = 0;
}
 
petshop::petshop(const petshop &ob)
{
    strcpy(this->animal, ob.animal);
    strcpy(this->name, ob.name);
    strcpy(this->gender, ob.gender);
    cost = ob.cost;
    count = ob.count;
}
 
void petshop::set_animal() {
    char r1[20];
    cout << "What kind of animal you want to write?\n";
    cin >> r1;
    strcpy(animal, r1);
}
 
void petshop::set_name() {
    char r1[20];
    cout << "What name you want to write?\n";
    cin >> r1;
    strcpy(name, r1);
}
 
void petshop::set_gender() {
    char r1[20];
    cout << "What gender do the animal have?\n";
    cin >> r1;
    strcpy(gender, r1);
}
 
void petshop::set_cost() {
    int a;
    cout << "What is the cost of the animal?\n";
    cin >> a;
    cost = a;
}
 
void petshop::set_count() {
    int a;
    cout << "How many animals of that type?";
    cin >> a;
    count = a;
}
 
void petshop::show_sample()
{
    cout << "Animal: " << this->animal << '\n';
    cout << "Name: " << this->name << '\n';
    cout << "Gender: " << this->gender << '\n';
    cout << "Cost: " << this->cost << '$' << '\n';
    cout << "Count: " << this->count << '\n';
}
 
char *petshop::get_animal() 
{
    return animal; 
}
 
char *petshop::get_name()
{
    return name;
}
 
char *petshop::get_gender()
{
    return gender;
}
 
int *petshop::get_cost()
{
    return &cost;
}
 
int *petshop::get_count()
{
    return &count;
}
 
petshop::~petshop()
{
}
 
 
petshop petshop::operator=(petshop ob)
{
    strcpy(this->animal, ob.animal);
    strcpy(this->name, ob.name);
    strcpy(this->gender, ob.gender);
    cost = ob.cost;
    count = ob.count;
    return *this;
}
 
ostream &operator<<(ostream &stream, petshop obj) 
{
    stream << obj.animal << '\n';
    stream << obj.name << '\n';
    stream << obj.gender << '\n';
    stream << obj.cost << '\n';
    stream << obj.count << "\n\n";
 
    return stream;
}
 
istream &operator>>(istream &stream, petshop &obj)
{
    stream >> obj.animal;
    stream >> obj.name;
    stream >> obj.gender;
    stream >> obj.cost;
    stream >> obj.count;
 
    return stream;
}
draw.cpp - описание раскраски активной строки меню
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include <windows.h>
#include <iostream>
using namespace std;
 
void draw(const char str[15])
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightMagenta));
    cout << str << '\n';
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightGray));
}
 
void draw(petshop ob)
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightMagenta));
    ob.show_sample();
    SetConsoleTextAttribute(hStdOut, (WORD)((Black << 4) | LightGray));
}
update.cpp - описание редактирования зверей в БД
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
#include "pch.h"
#include "update.h"
#include "draw.h"
#include "Class.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
void update_animal(vector<petshop> &v)
{
    int i;
    if (v.empty()) {
        cout << "There is no animals in database...";
        cin.get();
        return;
    }
    int choose;
    choose = choose_animal(v);
    if (choose == v.size()) return;
    int answer2;
    for (;;) {
        answer2 = menu_update();
        switch(answer2)
        {
        case 0: 
        {
            v[choose].set_animal();
            cout << "Type successfully changed!";
            break;
        }
        case 1: 
        {
            v[choose].set_name();
            cout << "Name successfully changed!";
            break;
        }
        case 2:
        {
            v[choose].set_gender();
            cout << "Gender successfully changed!";
            break;
        }
        case 3:
        {
            v[choose].set_cost();
            cout << "Type successfully changed!";
            break;
        }
        case 4:
        {
            v[choose].set_count();
            cout << "Count successfully changed!";
            break;
        }
        case 5:
        {
            return;
        }
        }
    }
 
}
 
int menu_update()
{
    static int key2 = 0;
    int code2;
    do {
        system("cls");
        if (key2 == 0) draw("Animal type");
        else cout << "Animal type\n";
        if (key2 == 1) draw("Animal name");
        else cout << "Animal name\n";
        if (key2 == 2) draw("Animal gender");
        else cout << "Animal gender\n";
        if (key2 == 3) draw("Animal cost");
        else cout << "Animal cost\n";
        if (key2 == 4) draw("Animal count");
        else cout << "Animal count\n";
        if (key2 == 5) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key2 == key2)
        {
            code2 = getch();
            if (code2 == 80) {
                key2++;
                if (key2 == 6) key2 = 0;
            }
            if (code2 == 72) {
                key2--;
                if (key2 == -1) key2 = 5;
            }
        }
    } while (code2 != 13);
    return key2;
}
 
int choose_animal(vector<petshop> &v)
{
    int i;
    static int key3 = 0;
    int code3;
    do {
        system("cls");
        for (i = 0; i < v.size(); i++) {
            if (key3 == i) draw(v[i]);
            else v[i].show_sample();
        }
        if (key3 == v.size()) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key3 == key3)
        {
            code3 = getch();
            if (code3 == 80) {
                key3++;
                if (key3 == v.size()+1) key3 = 0;
            }
            if (code3 == 72) {
                key3--;
                if (key3 == -1) key3 = v.size();
            }
        }
    } while (code3 != 13);
    return key3;
}
remove.cpp - описание удаления зверей из БД
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
#include "pch.h"
#include "draw.h"
#include "Class.h"
#include "remove.h"
#include <iostream>
#include <vector>
#include <conio.h>
using namespace std;
 
void remove_animal(vector<petshop> &v)
{
    int i;
    if (v.empty()) {
        cout << "There is no animals in database...";
        cin.get();
        return;
    }
    int choose2;
    choose2 = choose_animal2(v);
    if (choose2 == v.size()) return;
    v.erase(v.begin()+choose2);
}
 
int choose_animal2(vector<petshop> &v)
{
    int i;
    static int key3 = 0;
    int code3;
    do {
        system("cls");
        for (i = 0; i < v.size(); i++) {
            if (key3 == i) draw(v[i]);
            else v[i].show_sample();
        }
        if (key3 == v.size()) draw("Back to Main menu");
        else cout << "Back to Main menu\n";
        cout << endl;
 
        if (key3 == key3)
        {
            code3 = getch();
            if (code3 == 80) {
                key3++;
                if (key3 == v.size() + 1) key3 = 0;
            }
            if (code3 == 72) {
                key3--;
                if (key3 == -1) key3 = v.size();
            }
        }
    } while (code3 != 13);
    return key3;
}
write_file.cpp - описание записи БД в файл
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "pch.h"
#include "write_file.h"
#include <fstream>
#include <iostream>
 
using namespace std;
 
void write_to_file(std::vector<petshop> &v)
{
    ofstream tofile("animals.bin", ios::trunc | ios::binary);
    int i;
    if (!tofile.is_open()) {
        cout << "File is not found!";
        return;
    }
 
    for (i = 0; i < v.size(); i++) {
        tofile << v[i];
    }
 
    tofile.close();
}
read_file.cpp - описание чтения данных из файла и переноса в БД
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
#include "pch.h"
#include "read_file.h"
#include <fstream>
#include <iostream>
 
using namespace std;
 
void read_from_file(std::vector<petshop> &v)
{
    ifstream fromfile("animals.bin", ios::binary | ios::out);
    int i;
    if (!fromfile.is_open()) {
        cout << "File is not found!";
        return;
    }
    petshop *s = new petshop;
 
    while (!fromfile.eof()) {
        fromfile >> s->get_animal();
        fromfile >> s->get_name();
        fromfile >> s->get_gender();
        fromfile >> *s->get_cost();
        fromfile >> *s->get_count();
        v.emplace_back(*s);
    }
    fromfile.close();
}

Такая вот программка. Жду отзывов и критики!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2019, 17:16
Ответы с готовыми решениями:

Прошу оценить код на C++
Сильно не пинайте, только начал изучать C++, написал вот такое кот. Что не так в этом коде? Перечислите, какие есть недостатки. Предложите...

Прошу оценить свой уровень
Код во вложениях

Калькулятор для начинающих, прошу оценить
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int menu (); int sum (); int razn (); int vozved (); int delen...

73
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 14:46
Студворк — интернет-сервис помощи студентам
Руслан92,
Цитата Сообщение от DrOffset Посмотреть сообщение
устаналивает состояние класса
поддерживая инварианты.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 14:51  [ТС]
DrOffset

C++
1
2
3
4
5
6
7
    petshop s;
 
    while (!fromfile.eof()) {
        fromfile >> s;
        v.emplace_back(s);
    }
    fromfile.close();

C++
1
2
3
4
5
6
7
8
9
int petshop::get_cost()
{
    return cost;
}
 
int petshop::get_count()
{
    return count;
}
Цитата Сообщение от DrOffset Посмотреть сообщение
fromfile >> *s->get_cost();
- я от этой конструкции уже отказался.

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

Приведите, пожалуйста, пример правильного геттера.

Добавлено через 2 минуты
Гораздо лучше, как пример, когда у вас есть один контролируемый способ поменять состояние класса, чем множество неконтролируемых.
У меня вроде итак на каждый член по одному геттеру и по одному сеттеру...или я вообще не понимаю, что Вы хотите донести
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.02.2019, 15:01
Цитата Сообщение от Руслан92 Посмотреть сообщение
Приведите, пожалуйста, пример правильного геттера.
Привел в том же посте.

Цитата Сообщение от Руслан92 Посмотреть сообщение
Это не длинная и краткая форма одного и того же действия?
Дело не в этом, а в том, что вы выражаете своим кодом. Это должно быть согласовано с тем, что происходит на самом деле.

Допустим функция запрос-ответ - это часть логики класса (у вас для этого нет предпосылок, но такое может быть).
Например состояние объекта может зависеть от ответа некоего устройства, и тогда эта функция могла быть такой (псевдокод):
C++
1
2
3
4
5
6
7
8
9
10
11
void some_class::query_value(device & fd)
{
   fd << "get(value)";
   int val = 0;
   fd >> val;
   if(!val)
   {
        throw invalid_value();
   }
   value = val; 
}
Добавлено через 3 минуты
Цитата Сообщение от Руслан92 Посмотреть сообщение
У меня вроде итак на каждый член по одному геттеру и по одному сеттеру
В первоначальном варианте у вас был геттер, который работал как сеттер, если этого захотеть, т.к. он дает прямой доступ к состоянию класса. Этот доступ позволяет обойти инварианты, которые вы могли бы предусмотреть (например отсутствие огромных или отрицательных цен), просто записав туда какое угодно значение.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 15:14  [ТС]

DrOffset


C++
1
2
3
int petshop::get_cost() const {
    return cost;
}
слово const - делает геттер хорошим? что-то я вообще не понимаю. А функция update? Вдруг нужно будет в процессе работы изменить поле объекта. Это функционал программы позволяющий изменять данные, допустим, при изменении имени животного или выяснится что у животного другой пол. Const же нельзя менять...

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

Цитата Сообщение от DrOffset Посмотреть сообщение
Этот доступ позволяет обойти инварианты, которые вы могли бы предусмотреть (например отсутствие огромных или отрицательных цен), просто записав туда какое угодно значение.
Да, здесь согласен. Надо для каждого поля написать что-то типа конструкций try-catch для ловли exception'ов, так? или опять не об этом...?

Добавлено через 1 минуту
C++
1
2
3
4
5
char *get_animal();
    char *get_name();
    char *get_gender();
    int *get_cost();
    int *get_count();
Почему для char - это нормальный геттер, а для int нет? По идее получается что и char* геттер работает как сеттер, нет?
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.02.2019, 15:38
Цитата Сообщение от Руслан92 Посмотреть сообщение
слово const - делает геттер хорошим? что-то я вообще не понимаю.
Его делает хорошим то, что он не дает возможности повлиять на объект неконтролируемым образом. А слово const помогает компилятору это проверить при компиляции.

Цитата Сообщение от Руслан92 Посмотреть сообщение
Надо для каждого поля написать что-то типа конструкций try-catch для ловли exception'ов, так?
Нет, не надо.
Это отдельный сложный вопрос.
Под новую тему, в идеале.

Цитата Сообщение от Руслан92 Посмотреть сообщение
Почему для char - это нормальный геттер, а для int нет?
Для char * тоже не нормальный.
Для него можно было бы так:
C++
1
const char * get_animal() const;
Обратите внимание, что вы не смогли бы оставить возвращаемое значение без const, если бы написали const у метода. Компилятор бы вам сказал об этом. Если мы декларируем, что геттер только получает состояние объекта, но не меняет его, то он должен быть const - это поможет при разработке.

Добавлено через 12 минут
Цитата Сообщение от Руслан92 Посмотреть сообщение
Только я не понял, как он мне позволит приблизиться к пониманию того, почему мой сеттер незащищен и плох. А понять очень хочется!
Если брать ваш пример, то улучшить ваш сеттер в том направлении, можно было бы так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void petshop::input_cost(std::istream & in)
{
    int costval;
    if(!(in >> costval)) // ввод и проверка
    { 
         throw std::runtime_error("invalid cost input"); // выходим с исключением, состояние класса осталось прежним
    }
    // возможно еще проверки на отрицательность и разумную величину
    cost = costval; // безопасно устаналиваем состояние класса - это и есть сеттер. 
    // возможно тут даже вот так будет, 
    // set_cost(costval); // тогда проверка на допустимую цену будет внутри set_cost
    // итого мы добились разделения ответственности: сеттер проверяет значение, input_cost вводит значение
}
Только сеттером он уже перестал бы быть. Но зато сохранилась бы функция,которую вы для него изначально задумали (ну или почти).
А вот вывод приглашения о вводе все равно здесь размещать было бы в данном случае неправильно.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 16:01  [ТС]
Обратите внимание, что вы не смогли бы оставить возвращаемое значение без const, если бы написали const у метода. Компилятор бы вам сказал об этом. Если мы декларируем, что геттер только получает состояние объекта, но не меняет его, то он должен быть const - это поможет при разработке.
ТЕПЕРЬ ДОШЛО!

Добавлено через 20 минут
DrOffset, а где вообще можно найти какой-либо проект и вписаться в него? я так понял, что все познается в бою. Нужно реально понять где это все применяется. Потому что на данный момент классы инкапсуляция полиморфизм наследование - это какие-то абстрактные штуки, у которых я не совсем понимаю их мощь и пользу чего-либо через их реализацию..

Добавлено через 1 минуту
Изучил книгу Герберта Шилдта С++ Базовый курс. Все знания оттуда + топики и общение на киберфоруме. Хочется реальной прокачки.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.02.2019, 16:10
Цитата Сообщение от Руслан92 Посмотреть сообщение
Изучил книгу Герберта Шилдта С++ Базовый курс.
Книги этой крайне мало. Для серьезного проекта так уж точно.
Надо читать еще, и параллельно писать что-то.
Я уверен, что у вас есть какие-то идеи посерьезнее зоомагазина. Вот полученные в книгах знания на них сразу и пробуйте.

Оставлю здесь ссылку.

И на форуме ни я, ни кто-либо другой не научит вас программировать. Также как не дадут рецептов на все случаи жизни.
Только тренировками и чтением, а форум - это маленькое дополнение к этому, если что-то конкретное будет не понятно.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 16:29  [ТС]
DrOffset, спасибо большое!

В целом то нормальная программа получилась? Есть способность к программированию?
Или откровенная чушь получилась с точки зрения профессионала?

Добавлено через 7 минут
DrOffsetИ, кстати, каково Ваше мнение будет по такому вопросу: вот я еще с языком не определился, на котором хочу, скажем так, стать супер-пупер-мастер. Пробую себя в js+html+css. Просто очень выбор делать не хочется. Нравится все! Мне кажется, мне просто нравится прогать. Неважно какой язык. С++ нравится тем, что он структурирован и строг.
Видел прогеров на js, у которых код ну просто набор иероглифов, понятный только авторам.
Не желаю такой код писать, и знаю, что с++ меня волей-неволей заставит писать красиво и понятно, ведь сам по себе язык очень нелоялен в отношении всякого вольнодумства и гавнокодерства.
Но при этом я чувствую, что мне очень нравятся и другие языки и вроде как хочется быть IT-полиглотом.
Вопрос такой: можно ли стать мастером нескольких языков?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 16:31
Цитата Сообщение от Руслан92 Посмотреть сообщение
Или откровенная чушь получилась с точки зрения профессионала?
так и хочешь что бы тебя похвалили
ты написал по сути маленькую деталь, которая сама по себе не работает, это все равно что сделать шестеренку к часам и сказать, нормально получилось? а так в твоем коде проглядывается декомпозиция мыслей, того чего ты хочешь, это хороший знак.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 16:38  [ТС]
так и хочешь что бы тебя похвалили
Этого каждый хочет, особенно если из твоего окружения единомышленники только в киберфоруме обитают

Декомпозиция мыслей? Не очень понял, но если не хотите можете не раскрывать смысл)) Может до самого со временем дойдет

Добавлено через 1 минуту
Прочитал что такое декомпозиция) Ни дня без открытий!
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
15.02.2019, 16:39
Цитата Сообщение от Руслан92 Посмотреть сообщение
В целом то нормальная программа получилась?
Обычная для новичка программа, со многими типичными ошибками для этого уровня. Сейчас сложно сказать, как дальше у вас пойдет. Но если есть желание, то это уже половина дела.

Цитата Сообщение от Руслан92 Посмотреть сообщение
ведь сам по себе язык очень нелоялен в отношении всякого вольнодумства и гавнокодерства.
C++ как раз требует очень сильной самодисциплины и внимательности.
Есть, конечно, множество техник, которые повышают безопасность программирования на нем, но ведь про них надо знать (для этого читайте книги). А без этого вы точно также сможете написать совершенно нечитаемое нечто, ничем не лучше того, что вы видели на js, может быть лишь уродливое по-своему.

Поэтому снимите розовые очки сразу. С++ не будет вас жалеть изначально, ограничивать вас в чем-то тоже особо не будет.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 16:43
Руслан92,
Цитата Сообщение от DrOffset Посмотреть сообщение
но ведь про них надо знать
Скотта Маерса советую (Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ), после прочтения его большая часть вопросов испариться, он хорош тем что рассказывает про грабли, и тебе не нужно будет на них наступать, конечто некоторые темы у него очень очевидны и не требуют внимания, но это мелочи.
1
45 / 0 / 0
Регистрация: 10.04.2016
Сообщений: 114
15.02.2019, 16:45  [ТС]
ВСЕМ СПАСИБО за теплые слова и поддержку! Мира всем, форумчане!
Закрываем тему! Пошел перелопачивать код
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
15.02.2019, 16:47
Цитата Сообщение от Руслан92 Посмотреть сообщение
Закрываем тему! Пошел перелопачивать код
лови отзыв на последок, заходи по чаще сюда.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2019, 16:47
Помогаю со студенческими работами здесь

Прошу оценить
1. Видеокарта Sapphire Radeon HD3470 256Mb GDDR3 PCI-E DUAL DVI-I/TVO. 2. Видеокарта Sapphire X1650 256m DDR2 AGP VGA/TVO/DVI-I. 3....

Прошу оценить
Здравствуйте. Пересмотрел пол сотни роликов, почитал тут, и не только. В результате чего сформировалось отчетливая каша в голове. Очень...

Прошу оценить пк
Вот характеристики: ЦП: QuadCore AMD Phenom II X4 Black Edition 965, 3415 MHz; Системная плата: ASRock 890FX Deluxe4; Оперативная...

Прошу оценить
Здравствуйте подскажите пожалуйста за сколько можно продать компьютер с характеристиками как на фото.

Прошу оценить пк
Добрый день.Прошу оценить пк для игр Процессор Intel Core i5-4590 Материнская плата ASUS B85M-G Память Kingston HyperX Fury DDR-III...


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

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

Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru