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

Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.84
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
05.02.2013, 02:54     Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел #1
Доброго всем времени суток.Я делаю только первые шаги в программировании.Начал разбираться с массивами простенькие задачки вроде получаются,а вот с этой не могу справиться.Дано 30 произвольных чисел типа double.Требуется вычислить по формуле и вывести на экран все возможные комбинации сумм этих чисел в произвольном,заданным пользователем интервале с заданной пользователем точностью.Комбинации в заданном интервале в 2,3,4,5,6.Все верные комбинации не должны повторяться.В моем решении массив уже отсортирован и выбран интервал.Вот что у меня получилось
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
#include <iostream>
#include <iomanip>
#include <math.h>
const int size = 30;
double  A[size] = {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,1.45,1.5};
double  const pi = 3.14159;
using namespace std;
 
int main()
{
  double S =1.,G = 0.01;//temp ;
  int a,b,c,i,j,k,t; //для массивов и суммы сечений
  int M =3;
  float flag =1;
  double  *B = new double  [size];//динамический массив
 
  bool q1 =1;
  bool q;
   b = 0; c = 0;t = 0;
 for (;;)
 {
double  *AB = new double  [size];//динамический массив
    for ( i = 0; i < size; i++)//интервал
    for ( i = 0; i < size; i++)//интервал
    {
        if(A[i] >= 0.75 && A[i]<= 0.9)//интервал
            B[b++] =((A[i]/2)*(A[i]/2))*pi;//интервал и вычислене сечения
    }
 for ( i = 0; i < b; i++)                 //интервал и начало перебора
 for( j = B[i]; j <b ; j++)
 for( k = B[i]; k <b ; k++)
 for ( a = i;  a <= b*3 ;  a ++ )          //сумма перебора
 
if ((((((i+j+k)==a)))&&(a <=a*2)))//выборка значений
 
 
{
    (AB[c] =S-(B[j]+B[i]+B[k]));                 //сумма сечений
if ((((i==0)||(j ==b))||((i==j)&&(j==k)))&&((j-(i-1))&&(k-(j-1))!=0)//выборка значений
   &&((AB[c] >= -G)&&(AB[c] <= G)))
{
    for(int j1 = 0; j < c; j++)
{
//если найдено соответствие, то меняем флаг q1
if(AB[j1] == AB[c])
 q1 = 0;
}
//если соответствия не было найдено, то печатаем 
if(q1 == 1)
 
 
 cout << setw(15)<<setprecision(3) << 2*(sqrt ((B[i])/pi))<< setw(15) << 2*(sqrt ((B[j])/pi))
      << setw(15) << 2*(sqrt ((B[k])/pi))
      << setw(15)<<setprecision(4) << AB[c]<< endl;
 
     q=1; //если нет значений меняем флаг q
 
}
}
         if (q==0)
         {
cout <<"" << endl;
 cout << " PODBOP V " << M << " PROVODA S TOCHNOST'U    " << G << "      USPESHNO ZAVERSHEN !!!"
      << endl << endl;
cout << "                VARIANTOV NET!!  " << endl << endl;
//cout << setw (7)<< VjchisS (pi,i)<< setw (7) << VjchisS (pi,j) << setw (7) << VjchisS (pi,k) << endl;
 cout << "Prodoljit?     DA 1  NET  0" << endl;
 cin >>flag;
                  if (!((flag == 0)||((flag == 1))))
                       {
   cout << "           Oshibka !!!" << endl;
 cout << "Chislo mojet bjt 0 ili 1   Povtorite vvod!!" << endl;
 cin >> flag;
                       }
             if (flag == 1)
                     {
 
cout << "Zadajte tochnost podbora provoda  > ili <   " << G << endl;
cin >>G;
delete [] AB;
                    }
 
           }
 
        if  (q==1)
          {
 cout <<"" << endl;
 cout << " PODBOP V " << M << " PROVODA S TOCHNOST'U    " << G << "      USPESHNO ZAVERSHEN !!!"
      << endl << endl;
 cout << "Prodoljit?     DA 1  NET  0" << endl;
 cin >>flag;
                  if (!((flag == 0)||((flag == 1))))
                       {
   cout << "           Oshibka !!!" << endl;
 cout << "Chislo mojet bjt 0 ili 1   Povtorite vvod!!" << endl;
 cin >> flag;
                       }
             if (flag == 1)
                     {
 delete [] AB;
cout << "Zadajte tochnost podbora provoda  > ili <   " << G << endl;
cin >>G;
 
                    }
 
           }
 
   if (flag == 0)
   break;
   delete [] AB;
 }
 
 
return 0;
 
}
Здесь выбран интервал от 0,75 до 0,9 в 3.Пытаюсь решить простым перебором всех вариантов 2,3,4,5,6 циклами.На 3 циклах застопорился,не получается убрать повторяющиеся значения,а что я не правильно делаю не могу понять.Помогите разобраться одному мне не под силу.Возможно и все решение не верно.
Спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2013, 02:54     Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел
Посмотрите здесь:

C++ возможные комбинации перестановки n чисел
Все возможные комбинации 5 чисел C++
C++ Все возможные комбинации из 4 цифр
C++ Вывести все возможные комбинации цепочек в матрице смежности
Нужно вывести все возможные возрастающие 6-ти значные комбинации C++
C++ Все возможные комбинации длины k из 0 и 1
C++ Вывести все возможные комбинации трех натуральных чисел x, y и z до 36 с определенными условиями
Все возможные комбинации из 10 цифр по n C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,398
05.02.2013, 03:11     Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел #2
Сразу скажу, что код написан адово, ориентироваться в нем тяжело. Я не затрагиваю логику программы, я про отступы. Тело циклов желательно писать не на том же уровне, что и объявление, пробелы почаще б ставить.
По программе:
глобальные переменные - зло,
не нашел delete []B;
комментарий для массивов и суммы сечений лично мне ничего не сказал
в конце программы реально напряжная пляска с отступами.
math.h желательно заменить аналогом из С++ cmath

По логике программы:
т.к. у вас массив А отсортирован, то последовательность из него также отсортирована, следовательно, чем правее мы берем, тем больше наше значение, либо равно. Вам надо лишь запоминать сумму предыдущей последовательности и, если сумма новой равна предыдущей, то просто не засчитывать её.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
06.02.2013, 00:22  [ТС]     Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел #3
Я наверное не очень внятно сформулировал задачу.Задача взята из справочника по электротехнике.Есть таблица замены круглого провода в несколько проводов.Например диаметр провода 1мм можно заменить в 2 провода 0,55+0,83.0,59+0,8 и так далее,аналогично в 3,4,5,6 проводов.Расчитать можно по известному диаметру таким образом:Определить площадь круга,разделить его на требуемое число проводов выбрать предполагаемые сложить площади круга и вычислить диаметр суммы,если точность устраивает это и будет нужная комбинация заменяющих проводов.Таким образом можно провод любого диаметра заменить суммой проводов более тонкого диаметра.Надо написать программу,чтобы при вводе с клавиатуры диаметра провода получать все возможные комбинации заменяющих проводов с заданной точностью.По моему мнению реализовать ее можно используя вложенные циклы и вложенных циклов должно быть столько во сколько проводов ведется подбор.Возможно я и не прав,но пока моих познаний в с++ хватило только на это.Это и реализовано в моем коде но пока только для трех заменяющих проводов.Не получается у меня отобразить все комбинации без повторений.Спасибо большое за подсказку,но у меня так ничего и не получилось.Проблема в том,что это не простая последовательность.Ну не могу сообразить.Код переписал на заключительную часть можно и не обращать внимания,там я никаких проблем для себя не вижу написано только для удобства экспериментов.
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
#include <iostream>
#include <iomanip>
#include <cmath>
 
using namespace std;
 
int main()
{
  const int size = 30;//объявляем массив на 30 элементов
  //этот массив отсортирован числа это диаметры
  double  A[size] = {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,1.45,1.5};
  double  const pi = 3.14159;
  //double D; //диаметр задаются с клавиатуры здесь используется только в потоке вывода по формуле
              //2*(sqrt (S/pi),а здесь используется сечение
  double S =1,G = 0.01;//задаются с клавиатуры сейчас задано произвольно S уже вычеслено из заданного диаметра
  int M =3;            //задаются с клавиатуры сейчас задано произвольно
  int a,b,c,i,j,k;
  float flag =1;
  double  *B = new double  [size];//динамический массив
  bool  q;//q1 =1;
 
   b = 0; c = 0;
 
 for (;;)
 {
 
 double  *AB = new double  [size];//динамический массив будет хранить набор диаметров в диапазоне
              //заданным пользователем
 
    for ( i = 0; i < size; i++)//верхний интервал диаметров задаются с клавиатуры
     for ( i = 0; i < size; i++)// нижний интервал диаметров задаются с клавиатуры
     //в данном случае заданы 0,75 и 0,9,но могут быть любыми
        {
        if(A[i] >= 0.75 && A[i]<= 0.9)// если это интервал
        //заполняется массив с одновременным вычислением сечения ((D/2)*(D/2))*pi
            B[b++] =((A[i]/2)*(A[i]/2))*pi;//интервал и вычислене сечения
        }
  //чтобы правильно посчитать результирующий диаметр нужно сложить сечения и из них вычислить диаметр
       for ( i = 0; i < b; i ++)                 //перебираем все сечения
         for ( j = B[i]; j < b; j ++)            //из полученного интервала
            for ( k = B[i]; k < b; k ++)         //циклами i,j,k
              for ( a = i;  a <= b*M ;  a ++ )   //этим циклом просматриваем все варианты
                                                 //и заполняем массив
 
        if ((((((i+j+k)==a)))&&(a <=a*2))) //выборка значений
 
       {
         //суммируем все значения,вычисляем разницу и сохраняем в массиве AB[c]
         AB[c] = S - (B[j] + B[i] + B[k]);//разница сумма сечений
 
         //AB[c+1] = S - (B[j+1]+B[i]+B[k+1]);
          if ((((i==0)||(j ==b))||((i==j)&&(j==k)))&&((j-(i-1))&&(k-(j-1))!=0)//выборка значений
              &&((AB[c] >= -G)&&(AB[c] <= G)))
            {
 
              cout << setw(15)<<setprecision(3) << 2*(sqrt ((B[i])/pi))
                   << setw(15) << 2*(sqrt ((B[j])/pi))
                   << setw(15) << 2*(sqrt ((B[k])/pi))
                   << setw(15)<<setprecision(4) << AB[c]<< endl; //setw (15)<< AB[c+1] << endl;
 
                   q=1; //если нет значений меняем флаг q
 
            }
       }
 if (q==0)  // если нет ни одного значения выводим сообщение вариантов нет
            // запрашиваем продолжение или выход
            // если выбран выход (введен 0) меняем флаг программа завершается
            // если выбрано продолжение проверяем правильность ввода
    {
     cout <<"" << endl;
     cout << " PODBOP V " << M << " PROVODA S TOCHNOST'U    " << G << "      USPESHNO ZAVERSHEN !!!"
          << endl << endl;
     cout << "                VARIANTOV NET!!  " << endl << endl;
 
     cout << "Prodoljit?     DA 1  NET  0" << endl;
     cin >>flag;
                if (!((flag == 0)||((flag == 1)))) //проверка ввода если не верно просим повторить
                //если введено не верно программа не верно работает или досрочно завершается
                //а так просто пишет ошибку и если ввод верный продолжает работу
                   {
                     cout << "           Oshibka !!!" << endl;
                     cout << "Chislo mojet bjt 0 ili 1   Povtorite vvod!!" << endl;
                     cin >> flag;
                   }
         if (flag == 1) // если ввод верный просим задать другую точность
            {
 
              cout << "Zadajte tochnost podbora provoda  > ili <   " << G << endl;
              cin >>G;
              delete [] AB;
            }
 
    }
 
 if  (q==1) //если есть хотя бы одно значение оно выводится на экран
            //и запрашиваем продолжение или выход
            // если выбран выход (введен 0) меняем флаг программа завершается
            // если выбрано продолжение проверяем правильность ввода
    {
      cout <<"" << endl;
      cout << " PODBOP V " << M << " PROVODA S TOCHNOST'U    " << G << "      USPESHNO ZAVERSHEN !!!"
           << endl << endl;
      cout << "Prodoljit?     DA 1  NET  0" << endl;
      cin >>flag;
                if (!((flag == 0)||((flag == 1))))//проверка ввода если не верно просим повторить
                    {
                      cout << "           Oshibka !!!" << endl;
                      cout << "Chislo mojet bjt 0 ili 1   Povtorite vvod!!" << endl;
                      cin >> flag;
                    }
        if (flag == 1) // если ввод верный просим задать другую точность
          {
            delete [] AB;
            cout << "Zadajte tochnost podbora provoda  > ili <   " << G << endl;
            cin >>G;
 
          }
 
    }
 
if (flag == 0) // если выбран выход (введен 0) меняем флаг программа завершается
break;
delete [] AB;
delete [] B;
 }
 
 
return 0;
 
}
Буду благодарен за любой ответ.
Yandex
Объявления
06.02.2013, 00:22     Массивы. Вычислить по формуле и вывести на экран все возможные комбинации сумм чисел
Ответ Создать тему
Опции темы

Текущее время: 03:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru