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

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

22.04.2018, 10:53. Показов 7551. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru