После выполнения одной из функций другие функции перестают работать - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Создать массив структур"Пациенты" с полями "Имя", "Температура". "Пульс", "Вес". Отсортировать введенный список по выбранному полю, и удалить пациентов, чья температура ниже 25 градусов. Удаление происходит в функции deltemp, удаляет всех нужных, то есть работает нормально, но после другие функции не работают. Если не использовать данную функцию программа работает нормально.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
int i, n, q=9, j=1;
struct patient
{
    char name[30];
    int temp;
    int pulse;
    int weight;
};
void sortname(int n,struct patient p[])
{
    int l, imin, pmin, pmin2, pmin3;
    char pmin4[30],m[30]="Zzzzzzzzzzzzzzzzzzzzzzzzzzzzz";  
    struct patient *o;
    o = (patient*)calloc(n,sizeof(patient));
    for(i=0;i<n;i++)
    {
        for(memcpy(pmin4, m, strlen(m)),l=0;l<n;l++)
        {
            if(strcmp(p[l].name,pmin4)<0)
            {
                imin=l;
                pmin=p[l].weight;
                pmin2=p[l].pulse;
                pmin3=p[l].temp;
                memcpy(pmin4, p[l].name, strlen(p[l].name));
                pmin4[strlen(p[l].name)]=0;
            }
        }
        
        memcpy(o[i].name, pmin4, strlen(pmin4));
        o[i].weight=pmin;
        o[i].pulse=pmin2;;
        o[i].temp=pmin3;
        
        memcpy(p[imin].name, m, strlen(m));
    }
    for(i=0;i<n;i++)
p[i]=o[i];
    free(o);
    pmin=0;
    pmin2=0;
    pmin3=0;
    
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }
    
};
void sorttemp(int n,struct patient p[])
{
    int l, imin, pmin, pmin2, pmin3;
    char pmin4[30];
    struct patient *o;
    o = (patient*)calloc(n,sizeof(patient));
    for(i=0;i<n;i++)
    {
    
        for(pmin=INT_MAX,l=0;l<n;l++)
        {
            if(p[l].temp<pmin)
            {
                imin=l;
                pmin=p[l].temp;
                pmin2=p[l].pulse;
                pmin3=p[l].weight;
                memcpy(o[i].name, p[l].name, strlen(p[l].name));
                o[i].name[strlen(p[l].name)]=0;
            }
        }
        
        o[i].temp=pmin;
        o[i].pulse=pmin2;;
        o[i].weight=pmin3;
        
        p[imin].temp=INT_MAX;
    }
    for(i=0;i<n;i++)
        p[i]=o[i];
    free(o);
    pmin=0;
    pmin2=0;
    pmin3=0;
    
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }       
};
void sortpulse(int n,struct patient p[])
{
    int l, imin, pmin, pmin2, pmin3;
    struct patient *o;
    o = (patient*)calloc(n,sizeof(patient));
    for(i=0;i<n;i++)
    {
        for(pmin=INT_MAX,l=0;l<n;l++)
        {
            if(p[l].pulse<pmin)
            {
                imin=l;
                pmin=p[l].pulse;
                pmin2=p[l].temp;
                pmin3=p[l].weight;
                memcpy(o[i].name, p[l].name, strlen(p[l].name));
                o[i].name[strlen(p[l].name)]=0;
            }
        }
        
        o[i].pulse=pmin;
        o[i].temp=pmin2;;
        o[i].weight=pmin3;
        p[imin].pulse=INT_MAX;
    }
    for(i=0;i<n;i++)
    p[i]=o[i];
    free(o);
    pmin=0;
    pmin2=0;
    pmin3=0;
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }   
};
void sortweight(int n,struct patient p[])
{
    int l, imin, pmin, pmin2, pmin3;
    struct patient *o;
    o = (patient*)calloc(n,sizeof(patient));
    for(i=0;i<n;i++)
    {
        for(pmin=INT_MAX,l=0;l<n;l++)
        {
            if(p[l].weight<pmin)
            {
                imin=l;
                pmin=p[l].weight;
                pmin2=p[l].pulse;
                pmin3=p[l].temp;
                memcpy(o[i].name, p[l].name, strlen(p[l].name));
                o[i].name[strlen(p[l].name)]=0;
            }
        }
        
        o[i].weight=pmin;
        o[i].pulse=pmin2;;
        o[i].temp=pmin3;
        
        p[imin].weight=INT_MAX;
    }
    for(i=0;i<n;i++)
p[i]=o[i];
    free(o);
    pmin=0;
    pmin2=0;
    pmin3=0;
    
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }       
};
[COLOR="Blue"]void deltemp(int n,struct patient p[])
{
    int l, m=n, imin, pmin, pmin2, pmin3;
    char pmin4[30];
    
        for(i=0;i<n;i++)
        {
            if(p[i].temp<25)
            { 
                  
                 for(int l=i;l<n-1;l++)
                 {
                 (p[l].temp)=(p[l+1].temp);
                 (p[l].pulse)=(p[l+1].pulse);
                 (p[l].weight)=(p[l+1].weight);
                 memcpy(p[l].name, p[l+1].name, strlen(p[l].name));
                p[l+1].name[strlen(p[l].name)]=0;
                 }
                  n--;
                  i--;
                  }                 
                    }
                    realloc(p, n * sizeof(p));
    
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }       
};[/COLOR]
 
int main()
{
struct patient *p;  
    printf("Enter n:");
    scanf("%d", &n);
    p = (patient*)calloc(n,sizeof(patient));
    for (i=0;i<n;i++)
    {
        p[i].pulse = 0;
        p[i].weight = 0;
        p[i].temp = 0;
 
        printf("Enter name:  ");
        scanf("%255s", p[i].name);
 
        printf("Enter temp:  ");
        scanf("%d", &p[i].temp);
        
        printf("Enter pulse:  ");
        scanf("%d", &p[i].pulse);
        
        printf("Enter weight:  ");
        scanf("%d", &p[i].weight);
    }
    
    for (i=0,j=1;i<n;i++,j++)
    {
        printf("%d. %s  %d  %d  %d ", j, p[i].name, p[i].temp, p[i].pulse, p[i].weight);
        printf("\n");
    }
    while(q!=0)
{
    printf("1. sort by name \n2. sort by temperature \n3. sort by pulse \n4. sort by weight ");
    scanf("%d", &q);
    switch(q)
    {
    case 1:
    {
        sortname(n, p);
        break;
    };
    case 2:
    {
        sorttemp(n, p);
        break;
    };
    case 3:
    {
        sortpulse(n, p);
        break;
    };
    case 4:
    {
        sortweight(n, p);
        break;
    };
    case 5:
    {
        deltemp(n, p);
        break;
    };
        
    }
}
free(p);
return 0;
}

Решение задачи: «После выполнения одной из функций другие функции перестают работать»

textual
Листинг программы
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int i, n, q = 1;
 
typedef struct _patient{
  char name[30];
  int temp;
  int pulse;
  int weight;
} patient;
 
void sortname(int, patient *);
void sorttemp(int, patient *);
void sortpulse(int, patient *);
void sortweight(int, patient *);
void deltemp(int *, patient *);
 
int main(int argc, char *argv[])
{
  patient *p;
  printf("Enter n:\t");
  scanf("%d", &n);
  p = (patient *)calloc(n, sizeof(patient));
  for (i = 0; i < n; i++){
    printf("Enter name:\t");
    scanf("%s", p[i].name);
 
    printf("Enter temp:\t");
    scanf("%d", &p[i].temp);
 
    printf("Enter pulse:\t");
    scanf("%d", &p[i].pulse);
 
    printf("Enter weight:\t");
    scanf("%d", &p[i].weight);}
 
  printf("\n");
  for (i = 0; i < n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
 
  while (q){
    printf("1. sort by name\n2. sort by temperature\n3. sort by pulse\n4. sort by weight\n5. filter\n0. exit\n");
    scanf("%d", &q);
    switch (q){
      case 1:{
        sortname(n, p);
        break;}
      case 2:{
        sorttemp(n, p);
        break;}
      case 3:{
        sortpulse(n, p);
        break;}
      case 4:{
        sortweight(n, p);
        break;}
      case 5:{
        deltemp(&n, p);
        break;}
    }
  }
  free(p);
  return 0;
}
 
void sortname(int n, patient *p)
{
  int i, flag = 1;
  patient *o = (patient *)malloc(sizeof(patient));
  while(flag){
    flag = 0;
    for (i = 0; i < n-1; i++){
      if(strcmp(p[i].name, p[i+1].name) > 0){
        flag = 1;
        memcpy(o, &p[i], sizeof(patient));
        memcpy(&p[i], &p[i+1], sizeof(patient));
        memcpy(&p[i+1], o, sizeof(patient));}
    }
  }
  free(o);
  printf("\n");
  for (i = 0; i < n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
}
 
void sorttemp(int n, patient *p)
{
  int i, flag = 1;
  patient *o = (patient *)malloc(sizeof(patient));
  while(flag){
    flag = 0;
    for (i = 0; i < n-1; i++){
      if(p[i].temp > p[i+1].temp){
        flag = 1;
        memcpy(o, &p[i], sizeof(patient));
        memcpy(&p[i], &p[i+1], sizeof(patient));
        memcpy(&p[i+1], o, sizeof(patient));}
    }
  }
  free(o);
  printf("\n");
  for (i = 0; i < n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
}
 
void sortpulse(int n, patient *p)
{
  int i, flag = 1;
  patient *o = (patient *)malloc(sizeof(patient));
  while(flag){
    flag = 0;
    for (i = 0; i < n-1; i++){
      if(p[i].pulse > p[i+1].pulse){
        flag = 1;
        memcpy(o, &p[i], sizeof(patient));
        memcpy(&p[i], &p[i+1], sizeof(patient));
        memcpy(&p[i+1], o, sizeof(patient));}
    }
  }
  free(o);
  printf("\n");
  for (i = 0; i < n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
}
 
void sortweight(int n, patient *p)
{
  int i, flag = 1;
  patient *o = (patient *)malloc(sizeof(patient));
  while(flag){
    flag = 0;
    for (i = 0; i < n-1; i++){
      if(p[i].weight > p[i+1].weight){
        flag = 1;
        memcpy(o, &p[i], sizeof(patient));
        memcpy(&p[i], &p[i+1], sizeof(patient));
        memcpy(&p[i+1], o, sizeof(patient));}
    }
  }
  free(o);
  printf("\n");
  for (i = 0; i < n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
}
 
void deltemp(int *n, patient *p)
{
  int i, j;
  for (i = 0; i < *n; i++){
    if(p[i].temp < 25){
      for (j = i; j < *n-1; j++){
        memcpy(&p[j], &p[j+1], sizeof(patient));}
      free(&p[*n-1]);
      (*n)--;
    }
  }
  printf("\n");
  for (i = 0; i < *n; i++){
    printf("%d. %s  %d  %d  %d\n", i+1, p[i].name, p[i].temp, p[i].pulse, p[i].weight);}
  printf("\n");
}

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

В данном коде реализована сортировка и фильтрация пациентов по различным критериям.

  1. sortname(int n, patient *p) - функция сортировки пациентов по имени.
  2. sorttemp(int n, patient *p) - функция сортировки пациентов по температуре.
  3. sortpulse(int n, patient *p) - функция сортировки пациентов по пульсу.
  4. sortweight(int n, patient *p) - функция сортировки пациентов по весу.
  5. deltemp(int *n, patient *p) - функция фильтрации пациентов по температуре. В основной функции main(int argc, char *argv[]) происходит следующее:
    • Сначала пользователю предлагается ввести количество пациентов n.
    • Затем выделяется память под массив пациентов p с помощью функции calloc(n, sizeof(patient)).
    • Далее пользователь вводит данные о пациентах (имя, температура, пульс, вес) с помощью функции scanf().
    • После ввода данных происходит их вывод с помощью цикла for.
    • Затем пользователю предлагается выбрать действие с помощью цикла while и функции scanf().
    • В зависимости от выбранного действия выполняется соответствующая функция сортировки или фильтрации.
    • В конце программы освобождается память с помощью функции free(). Возможная проблема с кодом может быть связана с неправильным освобождением памяти в функции deltemp(int *n, patient *p). Вместо free(&p[*n-1]) следует использовать free(p).

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


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

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

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