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

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

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

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

17.08.2012, 14:19. Просмотров 1000. Ответов 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; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
defer
秘密
555 / 235 / 3
Регистрация: 29.11.2010
Сообщений: 783
18.08.2012, 13:27 #16
Цитата Сообщение от KeyGen Посмотреть сообщение
Dev c++ бочинит, он давно не обновляется. Ставь Code::Block.
в Code::Block будет тоже самое, это из-за gcc
0
novi4ok
551 / 504 / 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;
сообщи что выведется. просто любопытно.
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
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
I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
18.08.2012, 22:08 #19
Для простоты отладки я бы посоветовал заполнять вектор не вручную, а автоматически - из файла или рандомно.
Если уж используете вектора, то и массив a тоже лучше сделать вектором.
Координаты точек лучше хранить в виде структуры или std:: pair.
Вызов sqrt можно не делать вовсе - результат от этого не изменится.
Чтобы не делать столько сравнений в одном месте, можно работать с каждой точкой отдельно. Поясню - берем первую точку из массива точек, высчитываем расстояния до всех других точек и тут же ищем одинаковые расстояния. Если находим - выводим сообщение о найденных равнобедренных треугольниках. Затем переходим к другой точке.
Как-то так, надеюсь поможет и успехов в изучении.
1
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
18.08.2012, 23:00  [ТС] #20
I.M., Большое спасибо за советы. На счёт структур и std:: pair: слышал про эти два пункта, но я с ними дела ещё не имел так что не знаю как их использовать.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
19.08.2012, 01:33 #21
т.е. некий компилятор решил "подшестерить", и сделать, чтобы царь жил еще немного лучше, чем царь.
это полнейшее изнасилование с++. я могу только посоветовать никогда нак не делать.
если пишется такое:
C++
1
2
3
int n;
n = 5;
int a[n];
, то компилятор, который немного понимает в с++ должен заругаться (пусть мой друг велосипедист evg меня поправит).
эта форма записи предполагает размещение массива в стеке. т.е. компилятор должен знать его размер. а значение n будет присвоено только во время выполнения. в общем, ТАК НИЗЗЯ!
0
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 267
19.08.2012, 01:43  [ТС] #22
novi4ok, Ладна, я буду стараться избегать таких вещей. Тоесть если я хочу написать универсальную программу, для любого количества точек, то мне надо использовать вектор?
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
19.08.2012, 01:48 #23
Цитата Сообщение от Leonman Посмотреть сообщение
novi4ok, Ладна, я буду стараться избегать таких вещей. Тоесть если я хочу написать универсальную программу, для любого количества точек, то мне надо использовать вектор?
вектор удобнее (даже я бы сказал - незаменим), когда заранее неизвестно, сколько элементов нужно будет там разместить.
если ты знаешь, по природе решаемой задачи число элементов будет всегда постоянным, то массив удобнее.
у тебя получится, ты - думаешь. а привычки и прочее, что приходит с опытом - придет в свое время.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.08.2012, 01:48
Привет! Вот еще темы с ответами:

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.08.2012, 01:48
Ответ Создать тему
Опции темы

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