Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
1

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

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

Author24 — интернет-сервис помощи студентам
При выполнении хотя бы одного условия равенства, вывести только один из двух равных элементов. На выходе: 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2012, 14:19
Ответы с готовыми решениями:

Упростить код, если возможно
На вход программы подаются фамилии и имена учеников. Известно, что общее количество учеников не...

Возможно ли как-то упростить код?
int choice = int.Parse(Console.RealLine()); int money = 10000; int money2 = 1000; switch...

Возможно ли упростить код для асинхронной отправки электронной почты
Пишу консольное приложение для отправки писем. За раз отправляется около 100 писем с отчетами....

Уважаемые знатоки, подскажите возможно ли как то упростить данный код
Суть в том, что количество и значения измерений (переменных fr и Tkip) каждый раз разное. А формулы...

22
8 / 8 / 1
Регистрация: 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
32 / 32 / 8
Регистрация: 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
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
17.08.2012, 14:45  [ТС] 4
SubTerran, Спасибо, но по-большому счёту эта функция особо код не упрощает, но всё же спасибо за ответ.

Добавлено через 1 минуту
Thirteen, Спасибо, уже исправил, но мне всё же важнее было знать можно-ли избежать такое количество строк?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
17.08.2012, 14:52 5
циклы нужно упростить, и выделить проверку в ф-ю, как SubTerran советует. раза в два короче будет и читаемее.
и быстрее.
1
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
17.08.2012, 14:55  [ТС] 6
novi4ok, Так ведь если я каждую проверку добавлю в функцию, то функций тоже будет 4 штуки, как и проверок или я ошибаюсь? Просто я с функциями ещё не разу не работал и толком нечего не знаю про них и про их написание.
0
556 / 510 / 25
Регистрация: 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
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 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
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
17.08.2012, 21:55  [ТС] 9
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 00:37 10
Цитата Сообщение от Leonman Посмотреть сообщение
novi4ok, Вообще-то там написано
C++
1
2
cout << "Введите количество точек:" << endl;
 cin >> n;
Что вам тут не нравиться?
я - ни при чем. компилятор не поймет, что за массив он должен разместить. ты компилировать этот код пробовал? если нет - попробуй.
0
Делаю внезапно и красиво
Эксперт С++
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
18.08.2012, 07:21 11
Цитата Сообщение от Leonman Посмотреть сообщение
Что вам тут не нравиться?
Для статически создаваемых массивов, размер должен быть известен при компиляции. Тебе нужно использовать int a = new int[n]; ... delete[] a;
0
387 / 294 / 21
Регистрация: 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
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
18.08.2012, 11:31 13
в общем, с массивом, думаю, ясно.
но я - за vector. вводим точки и дописываем их в вектор. после этого проверяем, действительно ли у вектора четная длина и находится ли там по крайней мере 3 точки (6 элементов).
затем перебираем все сочетания точек, которые могли бы быть вершинами треугольника. но для этого нужно исключить вхождение в треугольник одной и той же точки, проверку одного и того же несколько раз и т.д.
т.е. цикл внешний должен начинаться с нуля, но заканчиваться не доходя две точки до конца, первый вложенный - от текущего значения индекса внешнего цикла по предпоследнюю точку, и внутренний - от текущего значения индекс первого вложенного по последнюю включительно. при таком подходе все возможные треугольники будут проверены, причем только они и только один раз.
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
18.08.2012, 12:36  [ТС] 14
novi4ok,Программирую в Dev c++ там код и компилируется и запускается спокойно.
Собственно я написал так:
C++
1
2
cout << "Введите количество точек:" << endl;
cin >> n;
что бы программа была универсальной для любого количества точек, не ужели если писать универсальную программу, то так делать нельзя, а нужна только вектор брать. Я программирую не так давно, да ещё и самоучка, так что может я и не прав, просто код у меня компилируется, запускается, и работает отлично.
0
387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
18.08.2012, 13:06 15
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
0
577 / 256 / 18
Регистрация: 29.11.2010
Сообщений: 868
18.08.2012, 13:27 16
Цитата Сообщение от KeyGen Посмотреть сообщение
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
в Code::Block будет тоже самое, это из-за gcc
0
556 / 510 / 25
Регистрация: 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;
сообщи что выведется. просто любопытно.
0
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
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, на выходе у нас пятёка
1
576 / 559 / 47
Регистрация: 16.12.2011
Сообщений: 1,389
18.08.2012, 22:08 19
Для простоты отладки я бы посоветовал заполнять вектор не вручную, а автоматически - из файла или рандомно.
Если уж используете вектора, то и массив a тоже лучше сделать вектором.
Координаты точек лучше хранить в виде структуры или std:: pair.
Вызов sqrt можно не делать вовсе - результат от этого не изменится.
Чтобы не делать столько сравнений в одном месте, можно работать с каждой точкой отдельно. Поясню - берем первую точку из массива точек, высчитываем расстояния до всех других точек и тут же ищем одинаковые расстояния. Если находим - выводим сообщение о найденных равнобедренных треугольниках. Затем переходим к другой точке.
Как-то так, надеюсь поможет и успехов в изучении.
1
15 / 15 / 4
Регистрация: 17.06.2012
Сообщений: 274
18.08.2012, 23:00  [ТС] 20
I.M., Большое спасибо за советы. На счёт структур и std:: pair: слышал про эти два пункта, но я с ними дела ещё не имел так что не знаю как их использовать.
0
18.08.2012, 23:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2012, 23:00
Помогаю со студенческими работами здесь

Возможно ли упростить запрос?
Помогите пожалуйта.. Есть вот такая форма http://i057.***********/1105/fb/d1806f16ae37t.jpg При...

Возможно ли упростить цикл?
Хотелось бы спросить можно ли избавиться от костыля в виде цикла тут: //{ ...

Возможно ли упростить сортировку массива по значению?
Добрый день, подскажите пожалуйста, есть массив, например: array( =&gt; array( =&gt; value1 =&gt;...

Возможно ли упростить мою функцию по переключению картинок?
Принцип простой, задал некую переменную, меняю её значение в зависимости от активной картинки,...

Возможно ли упростить так, чтобы не осталось тригонометрических функций?
\cos(\frac{\arccos \, x}{2})

Упростить код
Задача передо мной такая:реализовать веб-сервер, клиентом у которого является браузер. Запрос в...


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

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