Определить, есть ли определённое лекарство заданных производителей по цене, не более заданной - C (СИ)
Формулировка задачи:
Подскажите, как исправить ошибку в программе. Нужно сформировать запрос по массиву строк "Лекарства. Аптеки". Нужно определить, есть ли определённое лекарство заданных производителей по цене, не более некоторой заданной.
Эта программа проводит сравнение только по цене, а должна ещё и по названию и по производителю. Подскажите, пожалуйста, что исправить в этой программе. Заранее СПАСИБО!!!
#include <stdio.h> #include <conio.h> #include <windows.h> #include <stdlib.h> #include <string.h> #define n 100 char g_buffer[225]; char *rus(char *str,char *buff) { if(str==buff) {return NULL;} CharToOem(str,buff); return buff; } int main() { int w=0,m; double x; do { system("cls"); printf("%s",rus("Введите количество наименований лекарств: ",g_buffer)); scanf("%d",&m); char s[m][n],s1[m][n],*srv,*word,*nazv,*nazv2,*pro,*pro2; int i,flag[m],f; double c; for(i=0;i<m;i++) flag[m]=0; printf("%s",rus("\nВведите лекарство по образцу:\n",g_buffer)); printf("%s",rus("<Название> <Страна-производитель> <Дата произв-ва> <Аптеки(№)> <Цена> \n",g_buffer)); fflush(stdin); for(i=0;i<m;i++) gets(s[i]); do { pro=(char*)calloc(n,sizeof(char)); pro2=(char*)calloc(n,sizeof(char)); word=(char*)calloc(n,sizeof(char)); nazv2=(char*)calloc(n,sizeof(char)); srv=(char*)calloc(n,sizeof(char)); nazv=(char*)calloc(n,sizeof(char)); fflush(stdin); for(i=0;i<m;i++) flag[m]=0; system("cls"); printf("%s",rus("\nВаш товар: \n",g_buffer)); for(i=0;i<m;i++) { puts(s[i]); } printf("\n"); printf("\n"); do { printf("%s",rus("\nВведите название лекарства: ",g_buffer)); gets(nazv); }while(*nazv=='\0'); do { printf("%s",rus("\nВведите производителя: ",g_buffer)); gets(pro); }while(*pro=='\0'); printf("%s",rus("\nВведите заданную цену: ",g_buffer)); scanf("%lf",&c); for(i=0;i<m;i++) strcpy(s1[i],s[i]); for(i=0;i<m;i++) { w=0; strcpy(srv,s1[i]); word=strtok(srv," -\"!?"); while(word!=NULL) { w++; x=atof(word); strcpy(nazv2,word); strcpy(pro2,word); switch(w) { case 1:if (strcmp(nazv,nazv2)==0){flag[i]=1;}break; case 2:if (strcmp(pro,pro2)==0){flag[i]=1;}break; case 5:if ((x<=c)&&(flag[i]==1)) {flag[i]=1;}else flag[i]=0;break; } word=strtok(NULL," -\"!?"); } } f=0; for(i=0;i<m;i++) if(flag[i]==1) f=1; if(!f) printf("%s",rus("\nПо вашему запросу ничего не найдено!",g_buffer)); else printf("%s",rus("\nВаш товар:\n",g_buffer)); for(i=0;i<m;i++) if(flag[i]==1) { puts(s[i]); } printf("\n"); printf("\n"); printf("%s",rus("\nПовторить запрос с заданным лекарством? Esc-нет, другая клавиша- да.\n",g_buffer)); free(nazv); free(nazv2); free(srv); free(word); free(pro); free(pro2); for(i=0;i<m;i++) flag[m]=0; }while (getch()!=27); printf("%s",rus("\nВыход? Esc-да, другая клавиша-нет.\n",g_buffer)); }while (getch()!=27); return 0; }
Решение задачи: «Определить, есть ли определённое лекарство заданных производителей по цене, не более заданной»
textual
Листинг программы
for(i=0;i<m;i++) { w=0; strcpy(srv,s1[i]); word=strtok(srv," -\"!?"); while(word!=NULL) { w++; x=atof(word); strcpy(nazv2,word); strcpy(pro2,word); switch(w) { case 1:if (strcmp(nazv,nazv2)==0){flag[i]=1;}break; case 2:if (strcmp(pro,pro2)==0){flag[i]=1;}break; case 5:if ((x<=c)&&(flag[i]==1)) {flag[i]=1;}else flag[i]=0;break; } word=strtok(NULL," -\"!?"); } }
Объяснение кода листинга программы
- Инициализируется счётчик
i
для циклаfor
, который будет выполнятьсяm
раз. - Каждая итерация цикла начинается с обнуления счётчика
w
. - Переменная
srv
получает значениеs1[i]
(возможно, это массив или строка). - Строка
srv
разбивается на отдельные слова с помощью функцииstrtok
, где пробел, дефис, двоеточие, восклицательный знак и вопросительный знак используются в качестве разделителей. - В каждой итерации цикла
while
обрабатывается одно слово изsrv
. - Переменная
w
увеличивается на 1 после каждой итерации циклаwhile
, так что она всегда равна количеству слов в текущем сервисе. - Каждое слово преобразуется в числовой формат с помощью функции
atof
. - Строки
nazv2
иpro2
получают значение текущего слова. - С помощью оператора
switch
проверяется, какое слово в сервисе является вторым или третьим (индексы 1 или 2). - Если слово совпадает с
nazv
илиpro
, то устанавливается флагflag[i]
равным 1. - В пятой итерации цикла
switch
проверяется, является ли числовое значение слова не большеc
, и если да, то устанавливается флагflag[i]
равным 1. В противном случае флаг сбрасывается в 0. - После каждой итерации цикла
while
функцияstrtok
возвращаетNULL
, чтобы указать на конец строки. - Цикл
for
продолжается до тех пор, пока все элементы массиваs1
не будут обработаны. - Флаг
flag[i]
в каждой итерации циклаfor
будет равен 1, если лекарство найдено, и 0 в противном случае.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д