Рисование рамки вокруг текстовой строки - 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;- завершаем работу программы.