Задать вопрос
@dimaweyder

Как сделать обход матрицы по диагоналям?

5dd4569aa62ce048511411.png

Надо заполнить текстовое окно в таком направлении.
Размеры: 80х24
80 столбцов, 24 строки
void gotoxy(int x, int y)
{
	COORD coord;
	coord.X = x;
	coord.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

int main()
{
	int i = 0, j, k;
	printf("Input start: ");
	scanf_s("Input start: ");
	for (i = 0; i < 80; i++)
	{
		int x = 1;
		int y = 24;
		if (i % 2 == 0) {
			x += i;
			for (j = 0;j <= i;j++) {
				gotoxy(x - j, y - j);
				printf("1");
				Sleep(20);
			}
		}
		else {
			y -= i;
			for (j = 0;j <= i;j++) {
				gotoxy(x + j, y + j);
				printf("0");
				Sleep(20);
				
			}
		}
	}

upd: Сделал направление обхода поля 80х24 как на первом фото, но при большом значении i, появляется ошибка как на втором фото.
Как исправить?
5dda9d2f63163117780506.jpeg
  • Вопрос задан
  • 2315 просмотров
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
@vanyamba-electronics
Написать машину состояний.
enum { MoveDownRight, MoveUpLeft } state = MoveUpLeft;
while (TRUE) {
   switch (state) {
   case MoveUpLeft:
       move_up_left();
       break;
   case MoveDownRight:
       move_down_right();
       break;
    }
    draw_pixel();
}
Ответ написан
@gorpsys
системный программист
Используй циклы вместо условий.
Примерно так:

int order = -1;
int x=0;
int y=maxY-1;
while (x<maxX || y>0)
{
     while (x<0 && y<0) {x+=2; y++; order*=-1};
     while (x>=maxX && y>=maxY) {x--; y-=2; order*=-1};
     while (x<0 ) {x++; order*=-1};
     while (y<0 ) {y++; order*=-1};
     while (y>=maxY ) {y--; order*=-1};
     while (x>=maxX ) {x--; order*=-1};

      gotoxy((x+1),(y+1));
                         printf("1");
      x+=order;
      y+=order;
      Sleep(150);
}
Ответ написан
AnnTHony
@AnnTHony
Интроверт
5ddbc5b338f31121226147.gif

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>

const int _DELAY = 300;

void set_cursor_position(int row, int col)
{
    COORD coord;
    coord.X = col;
    coord.Y = row;

    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

void set_left_top(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
    while (true)
    {
        Sleep(_DELAY);

        set_cursor_position(*start_row, *start_col);
        printf("1");

        *start_row = *start_row - 1;
        *start_col = *start_col - 1;

        if (*start_row < finish_row)
        {
            *start_row = *start_row + 1;
            *start_col = *start_col + 2;

            break;
        }

        if (*start_col < finish_col)
        {
            *start_col = *start_col + 1;

            break;
        }
    }
}

void set_right_bottom(int *start_row, int *start_col, const int finish_row, const int finish_col)
{
    while (true)
    {
        Sleep(_DELAY);

        set_cursor_position(*start_row, *start_col);
        printf("0");

        *start_row = *start_row + 1;
        *start_col = *start_col + 1;

        if (*start_col > finish_col)
        {
            *start_row = *start_row - 2;
            *start_col = *start_col - 1;

            break;
        }

        if (*start_row > finish_row)
        {
            *start_row = *start_row - 1;

            break;
        }
    }
}

int main()
{
    printf("*** MATRIX RESOLUTION ***\n\n");

    int rows;
    printf("ROWS: ");
    scanf("%d", &rows);

    int padding_top = rows + 4;
    int padding_left = 2;

    int cols;
    printf("COLS: ");
    scanf("%d", &cols);
    cols = cols + padding_left;

    bool direction = true;

    int start_row = padding_top;
    int start_col = padding_left;

    while (start_row != (padding_top - rows) + 1 || start_col != cols)
    {
        if (direction)
        {
            set_left_top(&start_row, &start_col, (padding_top - rows) + 1, padding_left);
        }
        else
        {
            set_right_bottom(&start_row, &start_col, padding_top, cols - 1);
        }

        direction = !direction;
    }

    padding_top = padding_top + 1;
    set_cursor_position(padding_top, 0);

    return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы