Рамка на титул

Уровень сложности:

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

/* ********************************
   * Лабораторная работа № 1      *
   * Выполнил(а): ст. гр. ЗИ-123  *
   * Иванов Андрей Петрович       *
   ******************************** */

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

Очень необычное задание, такую рамку часто задают в ВУЗ-ах в качестве титульного листа. Программу написать не сложно для частного случая, но вот, если сделать универсальную рамку, нужно немного потрудиться. Результат работы программы показан на рисунке 1.

// title.cpp: определяет точку входа для консольного приложения.

#include "stdafx.h"
#include <iostream>
#include <Windows.h> // прототипы функций SetConsoleCP() и SetConsoleOutputCP()
using namespace std;

int main(int argc, char* argv[])
{
    // Кириллица в консоли
    SetConsoleCP(1251); // функция устанавливает кодовую таблицу(win-cp 1251) для работы с потоком ввода 
    SetConsoleOutputCP(1251); // функция устанавливает кодовую таблицу(win-cp 1251) для работы с потоком вывода 

    char name[20] = "\0"; // строка для хранения имени, 
    cout << "Введите имя студента: ";
    cin >> name;

    char surname[30] = "\0"; // строка для хранения фамилии студента
    cout << "Введите фамилию студента: ";
    cin >> surname;

    char patronymic[30] = "\0"; // строка для хранения отчества 
    cout << "Введите отчество студента: ";
    cin >> patronymic;

    char group_number[10] = "\0"; // строка для хранения номера группы
    cout << "Введите номер группы студента: ";
    cin >> group_number;

    int len = 31; // минимальная длина рамки
    int len_str1 = 25 + strlen(group_number); // длина второй строки в рамке
    int len_str2 = strlen(name) + strlen(surname) + strlen(patronymic) + 6; // длина третьей строки

    // в операторе if определяем длину рамки? причём минимальная длина должна быть - 31 символ
    if ( len_str1 >= len_str2 && len_str1 > 31 )
        len = len_str1;
    else
        if (len_str2 > 31)
        len = len_str2;

    cout << "\n\t\t\t"; // выравнивание по центру
    for (int counter = 0; counter < len; counter++ )
        cout << "*";

    cout << "\n\t\t\t* Лабораторная работа №1";
    for (int counter = 0; counter < len - 25; counter++ )
        cout << " ";

    cout << "*\n\t\t\t* Выполнил(а): ст. гр. " << group_number;
    for (int counter = 0; counter <= (len - len_str1); counter++ )
        cout << " ";

    cout  << "*\n\t\t\t* " << surname << " " << name << " " << patronymic;
    for (int counter = 0; counter <= (len - len_str2); counter++ )
        cout << " ";
    cout << "*";

    cout << "\n\t\t\t"; // выравнивание по центру
    for (int counter = 0; counter < len; counter++ )
        cout << "*";
    cout << endl; 

    system("pause");
    return 0;
}

В строках 14 — 28 организуется ввод информации в программу. Минимальная длина рамки — 31 символ, в случае если ФИО или группа студента не будет помещаться внутри рамки, длина рамки увеличится на нужное количество символов. В строках 46 — 47, 50-51, 54-55 циклы for перемещают курсор, методом вывода символа пробела. После чего ставится символ ‘*’ граница рамки.


Рамка на титул

Рисунок 1 — Рамка на титул

Следующие статьи помогут вам в решении данной задачи:
Автор: admin
Дата: 12.09.2012
Поделиться:

Комментарии

  1. EGOIST

    //получаем значение самой длинной строки
    int GetTopCount(vector<string>& vs)
    {
    	int topCount = 0;
    
    	for each (string s in vs)
    	{
    		if (s.length() > topCount)
    		{
    			topCount = s.length();
    		}
    	}
    	return topCount;
    }
    
    //форматируем строку
    string FormatLine(string& value, int& count)
    {
    	string nVal = "* " + value;
    
    	if (value.length() < count)
    	{
    		int difference = count - value.length();
    
    		for (int i = 0; i < difference; i++)
    		{
    			nVal += " ";
    		}
    		
    		nVal += " *";
    	}
    	else
    	{
    		nVal += " *";
    	}
    
    	return nVal;
    }
    
    //выводим все строки в рамке
    void PrintInBorder(vector<string>& vs)
    {
    	int topCount = GetTopCount(vs);
    	string indent = "\t\t\t";
    
    	string line;
    	for (int i = 0; i <= topCount + 3; i++)
    	{
    		line += "*";
    	}
    
    	cout << indent << line << endl;
    	for each (string s in vs)
    	{
    		s = FormatLine(s, topCount);
    		cout << indent << s << endl;
    	}
    	cout << indent << line << endl;
    }
    
    
    void main(void)
    {
    	setlocale(LC_ALL, "Russian");	
    
    	string name, surname, patronymic, numberGroup;
    
    	vector<string> vs;
    	vs.push_back("Лабораторная работа № 1");
    
    	cout << "Name: ";
    	getline(cin, name);
    
    	cout << "Surname: ";
    	getline(cin, surname);
    
    	cout << "Patronymic: ";
    	getline(cin, patronymic);
    
    	cout << "Number Group: ";
    	getline(cin, numberGroup);
    
    	vs.push_back("Выполнил(а): ст. гр. " + numberGroup);
    	vs.push_back(surname + " " + name + " " + patronymic);
    
    	PrintInBorder(vs);
    
    	system("Pause");
    }
  2. Юрій Білоус

    Мой варинат:

    #include <iostream>
    #include <string> // для работы со string
    #include <windows.h> // нужен для вода кирилицы

    using namespace std;

    void titul () {
    int max;
    string name, name2, name3 , group;
    string f = «Лабораторная работа № 1″;
    cout << «Введите имя студента:»;
    cin >> name;
    cout << «Введите фамилию студента:»;
    cin >> name2;
    cout << «Введите отчество студента:»;
    cin >> name3;
    cout << «Введите номер группы студента:»;
    cin >> group;
    string s= «Выполнил(а): ст. гр. » + group;
    string student = name + » » + name2 + » » + name3;

    if ( f.size() > s.size() && f.size() > student.size() )
    max = f.size();
    else if ( student.size() > s.size() )
    max = student.size();
    else
    max = s.size();

    cout << «\t\t»;
    for (int i = 0; i <= (max+4); i++ )
    cout << «*»;

    cout << endl <<  «\t\t* » << f;
    for ( int i = 0; i < (max — f.size()); i++ )
    cout << » «;
    cout << »  *» << endl;

    cout << «\t\t»;
    cout << endl << «\t\t* » << s;
    for ( int i = 0; i < (max — s.size()); i++ )
    cout << » «;
    cout << »  *» << endl;

    cout << «\t\t»;
    cout << endl << «\t\t* » << student;
    for ( int i = 0; i < (max — student.size()); i++ )
    cout << » «;
    cout << »  *» << endl;

    cout << «\t\t»;
    for ( int i = 0; i <= (max+4); i++ )
    cout << «*»;
    cout << endl;
    };

    int main () {
    //setlocale ( NULL, «» ); // настройка языка вывода

    //для корректной работы в консолив свойствах выбираем шрифт Lucida Console
    SetConsoleCP ( 1251 );// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP ( 1251 ); // установка кодовой страницы win-cp 1251 в поток вывода

    titul ();

    system ( «pause» );
    return 0;

  3. cppg0d

    cppg0d

    #include <iostream>
    #include <iomanip>
    #include <string>
    #include <array>
    #include <algorithm>
    
    static const int __changeEncoding {
    	(system("chcp 1251 > nul"), 0)
    };
    
    using Student = std::array<std::string, 4>;
    
    std::istream & operator>>(std::istream & input, Student & student) {
    	static char *messages[] = {
    		"Введите имя студента: ",
    		"Введите фамилию студента: ",
    		"Введите отчество студента: ",
    		"Введите номер группы студента: ",
    	};
    	char **pMessages = messages;
    	for(auto & attribute : student) {
    		std::cout << *pMessages++;
    		std::getline(input, attribute);
    	}
    	return input;
    }
    
    std::ostream & operator<<(std::ostream & output, const Student & student) {
    
    	std::array<std::string, 3> banner {
    		"Лабораторная работа № 1",
    		"Выполнил(а): ст.гр. " + student[3],
    		student[1] + " " + student[0] + " " + student[2]
    	};
    
    	auto longestStringSize = std::max_element(
    		std::begin(banner), std::end(banner),
    		[](const auto & lhs, const auto & rhs) {
    			return lhs.size() < rhs.size();
    		}
    	)->size();
    
    	output << std::setfill('*') << "\n\t\t" << std::setw(longestStringSize + 5) << '\n'
    		<< std::left << std::setfill(' ');
    
    	for(const auto & message : banner) {
    		output << "\t\t* " << std::setw(longestStringSize + 1) << message << "*\n";
    	}
    
    	output << std::right << std::setfill('*') << "\t\t"
    		<< std::setw(longestStringSize + 5) << '\n';
    
    	return output;
    }
    
    int main() {
    
    	Student student;
    	std::cin >> student;
    	std::cout << student;
    
    	return 0;
    }
  4. Витя Ермолин

    Не заморачивайтесь) Делайте программу проще)

     

    #include<iostream>
    #include<windows.h>
    using namespace std;
    int main()
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char name[20]=»», surname[30]=»», patronymic[30]=»», group[15]=»»;
    cout<<«Введите имя студента: «;
    cin>>name;
    cout<<«Введите фамилию студента: «;
    cin>>surname;
    cout<<«Введите отчество студента: «;
    cin>>patronymic;
    cout<<«Введите номер группу студента: «;
    cin>>group;
    char len_srt1[]=» Лабараторная работа №1 «;
    char len_srt2[]=» Выполнил(а): ст. гр. «;
    char len_srt3[]=» «;
    int str1=2, str2=2, str3=2, max=0;
    str1+=strlen(len_srt1);
    str2+=strlen(len_srt2)+strlen(group);
    str3+=strlen(len_srt3)+strlen(name)+1+strlen(surname)+1+strlen(patronymic)+1;
    if(max<str1)
    max=str1;
    if(max<str2)
    max=str2;
    if(max<str3)
    max=str3;
    cout<<endl;
    cout<<«\n\t\t\t»;
    for(int i=0; i<max; i++)
    cout<<«*»;
    cout<<«\n\t\t\t*»<<len_srt1;
    for(int i=0; i<max-(strlen(len_srt1)+2); i++)
    cout<<» «;
    cout<<«*\n\t\t\t*»<<len_srt2<<group;
    for(int i=0; i<max-(strlen(len_srt2)+2+strlen(group)); i++)
    cout<<» «;
    cout<<«*\n\t\t\t*»<<len_srt3<<name<<» «<<surname<<» «<<patronymic;
    for(int i=0; i<max-(strlen(len_srt3)+1+strlen(name)+strlen(surname)+strlen(patronymic)+3); i++)
    cout<<» «;
    cout<<«*\n\t\t\t»;
    for(int i=0; i<max; i++)
    cout<<«*»;
    cout<<endl;
    system(«pause»);
    return 0;
    }

  5. Лис Необыкновенный

    #include <iostream>
    using namespace std;
    
    //размер русского символа 2 байта, а латинского - 1 байт...
    //из-за этого различия стандартные метода типа .length() и strlen()... 
    //в некоторых компиляторах выдают неверные результаты...
    //это актуально, например, для GCC 4.9.2
    
    int mystrlen(string); //функция для замены стандартных методов
    
    class Titletable{
        string templts[3]{"* Лабораторная работа № 1","* Выполнил(а): ст. гр. ","* " };
        int maxlen = 0;
    public:
        Titletable(string l, string n, string p, string g);
        int find_max_len();
        void draw_table(int);
        int get_max_len(){return maxlen;}
    };
    
    int main()
    {
        string l,n,p,g;
        cout << "Введите Фамилию: ";
        cin >> l;
        cout << "Введите Имя: ";
        cin >> n;
        cout << "Введите Отчество: ";
        cin >> p;
        cout << "Введите номер группы: ";
        cin >> g;
        Titletable cTitletable(l,n,p,g);
        cTitletable.draw_table(cTitletable.get_max_len());
    }
    
    Titletable::Titletable(string l, string n, string p, string g){
        templts[1]+=g; 
        templts[2] = templts[2]+l+" "+n+" "+p;
        maxlen = find_max_len();
    }
    
    void Titletable::draw_table(int){
        for(int i=0;i<maxlen;i++) cout << "*";
        cout << "**\n";
        for(int i=0;i<3;i++){
            cout << templts[i];
            int spaces = maxlen - mystrlen(templts[i]);
            for(int counter = 0;counter<spaces;counter++ ) cout << " ";
            cout << " *\n";
        }
        for(int i=0;i<maxlen;i++) cout << "*";
        cout << "**\n";
    }
    
    int Titletable::find_max_len(){
        int max = 0;
        for(int i=0;i<3;i++) if(mystrlen(templts[i]) > max) max=mystrlen(templts[i]);
        return max;
    }
    
    int mystrlen(string str){
        
        int counter = 0;
        for(int i=0;str[i];){
            (static_cast<int>(str[i])<0)? i+=2 : i++;
            counter++;
        }
        return counter;     
    }
  6. colt

    #include "stdafx.h"
    #include "iostream"
    #include "iomanip"
    #include "string"
    #include "windows.h"
    
    using namespace std;
    
    #define LGHT 4
    #define NS   3
    
    unsigned short usCounter[LGHT], usHoles[NS];
    
    string cData[LGHT];
    string cNames[LGHT]= 
    {
    	"имя",
    	"фамилию",
    	"отчество",
    	"номер группы"
    
    };
    string cBlank[NS]=
    {
    	"* Лабораторная работа №1",
    	"* Выполнил(а): ст. гр. ",
    	"* "
    
    };
    string cEnd = " *";
    
    int _tmain(int argc, _TCHAR* argv[])
    {	
    	SetConsoleCP(1251);
    	SetConsoleOutputCP(1251);																	//в cmd.exe установить другой шрифт - Lucida Console
    	while(true)
    	{
    		system("CLS");
    		unsigned short usNumbOfSybs[NS]= {0, 0, 0};												//массив длин вводимых строк
    		string cHoles[NS] =		{"","",""};														//строки в которых будут хранится недостающие пробелы
    		for (int i=0;i<LGHT;i++)
    			{
    				cout<<"Введите "<<cNames[i]<<" студента: ";
    				cin>>cData[i];																	//вводим данные
    			
    				if (i==(LGHT-1)) usNumbOfSybs[1]+=cData[i].length();							//длина группы
    				else usNumbOfSybs[2]+=cData[i].length();										//длина ФИО
    			}
    		usNumbOfSybs[2]+=2;																		//неучтённые два пробела между Фамилией и Именем а также Именем и Отчеством
    		for (int i=0;i<NS;i++)	usNumbOfSybs[i]+=cBlank[i].length()+cEnd.length();				//измеряем длину всех выводимых строк
    		int iMax=usNumbOfSybs[0];
    		for (int i=0;i<NS;i++)	if (usNumbOfSybs[i]>iMax) iMax=usNumbOfSybs[i];					//определяем строку максимальной длины
    		for (int i=0;i<NS;i++)	
    			{
    				usHoles[i]=iMax-usNumbOfSybs[i];												//вычисляем необходимое кол-во недостающих пробелов
    				for (int j=0; j<usHoles[i]; j++)	cHoles[i]+=" ";								//добавляем пробелы в строки
    			}		
    		cout<<"\n\t\t\t";	for (int i=0;i<iMax;i++)	cout<<"*";								//вывод 1-й строки
    		cout<<"\n\t\t\t"<<cBlank[0]<<cHoles[0]<<cEnd;											//вывод 2-й строки
    		cout<<"\n\t\t\t"<<cBlank[1]<<cData[3]<<cHoles[1]<<cEnd;									//вывод 3-й строки
    		cout<<"\n\t\t\t"<<cBlank[2]<<cData[1]<<" "<<cData[0]<<" "<<cData[2]<<cHoles[2]<<cEnd;	//вывод 4-й строки
    		cout<<"\n\t\t\t";	for (int i=0;i<iMax;i++)	cout<<"*";	cout<<endl<<endl;			//вывод 5-й строки
    	
    		system("PAUSE");
    	}
    	
    	return 0;
    }

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.