Определить, есть ли определённое лекарство заданных производителей по цене, не более заданной - 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," -\"!?");
}
}

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

  1. Инициализируется счётчик i для цикла for, который будет выполняться m раз.
  2. Каждая итерация цикла начинается с обнуления счётчика w.
  3. Переменная srv получает значение s1[i] (возможно, это массив или строка).
  4. Строка srv разбивается на отдельные слова с помощью функции strtok, где пробел, дефис, двоеточие, восклицательный знак и вопросительный знак используются в качестве разделителей.
  5. В каждой итерации цикла while обрабатывается одно слово из srv.
  6. Переменная w увеличивается на 1 после каждой итерации цикла while, так что она всегда равна количеству слов в текущем сервисе.
  7. Каждое слово преобразуется в числовой формат с помощью функции atof.
  8. Строки nazv2 и pro2 получают значение текущего слова.
  9. С помощью оператора switch проверяется, какое слово в сервисе является вторым или третьим (индексы 1 или 2).
  10. Если слово совпадает с nazv или pro, то устанавливается флаг flag[i] равным 1.
  11. В пятой итерации цикла switch проверяется, является ли числовое значение слова не больше c, и если да, то устанавливается флаг flag[i] равным 1. В противном случае флаг сбрасывается в 0.
  12. После каждой итерации цикла while функция strtok возвращает NULL, чтобы указать на конец строки.
  13. Цикл for продолжается до тех пор, пока все элементы массива s1 не будут обработаны.
  14. Флаг flag[i] в каждой итерации цикла for будет равен 1, если лекарство найдено, и 0 в противном случае.

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


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

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

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