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