Пользователь выбирает из предложенного меню команду, вводя нужную букву. Например, чтобы отобразить всю инвентарную ведомость, нажмите букву "D".

Функция menu() вызывает библиотечную функцию C++ strchr(), которая имеет такой прототип.

char *strchr(const char *str, int ch);

Эта функция просматривает строку, адресуемую указателем str, на предмет вхождения в нее символа, который хранится в младшем байте переменной ch. Если такой символ обнаружится, функция возвратит указатель на него. И в этом случае значение, возвращаемое функцией, по определению будет истинным. Но если совпадения символов не произойдет, функция возвратит нулевой указатель, который по определению представляет собой значение ЛОЖЬ. Так здесь организована проверка того, являются ли значения, вводимые пользователем, допустимыми командами меню.

Функция enter() предваряет вызов функции input(), которая "подсказывает" пользователю порядок ввода данных и принимает их. Рассмотрим код обеих функций.

// Ввод элементов в инвентарную ведомость.

void enter()

{

 int i;

 // Находим первую свободную структуру.

 for(i=0; i

  if( !*invtry[i].item) break;

 // Если массив полон, значение i будет равно SIZE.

 if(i==SIZE) {

  cout << "Список полон.\n";

  return;

 }

 input (i);

}

// Ввод информации.

void input(int i)

{

 cout << "Товар: ";

  cin >> invtry[i].item;

 cout << "Стоимость: ";

  cin >> invtry[i].cost;

 cout << "Розничная цена: ";

  cin >> invtry[i].retail;

 cout << "В наличии: ";

  cin >> invtry[i].on_hand;

 cout << "Время до пополнения запасов (в днях): ";

  cin >> invtry[i].lead_time;

}

Функция enter() сначала находит пустую структуру. Для этого проверяется поле item каждого (по очереди) элемента массива invtry, начиная с первого. Если поле item оказывается пустым, то предполагается, что структура, к которой оно относится, еще ничем не занята. Если не отыщется ни одной свободной структуры при проверке всего массива структур, управляющая переменная цикла i станет равной его размеру. Это говорит о том, что массив полон, и в него уже нельзя ничего добавить. Если же в массиве найдется свободный элемент, будет вызвана функция input() для получения информации о товаре, вводимой пользователем. Если вас интересует, почему код ввода данных о новом товаре не является частью функции enter(), то ответ таков: функция input() используется также и функцией update(), о которой речь впереди.

Поскольку информация о товарах на складе может меняться, программа ведения инвентарной ведомости должна позволять вносить изменения в ее отдельные элементы. Это реализуется путем вызова функции update().

// Модификация существующего элемента.

void update()

{

 int i;

 char name[80];

 cout << "Введите наименование товара: ";

  cin >> name;

 for(i=0; i

  if(!strcmp(name, invtry[i].item)) break;

 if(i==SIZE) {

  cout << "Товар не найден.\n";

  return;

 }

 cout << "Введите новую информацию.\n";

 input(i);

}

Эта функция предлагает пользователю ввести наименование товара, информацию о котором ему нужно изменить. Затем она просматривает весь список существующих элементов, и если указанный товар в нем имеется, то вызывается функция input(), которая обеспечивает прием от пользователя новой информации.

Нам осталось рассмотреть функцию display(). Она выводит на экран инвентарную ведомость в полном объеме. Код функции display() выглядит так.

// Отображение на экране инвентарной ведомости.

void display()

{

 int t;

 for(t=0; t

  if(*invtry[t].item) {

   cout << invtry[t].item << '\n';

   cout << "Стоимость: $" << invtry[t].cost;

   cout << "\nB розницу: $";

   cout << invtry[t].retail << '\n';

   cout << "В наличии: " << invtry[t].on_hand;

   cout << "\nДо пополнения осталось: ";

   cout << invtry[t].lead_time << " дней\n\n";

  }

 }

}

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги