Написано: 14.12.2022

Вывод титульной рамкки.

Задание.

Напишите программу, запрашивающую имя, фамилия, отчество и номер группы студента и выводящую введённые данные в следующем виде:

/* ********************************
   * Лабораторная работа № NNN    *
   * Выполнил(а): ст. гр. XX-123  *
   * Иванов Иван Иванович         *
   ******************************** */

Необходимо, чтобы программа сама определяла нужную длину рамки. Сама же длина рамки зависит от длины наибольшей строки внутри рамки.

Решение.

Задача по выводу рамки разбивается на несколько простых действий.

Следует:

  • запросить данные
  • сформировать три строки, которые выводятся в рамке
  • определить длину наибольшей строки
  • дополнить строки, кроме наибольшей, пробелами справа
  • сормировать строчку из звездочек, которая выводится сверху и снизу рамки
  • вывести рамку

Удобнее задачу решать с помощью класса, у которого есть методы:

  • Input() – для ввода данных
  • PrintTitle() – для вывода результатов
#include <iostream>
#include "LabInfo.h"
#include "Windows.h"

int main()
{
    LabInfo l;
    
    // Кириллица в консоли
    SetConsoleCP(1251); // функция устанавливает кодовую таблицу(win-cp 1251) для работы с потоком ввода
    SetConsoleOutputCP(1251); // функция устанавливает кодовую таблицу(win-cp 1251) для работы с потоком вывода

    l.Input();
    l.PrintTitle();
}

Определение класса LabInfo

#pragma once
#include "string"
class LabInfo
{
	std::string LabNo;		// номер лабораторной работы
	std::string LName;		// фамилия студента
	std::string FName;		// имя студента
	std::string SName;		// отчество
	std::string GroupNum;	// номер группы

	std::string Lines[5];	// Лабораторная работа № LabNo
	void MakeLines();		// процедура формирования строк внутри рамки

public:
	void Input();			// процедура ввода данных
	void PrintTitle();		// процедура отображения рамки
};

Процедура ввода данных

void LabInfo::Input()
{
	// номер лабораторной работы
	std::cout << "Введите номер лабораторной работы: ";
	std::cin >> LabNo;		
	// фамилия студента
	std::cout << "Введите фамилию студента: ";
	std::cin >> LName;
	// имя студента
	std::cout << "Введите имя студента: ";
	std::cin >> FName;
	// отчество
	std::cout << "Введите отчество студента: ";
	std::cin >> SName;
	// номер группы
	std::cout << "Введите номер группы: ";
	std::cin >> GroupNum;

	MakeLines();
}

Процедура отображения рамки

Это просто цикл по пяти строчкам Lines

void LabInfo::PrintTitle()
{
	std::cout << "\n";
	for (int i = 0; i < 5; i++) {
		std::cout << "\t\t\t" << Lines[i] << "\n";
	}
}

Процедура формирования линий Lines

void LabInfo::MakeLines()
{
	Lines[1] = "Лабораторная работа № " + LabNo;
	Lines[2] = "Выполнил(а): ст. гр. " + GroupNum;
	Lines[3] = LName + " " + FName + " " + SName;

	// определяем наибольшую длину среди строчек
	int len = Lines[1].length(), l;
	for (int i = 2; i < 4; i++) {
		l = Lines[i].length();
		if (l > len) {
			len = l;
		}
	}

	// дополняем пробелами
	for (int i = 1; i < 4; i++) {
		l = len - Lines[i].length();
		for (int j = 0; j < l; j++) {
			Lines[i] += " ";
		}
	}

	// дополняем звездочками
	for (int i = 1; i < 4; i++) {
		Lines[i] = "* " + Lines[i] + " *";
	}

	// формируем верхнюю линию
	for (int i = 0; i < len + 4; i++) {
		Lines[0] += "*";
	}

	// формируем нижнюю линию
	Lines[4] = Lines[0];
}

Результат

Листинг программы