Рисование рамки вокруг текстовой строки - C (СИ)

Узнай цену своей работы

Формулировка задачи:

]Составьте программу frame.c, выполняющую рисование рамки вокруг текстовой строки. Программа должна принимать в качестве аргументов командной строки размеры рамки и значение строки. Например, пусть программа вызвана как ./frame 6 20 Abracadabra Тогда в стандартный поток вывода должно быть выведено ******************** * * * Abracadabra * * * * * ******************** Текстовая строка должна быть отцентрирована как по горизонтали, так и по вертикали. В случае, если длина строки не позволяет вписать строку в рамку заданного размера, программа должна вместо рамки выводить сообщение Error Если программа вызвана с неправильным количеством аргументов командной строки, необходимо вывести подсказку Usage: frame <height> <width> <text>

Решение задачи: «Рисование рамки вокруг текстовой строки»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
 
void print_title_line(int length);
void print_simple_line();
void center_text(const char *text, int width);
 
int main(int argc, char *argv[])
{
    char string[64] = { "\0" };
    int width = 0, length = 0;
    int counter = 0, centered_text_pos = 0;
    int strling_length = 0;
    
    if (argc != 4) {
        printf("Usage: frame <height> <width> <text>\n");
        system("pause");
        return 0;
    }
 
    strling_length = strlen(argv[3]);
 
    width  = atoi(argv[1]);
    length = atoi(argv[2]);
    strcpy(string, argv[3]);
 
    (centered_text_pos = width % 2) ? (centered_text_pos = width / 2 + 1) : (centered_text_pos = width / 2);
 
    for (counter = 1; counter <= width; counter++) {
        if (counter == 1 || counter == width)
            print_title_line(length);
        else if(counter == centered_text_pos)
            center_text(string, length);
        else
            print_simple_line();
    }
 
    system("pause");
    return 0;
}
 
void print_title_line(int length) {
    int i;
    for (i = 0; i < length; i++)
        printf("*");
    printf("%\n");
}
 
void print_simple_line() {
    printf("**\n");
}
 
void center_text(const char *text, int width) {
    int length = strlen(text);
    int i;
    for (i = 0; i <= (width - length) / 2; i++) {
        if (i == 0)
            fputs("*", stdout);
        else
            fputs(" ", stdout);
    }
    fputs(text, stdout);
    i += length;
    for (; i <= width; i++) {
        if (i == width)
            fputs("*", stdout);
        else
            fputs(" ", stdout);
    }
    printf("\n");
}

Объяснение кода листинга программы

  1. Включаем необходимые заголовочные файлы:
    • stdio.h для работы с функциями ввода-вывода;
    • stdlib.h для работы с функцией atoi, которая преобразует строку в целое число;
    • string.h для работы со строками;
    • Windows.h для работы с функцией system, которая выполняет команды операционной системы.
  2. Определяем функции:
    • print_title_line(int length) - выводит строку из символов * заданной длины;
    • print_simple_line() - выводит строку **;
    • center_text(const char *text, int width) - выводит текст в центрированном виде в пределах заданной ширины.
  3. В функции main() инициализируем переменные:
    • char string[64] = {\0} - буфер для хранения текста;
    • int width = 0, length = 0 - переменные для хранения ширины и высоты рамки;
    • int counter = 0, centered_text_pos = 0 - счетчик для вывода символов рамки и позиция выравнивания текста;
    • int strling_length = 0 - длина строки текста.
  4. Проверяем корректность ввода аргументов программы:
    • Если введены некорректные аргументы (меньше или больше 4), выводим сообщение об ошибке и завершаем работу программы.
  5. Заполняем переменную strling_length:
    • strling_length = strlen(argv[3]); - длина строки текста, переданного в качестве аргумента.
  6. Заполняем переменные width и length:
    • width = atoi(argv[1]); - ширина рамки;
    • length = atoi(argv[2]); - высота рамки.
  7. Заполняем переменную string:
    • strcpy(string, argv[3]); - копируем текст в буфер string.
  8. Вычисляем позицию выравнивания текста:
    • (centered_text_pos = width % 2) ? (centered_text_pos = width / 2 + 1) : (centered_text_pos = width / 2); - если ширина рамки нечетная, то выравниваем текст по центру, иначе - смещаем на половину символа вправо.
  9. Выводим символы рамки:
    • for (counter = 1; counter <= width; counter++) { - цикл, выполняющийся от 1 до ширины рамки;
      • if (counter == 1 || counter == width) - условие для вывода верхней и нижней горизонтальных линий рамки;
      • print_title_line(length); - вызываем функцию для вывода горизонтальной линии.
      • else if(counter == centered_text_pos) - условие для вывода центрированного текста;
      • center_text(string, length); - вызываем функцию для вывода центрированного текста.
      • else - условие для вывода вертикальных линий рамки;
      • print_simple_line(); - вызываем функцию для вывода простой линии.
    • } - завершаем цикл.
  10. Завершаем работу программы:
    • system(pause); - приостанавливаем выполнение программы до нажатия клавиши;
    • return 0; - завершаем работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5
Похожие ответы