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

Разделить код на функции

27.01.2022, 09:10. Показов 902. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть готовая программа с условием: Произвольный выпуклый многоугольник задан координатами своих вершин на плоскости. Найдите самую длинную диагональ данного многоугольника.

Надо разделить ввод, обработку и вывод в отдельные функции

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
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <ctime>
#include <cmath>
using namespace std;
 
int main()
{
    setlocale(0,"");
    float x[6];
    float y[6];
    float max = 0, d = 0;
    int n;
 
 
    cout << "Введите количество точек: ";
    cin >> n;//количество точек
 
    cout << "Введите x: ";
    for (int i = 0; i < n; i++)
        cin >> x[i];
 
    cout << "Введите y: ";
    for (int i = 0; i < n; i++)
        cin >> y[i];
 
 
    for (int i = 0; i < n; i++)
    {
        //смещаю элементы влево, чтобы каждая точка могла проверить лежащие от нее точки до предпоследней, иначе точки будут оставаться на первых элементах
        int last = x[n - 1];//последний элемент
        int temps = x[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            x[i] = x[i + 1];
        }
        x[n - 1] = temps;
 
        int lastY = y[n - 1];//последний элемент
        int tempsY = y[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            y[i] = y[i + 1];
        }
        y[n - 1] = tempsY;
 
 
        for (int j = i + 2; j < n - 1; j++)
        {
            d = sqrt(pow((x[j] - x[i]), 2) + pow((y[j] - y[i]), 2));
            cout << "текущий d=" << d << endl;
            if (d > max)
            {
                max = d;
            }
 
        }
    }
    cout << "Самая длинная диагональ: " << max;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.01.2022, 09:10
Ответы с готовыми решениями:

Определить номер строки и столбца имеющих минимальную сумму элементов: разделить код на процедуры и функции
program LR8; uses crt; Const nmax=100; type mas=array of integer; Var A:mas; i,j,n:byte; s,max1,max2,k,z,t:integer; ...

Разделить код на файлы
Нужно следующий код правильно разделить на 3 файла: .h(класс), .cpp(реализация), main.cpp #include &lt;iostream&gt; using namespace...

Разделить код на классы
Помогите, пожалуйста! Как мне методы из этой формы вынести в разные классы и вызвать потом их оттуда? Объясните, если можно, поподробней. ...

9
236 / 50 / 37
Регистрация: 24.01.2022
Сообщений: 137
27.01.2022, 11:10
Олег1000, разделил программу, проверяй действительно ли алгоритм твой правильно написан.

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
#include <Windows.h>
 
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
 
using namespace std;
 
void enterN(int& n);
void enterXY(const int n, float* x, float* y);
 
float findMaxD(const int n, float* x, float* y, float *ds, int& numOfDs);
float calcD(const float xj, const float xi, const float yj, const float yi);
 
void outputDs(float* ds, const int numOfDs);
void outputMaxD(const float max);
 
int main()
{
    setlocale(0, "");
 
    int n = 0;
    float x[6];
    float y[6];
 
    float ds[36]; // Все расчитанные D
    int numOfDs = 0;
 
    enterN(n);
    enterXY(n, x, y);
 
    const float max = findMaxD(n, x, y, ds, numOfDs);
    outputDs(ds, numOfDs);
    outputMaxD(max);
}
 
void enterN(int& n)
{
    cout << "Введите количество точек: ";
    cin >> n; //количество точек
    while (n < 0 || n > 6)
    {
        cout << "Точек очень много!" << endl;
        cout << "Введите количество точек: ";
        cin >> n;
    }
}
 
void enterXY(const int n, float* x, float* y)
{
    cout << "Введите x: ";
    for (int i = 0; i < n; i++)
        cin >> x[i];
 
    cout << "Введите y: ";
    for (int i = 0; i < n; i++)
        cin >> y[i];
}
 
float findMaxD(const int n, float* x, float* y, float* ds, int& numOfDs)
{
    float d = 0;
    float max = 0;
    numOfDs = 0;
 
    for (int i = 0; i < n; i++)
    {
        //смещаю элементы влево, чтобы каждая точка могла проверить лежащие от нее точки до предпоследней, иначе точки будут оставаться на первых элементах
        float lastX = x[n - 1]; //последний элемент
        float tempsX = x[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            x[i] = x[i + 1];
        }
        x[n - 1] = tempsX;
 
        float lastY = y[n - 1]; //последний элемент
        float tempsY = y[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            y[i] = y[i + 1];
        }
        y[n - 1] = tempsY;
 
        for (int j = i + 2; j < n - 1; j++)
        {
            d = calcD(x[j], x[i], y[j], y[i]);
            ds[numOfDs] = d;
            ++numOfDs; 
 
            if (d > max)
            {
                max = d;
            }
        }
    }
    return max;
}
 
float calcD(const float xj, const float xi, const float yj, const float yi)
{
    return static_cast<float>(sqrt(pow((xj - xi), 2) + pow((yj - yi), 2)));
}
 
void outputDs(float* ds, const int numOfDs)
{
    for (int i = 0; i < numOfDs; ++i)
    {
        cout << "текущий d=" << ds[i] << endl;
    }
}
 
void outputMaxD(const float max)
{
    cout << "Самая длинная диагональ: " << max;
}
0
24 / 19 / 8
Регистрация: 21.04.2019
Сообщений: 494
27.01.2022, 13:29  [ТС]
По своему сделал. Проверьте, правильно или неправильно. Вроде все правильно выводит, но я не уверен.

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
#include <iostream>
#include <cstdlib>
#include <Windows.h>
#include <ctime>
#include <cmath>
using namespace std;
 
void vvod2(float x[], float y[], int &_n)
{
    cout << "Введите количество точек: ";
    cin >> _n;//количество точек
 
    cout << "Введите x: ";
    for (int i = 0; i < _n; i++)
        cin >> x[i];
 
    cout << "Введите y: ";
    for (int i = 0; i < _n; i++)
        cin >> y[i];
}
 
 
 
int obrabotka2(float x[],float y[],int n,float &d, float &max)
{
    
    
    
        for (int i = 0; i < n; i++)
    {
        //смещаю элементы влево, чтобы каждая точка могла проверить лежащие от нее точки до предпоследней, иначе точки будут оставаться на первых элементах
        int last = x[n - 1];//последний элемент
        int temps = x[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            x[i] = x[i + 1];
        }
        x[n - 1] = temps;
 
        int lastY = y[n - 1];//последний элемент
        int tempsY = y[i]; //текущий номер элемента
 
        for (int i = 0; i < n - 1; i++)
        {
            y[i] = y[i + 1];
        }
        y[n - 1] = tempsY;
 
 
        for (int j = i + 2; j < n - 1; j++)
        {
            d = sqrt(pow((x[j] - x[i]), 2) + pow((y[j] - y[i]), 2));
            cout << "текущий d=" << d << endl;
            if (d > max)
            {
                max = d;
            }
 
        }
        
        
    }return max;
    
    
}
 
 
 
float vuvod2(float &_max)
{
    cout << "Самая длинная диагональ: " << _max << endl<<endl;
}
 
 
 
 
int main()
{
    setlocale(0,"");
    
    float x[6];
    float y[6];
    float max = 0, d = 0;
    int n;
    
    
    vvod2(x,y,n);
    obrabotka2(x,y,n,d,max);
    vuvod2(max);
}
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
27.01.2022, 14:35
Олег1000, я бы сделал ввод пар координат, а не сначала "Введите x" потом "Введите y: "
Зачем в программе сделан циклический сдвиг?
Даже если он и правда нужен, я бы вынес его в отдельную функцию. А если нет, то удалил бы.
При поиске d я бы не извлекал из него корень до поры до времени. Поиск максимума был бы оптимален без постоянного вызова sqrt в цикле.
0
236 / 50 / 37
Регистрация: 24.01.2022
Сообщений: 137
28.01.2022, 04:37
Kuzia domovenok, уточни, когда тот самый момент, что пора извлекать корень?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
28.01.2022, 10:13
Mushroomer, перед выводом результата
0
236 / 50 / 37
Регистрация: 24.01.2022
Сообщений: 137
28.01.2022, 10:23
Kuzia domovenok, блин, ну перед выводом результата же как раз идет поиск. Как мне тогда максимум найти не вычисляя d (а это и есть вычисление корня)?
Скажи пожалуйста, вот это "поиск максимума был бы оптимален без постоянного вызова sqrt в цикле", какой это метод без вызова sqrt?
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
28.01.2022, 12:49
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//.......
        for (int j = i + 2; j < n - 1; j++)
        {
            d = (x[j] - x[i])*(x[j] - x[i]) + (y[j] - y[i])*(y[j] - y[i])ж
            cout << "текущий d=" << d << endl;
            if (d > max)
            {
                max = d;
            }
 
        }
        
        
    }
   return sqrt(max);
Добавлено через 1 минуту
Цитата Сообщение от Mushroomer Посмотреть сообщение
Как мне тогда максимум найти не вычисляя d (а это и есть вычисление корня)?
что, это по-твоему не поиск максимума?
1
236 / 50 / 37
Регистрация: 24.01.2022
Сообщений: 137
28.01.2022, 12:58
Kuzia domovenok, заметь, он еще и каждую найденную d выводит в консоль, вдруг ему корни видеть необходимо
1
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
28.01.2022, 13:30
Mushroomer, ах вот вы про какой вывод!
Сорри сорри, вообще мимо глаз проскочило у меня!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.01.2022, 13:30
Помогаю со студенческими работами здесь

Разделить код на файлы
Расскажите, как в Python можно разделить код на файлы. К примеру, один класс описан в другом файле .py. Как мне воспользоваться этим...

Разделить XAML код
Можно ли как то разделить большой XAML-код на несколько файлов-представлений? Я даже где то это видел уже, т.е. делается для каждого...

Разделить код на методы
Здравствуйте, как разделить этот код на методы? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; void main() { ...

Разделить 1 код на 3 с циклами
есть код как его поделить на 3 разные программы (3 цикла), подскажите как. #include &lt;iostream&gt; #include &lt;clocale&gt; ...

stringToHex + разделить код символами
Вот что смог: function stringToHex (tmp) { var str = '', tmp_len = tmp.length, c; for (i = 0; tmp_len...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru