Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416

Построить график функции заданной двумя массивами

22.04.2018, 10:53. Показов 7581. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Пишу консольное приложение. Имеется два массива одинаковой размерности: х и у. Оба заполнены некоторыми занчениями. В одном лежит тип int, в другом - double. Каждому i-му значению массива х соответствует i-ое значение массива у.
Можно ли каким-то образом визуализировать с помощью графика эти два массива? То есть построить зависимость у(х). Грубо говоря, нарисовать координатные оси х и у, отметить соответствующие значения у(х) на графике и соединить все значения линией.
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.04.2018, 10:53
Ответы с готовыми решениями:

Построить график заданной функции
кто нибудь сможет написать программу на си++ которая строит график заданной функции

Вывести таблицу значений заданной функции (любой) и построить график ее производной
пришлите пожалуйста код программы, которая выводит таблицу значений заданной функции (любой) и строит график ее производной. буду очень...

Нужно построить график функции y = x2 на интервале [-3,3] и Построить график функции (эллипс) x^2/16 + y^2/9 = 1
Нужно построить график функции y = x2 на интервале и Построить график функции (эллипс) x^2/16 + y^2/9 = 1. На C++

21
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 11:37
Проще воспользоваться каким-нибудь GUI (Qt, FLTK или иные). Там уже есть готовые решения для построения графиков функций.
В консоле можно сделать что-нибудь такое, но в GUI будет намного нагляднее.

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
#include <iostream>
#include <cstdlib>
#include <cmath>
 
using namespace std;
 
bool is_equal(double y, double r)
{
    return fabs(y - r) < 1.0 / 12.0;
}
 
int main()
{
    double x, y;
 
    for (int i = 0; i <= 24; i++)
    {
        for (int j = 0; j <= 96; j++)
        {
            x = (double)j / 12 - 4;
            y = (double)(24 - i) / 6 - 2;
 
            if (i % 6 == 0 && j == 48 || j % 12 == 0 && i == 12)
                cout << '+';
            else if (is_equal(y, sin(x))) // нужное условие
                cout << '#';
            else
                cout << ' ';
        }
 
        cout << endl;
    }
 
    system("pause");
    return 0;
}
1
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 11:52
Цитата Сообщение от Alex7676 Посмотреть сообщение
Можно ли каким-то образом визуализировать с помощью графика эти два массива?
Можно, но стандартных средств для этого в C++ нет. Поэтому нужна какая-либо сторонняя библиотека. От твоего выбора будет зависеть то, как будет решаться задача.

С моей точки зрения, под винду самым простым способом будет использовать Winapi:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <Windows.h>
 
int main()
{
    // Получаем дескрипторы для рисования
    HWND hWnd = GetConsoleWindow();
    HDC hDC = GetDC(hWnd);
    // задаем то, чем рисуем
    HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    SelectObject(hDC, hPen);
    // рисуем линию из позиции (100, 100) в (200, 200), а потом в (300, 200)
    MoveToEx(hDC, 100, 100, NULL);
    LineTo(hDC, 200, 200);
    LineTo(hDC, 300, 200);
    std::cin.get();
 
    // При завершении работы необходимо освободить ресурсы
    DeleteObject(hPen);
    ReleaseDC(hWnd, hDC);
    return 0;
}
Тебе нужно только написать цикл и правильно отмасштабировать свою функцию.
1
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:09  [ТС]
QuakerRUS, nonedark2008, спасибо за ответы!!

nonedark2008, не подскажете, как сделать отрисовку этого графика под всеми выведенными данными? И где в вашей функции подаются массивы х и у?
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:14  [ТС]
QuakerRUS, вашу функцию я не совсем понял
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 14:20
Alex7676, что именно непонятно? Рисует график sin(x) на экране. Можно вместо sin(x) подставить другую функцию, но нужно будет допиливать программу, если изменятся интервалы или если график функции будет практически вертикальным. Но я бы рекомендовал делать через GUI.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:25  [ТС]
QuakerRUS, у меня нет заданной функции для отрисовки графика. У меня два массива значений х и у. В этих массивах i-му значению массива х соответствует i-ое значение массива у. То есть чтобы отметить точку на графике, берем одно значение из х и одно из у. Сдвигаемся по оси Ох на значение х и сдвигаемся по оси Оу на значение у и ставим точку на графике.

Добавлено через 2 минуты
Я прикрепил изображение выше. Количество нулей - это х, время - это у.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 14:28
Alex7676, а количество нулей как задается?
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:30  [ТС]
QuakerRUS, этому предшествуют непростые вычисления В итоге получается два указанных массива.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 14:33
Alex7676, ну я просто смотрю, у вас повторяющиеся значения там. Это нормально? Проще сделать гистограммой думаю.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:45  [ТС]
QuakerRUS, да, это нормально Можно было бы и гистограммой. Так даже, возможно, и интереснее было бы. Только как это реализовать...затруднения.

Добавлено через 9 минут
nonedark2008, таким образом изменил, но что-то не то...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    HWND hWnd = GetConsoleWindow();
    HDC hDC = GetDC(hWnd);
    // задаем то, чем рисуем
    HPEN hPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    SelectObject(hDC, hPen);
    
    MoveToEx(hDC, 100, 100, NULL);
    for (int i = 0; i < 20; i++)
    {
        if (x[i] != 0)
        {           
            LineTo(hDC, x[i], y[i]);            
        }
    }
    
    std::cin.get();
 
    // При завершении работы необходимо освободить ресурсы
    DeleteObject(hPen);
    ReleaseDC(hWnd, hDC);   
    return 0;
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 14:47
Цитата Сообщение от Alex7676 Посмотреть сообщение
И где в вашей функции подаются массивы х и у?
Нигде, чисто Proof of concept для рисования пары прямых в консоли. Это уже твоя задача переделать все в функцию, куда будут передаваться два массива. Если что-то конкретное не будет получаться, то спрашивай.
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:48  [ТС]
nonedark2008, спросил минутой ранее
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 14:49
Цитата Сообщение от Alex7676 Посмотреть сообщение
LineTo(hDC, x[i], y[i]);
Значения x[i] и y[i] должны быть в пикселях и в промежутке от 0, скажем, до 1000. Тебе нужно их правильно отмасштабировать перед передачей в LineTo.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 14:50
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
#include <iostream>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    const int n = 8;
    int x[n] = { 11, 15, 15, 14, 14, 12, 12, 16 };
    double y[n] = { 0.058, 0.134, 0.134, 0.029, 0.029, 0.037, 0.037, 0.206 }, max = y[0];
 
    for (int i = 1; i < n; ++i)
    {
        if (y[i] > max)
            max = y[i];
    }
 
    for (int i = 0; i < n; ++i)
    {
        cout << "Nulls: " << x[i] << endl
             << "Time: " << y[i] << endl;
 
        for (int j = 0; j < y[i] / max * 80; ++j)
            cout << '*';
 
        cout << endl;
    }
 
    system("pause");
    return 0;
}
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 14:57  [ТС]
QuakerRUS, происходит отображение значений. А где график?

Добавлено через 1 минуту
nonedark2008, как перевести типы int и double в пиксели? И что значит "правильно отмасштабировать"?
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
22.04.2018, 15:02
Цитата Сообщение от Alex7676 Посмотреть сообщение
как перевести типы int и double в пиксели?
Нужны просто целые числа, а пиксели - можешь их на своем экране посчитать =) Скажем, значение 100 - это сотый пиксель от края окна.
Цитата Сообщение от Alex7676 Посмотреть сообщение
И что значит "правильно отмасштабировать"?
Скажем твои значения x находятся в промежутке от -1.5 до 1.5. Тебе нужно их преобразовать так, чтобы они попадали в промежуток от 0 до 1000.
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 15:04
Alex7676, как вы себе представляете график с повторяющимися значениями? Сами просили гистограмму. Уберите слова лишние, если вас смущают. Например так.

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
#include <iostream>
#include <iomanip>
#include <cstdlib>
 
using namespace std;
 
int main()
{
    const int n = 8;
    int x[n] = { 11, 15, 15, 14, 14, 12, 12, 16 };
    double y[n] = { 0.058, 0.134, 0.134, 0.029, 0.029, 0.037, 0.037, 0.206 }, max_x = x[0], max_y = y[0];
 
    for (int i = 1; i < n; ++i)
    {
        if (x[i] > max_x)
            max_x = x[i];
 
        if (y[i] > max_y)
            max_y = y[i];
    }
 
    for (int i = 0; i < n; ++i)
    {
        cout << "X: " << setw(7) << x[i] << ' ';
 
        for (int j = 0; j < x[i] / max_x * 70; ++j)
            cout << 'x';
 
        cout << endl << "Y: " << setw(7) << y[i] << ' ';
 
        for (int j = 0; j < y[i] / max_y * 70; ++j)
            cout << '*';
 
        cout << endl << endl;
    }
 
    system("pause");
    return 0;
}
0
5 / 5 / 1
Регистрация: 11.10.2013
Сообщений: 416
22.04.2018, 15:11  [ТС]
QuakerRUSгистограмма, в моем понимании, это тоже графическое представление данных
0
 Аватар для QuakerRUS
1469 / 1010 / 456
Регистрация: 30.10.2017
Сообщений: 2,799
22.04.2018, 15:14
Alex7676, ну вот, звездочки и крестики графически и показывают вам данные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2018, 15:14
Помогаю со студенческими работами здесь

Построить график по заданной функции
Необходимо построить график по функции (локон Аньези)

Построить график по заданной функции
Доброе время суток. Пытаюсь построить график в Borland C++, но программа выводит неправильный график. Формула для графика и то, что...

Построить график заданной функции
Построить график заданной функции: помогите совершенно не впрягаю как это сделать

Построить график заданной функции
Наперёд извиняюсь , просто времени нету а сдать надо. Составить программу на языке Pascal, которая строит график заданной функции (в ...

Построить график заданной функции
Нужно построить график функции sin^2(x)/x. х есть какие введены с клавиатуры.ТАкже ложны быть оси и обозначение маштабная сетка,и начинался...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru