Структура без вывода - C (СИ)
Формулировка задачи:
Все делает правильно, но только выводит что-то непонятное
Возможно какая-то ошибка с памятью ибо компилятор молчит
И никак не могу понять, что за дела
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
const char err[35]="0123456789!@#$%^&*()_+=:;{}[]<>?,.";
const char numb[11]="0123456789";
typedef struct{
char surname[15];
char name[15];
char patronymic[15];
}NAME;
typedef struct{
int day;
char day_char[3];
int month;
char month_char[3];
int year;
char year_char[5];
}DATA;
typedef struct {
NAME imya;
DATA born;
char department[51];
char position[51];
unsigned experience;
char experience_char[99];
}WORKMAN;
int DATE(int *day1, int *month1, int *year1);// проверка
int LITARA(char *ar);// проверка
int NUM(char *a);// проверка
void Print(int* , WORKMAN*);// печать
void CLEAR(int*, WORKMAN*);// удаление
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
int i=1;
WORKMAN *lud = (WORKMAN*) malloc(i * sizeof(WORKMAN));
if(!lud ) {puts("Недостаточно памяти!"); return 0;}
int k=1; //Для обозначения №
fflush(stdin);
while(1){
//lud = (WORKMAN *) realloc(lud,i*sizeof(WORKMAN));
//WORKMAN *lud = (WORKMAN*) calloc(i, sizeof(WORKMAN));
printf("Ввод инфы сотрудника №%d \n",k);
printf("Введите имя сотрудника или пустую строку чтобы прекратить ввод: ");
fflush(stdin);
gets(lud[i].imya.name);
if(strcmp(lud[i].imya.name,"")==0)
break;
while(LITARA(lud[i].imya.name)!=0){
printf("Ввод повторно: ");
//fflush(stdin);
scanf("%s", lud[i].imya.name);
}
printf("Фамилия: ");
//fflush(stdin);
scanf("%s", lud[i].imya.surname);
while(LITARA(lud[i].imya.surname)!=0){
printf("Ввод повторно: ");
scanf("%s", lud[i].imya.surname);
}
printf("Отчество: ");
scanf("%s", lud[i].imya.patronymic);
while(LITARA(lud[i].imya.patronymic)!=0){
printf("Ввод повторно: ");
scanf("%s", lud[i].imya.patronymic);
}
lud[i].born.day=0;
lud[i].born.month=0;
lud[i].born.year=0;
while(DATE(&lud[i].born.day,&lud[i].born.month,&lud[i].born.year)!=0){
puts("Дата (дд мм гггг): ");
scanf("%s %s %s", lud[i].born.day_char, lud[i].born.month_char, lud[i].born.year_char);
while(NUM(lud[i].born.year_char)!=0){
printf("Повторный ввод года: ");
scanf("%s", lud[i].born.year_char);
}
lud[i].born.year = atoi(lud[i].born.year_char);
while(NUM(lud[i].born.month_char)!=0){
printf("Повторный ввод месяца: ");
scanf("%s", lud[i].born.month_char);
}
lud[i].born.month = atoi(lud[i].born.month_char);
while(NUM(lud[i].born.day_char)!=0){
printf("Повторный ввод дня: ");
scanf("%s", lud[i].born.day_char);
}
lud[i].born.day = atoi(lud[i].born.day_char);
}
printf("Отдел: ");
scanf("%s", lud[i].department);
while(LITARA(lud[i].department)!=0){
printf("Повторный ввод: ");
scanf("%s", lud[i].department);
}
printf("Должность: ");
scanf("%s", lud[i].position);
while(LITARA(lud[i].position)!=0){
printf("Повторный ввод: ");
scanf("%s", lud[i].position);
}
printf("Стаж: ");
scanf("%s", lud[i].experience_char);
while(NUM(lud[i].experience_char)!=0 || strlen(lud[i].experience_char)>2){
printf("Повторный ввод: ");
scanf("%s", lud[i].experience_char);
}
lud[i].experience = atoi(lud[i].experience_char);
lud = (WORKMAN *) realloc(lud, sizeof(WORKMAN)*(i+1));
if(!lud ) {puts("Недостаточно памяти!"); return 0;}
k++;
i++;
//realloc(lud ,i*sizeof(WORKMAN));
puts("-----------------------------------");
}
lud = (WORKMAN *) realloc(lud,i*sizeof(WORKMAN));
CLEAR( &i, lud);
if(i>1)
Print( &i, lud);
free(lud);
printf("\n");
puts("---------------КОНЕЦ-----------------");
return 0;
}
int DATE(int *day1, int *month1, int *year1){
int day=*day1, month=*month1, year=*year1;
int k=0;
if (year>1900 && year<2017){
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
switch(month){
case 1: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 2: {if((day>29) || (day<1))
{ k++; break;} else break;};
case 3: {if((day>30) || (day<1))
{puts("i"); k++; break;} else break;};
case 4: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 5: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 6: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 7: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 8: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 9: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 10: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 11: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 12: {if((day>31) || (day<1))
{ k++; break;} else break;};
default: { k++;}
}
} else switch(month){
case 1: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 2: {if((day>28) || (day<1))
{ k++; break;} else break;};
case 3: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 4: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 5: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 6: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 7: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 8: {if((day>31) || (day<1))
{ k++; break;} else break;};
case 9: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 10: {if((day>31) || (day<1))
{ break;} else break;};
case 11: {if((day>30) || (day<1))
{ k++; break;} else break;};
case 12: {if((day>31) || (day<1))
{ k++; break;} else break;};
default: { k++;}
}
} else {
k++;
}
return k;
}
int LITARA(char *ar){
unsigned int ir,jr,kr=0;
for(ir=0;ir<strlen(ar);ir++){
for(jr=0;jr<32;jr++){
if(ar[ir]==err[jr]){
puts("Плохо");
kr++;
break;
}
}
if(ar[ir]==err[jr])
break;
}
return kr;
}
int NUM(char *a){
unsigned int k=0, i,j;
for(i=0;i<strlen(a);i++){
for(j=0;j<10;j++){
if(a[i]==numb[j])
break;
}
if(a[i]!=numb[j]){
puts("Плохо");
k++;
break;
}
}
return k;
}
void Print(int *n, WORKMAN *lud){
printf("\t!Вывод cотрудников!\n");
for(int i=0; i<*n-1; i++){
puts("=====================================");
printf(" Имя: %s\n Фамилия: %s\n Отчество: %s\n", lud[i].imya.name,
lud[i].imya.surname, lud[i].imya.patronymic);
printf(" Дата: %d.%d.%d\n", lud[i].born.day,
lud[i].born.month, lud[i].born.year);
printf(" Отдел: %s\n", lud[i].department);
printf(" Должность: %s\n", lud[i].position);
printf(" Стаж: %d\n", lud[i].experience);
}
}
void CLEAR(int* n, WORKMAN *lud){
char vibor[2], num[4];
int num1;
printf("Хотите удалить что-нибудь (y - да, n - нет): ");
scanf("%s", vibor);
if(strcmp(vibor,"y")==0 || strcmp(vibor,"да")==0 ){
printf("Рабочий под номером: ");
scanf("%s", num);
while(NUM(num)!=0){
printf("Повторный ввод: ");
scanf("%s", num);
}
num1 = atoi(num);
if (num1>0 || num1<*n){
for(int j=1; j<*n; j++){
if(j==num1){
for(int k=j; k<*n; k++){
lud[k]=lud[k+1];
}
*n-=1;
realloc(lud,*n);
}
if(j==num1)
break;
}
}else
return;
} else
return;
*n--;
printf("====Сотрудник №%d удалён======\n", num1);
}Решение задачи: «Структура без вывода»
textual
Листинг программы
WORKMAN *lud = (WORKMAN*) malloc(i * sizeof(WORKMAN));
Объяснение кода листинга программы
- В данном коде происходит выделение памяти под массив структур
WORKMANс помощью функцииmalloc. i- это переменная, которая содержит размер этого массива.sizeof(WORKMAN)- это выражение, которое вычисляет размер одной структурыWORKMANв памяти.WORKMAN*- это указатель на структуруWORKMAN.lud- это переменная, которая будет содержать адрес первого элемента массива.malloc- это функция, которая выделяет память под массив.- Результат работы функции
mallocсохраняется в переменнойlud.