Структура без вывода - 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));

Объяснение кода листинга программы

  1. В данном коде происходит выделение памяти под массив структур WORKMAN с помощью функции malloc.
  2. i - это переменная, которая содержит размер этого массива.
  3. sizeof(WORKMAN) - это выражение, которое вычисляет размер одной структуры WORKMAN в памяти.
  4. WORKMAN* - это указатель на структуру WORKMAN.
  5. lud - это переменная, которая будет содержать адрес первого элемента массива.
  6. malloc - это функция, которая выделяет память под массив.
  7. Результат работы функции malloc сохраняется в переменной lud.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.846 из 5
Похожие ответы