Структура без вывода - 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
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д