Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
1

Класс: показать все варианты замены провода без повторов

19.10.2014, 17:07. Просмотров 284. Ответов 2
Метки нет (Все метки)

Доброго всем времени суток!Большая просьба кому не трудно покритиковать и указать на мои косяки желательно с разъяснениями.Изучаю я с++ самостоятельно и показать код просто больше не кому.
За ранее всем спасибо.
Вот мой,наверное далеко не лучший код.
Select.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
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
//--------------------Заголовочный файл h класса Select------------------------------------------
 #ifndef Select_H
 #define Select_H
 #include <iostream>
 #include <vector>
 size_t bigV(0);
 
 class Select
 {
 private:
 
    typedef std::vector<double> Myvec;
    typedef  const double Myarr;
 
 public:
 
    Select ();
    Select( const Select & other);
 
    Select& operator = (const Select &);
 
    double diameter (double)const;
    double sechenie (double)const;
 
    //void print(std::vector<double> const&);//печать вектора
    void print(Myvec const&);//печать вектора
 
    ~Select(){};
 
 private:
    struct
    {
    double Pi;
    short num_sel;
    double disc,sum;
    size_t endV;
    };
    //static const double arr[];
    static Myarr arr[];
    //std::vector< double >seq;
    Myvec seq;
 
    //void init (double,short,double,double,size_t,std::vector<double>const & );
    void init (double,short,double,double,size_t,Myvec const & );
    void Sum (double *);//ввод данных
    double razSelect ()const;//число от процента
    double maxSum ()const;//макс заданное сечение
    double reasZero (double);//функция переприсваивает 0
    void interval (size_t*,size_t*)const;//сформированная последовательность для подбора
    void select(double,double, short, size_t i = bigV);//функция подбора
    //void clearVec();
 };
#endif // Select_H
Select.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
//----------- Файл реализации класса Select------------------
 #include <cmath>
 #include <iomanip>
 #include <iostream>
 #include <vector>
 #include <algorithm>
 #include <iterator>
 #include <windows.h>
 #include <numeric>
 #include <functional>
 #include "Select.h"
    const double Select::arr[] ={0.25,0.28,0.3,0.315,0.335,0.355,0.38,0.4,0.45,0.5,0.53,0.56,0.6,0.63,
            0.67,0.71,0.75,0.8,0.85,0.9,0.95,1.0,1.06,1.12,1.18,1.25,1.32,1.40};
 
 Select::Select (): Pi (acos(-1.0)),num_sel(1),disc (1.5),sum(0),endV (0),
     seq(arr, arr + sizeof arr /sizeof *arr )
 {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
    std::transform( arr, arr + sizeof arr /sizeof *arr , seq.begin(),
                    std::bind1st(std::mem_fun(&Select::sechenie), this));
 
    this->Sum (&sum);
    this->interval(&bigV,&endV);
    std::cout << "Результат подбора \n\n";
    this->select(sum,maxSum(),num_sel);
 }
 Select& Select::operator= (const Select &m)
 {
    if (this != &m) // проверка на присваивание самому себе
    {
        init (m.Pi,m.num_sel,m.disc,m.sum,m.endV,m.seq);
    }
    return *this;
 }
 Select::Select( const Select &m): Pi(),num_sel(),disc(),sum(),endV(),seq() // конструктор копии
 {
    init (m.Pi,m.num_sel,m.disc,m.sum,m.endV,m.seq);
 }
 //void Select::init (double pi,short n_s,double d,double s,size_t e,std::vector<double>const &v)
 void Select::init (double pi,short n_s,double d,double s,size_t e,Myvec const &v)
 
 {
    Pi = pi;num_sel = n_s;disc = d;sum = s;endV = e;seq = v;
 }
 double Select::diameter (double sech )const {return 2*(sqrt (sech/Pi));}
 double Select::sechenie (double diam)const { return pow(diam /2,2)* Pi;}
 double Select::razSelect ()const {return (sum/100)* disc;}//число от процента
 double Select::maxSum ()const {return sum + razSelect ();}
 void Select::Sum(double *sum)
 {
    std::cout <<" Введите диаметр и число проводов \n";
    std::cin >>*sum>>num_sel;
    *sum = sechenie(*sum);
 }
 void Select::interval (size_t*bigV,size_t*endV)const
 {
    //std::vector<double>::const_iterator it = lower_bound(seq.begin(),seq.end(),sum/num_sel);
    Myvec::const_iterator it = lower_bound(seq.begin(),seq.end(),sum/num_sel);
    size_t iter ;
    sum/num_sel > seq[seq.size()-1] ? iter = (it - seq.begin())-1 :iter = it - seq.begin();
    iter >= 3 ? *bigV = iter - 3 : *bigV = 0;
    iter >= seq.size() -1 ? *endV = seq.size() : *endV = iter +2;
 }
 void Select::select(double sum,double max, short c, size_t i)
 {
    double rezult(0);
    //static std::vector< double > sub; // вектор слагаемых
    static Myvec sub; // вектор слагаемых
    if ( c < 0 || max < reasZero(max) ) return;
    else if ( !reasZero(max) && c ) return;
    else if ( reasZero(max) && !c ) return;
    else if ( !reasZero(max) && !c )
    {
        rezult = std::accumulate(sub.begin(), sub.end(), 0.);
        print(sub),std::cout <<diameter(rezult) << "          "
                     <<((rezult- sum)/ sum)*100 <<" %"<< "\n";
    }
    else
        for (; i < endV; ++i )
        {
            sub.push_back( seq[ i ] );
            select(sum, max - seq[i] , c - 1, i );
            sub.pop_back();
        }
 }
 //void Select::print(std::vector<double> const& vec)//печать вектора
 void Select::print(Myvec const& vec)//печать вектора
 {
     //for (std::vector<double>::const_iterator it = vec.begin(); it != vec.end(); ++it)
     for (Myvec::const_iterator it = vec.begin(); it != vec.end(); ++it)
     if (it < vec.end()-1)
       std::cout << std::setw (3) <<diameter(*it)<<" + ";
     else
       std::cout<< std::setw (3) <<diameter(*it)<<"  -> ";
 }
 double Select::reasZero (double max)//функция переприсваивает 0
 {
    return (max <= razSelect())|| ((max - razSelect()) <= razSelect()) ? max = 0 : max;
 }
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
//-------------Главная функция main----Работа с классом--------------------------------------------------
 #include <cstdlib>
 #include <iostream>
 #include "Select.h"
 
int main()
{
 Select obj;
 
 return 0;
}
Код работает,с закомментированными строками тоже.Это эксперименты с кодом.
Спасибо.

Добавлено через 23 часа 16 минут
Возможно ли избавиться в этом коде от глобальной переменной?
C++
1
size_t bigV(0);
если можно то как?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2014, 17:07
Ответы с готовыми решениями:

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

Все возможные тройки из 10 фамилий без повторов
Вообщем то в задачке нужно составить все возможные тройки из 10 фамилий. Проблема в том, что я не...

Генерация чисел без повторов
Подскажите пожалуйста, как сделать так, чтобы при генерации значения в строке не повторялись? ...

Вывести рядки матрицы с 1 и 0 без повторов
Есть двумерный массив, размер которого мы задаем. Как можна вывести рядки с 1 и 0 чтоб рядки не...

Вывести список студентов без повторов
Список дежурных. Создать массив данных с фамилиями студентов группы (массив заполняется с...

2
stima
495 / 345 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
19.10.2014, 20:14 2
1. Форматирование. Форматирование должно быть одинаково на проект.
2. Функции на транслите. Или учите английский или пользуйтесь переводчиком.
3. Названия. Название должны быть осмысленными. Что делать сущность Select? Выбирает? Выбирает что и из чего?
4. Макросы. Общепринято макросы писать большыми буквами.
5. Зачем вам функция init если у вас есть конструктор?
6. this в методах излишен.
7. Вынесите ввод/вывод данных в соответствующие операторы istream, ostream.
8. Определитесь с "нижестоящим" контейнером и не мешайте код для вектора/массива.
9. Оставьте только те include что Вы используете.
10. else после return это рудимент.

это по началу.
1
Genn55
378 / 225 / 108
Регистрация: 26.12.2012
Сообщений: 744
20.10.2014, 02:52  [ТС] 3
Спасибо огромное за конструктивную критику!
Исправил пока так
selection_of_wire.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
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
//--------------------Заголовочный файл h класса selection_of_wire------------------------------------------
 #ifndef SELECT_OF_WIRE_H
 #define SELECT_OF_WIRE_H
 #include <iostream>
 #include <vector>
 size_t bigV(0);
 
 class selection_of_wire
 {
 private:
 
 typedef std::vector<double> Myvec;
 
 public:
 
 selection_of_wire();
 selection_of_wire( const selection_of_wire & other);
 
 selection_of_wire& operator = (const selection_of_wire &);
 
 double diameter (double)const;
 double sechenie (double)const;
 
 void print(Myvec const&);//печать вектора
 
 
 ~selection_of_wire(){};
 
 private:
 struct
 {
    double Pi;
    short num_sel;
    double disc,sum;
    size_t endV;
 };
 
 static const double arr[];
 Myvec seq;
 
 void init (double,short,double,double,size_t,Myvec const & );
 void Sum (double *);//ввод данных
 double numPercent ()const;//число от процента
 double maxSum ()const;//макс заданное сечение
 double reasZero (double);//функция переприсваивает 0
 void interval (size_t*,size_t*)const;//сформированная последовательность для подбора
 void funcSelection(double,double, short, size_t i = bigV);//функция подбора
    //void clearVec();
 };
#endif // SELECT_OF_WIRE_H
selection_of_wire.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
//----------- Файл реализации класса selection_of_wire------------------
 #include <cmath>
 #include <iomanip>
 #include <iostream>
 #include <vector>
 #include <algorithm>
 #include <iterator>
 #include <windows.h>
 #include <numeric>
 #include "SELECT_OF_WIRE_H"
 const double selection_of_wire::arr[] ={0.25,0.28,0.3,0.315,0.335,0.355,0.38,0.4,0.45,0.5,0.53,0.56,0.6,0.63,
            0.67,0.71,0.75,0.8,0.85,0.9,0.95,1.0,1.06,1.12,1.18,1.25,1.32,1.40};
 
 selection_of_wire::selection_of_wire (): Pi (acos(-1.0)),num_sel(1),disc (1.5),sum(0),endV (0),
     seq(arr, arr + sizeof arr /sizeof *arr )
 {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
    std::transform( arr, arr + sizeof arr /sizeof *arr , seq.begin(),
                    std::bind1st(std::mem_fun(&selection_of_wire::sechenie), this));
 
    Sum (&sum);
    interval(&bigV,&endV);
    std::cout << "Результат подбора \n\n";
    funcSelection(sum,maxSum(),num_sel);
 }
 selection_of_wire& selection_of_wire::operator= (const selection_of_wire &m)
 {
    if (this != &m) // проверка на присваивание самому себе
    {
        init (m.Pi,m.num_sel,m.disc,m.sum,m.endV,m.seq);
    }
    return *this;
 }
 selection_of_wire::selection_of_wire( const selection_of_wire &m): Pi(),num_sel(),disc(),sum(),endV(),seq() // конструктор копии
 {
    init (m.Pi,m.num_sel,m.disc,m.sum,m.endV,m.seq);
 }
 void selection_of_wire::init (double pi,short n_s,double d,double s,size_t e,Myvec const &v)
 {
    Pi = pi;num_sel = n_s;disc = d;sum = s;endV = e;seq = v;
 }
 double selection_of_wire::diameter (double sech )const {return 2*(sqrt (sech/Pi));}
 double selection_of_wire::sechenie (double diam)const { return pow(diam /2,2)* Pi;}
 double selection_of_wire::numPercent ()const {return (sum/100)* disc;}//число от процента
 double selection_of_wire::maxSum ()const {return sum + numPercent ();}
 void selection_of_wire::Sum(double *sum)
 {
    std::cout <<" Введите диаметр и число проводов \n";
    std::cin >>*sum>>num_sel;
    *sum = sechenie(*sum);
 }
 void selection_of_wire::interval (size_t*bigV,size_t*endV)const
 {
    Myvec::const_iterator it = lower_bound(seq.begin(),seq.end(),sum/num_sel);
    size_t iter ;
    sum/num_sel > seq[seq.size()-1] ? iter = (it - seq.begin())-1 :iter = it - seq.begin();
    iter >= 3 ? *bigV = iter - 3 : *bigV = 0;
    iter >= seq.size() -1 ? *endV = seq.size() : *endV = iter +2;
 }
 void selection_of_wire::funcSelection(double sum,double max, short c, size_t i)
 {
    double rezult(0);
    static Myvec sub; // вектор слагаемых
    if (( c < 0 || max < reasZero(max))||(( !reasZero(max) && c )||( reasZero(max) && !c )))return;
    if (!( reasZero(max) && c ))
    {
        rezult = std::accumulate(sub.begin(), sub.end(), 0.);
        print(sub),std::cout <<diameter(rezult) << "          "
                     <<((rezult- sum)/ sum)*100 <<" %"<< "\n";
    }
    else
        for (; i < endV; ++i )
        {
            sub.push_back( seq[ i ] );
            funcSelection(sum, max - seq[i] , c - 1, i );
            sub.pop_back();
        }
 }
 void selection_of_wire::print(Myvec const& vec)//печать вектора
 {
     for (Myvec::const_iterator it = vec.begin(); it != vec.end(); ++it)
     if (it < vec.end()-1)
       std::cout << std::setw (3) <<diameter(*it)<<" + ";
     else
       std::cout<< std::setw (3) <<diameter(*it)<<"  -> ";
 }
 double selection_of_wire::reasZero (double max)//функция переприсваивает 0
 {
    return (max <= numPercent())|| ((max - numPercent()) <= numPercent()) ? max = 0 : max;
 }
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
//-------------Главная функция main----Работа с классом--------------------------------------------------
 #include <cstdlib>
 #include <iostream>
 #include "SELECT_OF_WIRE_H"
 
 int main()
 {
  selection_of_wire obj;
 
  return 0;
 }
5. Зачем вам функция init если у вас есть конструктор?
Пишут если написан свой конструктор по умолчанию,то нужно писать и свой конструктор копирования и свой оператор присвоения.Возможно я и не правильно понял.
7. Вынесите ввод/вывод данных в соответствующие операторы istream, ostream.
Наверное это бред,но задумка была объявить объект и получить результат.С вводом проблем нет,а вывод с перегруженным оператором << пока не могу сообразить как сделать из локальной функции funcSelection.
8. Определитесь с "нижестоящим" контейнером и не мешайте код для вектора/массива.
Здесь я не совсем понял.Вы про функцию interval? По другому я пока не знаю как правильно делать STL для меня больше вопросов.Только начал разбираться.Буду рад любой подсказке.
это по началу. Надеюсь на вашу помощь.
Спасибо огромное!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2014, 02:52

Создать массив из элементов массивов А и В без повторов
3. Написать программу, которая на основе двух динамических массивов А и В быть разного размера...

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

Создать массив, содержащий только общие элементы массивов А и В без повторов
1. Написать программу, которая на основе двух динамических массивов А и В быть разного размера...


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

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

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