Язык Си. Тема: структуры данных
Необходимо произвести ввод и вывод массива структур на экран. Структура «Клиент банка» включает в себя: Фамилия И.О. самого клиента, номер счёта, сумма на счёте, дата последнего изменения. Необходима помощь с доработкой ввода, чтобы он стал более фиксированным (например, я могу ввести дату 25.01.2021 или 25 января 2021-го года, а мне нужно вводить именно первым вариантом (25.01.2021) - как это сделать?), та же ситуация с вводом ФИО - написал, например, фамилию, имя, потом отчество и после него пару цифр - и программа одобрила. Помогите, пожалуйста, разобраться в коде. Ну, с датой я думал, что можно в структуры 3 int-a ввести (day, month и year соответственно), а потом вводить их с помощью цикла while (scanf_s("%lf", &a[i].process.day) == 0 || a[i].process.day < 0 || prov(a[i].process.day) == 1), а в printf-e выводить дату через точки, а на ввод ФИО надо писать какое-то ограничивающее условие. Первое что пришло в голову, это ограничить, опять же: while (a[i].process.master>='a' && a[i].process.master <='Z') и так же для русского алфавита - только как потом возвразать пользователя на повторный ввод сначала?
Непосредственно сам код:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
struct rab {
char* master;
double cost;
};
struct auto1 {
char* number;
double km;
rab process;
};
int prov(double n) {
char* s = (char*)malloc(50 * sizeof(char));
fgets(s, 255, stdin);
if (s[0] == '\n')
return 0;
else return 1;
}
int proverka_indiv(auto1* a, int n, char* num) {
int k = 0;
for (int i = 0; i < n; i++)
if (strcmp(a[i].number, num) == 0)
k++;
if (k == 0)
return 0;
else return 1;
}
void delet_n(char*& a) {
int i = 0;
while (a[i] != '\n')
i++;
a[i] = '\0';
}
void input(auto1*& a, int& n) {
double w;
int q, fl = 0, e;
printf_s("Введите количество клиентов в банке: ");
e = n;
do {
while (scanf_s("%lf", &w) == 0 || w < 0 || prov(w) == 1) {
printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
rewind(stdin);
}
q = w;
if (w - q != 0) {
printf_s("Вы ввели дробное число, а надо целое. Повторите.\n");
continue;
}
if (q == 0)
return;
a = (auto1*)realloc(a, (n + q) * sizeof(auto1));
fl = 1;
for (int i = n; i < q + n; i++) {
a[i].process.master = (char*)malloc(50 * sizeof(char));
a[i].number = (char*)malloc(50 * sizeof(char));
double e, pl = 0;
char* poiu = (char*)malloc(50 * sizeof(char));
printf_s("\n Дата последнего изменения: ");
rewind(stdin);
int k = 0;
do {
fgets(poiu, 255, stdin);
delet_n(poiu);
k = 1;
} while (proverka_indiv(a, i + 1, poiu) > 0);
a[i].number = poiu;
printf_s(" номер счёта: ");
while (scanf_s("%lf", &a[i].km) == 0 || a[i].km < 0 || prov(a[i].km) == 1) {
printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
rewind(stdin);
}
printf_s(" ФИО клиента: ");
rewind(stdin);
fgets(a[i].process.master, 255, stdin);
delet_n(a[i].process.master);
printf_s(" сумма на счёте($): ");
while (scanf_s("%lf", &a[i].process.cost) == 0 || a[i].process.cost < 0 || prov(a[i].process.cost) == 1) {
printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
rewind(stdin);
}
}
} while (fl == 0);
n += q;
}
void output(auto1* a, int n) {
printf_s("Дата последнего изменения\t\t\t\tномер счёта\t\t\t\tклиент\t\t\t\tсумма на счёте\n");
for (int i = 0; i < n; i++)
printf_s("%-31s %-31.2lf %-31s %-31.2lf\n", a[i].number, a[i].km, a[i].process.master, a[i].process.cost);
//printf_s("%10s\t\t%15s\t\t%7.2lf\t%15s\t\t%20s\t\t%7.2lf\n", a[i].number, a[i].mark, a[i].km, a[i].process.master, a[i].process.work, a[i].process.cost);
}
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
struct auto1* cs = (auto1*)malloc(sizeof(auto1));
int buf = 1, flag = 0, n = 0, a;
double w;
do {
rewind(stdin);
printf_s("что вы хотите сделать?(варианты ответа 1-9)\n 1.Ввод\n 2.Вывод на экран\n 3.Завершить работу\nВаш Ответ: ");
while (scanf_s("%lf", &w) == 0 || w < 0 || w > 8 || prov(w) == 1) {
printf_s("Вы ввели не то, что надо или данного пункта нет в списке задач. Повторите. Ваш ответ: ");
rewind(stdin);
}
a = w;
if (w - a != 0) {
printf_s("Вы ввели дробное число, а надо целое. Повторить.\n");
continue;
}
system("CLS");
switch (a) {
case 1: input(cs, n); break;
case 2:if (n != 0)output(cs, n); else printf_s("Вы ещё не ввели данные про авто."); break;
case 3: buf = 0; break;
}
if (buf != 0) {
double e;
printf_s("Вы хотите вернуться в меню?\n 1.да\n 2.нет(выйти из программы)\nВаш ответ: ");
while (scanf_s("%lf", &e) == 0 || (e != 2 && e != 1) || prov(e) == 1) {
printf_s("Вы ввели не то, что надо. Повторите. Ваш ответ: ");
rewind(stdin);
}
if (e == 2)
buf = 0;
rewind(stdin);
}
system("CLS");
} while (buf == 1);
}