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