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

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

Восстановить пароль Регистрация
 
 
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
17.08.2012, 14:19     Возможно-ли упростить код? #1
При выполнении хотя бы одного условия равенства, вывести только один из двух равных элементов. На выходе: 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");    
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2012, 14:19     Возможно-ли упростить код?
Посмотрите здесь:

C++ Упростить код
Упростить код C++
упростить код C++
C++ Упростить код
C++ Упростить код
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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]);
}
Thirteen
 Аватар для 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;  
}
Может так? Просто эти условия так или иначе будут проверяться.
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
17.08.2012, 14:45  [ТС]     Возможно-ли упростить код? #4
SubTerran, Спасибо, но по-большому счёту эта функция особо код не упрощает, но всё же спасибо за ответ.

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

дальше ты в векторы что-то набиваешь непонятно зачем. почему ты для ввода вектор не используешь? ведь ты заранее не знаешь, сколько точек тебе дадут. или сразу забей массив макс длины, и проверяй степень заполнения, и прекращай ввод, когда больше некуда.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 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;  
}
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
17.08.2012, 21:55  [ТС]     Возможно-ли упростить код? #9
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 00:37     Возможно-ли упростить код? #10
Цитата Сообщение от Leonman Посмотреть сообщение
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
я - ни при чем. компилятор не поймет, что за массив он должен разместить. ты компилировать этот код пробовал? если нет - попробуй.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
18.08.2012, 07:21     Возможно-ли упростить код? #11
Цитата Сообщение от Leonman Посмотреть сообщение
Что вам тут не нравиться?
Для статически создаваемых массивов, размер должен быть известен при компиляции. Тебе нужно использовать int a = new int[n]; ... delete[] a;
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 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];
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 11:31     Возможно-ли упростить код? #13
в общем, с массивом, думаю, ясно.
но я - за vector. вводим точки и дописываем их в вектор. после этого проверяем, действительно ли у вектора четная длина и находится ли там по крайней мере 3 точки (6 элементов).
затем перебираем все сочетания точек, которые могли бы быть вершинами треугольника. но для этого нужно исключить вхождение в треугольник одной и той же точки, проверку одного и того же несколько раз и т.д.
т.е. цикл внешний должен начинаться с нуля, но заканчиваться не доходя две точки до конца, первый вложенный - от текущего значения индекса внешнего цикла по предпоследнюю точку, и внутренний - от текущего значения индекс первого вложенного по последнюю включительно. при таком подходе все возможные треугольники будут проверены, причем только они и только один раз.
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
18.08.2012, 12:36  [ТС]     Возможно-ли упростить код? #14
novi4ok,Программирую в Dev c++ там код и компилируется и запускается спокойно.
Собственно я написал так:
C++
1
2
cout << "Введите количество точек:" << endl;
cin >> n;
что бы программа была универсальной для любого количества точек, не ужели если писать универсальную программу, то так делать нельзя, а нужна только вектор брать. Я программирую не так давно, да ещё и самоучка, так что может я и не прав, просто код у меня компилируется, запускается, и работает отлично.
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
18.08.2012, 13:06     Возможно-ли упростить код? #15
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
defer
秘密
 Аватар для defer
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
18.08.2012, 13:27     Возможно-ли упростить код? #16
Цитата Сообщение от KeyGen Посмотреть сообщение
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
в Code::Block будет тоже самое, это из-за gcc
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 16:40     Возможно-ли упростить код? #17
Цитата Сообщение от Leonman Посмотреть сообщение
novi4ok,Программирую в Dev c++ там код и компилируется и запускается спокойно.
это интересно. а что будет если так?
C++
1
2
3
int n;
int a[n];
cout << "size of undefined: " << sizeof (a)<< endl;
сообщи что выведется. просто любопытно.
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
18.08.2012, 18:12  [ТС]     Возможно-ли упростить код? #18
novi4ok,
Если код выглядит вот так:
C++
1
2
3
int n;
int a[n];
cout << "size of undefined: " << sizeof (a)<< endl;
...программа завершается аварийно.
В таком случае:
C++
1
2
3
4
int n;
cin >> n;
int a[n];
cout << "size of undefined: " << sizeof (a) << endl;
... при n = 5, на выходе 20.
НО, если код написать вот так:
C++
1
2
3
4
int n;
cin >> n;
int a[n];
cout << "size of undefined: " << sizeof (a) / sizeof (int) << endl;
... при n = 5, на выходе у нас пятёка
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
18.08.2012, 22:08     Возможно-ли упростить код? #19
Для простоты отладки я бы посоветовал заполнять вектор не вручную, а автоматически - из файла или рандомно.
Если уж используете вектора, то и массив a тоже лучше сделать вектором.
Координаты точек лучше хранить в виде структуры или std:: pair.
Вызов sqrt можно не делать вовсе - результат от этого не изменится.
Чтобы не делать столько сравнений в одном месте, можно работать с каждой точкой отдельно. Поясню - берем первую точку из массива точек, высчитываем расстояния до всех других точек и тут же ищем одинаковые расстояния. Если находим - выводим сообщение о найденных равнобедренных треугольниках. Затем переходим к другой точке.
Как-то так, надеюсь поможет и успехов в изучении.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2012, 23:00     Возможно-ли упростить код?
Еще ссылки по теме:

Упростить код C++
C++ Упростить код
Упростить код C++

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

Или воспользуйтесь поиском по форуму:
Leonman
 Аватар для Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
18.08.2012, 23:00  [ТС]     Возможно-ли упростить код? #20
I.M., Большое спасибо за советы. На счёт структур и std:: pair: слышал про эти два пункта, но я с ними дела ещё не имел так что не знаю как их использовать.
Yandex
Объявления
18.08.2012, 23:00     Возможно-ли упростить код?
Ответ Создать тему
Опции темы

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