Читаем Основы программирования в Linux полностью

   count_all_entries;

   break;

  case mo_exit:

   break;

  case mo_invalid:

   break;

  default:

   break;

  } /* switch */

 } /* while */

6. Когда цикл в функции main завершится, закройте базу данных и вернитесь в окружение. Функция announce выводит приглашающее предложение:

 database_close;

 exit(EXIT_SUCCESS);

} /* main */


static void announce(void) {

 printf("\n\nWelcome to the demonstration CD catalog database \

  program\n");

}

7. Здесь вы реализуете функцию show_menu. Эта функция проверяет, выбран ли текущий элемент каталога, используя первый символ имени в каталоге. Если элемент каталога выбран, становятся доступными дополнительные пункты меню:

static menu_options show_menu(const cdc_entry *cdc_selected) {

 char tmp_str[TMP_STRING_LEN + 1];

 menu_options option_chosen = mo_invalid;

 while (option_chosen == mo_invalid) {

  if (cdc_selected->catalog[0]) {

   printf("\n\nCurrent entry: ");

   printf("%s, %s, %a, %s\n",

    cdc_selected->catalog, cdc_selected->title,

    cdc_selected->type, cdc_selected->artist);

   printf("\n");

   printf("1 - add new CD\n");

   printf("2 — search for a CD\n");

   printf("3 — count the CDs and tracks in the database\n");

   printf("4 — re-enter tracks for current CD\n");

   printf("5 - delete this CD, and all its tracks\n");

   printf("6 - list tracks for this CD\n");

   printf("q — quit\n");

   printf("\nOption: ");

   fgets(tmp_str, TMP_STRING_LEN, stdin);

   switch(tmp_str[0]) {

   case '1':

    option_chosen = mo_add_cat;

    break;

   case '2':

    option_chosen = mo_find_cat;

    break;

   case '3':

    option_chosen = mo_count_entries;

    break;

   case '4':

    option_chosen = mo_add_tracks;

    break;

   case '5':

    option_chosen = mo_del_cat;

    break;

   case '6':

    option_chosen = mo_list_cat_tracks;

    break;

   case 'q':

    option_chosen = mo_exit;

    break;

   }

  } else {

   printf("\n\n");

   printf("1 - add new CD\n");

   printf("2 - search for a CD\n");

   printf("3 — count the CDs and tracks in the database\n");

   printf("q — quit\n");

   printf("\nOption: ");

   fgets(tmp_str, TMP_STRING_LEN, stdin);

   switch(tmp_str[0]) {

   case '1':

    option_chosen = mo_add_cat;

    break;

   case '2':

    option_chosen = mo_find_cat;

    break;

   case '3':

    option_chosen = mo_count_entries;

    break;

   case 'q':

    option_chosen = mo_exit;

    break;

   }

  }

 } /* while */

 return(option_chosen);

}

Примечание

Учтите, что для выбора пунктов меню теперь используются номера, а не начальные буквы, применявшиеся в двух предыдущих примерах.

8. В программе есть несколько участков, в которых хотелось бы спросить пользователя о том, уверен ли он в своем запросе. Вместо того чтобы вставлять в эти места программный код, задающий вопрос, поместим его в отдельную функцию get_confirm:

static int get_confirm(const char *question) {

 char tmp_str[TMP_STRING_LEN + 1];

 printf("%s", question);

 fgets(tmp_str, TMP_STRING_LEN, stdin);

 if (tmp_str[0] == 'Y' || tmp_str[0] = 'y') {

  return(1);

 }

 return(0);

}

9. Функция enter_new_cat_entry позволяет вводить новый элемент каталога. Вам не нужно сохранять перевод строки, который возвращает функция fgets, поэтому отбросьте его:

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже