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

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

Войти
Регистрация
Восстановить пароль
 
 
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
#1

Возможно-ли упростить код? - C++

17.08.2012, 14:19. Просмотров 1020. Ответов 22
Метки нет (Все метки)

При выполнении хотя бы одного условия равенства, вывести только один из двух равных элементов. На выходе: b[i] и три элемента из c[i], c[j], d[i], d[j].

Код для упрощения:

C++
1
2
3
4
5
6
7
8
9
10
11
if(b[i] == b[j] && (c[i] == c[j] || c[i] == d[j] || d[i] == c[j] || d[i] == d[j]))
     {
      if (c[i] == c[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << d[i] << ", " << d[j] << endl;   
      if (c[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;
      if (c[j] == d[i])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[j] << endl;
      if (d[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;  
     }
Условие задачи:

В одномерном массиве с четным количеством элементов(2N) находятся координаты N точек плоскости.
Они располагаются в следующем порядке: x1,y1,x2,y2,x3,y3…Определить номера точек, которые могут
являться вершинами равнобедренного треугольника.

И сам код (его упрощать не надо!):

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 <iostream>
#include <iomanip>
#include <vector>
#include <cmath>
using namespace std;
 
int main()
{  
   int n;
   srand(time(0));   
   float a[n], x = rand();
   cout << "Введите количество точек:" << endl;
   cin >> n;
    cout << "Введите координаты точек:" << endl;
   for (int i = 0; i < n*2; i++)
    cin >> a[i];
   system("CLS");
   for (int i = 0; i < n; i++)
    cout << "X: " << a[2*i] << " " << setw(7) << "Y: " << a[2*i+1] << endl;
   vector<float> b;
   vector<float> c;
   vector<float> d;
   for (int i = 0; i < n; i++)  
    for (int j = i+1; j < n; j++)  
    { 
     b.push_back(sqrt((a[2*j] - a[2*i]) * (a[2*j] - a[2*i]) + (a[2*j+1] - a[2*i+1]) * (a[2*j+1] - a[2*i+1])));  
     c.push_back(i+1);
     d.push_back(j+1);
    }
   for (int i = 0; i < b.size(); i++)
    cout << b[i] << ", ";
    cout << endl;
   for (int i = 0; i < c.size(); i++)
    cout << c[i] << " ";
    cout << endl;
   for (int i = 0; i < d.size(); i++)
    cout << d[i] << " ";
    cout << endl; 
   for (int i = 0; i < b.size(); i++) 
    for (int j = i+1; j < b.size(); j++)
     if(b[i] == b[j] && (c[i] == c[j] || c[i] == d[j] || d[i] == c[j] || d[i] == d[j]))
     {
      if (c[i] == c[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << d[i] << ", " << d[j] << endl;   
      if (c[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;
      if (c[j] == d[i])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[j] << endl;
      if (d[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;  
     }
system("PAUSE >> null");    
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2012, 14:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Возможно-ли упростить код? (C++):

Упростить код - C++
Добрый вечер. Такая задача. Исходные данные: вектор размерностью кратной 3 Выходные данные: вектор, получающийся из исходного...

Упростить код - C++
#include &lt;iostream&gt; #include &lt;iomanip&gt; using namespace std; int main() { size_t rowsCount; cout &lt;&lt; &quot;N: &quot;; cin...

Упростить код - C++
Как упростить вот такой код? Спасибо за внимание. #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std; int main() { ...

Упростить код - C++
Разработать рекурсивную функцию , возвращающую значение : для перевода числа из двоичной системы счисления в десятичную; Как упростить...

Упростить код - C++
Добрый вечер! Есть задача: дан вещественный массив, определить номер столбца с наибольшим количеством положительных элементов. После...

Упростить код - C++
Добрый день, подскажите, можно ли упростить код (используя уровень знаний как в оригинале)? #include &lt;iostream&gt; #include &lt;time.h&gt; ...

22
SubTerran
8 / 8 / 0
Регистрация: 13.08.2012
Сообщений: 18
17.08.2012, 14:35 #2
// ...

C++
1
2
3
4
void f(float b, float c, float dc, float d)
{
    cout << "Расстояние: " << b << " Вершинами треугольника являются точки: " << c << ", " << dc << ", " << d << endl; 
}
//...

C++
1
2
3
4
5
6
7
8
9
10
11
if(b[i] == b[j] && (c[i] == c[j] || c[i] == d[j] || d[i] == c[j] || d[i] == d[j]))
{
    if (c[i] == c[j])   
        f(b[i], c[i], d[i], d[j]);
    if (c[i] == d[j])
        f(b[i], c[i], c[j], d[i]);
    if (c[j] == d[i])
        f(b[i], c[i], c[j], d[j]);
    if (d[i] == d[j])    
        f(b[i], c[i], c[j], d[i]);
}
1
Thirteen
32 / 32 / 4
Регистрация: 04.07.2012
Сообщений: 50
17.08.2012, 14:37 #3
Вообще, по логике не нужно два раза выполнять сравнение, мне кажется.
C++
1
2
3
4
5
6
7
8
9
10
11
if(b[i]==b[j])
{
      if (c[i] == c[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << d[i] << ", " << d[j] << endl;   
      if (c[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;
      if (c[j] == d[i])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[j] << endl;
      if (d[i] == d[j])              
       cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " << c[j] << ", " << d[i] << endl;  
}
Может так? Просто эти условия так или иначе будут проверяться.
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
17.08.2012, 14:45  [ТС] #4
SubTerran, Спасибо, но по-большому счёту эта функция особо код не упрощает, но всё же спасибо за ответ.

Добавлено через 1 минуту
Thirteen, Спасибо, уже исправил, но мне всё же важнее было знать можно-ли избежать такое количество строк?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2012, 14:52 #5
циклы нужно упростить, и выделить проверку в ф-ю, как SubTerran советует. раза в два короче будет и читаемее.
и быстрее.
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
17.08.2012, 14:55  [ТС] #6
novi4ok, Так ведь если я каждую проверку добавлю в функцию, то функций тоже будет 4 штуки, как и проверок или я ошибаюсь? Просто я с функциями ещё не разу не работал и толком нечего не знаю про них и про их написание.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2012, 15:12 #7
начнем с начала. что здесь делается?

C++
1
2
int n;
float a[n];
компилятор не должен такого допускать. или как ты думаешь, какой длины твой массив должен быть? даже если
C++
1
2
int n = 3;
float a[n];
, компилятор все равно заругается.

дальше ты в векторы что-то набиваешь непонятно зачем. почему ты для ввода вектор не используешь? ведь ты заранее не знаешь, сколько точек тебе дадут. или сразу забей массив макс длины, и проверяй степень заполнения, и прекращай ввод, когда больше некуда.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
17.08.2012, 16:04 #8
Ну и самое примитивное

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 
if(b[i]==b[j])
{
      cout << "Расстояние: " << b[i] << " Вершинами треугольника являются точки: " << c[i] << ", " ;
      if (c[i] == c[j])              
          cout << d[i] << ", " << d[j] << endl;   
      if (c[i] == d[j])              
          cout << c[j] << ", " << d[i] << endl;
      if (c[j] == d[i])              
          cout << c[j] << ", " << d[j] << endl;
      if (d[i] == d[j])              
          cout << c[j] << ", " << d[i] << endl;  
}
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
17.08.2012, 21:55  [ТС] #9
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 00:37 #10
Цитата Сообщение от Leonman Посмотреть сообщение
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
я - ни при чем. компилятор не поймет, что за массив он должен разместить. ты компилировать этот код пробовал? если нет - попробуй.
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.08.2012, 07:21 #11
Цитата Сообщение от Leonman Посмотреть сообщение
Что вам тут не нравиться?
Для статически создаваемых массивов, размер должен быть известен при компиляции. Тебе нужно использовать int a = new int[n]; ... delete[] a;
0
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
18.08.2012, 10:34 #12
Цитата Сообщение от Leonman Посмотреть сообщение
int n;
float a[n];
1 В n у тебя значение - фиг знает что.
2 Массив можно создовать только константной переменной.
C++
1
2
const int n = 5;
float a[n];
3 Или исползовать new для создания массива.
C++
1
2
int n = 5;
float *a = new float[n];
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 11:31 #13
в общем, с массивом, думаю, ясно.
но я - за vector. вводим точки и дописываем их в вектор. после этого проверяем, действительно ли у вектора четная длина и находится ли там по крайней мере 3 точки (6 элементов).
затем перебираем все сочетания точек, которые могли бы быть вершинами треугольника. но для этого нужно исключить вхождение в треугольник одной и той же точки, проверку одного и того же несколько раз и т.д.
т.е. цикл внешний должен начинаться с нуля, но заканчиваться не доходя две точки до конца, первый вложенный - от текущего значения индекса внешнего цикла по предпоследнюю точку, и внутренний - от текущего значения индекс первого вложенного по последнюю включительно. при таком подходе все возможные треугольники будут проверены, причем только они и только один раз.
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
18.08.2012, 12:36  [ТС] #14
novi4ok,Программирую в Dev c++ там код и компилируется и запускается спокойно.
Собственно я написал так:
C++
1
2
cout << "Введите количество точек:" << endl;
cin >> n;
что бы программа была универсальной для любого количества точек, не ужели если писать универсальную программу, то так делать нельзя, а нужна только вектор брать. Я программирую не так давно, да ещё и самоучка, так что может я и не прав, просто код у меня компилируется, запускается, и работает отлично.
0
KeyGen
384 / 291 / 6
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
18.08.2012, 13:06 #15
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
0
18.08.2012, 13:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 13:06
Привет! Вот еще темы с ответами:

Упростить код - C++
#include&lt;iostream&gt; using namespace std; int main() { int a, b, c, d = 0, g = 0, f = 0; cin &gt;&gt; a &gt;&gt; b &gt;&gt; c; if (a &gt; 0) d++; ...

Упростить код - C++
доброго времени суток, я совсем новичок в С++ (да и в программировании) сейчас учусь по Страуструпу, и возникла даже не то что проблема,...

упростить код - C++
есть решена задача, надо упростить, из того перебора в инструкции switch() на enum ( перечисленный тип, мб через рандом но чет не выходит...

Упростить код - C++
Создавал раннее тему с таковой задачей:Нужен код для шифрования русскоязычного текста методом простой подстановки(каждой букве алфавита...


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

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

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