Массив не меняется, и третий scanf не позволяет мне ничего вводить - PullRequest
0 голосов
/ 05 августа 2020

Итак, эта программа предназначена для бронирования мероприятий. У меня было несколько проблем с этой программой, и я не могу придумать лучшего решения. программа не завершена. Я написал программу только для случая A. Я объяснил две проблемы ниже.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){
int i, j, day, x;
char session[10];
int array[2][5] = {{0,0,1,0,1},{1,1,0,0,0}};
char response,ans,choice;


printf("\n**************** WELCOME TO NAT RESERVATION SYSTEM ****************");


printf("\n\nCHOOSE WHAT TO DO");

printf("\n\n\t\tA.\t\tBOOK THE THEATER\n");
printf("\t\tB.\t\tCHECK RESERRVATIONS\n");
printf("\t\tC.\t\tREMOVE RESERVATIONS\n");
printf("\t\tD.\t\tCALCULATE INCOME\n");
printf("\t\tE.\t\tEXIT\n");

printf("\n\nYOUR RESPONSE\t\t:  ");
scanf(" %c",&response);


switch (response){
  case 'A': printf("\n\nBOOK THE THEATER"); break;
  case 'B': printf("\n\nCHECK RESERRVATIONS"); break;
  case 'C': printf("\n\nREMOVE RESERVATIONS"); break;
  case 'D': printf("\n\nCALCULATE INCOME"); break;
  case 'E': printf("\n\nEXIT"); break;
}

первая проблема: третий scanf не позволяет мне ничего вводить. Даже если я изменю его на scanf ("% c", & ans); происходит то же самое. Я попытался удалить пробел во 2-м сканировании, но когда я это сделаю, он не позволит мне ввести что-либо, но может ввести в 3-й сканф (надеюсь, вы понимаете мой вопрос)

if (response == 'A'){

  printf("\n\nCHOOSE A DAY     :   ");
  scanf("%d",&day);
  j = day -1;

  printf("YOUR SESSION     :   ");
  scanf(" %c",session);    //WHEN I REMOVE THE SAPCE IT DOESNT LET ME INPUT ANYTHING

  if(session[0] == 'M'){
    i = 0;
  }
  if(session[0] == 'A'){
    i = 1;
  }

  if(array[i][j] == 0){
    printf("\n\nTHE SESSION IS AVAILABLE.\nDO YOU WANT TO CONFIRM THE BOOKING?(Y/N)   :   ");
    scanf("%c",&ans);  //3RD SCANF IF I KEEP A SPACE IN THE SECOND SCANF, I CANT INPUT ANYTHING HERE

2-й проблема: массив [i] [j] равен 0 перед бронированием, поэтому после подтверждения бронирования массив [i] [j] должен быть 1. В качестве примера, если я хочу зарезервировать утреннюю сессию (i = 0) дня 1 ( j = 0). После того, как я ввел данные, он показывает, что сеанс доступен. Затем я подтверждаю бронирование, массив [0] [0] должен быть равен 1. Но опять же, если я введу те же данные, это покажет, что сеанс доступен. но я хочу, чтобы он отображал, что сеанс недоступен.

    if(ans == 'Y' || ans == 'y'){
      array[i][j] = 1;
      printf("\nYOUR BOOKING WAS SUCCESSFUL!\n\n");
      main();
      
    }
  }
  if(array[i][j] == 1){
    printf("\n\nTHE SESSION IS NOT AVAILABLE.");
    printf("\nDO YOU WANT TO TRY ANOTHER SESSION?(Y/N):  ");
    scanf(" %c",&ans);

    if(ans == 'Y' || ans == 'y'){
      main();
      
    }else if(ans == 'N' || ans == 'n'){
      printf("THANK YOU! HAVE A NICE DAY!");
      exit(0);
     }
   }  
 }

  return 0;
 }

любая помощь приветствуется. Спасибо

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Посмотрите на свой код:

scanf(" %c", session); // ... WHEN I REMOVE THE SAPCE ...

Тип session равен char[] (т.е. массив символов), но вы сохраняете только %c (один символ) в сеансе . Кроме того, вы не указали амперсанд, обозначающий местоположение памяти.

Таким образом, измените его на что-то вроде:

#define MAX 10
char session[MAX];
scanf("%s", session);

Другой метод - использовать fgets(), как указано в комментарии, но вам может потребоваться обрезать вызванную им новую строку:

#define MAX 10
char session[MAX];

fgets(session, MAX, stdin); // it'll accepts whitespaces too!
session[strlen(session) - 1] = '\0'; // to avoid the extra newline

И вы можете оставить пробел сейчас (SESSION AVAILABLE case):

scanf(" %c", &ans);

Подводя итог, вы всегда должны проверять, правильно ли был принят ввод (т.е. проверять, точно ли значение, возвращаемое scanf, переданным в нем параметрам), чтобы избежать странного поведения, генерируемого в программа.

0 голосов
/ 05 августа 2020

вместо использования% c вы можете попробовать% s в коде или использовать gets (session);

  if (response == 'A'){

          printf("\n\nCHOOSE A DAY     :   ");
          scanf("%d",&day);
          j = day -1;
          printf("YOUR SESSION     :   "); 

          //scanf(" %s",session);    //try this one 
          //gets(session);          //or this one
         }

         if(session[0] == 'M'){
          i = 0;
          }
          if(session[0] == 'A'){
           i = 1;
          }

         if(array[i][j] == 0){
         printf("\n\nTHE SESSION IS AVAILABLE.\nDO YOU WANT TO CONFIRM THE BOOKING? 
        (Y/N)   :   ");
         scanf("%c",&ans);  //3RD SCANF IF I KEEP A SPACE IN THE SECOND SCANF, I CANT 
         INPUT ANYTHING HERE
...