Program in C quits after procedure execution

-1

Good, This is the following, I am developing a program that is for evaluation, which consists of doing a medication management ... the goal is to have the features of adding and removing medicines, as well as your listing ... I have the problem that when choosing the listing the program lists everything ... but then ends. Here is the excerpt of code, thank you.

    int main(){
      setlocale(LC_ALL,"Portuguese");

      char *categorias[20] = {"Anti-Infeciosos", "Sistema Nervoso Central", "Aparelho Cardiovascular", "Sangue", "Aparelho Respiratório",\
                                    "Aparelho Digestivo", "Aparelho Geniturinário", "Doenças Endócrinas", "Aparelho Locomotor", " Medicação Antialérgica",\
                                    "Nutrição", "Corretivos da Volemia", "Afeções Cutâneas", "Afeções Otorrinolaringológicas", "Afeções Oculares",\
                                    "Antineoplásticos", "Intoxicações", "Vacinas", "Meios Digestivos", "Material Diverso"};

      char *viasAdministracao[10] = {"Oral", "Injetável", "Dermatológica", "Nasal", "Oftálmica", "Respiratória", "Auricular", " Sublingual",\
                                     "Intramuscular", "Retal"};
      int nMedicamentosInserido = 0;
      char opcao;
      struct medicamentos medicamento[2000];
      int armario [20][10], bit[20][10][10];
      int nr;

      do{

    printf("\n\n\t FARMÁCIA\
              \n1 Administração\
              \n2 Venda de Medicamentos\
              \n3 Listagem de Medicamentos\
            \n\n4 SAIR");
    printf("\n\nInsira uma opção: ");
    scanf(" %c",&opcao);

    switch (opcao) {

      case '1':{
        printf("\n\n1 Inserir medicamentos\
                  \n2 Gerir medicamentos fora de validade\
                  \n3 Inserir sócio");
        printf("\n\tInsira uma opção: ");
        scanf(" %c",&opcao);

        if(opcao == '1'){

          int categ, viaz;

          printf("\nInsira a sua categoria: ");
          scanf(" %i",&categ);
          fflush(stdin);

          printf("\nInsira a via de administração: ");
          scanf(" %i",&viaz);
          fflush(stdin);

          nr= (categ * 100) + (viaz * 10);

          if(armario[medicamento->categoria][medicamento->viaAdministracao] != 10){
          inserirMedicamento(&medicamento[nr + armario[medicamento->categoria][medicamento->viaAdministracao]], armario, bit, nMedicamentosInserido, categ, viaz);
          //nMedicamentosInseridos = nMedicamentosInseridos + MEDICAMENTO.quantidade;
          printf("\n%s",medicamento[nr].nomeMedicamento);

          nMedicamentosInserido++;


        }
        }
        break;
      }

      case '2':{
        vendaMedicamento(&medicamento[nr - armario[medicamento->categoria][medicamento->viaAdministracao]], armario, bit, categorias, viasAdministracao, nMedicamentosInserido);
        break;
      }

      case '3':{
        printf("\n\n1 Listagem de todos os medicamentos\
                  \n2 Listagem por categoria\
                  \n3 Listagem por via de administração\
                  \n4 Listagem por data de validade");
        printf("\nInsira uma opção: ");
        scanf(" %c",&opcao);

        if(opcao == '1'){
        listagemMedicamentos(medicamento, categorias, viasAdministracao);
        }
        if(opcao == '2'){
        listagemCategoria(medicamento, categorias, viasAdministracao, nMedicamentosInserido);
        }
        if(opcao == '3'){
        listagemVia(medicamento, categorias, viasAdministracao, nMedicamentosInserido);
        }
        if(opcao == '4'){
        listagemData(medicamento, categorias, viasAdministracao, nMedicamentosInserido);
        }
        break;
      }
    }
  }while (opcao != 0);
  return 0;
}


    void listagemMedicamentos(struct medicamentos* medicamento,char* categorias[], char* viasAdministracao[]){
    for( size_t i = 0; i < 2000; i++){
      if(medicamento[i].validade.mes != 0){
                 printf("\n\n\tNome: %s\n\tCategoria: %s\n\tVia de administração: %s\n\tData de validade: %i/%i/%i\n\tQuantidade: %i\n\tPreço: %1.f",\
                        medicamento[i].nomeMedicamento, categorias[medicamento[i].categoria], viasAdministracao[medicamento[i].viaAdministracao], medicamento[i].validade.dia,\
                        medicamento[i].validade.mes, medicamento[i].validade.ano, medicamento[i].quantidade, medicamento[i].preco);
          }
        }
      }
    
asked by anonymous 23.12.2017 / 11:44

1 answer

0

Since there are only excerpts from the code, there is no way to track everything, but if you do not get an error message, there is a logic problem.

Its input says that to exit the user inserts 4 and stores this in the option variable, but at the end of the block of {} while it says to repeat while option is different from 0, that is, its program has no output condition .

You reuse the option variable during cases 1 and 3, and test this variable out of the case's scope in {while}, generating unanticipated behavior.

It is likely that at some point you are assigning the value 0 to the option, and this causes the program to close when it arrives at the end of the {while}.

Recommendations: Use a different control variable for each flow control. Each switch must have its variable. Avoid this type of error.

I do not like the {} while, because it separates the block marker from the repeat condition, but it's valid.

    
23.12.2017 / 19:18