413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
1

Найти все варианты возможной замены проводов с заданной точностью подбора

07.10.2014, 21:29. Показов 505. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Проверить код и указать ошибки

Доброго всем времени суток!Пожалуйста,кому не трудно.посмотрите мой код и подскажите,что я не так или плохо делаю.Библиотекой STL пока еще не толком не пользовался и без подсказок не обойдусь.Показывать коды не кому, посоветоваться не с кем и вся надежда на уважаемых форумчан.
Суть задачи.Пользователь вводит диаметр провода , число заменяющих проводов и точность подбора,а программа должна показать все варианты возможной замены с заданной точностью.
Вот что у меня получилось.Код упрощенный.
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <windows.h>
#include <math.h>
#include <numeric>
#include <functional>
#include <iomanip>
 
using namespace std;
 
 const double Pi = acos(-1.0);
 double diameter (const double);
 double sechenie (const double);
 double enterDat(vector< double > const &,int*,double *);//Ввод данных
 int index (size_t,const size_t);//макс индекс
 int index (size_t);//мин индекс
 void print(vector<double> const&);//печать вектора
 double reasZero (double,double);//функция переприсваивает 0
 void select(vector<double>,double,double, int,double, size_t i = 0);//функция подбора
 
 
int main()
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 double d,sum,raz, max;
 double G (1.5);//разница процентах;
 const size_t len(28);
    // исходная последовательность
 double  B[] ={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};
 vector< double > old_seq(len);// исходная последовательность
 transform( B, B+len, old_seq.begin(), &sechenie );
 int c (0);//число слагаемых
 
 d = enterDat (old_seq,&c,&sum);
 sum = sechenie(sum);
 raz = (sum /100)*G;
 max = sum + raz;
 
 vector<double>::const_iterator it = lower_bound(old_seq.begin(),old_seq.end(),d);
 
 int max_ind =index (it - old_seq.begin(),len);
 int min_ind = index (it - old_seq.begin());
 
 vector< double > seq;//сформированная последовательность для подбора
 for (vector<double>::const_iterator it = old_seq.begin()+min_ind; it != old_seq.begin() + max_ind; ++it)
 seq.push_back(*it);
 
 cout << "Результат пдбора \n";
 select(seq,sum, max, c ,raz);
    return 0;
}
 
 double reasZero (double raz,double num_const)//функция переприсваивает 0
 {
    return (raz <= num_const)|| ((raz - num_const) <= num_const) ? raz = 0 : raz = raz;
 }
 
 double diameter (const double sech) {return 2*(sqrt (sech/Pi));}
 double sechenie (const double diam) {return pow(diam /2,2)* Pi;}
 
 void print(vector<double> const& vec)//печать вектора
 {
  for (vector<double>::const_iterator it = vec.begin(); it != vec.end(); ++it)
     if (it < vec.end()-1)
       cout<<setw(3) <<diameter(*it)<<" + ";
    else
       cout<<setw(3) <<diameter(*it)<<"  -> ";
 }
  int index (size_t iter,const size_t size)
 {
     return iter >= size -1 ? iter = size  : iter = iter +2;
 }
 int index (size_t iter)
 {
    return iter >= 3 ? iter = iter - 3 : iter = 0;
 }
 double enterDat(vector< double >const &vec,int *n,double *D)
 {
    double d;
    size_t size = vec.size();
    do
    {
    cout << "Введите диаметр провода \n";
    cin >>*D;
    d =*D;
    cout << " Введите число проводов "<<"\n";
    cin>>*n;
    d = sechenie(d)/ *n;
    if ((d > vec[size -1]*1.04)||(d < vec[0]/1.2))
    cout << " No!"<<"Enter!"<<"\n";
    }
    while ((d > vec[size -1]*1.04)||(d < vec[0]/1.2));
    return d;
 }
 
 void select(vector<double> Myvec,double S,double x, int c,double q2, size_t i)
 {
    double rezult = 0;
    static vector< double > sub; // вектор слагаемых
    if ( c < 0 || x < reasZero(x,q2) ) return;
     else if ( !reasZero(x,q2) && c ) return;
     else if ( reasZero(x,q2) && !c ) return;
     else if ( !reasZero(x,q2) && !c )
      {
      rezult = accumulate(sub.begin(), sub.end(), 0.);
      print(sub),cout <<diameter(rezult) << "          "
                     <<((rezult- S)/ S)*100 <<" %"<< "\n";
      }
    else
        for ( ; i < Myvec.size(); ++i )
        {
            sub.push_back( Myvec[ i ] );
            select(Myvec,S, x - Myvec[i] , c - 1,q2, i );
            sub.pop_back();
        }
 }
Код работает результат дает верный.Если,можно дайте свою оценку.Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.10.2014, 21:29
Ответы с готовыми решениями:

Угол альфа в градусах, минутах и секундах. Найти его величину в радианах(с максимально возможной точностью)
Помогите пожалуйста) Угол альфа в градусах, минутах и секундах. Найти его величину в радианах(с...

Из градусов в радианы. Угол а задан в градусах, минутах и секундах. Найти его величину в радианах (с максимально возможной точностью)
1. Из градусов в радианы. Угол а задан в градусах, минутах и секундах. Найти его величину в...

Найти все корни уравнения на заданном интервале [a;b] с заданной точностью
Закрепление практических навыков по работе с функциями. В ходе выполнения работы необходимо...

На заданном отрезке найти все корни уравнения с заданной точностью
На заданном отрезке найти все корни уравнения f(x)=0 с точностью \epsilon. ...

4
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.10.2014, 11:49 2
Цитата Сообщение от Genn55 Посмотреть сообщение
double diameter (const double);
1. Добавлять const в аргументах, передающихся по значению, смысла почти нет. Другое дело ссылка или указатель.
Цитата Сообщение от Genn55 Посмотреть сообщение
double enterDat(vector< double > const &,int*,double *);//Ввод данных int index (size_t,const size_t);//макс индекс
2. Смешивание стилей: в одном случае const T, в другом - T const. Хорошо бы иметь единообразие.
3. Вместо того чтобы писать прототипы функций проще разместить их тела перед main(). В данном случае это уместно, т.к. проект очень простой.
Цитата Сообщение от Genn55 Посмотреть сообщение
double d,sum,raz, max;
4. Не инициализированные переменные, ну и определять их стоит ближе к месту использования.
Цитата Сообщение от Genn55 Посмотреть сообщение
for (vector<double>::const_iterator it = vec.begin(); it != vec.end(); ++it)
5. Если использовать стандарт C++11 это выражение можно упростить.
6. Проблемы с форматированием кода.
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
08.10.2014, 22:07  [ТС] 3
Большое спасибо за справедливую критику.
1 У Страуспурта вычитал: Правило 3: Везде, где только можно используйте const
вот и пишу ее везде,где можно не задумываясь.А стоит подумать.
2.Здесь я не совсем понял,если можно,поподробнее.Пробел налицо.
3.Учту на будущее.Для таких проектов,да читать попроще.
4.Чистой воды мой прокол.Исправил.
5.Стандарт C++11 у меня пока не поддерживается.Считаю,что рановато.
6.С форматированием действительно проблема еще та.Чем больше читаю,тем больше понимаю,что я ни фига ничего не знаю.Пишу медленно (проблемы не от меня зависящие)много ошибаюсь,исправляю,часто приходится копировать и естественно все начинает плясать.Стараюсь,но...... пинать не кому.
Большое спасибо.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.10.2014, 22:30 4
Цитата Сообщение от Tulosba Посмотреть сообщение
Смешивание стилей: в одном случае const T, в другом - T const.
C++
1
vector< double > const & // T const. Сначала тип, потом модификатор
C++
1
const size_t // const T. Сначала модификатор, потом тип
Следует остановиться на чем-то одном.
Цитата Сообщение от Genn55 Посмотреть сообщение
Стандарт C++11 у меня пока не поддерживается.Считаю,что рановато.
Зря. Уже C++14 одобрен. Так что следует осваивать.
Цитата Сообщение от Genn55 Посмотреть сообщение
и естественно все начинает плясать.
Использование табуляции и адекватного редактора должно помочь избежать чрезмерной пляски.
1
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
08.10.2014, 22:41  [ТС] 5
Цитата Сообщение от Tulosba Посмотреть сообщение
Зря. Уже C++14 одобрен. Так что следует осваивать.
Буду пытаться.
С модификатором понял.
Еще раз спасибо.
0
08.10.2014, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.10.2014, 22:41
Помогаю со студенческими работами здесь

Класс: показать все варианты замены провода без повторов
Доброго всем времени суток!Большая просьба кому не трудно покритиковать и указать на мои косяки...

Использование стандартных функций (найти все корни уравнения на заданном интервале [a;b] с заданной точностью)
Необходимо создать программу, которая находит все корни уравнения на заданном интервале с заданной...

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

Найти сумму с заданной точностью точностью E
Кто-нибудь помогите,а то сижу целый день уже и не могу понять как делать....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru