Задать вопрос
@Egor____Novichok

Как организовать корректный вывод информации в виде таблицы средствами си/си++(ООП использовать нельзя), если длина вводимых слов разная?

Мне нужно согласно заданию лабораторной работы изучить работу со структурами, после чего реализовать вывод массива структур в виде таблицы, а как это сделать, если длина ФИО и других полей таблицы, куда записывается текст разная? Я уже использовал в коде всё, что было по этой теме изучено и не могу двигаться дальше, пока не сделаю это, пожалуйста, помогите реализовать корректный вывод массива структур в виде таблицы.(код ниже)

#include
#include
#include
#include
using namespace std;

#define DN 25 //Длина названия

typedef struct {
struct FIO {
char familiya[DN];
char name[DN];
char otchestvo[DN];
} fio;

struct DATA {
int year;
int mes;
int day;
} data;

struct ADRES {
char nas_punkt[DN];
char streat[DN];
int zdaniye;
char litera[3];
} adres;

struct OBORUDOVANIE {
char tip[DN];
char name[DN];
float price;
} oborudovanie;

int col_uborud;
int stoimost_ystanovki;
int obchaya_stoimost;
} ZAYAVKA;

ZAYAVKA VVOD_ZAYAVKI();
void VIVOD_MASSIVA_ZAYAVOK(ZAYAVKA[],int kol_zayavok );

int main() {
setlocale(LC_CTYPE, "");
system("color f0");
const int kol_max = 55;
int kol;
ZAYAVKA massiv_zayavok[kol_max];
cout<< endl << "Сколько вы хотите ввести заявок?: ";
cin >> kol;
for (int i = 0; i < kol; i++) {
ZAYAVKA zayavka;
massiv_zayavok[i] = VVOD_ZAYAVKI();
}
VIVOD_MASSIVA_ZAYAVOK(massiv_zayavok, kol);

return 0;
}

ZAYAVKA VVOD_ZAYAVKI() {
ZAYAVKA zayavka;

cout << "\nФормируем заявку:" << endl;

cout << "Введите фамилию: ";
cin >> zayavka.fio.familiya;

cout << "Введите имя: ";
cin >> zayavka.fio.name;

cout << "Введите отчество: ";
cin >> zayavka.fio.otchestvo;

cout << "Введите год подачи заявки: ";
cin >> zayavka.data.year;

cout << "Введите месяц подачи заявки: ";
cin >> zayavka.data.mes;

cout << "Введите день подачи заявки: ";
cin >> zayavka.data.day;

cout << "Введите название населённого пункта,\n"
<< "где будет происходить установка оборудования: ";
cin >> zayavka.adres.nas_punkt;

cout << "Введите название улицы,\n"
<< "где будет происходить установка оборудования: ";
cin >> zayavka.adres.streat;

cout << "Введите номер здания,\n"
<< "где будет происходить установка оборудования: ";
cin >> zayavka.adres.zdaniye;

cout << "Введите литеру здания,\n"
<< "где будет происходить установка оборудования: ";
cin >> zayavka.adres.litera;

cout << "Введите тип устанавливаемого оборудования\n"
<< "(chethik, plita, kotel, kolonka): ";
cin >> zayavka.oborudovanie.tip;

cout << "Введите название устанавливаемого оборудования: ";
cin >> zayavka.oborudovanie.name;

cout << "Введите цену устанавливаемого оборудования: ";
cin >> zayavka.oborudovanie.price;

cout << "Введите количество (штук) устанавливаемого оборудования: ";
cin >> zayavka.col_uborud;

zayavka.stoimost_ystanovki=1500;
zayavka.obchaya_stoimost = zayavka.oborudovanie.price * zayavka.col_uborud + zayavka.stoimost_ystanovki;
return zayavka;

}

void VIVOD_MASSIVA_ZAYAVOK(ZAYAVKA zayavka[], int kol_zayavok)
{

cout << setfill('-') << setw(150) << "" << setfill(' ') << endl;

cout << "|" << setw(3) << setfill(' ') << "№" << setw(3) << setfill(' ');
cout << "|" << setw(20) << setfill(' ') << "Заказчик" << setw(12) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Дата" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Адрес" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Тип оборудования" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Название" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Цена(руб)" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Количество(шт)" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Стоимость установки(руб)" << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << "Общая сумма(руб)" << setw(5) << setfill(' ') << " |" << endl;

cout << setfill('-') << setw(150) << "" << setfill(' ') << endl;

for (int i = 0; i < kol_zayavok; i++) {
cout << "|" << setw(3) << setfill(' ') << i + 1 << setw(3) << setfill(' ');

cout << "|" << setw(30) << right << setfill(' ')
<< zayavka[i].fio.familiya << " "
<< zayavka[i].fio.name << " "
<< zayavka[i].fio.otchestvo << setw(3) << setfill(' ');

cout << "|" << setw(6) << setfill(' ')
<< zayavka[i].data.day << "."
<< setw(2) << zayavka[i].data.mes << "."
<< setw(4) << zayavka[i].data.year << setw(2) << setfill(' ');

cout << "|" << setw(5) << setfill(' ')
<< zayavka[i].adres.nas_punkt << ", "
<< zayavka[i].adres.streat << ", "
<< zayavka[i].adres.zdaniye
<< zayavka[i].adres.litera << setw(5) << setfill(' ');

cout << "|" << setw(5) << setfill(' ') << zayavka[i].oborudovanie.tip << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << zayavka[i].oborudovanie.name << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << fixed << setprecision(2) << zayavka[i].oborudovanie.price << " " << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << zayavka[i].col_uborud << " " << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << zayavka[i].stoimost_ystanovki << " " << setw(5) << setfill(' ');
cout << "|" << setw(5) << setfill(' ') << zayavka[i].obchaya_stoimost << " |" << setw(5) << setfill(' ') << endl;

if (i < kol_zayavok - 1) {
cout << setfill('-') << setw(150) << "" << setfill(' ') << endl;
}
}

cout << setfill('-') << setw(150) << "" << setfill(' ') << endl;
}
  • Вопрос задан
  • 151 просмотр
Подписаться 2 Средний 3 комментария
Помогут разобраться в теме Все курсы
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Разработчик на C++
    7 месяцев
    Далее
  • Нетология
    Разработчик на C++: Профессия + специализация + нейросети
    12 месяцев
    Далее
Пригласить эксперта
Ответы на вопрос 1
@Vadim_Student
Главное хорошо подобрать максимальный размер вводимой инфы + обрезание ( если вдруг больше). В общем смысле можно попробовать использовать спецификаторы вывода для printf(): %-*s - фиксированный размер + фиксация текста по левому краю ( что в большинстве случаев решит проблему смещения информации), если нужны разделители в полях, можно отдельно в каждый массив вставить последний элемент условно "|". Тогда же можно обойтись и без спецификаторов вывода, все строки будут выведены в полном размере.:
'аня.....| ....'
'денис.| ....'
Пример кода:
#include
#include

#define MAX_NAME_LEN 20
#define MAX_SURNAME_LEN 20

struct Employee {
char name[MAX_NAME_LEN];
char surname[MAX_SURNAME_LEN];
char position[30];
int salary;
};

void printTable(struct Employee* employees, int count) {
int name_width = MAX_NAME_LEN;
int surname_width = MAX_SURNAME_LEN;
int position_width = 30;
int salary_width = 10;

printf("%-*s %-*s %-*s %-*s\n",
name_width, "Name",
surname_width, "Last name",
position_width, "post",
salary_width, "salary");

for (int i = 0; i < name_width + surname_width + position_width + salary_width + 3; i++) {
printf("-");
}
printf("\n");

for (int i = 0; i < count; i++) {
printf("%-*s %-*s %-*s %-*d\n",
// print 'имя '
name_width, employees[i].name,
// print 'фамилия '
surname_width, employees[i].surname,
//...
position_width, employees[i].position,
salary_width, employees[i].salary);
}
}

int main() {
struct Employee employees[] = {
{"ANNA111111111111111", "AFQ:WKELQKWELQK", "MANAGAR_1231245", 50000},
{"Dima", "Dmitriev", "Devops", 80000},
{"Oleg", "Timohov", "Designer", 60000}
};

int count = sizeof(employees) / sizeof(employees[0]);
printTable(employees, count);

return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы