1

Тема: обхід терміналу windows за допомогою бібліотеки windows api

Умова: зробити візуальний обхід терміналу операційної системи windows знаком "*" за допомогою бібліотеки windows api.
Програма написана на мові програмування C, в IDE Clion. За розміри консолі взяти стандарт 80*25 (останній рядок повинен бути не заповнений). Обхід бере початок з умовного центру консолі та йде поступово спіраллю за годинниковою стрілкою, кінець у лівому верхньому куті.
ось схема обходу
https://cdn.discordapp.com/attachments/1191394879415263362/1191394904962760754/image.png
Текст наявної частини програми:

#include <stdio.h>
#include <windows.h>
int placed = 0;
void Draw(HANDLE hout, int i, int j) {
    COORD pos;
    pos.X = j;
    pos.Y = i;
    SetConsoleCursorPosition(hout, pos);
    printf("?");
    placed++;
    Sleep(150);
}
int main() {
    int col, row;
    unsigned long deleted;
    COORD pos;
    pos.X = 0;
    pos.Y = 0;
    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(hout, &csbi);
    col = csbi.srWindow.Right - csbi.srWindow.Left;
    row = csbi.srWindow.Bottom - csbi.srWindow.Top;
    FillConsoleOutputAttribute(hout, 0, (row+1)*(col+1), pos, &deleted);
    int i = 40;
    int j = 12;
    Draw(hout, i, j);
    int sign = 1; // змінна для визначення напрямку руху
    int all = (row+1)*(col+1);
    return 0;
}

2

Re: обхід терміналу windows за допомогою бібліотеки windows api

Де коментарі?

3

Re: обхід терміналу windows за допомогою бібліотеки windows api

ur_naz написав:

Де коментарі?

#include <stdio.h>
#include <windows.h>

// Функція для виводу символу '*' в певній позиції консолі
void Paint(HANDLE hout, int i, int j) {
    COORD pos; // Структура для зберігання координат
    pos.X = j; // Встановлення координати X
    pos.Y = i; // Встановлення координати Y
    SetConsoleCursorPosition(hout, pos); // Встановлення позиції курсора в консолі
    printf("*"); // Виведення символу '*'
    Sleep(50); // Затримка для  візуального ефекту
}

int main() {
    int centerX, centerY;

    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); // Отримання дескриптора стандартного виводу
    CONSOLE_SCREEN_BUFFER_INFO csbi; // Структура для зберігання інформації про буфер екрана консолі
    GetConsoleScreenBufferInfo(hout, &csbi); // Отримання інформації про буфер екрана консолі

    centerX = csbi.srWindow.Right / 2; // Знаходження центру консолі по ширині
    centerY = csbi.srWindow.Bottom / 2; // Знаходження центру консолі по висоті

    int width = csbi.srWindow.Right - csbi.srWindow.Left; // Визначення ширини консолі
    int height = csbi.srWindow.Bottom - csbi.srWindow.Top; // Визначення висоти консолі

    // Цикл для малювання шаблону в консолі
    for (int size = 1; size <= width && size <= height; size += 2) {
        int x = centerX - size / 2; // Визначення початкової координати X для малюнка
        int y = centerY - size / 2; // Визначення початкової координати Y для малюнка

        // Малювання верхньої лінії малюнка
        for (int i = 0; i < size; i++) {
            Paint(hout, y, x + i);
        }

        // Малювання правої лінії малюнка
        for (int i = 1; i < size; i++) {
            Paint(hout, y + i, x + size - 1);
        }

        // Малювання нижньої лінії малюнка
        for (int i = size - 2; i >= 0; i--) {
            Paint(hout, y + size - 1, x + i);
        }

        // Малювання лівої лінії малюнка
        for (int i = size - 2; i > 0; i--) {
            Paint(hout, y + i, x);
        }
    }
    getchar(); // Очікування введення користувача перед закриттям програми
    return 0; // Завершення програми
}

ось код з коментарями, але виникла проблема обхід малюється не зовсім за схемою

4

Re: обхід терміналу windows за допомогою бібліотеки windows api

ur_naz написав:

Де коментарі?

#include <stdio.h>
#include <windows.h>

// Функція для виводу символу '*' в певній позиції консолі
void Paint(HANDLE hout, int i, int j) {
    COORD pos; // Структура для зберігання координат
    pos.X = j; // Встановлення координати X
    pos.Y = i; // Встановлення координати Y
    SetConsoleCursorPosition(hout, pos); // Встановлення позиції курсора в консолі
    printf("*"); // Виведення символу '*'
    Sleep(50); // Затримка для  візуального ефекту
}

int main() {
    int centerX, centerY;

    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); // Отримання дескриптора стандартного виводу
    CONSOLE_SCREEN_BUFFER_INFO csbi; // Структура для зберігання інформації про буфер екрана консолі
    GetConsoleScreenBufferInfo(hout, &csbi); // Отримання інформації про буфер екрана консолі

    centerX = csbi.srWindow.Right / 2; // Знаходження центру консолі по ширині
    centerY = csbi.srWindow.Bottom / 2; // Знаходження центру консолі по висоті

    int width = csbi.srWindow.Right - csbi.srWindow.Left; // Визначення ширини консолі
    int height = csbi.srWindow.Bottom - csbi.srWindow.Top; // Визначення висоти консолі

    // Цикл для малювання шаблону в консолі
    for (int size = 1; size <= width && size <= height; size += 2) {
        int x = centerX - size / 2; // Визначення початкової координати X для малюнка
        int y = centerY - size / 2; // Визначення початкової координати Y для малюнка

        // Малювання верхньої лінії малюнка
        for (int i = 0; i < size; i++) {
            Paint(hout, y, x + i);
        }

        // Малювання правої лінії малюнка
        for (int i = 1; i < size; i++) {
            Paint(hout, y + i, x + size - 1);
        }

        // Малювання нижньої лінії малюнка
        for (int i = size - 2; i >= 0; i--) {
            Paint(hout, y + size - 1, x + i);
        }

        // Малювання лівої лінії малюнка
        for (int i = size - 2; i > 0; i--) {
            Paint(hout, y + i, x);
        }
    }
    getchar(); // Очікування введення користувача перед закриттям програми
    return 0; // Завершення програми
}

програма виконується не на всю консоль

5

Re: обхід терміналу windows за допомогою бібліотеки windows api

Це не коментарі. З них ніякого зиску нема. До того ж ти зовсім не спіраль малюєш, а якісь лінії паралельні.

6

Re: обхід терміналу windows за допомогою бібліотеки windows api

#include <stdio.h>
#include <windows.h>

// Функція для виводу символу '*' в певній позиції консолі
void Paint(HANDLE hout, int i, int j) {
    COORD pos; // Структура для зберігання координат
    pos.X = j; // Встановлення координати X
    pos.Y = i; // Встановлення координати Y
    SetConsoleCursorPosition(hout, pos); // Встановлення позиції курсора в консолі
    printf("*"); // Виведення символу '*'
    Sleep(50); // Затримка для  візуального ефекту
}

int main() {
    int centerX, centerY;

    HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE); // Отримання дескриптора стандартного виводу
    CONSOLE_SCREEN_BUFFER_INFO csbi; // Структура для зберігання інформації про буфер екрана консолі
    GetConsoleScreenBufferInfo(hout, &csbi); // Отримання інформації про буфер екрана консолі

    centerX = csbi.srWindow.Right / 2; // Знаходження центру консолі по ширині
    centerY = csbi.srWindow.Bottom / 2; // Знаходження центру консолі по висоті

    int width = csbi.srWindow.Right - csbi.srWindow.Left; // Визначення ширини консолі
    int height = csbi.srWindow.Bottom - csbi.srWindow.Top; // Визначення висоти консолі

    // Цикл для малювання шаблону в консолі
    for (int size = 1; size <= width && size <= height; size += 2) {
        int x = centerX - size / 2; // Визначення початкової координати X для малюнка
        int y = centerY - size / 2; // Визначення початкової координати Y для малюнка

        // Draw the right line of the pattern
        for (int i = 1; i < size; i++) {
            Paint(hout, y  + i, x+ size - 1);
        }


        // Draw the bottom line of the pattern
        for (int i = size - 2; i >= 0; i--) {
            Paint(hout, y  + size - 1, x + i);
        }

        // Draw the left line of the pattern
        for (int i = size - 2; i > 0; i--) {
            Paint(hout, y  + i, x );
        }

        // Draw the top line of the pattern
        for (int i = 0; i < size; i++) {
            Paint(hout, y, x  + i);
        }
    }
    getchar(); // Очікування введення користувача перед закриттям програми
    return 0; // Завершення програми
}

ось оновлений код, який вже працює більш-менш за схемою, але лишилось дві проблеми :
1) Малюнок не закінчується  в лівому верхньому кутку, як треба;
2) Малюнок не малюється на весь розмір консолі;
Зарання дякую за допомогу

7

Re: обхід терміналу windows за допомогою бібліотеки windows api

ur_naz написав:

Це не коментарі. З них ніякого зиску нема. До того ж ти зовсім не спіраль малюєш, а якісь лінії паралельні.

потрібно щоб малювалось як на схемі, я вже оновив код, який майже відповідає вимогам. Можливо ви б могли точніше пояснити, що для вас було б прийнятним в коментарях?