После выполнения одной из функций другие функции перестают работать - 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");
}
Объяснение кода листинга программы
В данном коде реализована сортировка и фильтрация пациентов по различным критериям.
sortname(int n, patient *p)- функция сортировки пациентов по имени.sorttemp(int n, patient *p)- функция сортировки пациентов по температуре.sortpulse(int n, patient *p)- функция сортировки пациентов по пульсу.sortweight(int n, patient *p)- функция сортировки пациентов по весу.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).
- Сначала пользователю предлагается ввести количество пациентов