График экспоненциальной функции - PullRequest
0 голосов
/ 22 декабря 2018

Мне нужно сгенерировать график функции $$ y = \ exp (-0.1x) sin (0.5x) $$
, используя звездочки (*) для каждой из точек, составляющих график, такойчтобы график проходил вертикально вниз по странице, с одной точкой (одна звездочка) на линию.Каждая печатная строка состоит из соответствующего номера.пустых мест.

Как мне построить эту функцию в C-программе.Я новичок в C, который знает только - 2 D массива, операторы Control, ввод данных -output.

Я не знаю -Recursion, функции и т. Д.Я не знаю, как мне построить такую ​​функцию, потому что я знаю, как построить пирамиду, прямоугольники и т. Д.

Ответы [ 3 ]

0 голосов
/ 22 декабря 2018

Вот что вам нужно.

Вам нужна библиотека черчения.Вот koolplot, вы можете скачать его здесь http://koolplot.codecutter.org/v1.2/koolplot1_2.zip.Кроме того, здесь есть терминал, похожий на библиотеку для построения графиков http://ndevilla.free.fr/gnuplot/.

Вам нужно уравнение (которое у вас есть).

Вам нужен код C.Здесь вы можете найти пример кода.http://koolplot.codecutter.org/byExample.html

0 голосов
/ 22 декабря 2018

Хорошо, вот полное решение с пользовательским плоттером в терминале, используя printf.

В верхней части у вас есть куча определений, которые вы можете настроить, чтобы изменить размер графика, точность ипределы.

Существует также функция уравнения, с которой вы можете играть.

Скомпилируйте код, используя что-то вроде gcc main.c -lm -o a.exe.

Вы получите что-то вроде этого.

enter image description here

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

#define PLOT_WIDTH (72U)
#define PLOT_HEIGHT (30U)

#define LIMIT_X_MAX (25.0)
#define LIMIT_Y_MAX (1.0)

#define LIMIT_X_MIN (-2.0)
#define LIMIT_Y_MIN (-1.0)

#define PLOT_POINTS (500U)

void print_plot(const bool plot[PLOT_WIDTH][PLOT_HEIGHT])
{
    int i;
    int j;

    for (i = PLOT_HEIGHT - 1; i >= 0; i--)
    {
        printf("\n");
        for (j = 0; j < PLOT_WIDTH; j++)
        {
            if (plot[j][i])
            {
                printf("*");
            }
            else
            {
                printf("-");
            }
        }
    }

    printf("\n");
}

double equation(const double x)
{
    return exp(-0.1 * x) * sin(0.5 * x);
}

size_t get_plot_x(const double x)
{
    double xx = x - LIMIT_X_MIN;
    return (size_t)((PLOT_WIDTH - 1) * (xx / (LIMIT_X_MAX - LIMIT_X_MIN)));
}

double limit_y(const double y)
{
    double yy = y;
    if (y > LIMIT_Y_MAX) {
        yy = LIMIT_Y_MAX;
    }
    if (y < LIMIT_Y_MIN) {
        yy = LIMIT_Y_MIN;
    }

    return yy;   
}

size_t get_plot_y(const double y)
{
    double yy = limit_y(y) - LIMIT_Y_MIN;

    return (size_t)((PLOT_HEIGHT - 1) * (yy / (LIMIT_Y_MAX - LIMIT_Y_MIN)));
}

double get_next_x(const double x)
{
    return  x + ((LIMIT_X_MAX - LIMIT_X_MIN) / PLOT_POINTS);
}

void populate_plot(bool plot[PLOT_WIDTH][PLOT_HEIGHT])
{
    double x;
    double y;

    for (x = LIMIT_X_MIN; x < LIMIT_X_MAX; get_next_x(x))
    {
        y = equation(x);

        plot[get_plot_x(x)][get_plot_y(y)] = true;
    }
}

int main(void)
{
    bool plot_area[PLOT_WIDTH][PLOT_HEIGHT] = { false };

    populate_plot(plot_area);

    print_plot(plot_area);

    return 0;
}
0 голосов
/ 22 декабря 2018
  1. Вы хотите построить график функции y=exp(-0.1x)sin(0.5x), верно?

    Тогда вашей первой задачей будет написать функцию.

    Вызовите новую функцию изC root void main(int argc, char *argv[]) с некоторыми примерами значений, чтобы убедиться, что ваши расчеты верны.Не работайте над частью «черчение», пока не убедитесь, что функция в порядке.

  2. Поскольку вы хотите построить «вниз» (линию за раз), тоВы, вероятно, хотите решить для «х», а не «у».Настройте свою функцию C соответствующим образом.

  3. Наконец, вызовите вашу функцию в цикле:

    void main(int argc, char *argv[])
    {
       ...
       for (y=0; y < nlines; y++) {
          x = myFunction(y);
          myPlot(x, y);
       }
       ...
    
  4. Дайте ей попытку.Пожалуйста, пишите с любыми конкретными вопросами, если у вас возникнут проблемы на этом пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...