Есть ли способ ускорить печать массивов? - PullRequest
0 голосов
/ 17 ноября 2018

Итак, я создал эту программу, в которой вы можете указать параметры круга или линии, и он будет отображать указанный объект, рисуя массив на дисплее.

Он работает, «проецируя» координату-система на массив.(Программа также запрашивает разрешение массива, количество столбцов и строк одинаковое.) Затем для каждой ячейки массива проверяется, пересекает ли круг / линия эту ячейку.Если это так или находится в заданном диапазоне, ячейка получит значение 1. Если она выходит за пределы диапазона, она будет равна 0. Когда всем ячейкам присвоено значение, программа отобразит массив.Таким образом, в конце вы увидите круг или линию, состоящую из них, остальные массивы будут отображаться в нолях.

Проблема заключается в том, что для печатимассив, в то время как фактические вычисления занимают очень мало времени.

Мой вопрос, как сказано в заголовке, может ли процесс отображения массива ускориться?Или я что-то не так делаю?Я использую Code :: Blocks в качестве моего компилятора.

Я знаю, что мой код, вероятно, очень плохо оптимизирован, но я начал программировать только неделю назад.Поэтому, пожалуйста, прости меня, если код трудно понять.

Заранее спасибо!

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float x = 0, y = 0, ypos= 0 , xpos = 0, radius = 0, rsqrd = 0, rcheck = 0, thick = 0, grad = 0, offs = 0, lcheck = 0;
    int matsize = 0, i, j, branch = 0;
    char filled;


    printf("\n0 - circle\n1 - line\nDo you want to draw a circle or a line? (0/1) ");
    scanf("%d", &branch);
    if(branch == 0)
    {
        printf("Value of radius: ");
        scanf("%f", &radius);
        printf("Position of circle on the x axis: ");
        scanf("%f", &xpos);
        printf("Position of circle on the y axis: ");
        scanf("%f", &ypos);
        printf("Is the circle filled? (y/n) ");
        scanf(" %c", &filled);
        if(filled == 'n')
        {
            printf("The thickness of circle: ");
            scanf("%f", &thick);
        }
        if(filled == 'y' || filled == 'n')
        {
            printf("Resolution: ");
            scanf("%d" , &matsize);
            printf("\n");
        }


    rsqrd = radius*radius; //rsqrd is equal to radius squared.
    x = -1*(matsize/2); //with this I make sure that the x and y values start from the top right corner of the matrix, so that each x, y value corresponds to the correct cell position (i, j)
    y = matsize/2;
    int mat[matsize][matsize];


    if(filled == 'n')
    {
        for(i = 0; i < matsize; i++)
        {
            for(j = 0; j < matsize; j++)
            {
                rcheck = ((y - ypos)*(y - ypos)) + ((x - xpos)*(x - xpos)); // calculating the equation of the circle with the x and y values taking the offset into account
                if(abs(rcheck-rsqrd) <= (thick*thick))
                {
                    mat[i][j] = 1;
                }
                else
                {
                    mat[i][j] = 0;
                }
                x = x+1; //stepping the values of x and y so they stay with the corresponding cell
            }
            x = -1*(matsize/2);
            y = y-1;
        }
    }
    if(filled =='y')
    {
        for(i = 0; i < matsize; i++)
        {
            for(j = 0; j < matsize; j++)
            {
                rcheck = ((y - ypos)*(y - ypos)) + ((x - xpos)*(x - xpos)); // calculating the equation of the circle with the x and y values taking the offset into account
                if(rcheck <= rsqrd)
                {
                    mat[i][j] = 1;
                }
                else
                {
                    mat[i][j] = 0;
                }
                x = x+1; //stepping the values of x and y so they stay with the corresponding cell
            }
            x = -1*(matsize/2);
            y = y-1;
        }
    }


    if(filled == 'y' || filled == 'n')
    {
        for(i = 0; i < matsize; i++)     // displaying the matrix
        {                                //
            for(j = 0; j < matsize; j++) //
            {                            //
                printf("%d ",mat[i][j]); //
            }                            //
            printf("\n");                //
        }                                //
    }
}
if(branch == 1)
{
    printf("Value of gradient: ");
    scanf("%f", &grad);
    printf("Value of offset: ");
    scanf("%f", &offs);
    printf("Thickness of line: ");
    scanf("%f", &thick);
    printf("Resoultion: ");
    scanf("%d", &matsize);


    x = -1*(matsize/2); //with this I make sure that the x and y values start from the top right corner of the matrix, so that each x, y value corresponds to the correct cell position (i, j)
    y = matsize/2;
    int mat[matsize][matsize];


    for(i = 0; i < matsize; i++)
    {
            for(j = 0; j < matsize; j++)
            {
                lcheck = y - (x * grad); // calculating the equation of the circle with the x and y values taking the offset into account
                if(abs(lcheck-offs) <= thick)
                {
                    mat[i][j] = 1;
                }
                else
                {
                    mat[i][j] = 0;
                }
                x = x+1; //stepping the values of x and y so they stay with the corresponding cell
            }
            x = -1*(matsize/2);
            y = y-1;
    }


    if(branch == 1)
    {
        for(i = 0; i < matsize; i++)    // displaying the matrix
        {                               //
            for(j = 0; j < matsize; j++)//
            {                           //
                printf("%d ",mat[i][j]);// 
            }                           //
            printf("\n");               //
        }                               //
    }
}


return 0;
}

1 Ответ

0 голосов
/ 18 ноября 2018

Как я уже говорил в своем комментарии, возможно, это как-то связано с этим вопросом и ответом о переполнении стека

Прочитав немного, вы также можете попытаться буферизовать ваш stdout вчтобы сделать это быстрее.

...