ПРОБЛЕМА ВВОДА

ПРОБЛЕМА ВВОДА

     Существует несколько способов последовательного ввода набора данных, скажем чисел. Мы обсудим здесь некоторые из них, переходя от менее удобных к более удобным.

     Вообще говоря, наименее удобный способ - это тот, который мы только что использовали; написание программы, допускающей ввод фиксированного числа элементов данных. (Такой способ, однако, прекрасно подходит для тех ситуаций, когда число входных данных никогда не изменяется.) Если число входных элементов данных изменяется, необходимо осуществить повторную компиляцию программы.

     Следующий шаг состоит в том, чтобы спросить у пользователя, сколько элементов данных будет введено. Так как размер массива в программе фиксирован, она должна проверить, не превышает ли величина, содержащаяся в ответе пользователя, размер массива. Затем пользователь может начать ввод данных. Тогда начало нашей программы можно переписать следующим образом:

printf(" Сколько элементов данных вы будете вводить ? ");

scanf(" %d", &nbr);

while(nbr > NUM)

{

printf("Я смогу обрабатывать не больше %d  элементов; пожалуйста, укажите");

printf("меньшую величину. ", NUM);

scanf("%d", &nbr);

 }

  /* гарантирует,

что nbr <= NUM - максимального размера массива */

for(i = 0; i <nbr; i++)

        scanf("%d", &score[i]);

Мы можем продолжить движение в этом направлении, заменяя в каждом случае символическую константу NUM в программе (исключая наличие ее в директиве #define и в описании массива) переменной nbr. При таком способе различные операции будут выполняться только над теми элементами массива, в которые введены данные.

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

Это подводит нас к следующему методу, при котором в программе осуществляется подсчет количества вводимых чисел. После всего сказанного выше очевидно, что у компьютеров имеются для этого вес возможности. Основная проблема здесь состоит в том, как сообщить компьютеру о завершении ввода чисел. Один из методов - дать пользователю возможность вводить специальный признак, указывающий на конец ввода. Признак должен принадлежать к данным того же типа, что и остальные вводимые данные, так как он должен быть прочитан тем же оператором программы. Но при этом он должен отличаться от обычных данных. К примеру, если бы мы вводили результаты игры, чтобы узнать, кто набрал от 0 до 100 очков, мы не могли бы выбрать число 74 в качестве такого признака, потому что оно может соответствовать некоторому возможному результату. С другой стороны, например, число 999 или - 3 вполне могло бы подойти в качестве такого признака, поскольку оно не соответствует требуемому результату.

 Ниже приводится программа, являющаяся реализацией этого метода:

#define STOP 999 /* признак завершения ввода */

#define NUM 50

main( )

{

int i, count, temp, score [NUM];

printf(" Начните ввод результатов. Введите 999 для указания ");

printf(" конца ввода. Максимальное число результатов, которое вы ");

printf(" можете ввести.- это %d. ", NUM);

count = 0;

scanf(" %d", &temp); /* вводвеличины*/

while(temp != STOP && count <= NUM) /* проверка наличия признака STOP */

{ /* и проверка, не произошло ли превышения размера массива */

score[count++] = temp;

/* запись величины в память и коррекция счетчика */

if(count < NUM + 1)

        scanf("%d", &temp); /* ввод очередного результата */

else

        printf("Я не могу принять больше данных. ");

}

printf("Bы ввели %d результатов, а именно: ", count);

for(i = 0; i < count; i++)

        printf("%5d ", scorc[i]);

}

     Мы вводим данные во временную переменную temp и присваиваем ее значение соответствующему элементу массива только в том случае, если оно не является признаком конца ввода. Совершенно не обязательно реализовывать все именно так; мы просто считаем, что указанный способ делает процесс проверки несколько более наглядным.

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

     Заметьте также, что мы воспользовались постфиксной формой операции увеличения. Поэтому, когда значение count равно 0, элементу массива score[0] присваивается величина переменной temp, а затем count возрастает на 1. После каждой итерации цикла while величина счетчика count становится на единицу больше последнего использованного индекса массива. Это как раз то, что нам нужно, поскольку score[0] - первый элемент, score[20] - 2-й элемент и т. д. Когда работа цикла в программе завершается, значение count оказывается равным полному чиcлу прочитанных элементов данных. Затем величина count используется в качестве верхней границы числа итераций для последующих циклов.

     Этот алгоритм хорошо работает, пока у нас имеется запас таких чисел, которые никогда не будут вводиться как данные. Но что делать, если мы захотим иметь программу, допускающую ввод в качестве данных любых чисел, относящихся к некоторому определенному типу? В таком случае мы не сможем использовать ни одно из чисел как признак конца ввода.

     Мы столкнулись с аналогичной проблемой, когда искали подходящий символ для признака End-of-File. Тогда было принято решение использовать для ввода символов специальную функцию(getchar( )), которая при обращении к ней фактически возвращала величину типа int. Это позволяло функции читать "символ" EOF, который на самом деле не был обычным символом. В рассматриваемом нами примере полезной оказалась бы функция, которая осуществляла бы ввод целых чисел, могла бы, кроме того, читать данные не только целого типа, но и использовать их в качестве признака конца ввода.

     Мы можем одновременно и обрадовать и огорчить вас: такое решение оказывается возможным, но вы должны узнать несколько больше о работе функций; поэтому обсуждение данной идеи откладывается до гл. 10.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Проблема выбора

Из книги Журнал `Компьютерра` N733 автора Журнал «Компьютерра»

Проблема выбора Автор: Олег ВолошинПохоже, что развитие цифровых камер достигло некоторого промежуточного потолка. Нет, разумеется, в техническом плане есть масса перспективных направлений.Тем не менее отличие новой камеры, выпущенной "на днях", от аналогичной, но


Проблема

Из книги Давайте создадим компилятор! автора Креншоу Джек


В чём ваша проблема?

Из книги Getting Real (на русском) [вычитывается] автора 37signals

В чём ваша проблема? Разрабатывайте ПО для себяПри создании программ большую часть времени будет занимать решение ваших собственных проблем. Вы и будете тем самым потенциальным клиентом, соответственно и знание о необходимом у вас уже есть. Это даёт вам отличное начало


Проблема тогда, когда это проблема

Из книги Компьютерра #27-28 (791-792) автора Автор неизвестен

Проблема тогда, когда это проблема Не тратьте бесцельно время на проблемы, которых у вас еще нетВам действительно нужно волноваться о вычислениях для 100 000 потребителей сегодня, если это будет у вас через два года?Действительно вам нужно нанять восемь программистов, если


ПРОБЛЕМА ЛЕБЕДЯ

Из книги Примеры использования Паттерн Singleton (Одиночка) автора Федоров Дмитрий


Проблема наследования

Из книги Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса автора Гусаров Михаил

Проблема наследования Если существует необходимость наследовать от класса Singleton, то следует придерживаться определенных правил.Во-первых, класс-наследник должен переопределить метод Instance(), так, чтобы создавать экземпляр производного класса. Если не предполагается, что


Но в чем тогда проблема?

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Но в чем тогда проблема? Обобщенный указатель всего лишь «прикидывается» указателем и не может быть использован везде, где используются обычные указатели. Например, возьмем адаптер указателя на функцию-член класса из STL:template<class R, class T> mem_fun_t<R, T> mem_fun(R (T::*pm)());


Техническая проблема

Из книги Инфобизнес на полную мощность [Удвоение продаж] автора Парабеллум Андрей Алексеевич

Техническая проблема Как же должен выглядеть повторно используемый модуль?


Проблема надежности

Из книги Введение в QNX/Neutrino 2. Руководство по программированию приложений реального времени в QNX Realtime Platform автора Кёртен Роб

Проблема надежности Допустим, разработчик управляет утилизацией объектов с помощью механизма reclaim. Возможность ошибочного вызова reclaim всегда существует; особенно при наличии сложных структур данных. В жизненном цикле ПО reclaim, бывшее когда-то правильным, может стать


Проблема

Из книги Антимозг [Цифровые технологии и мозг] автора Шпитцер Манфред

Проблема Рассмотрим пример стека, но уже не как АТД, а как класс. Мы знаем, как написать класс INTEGER_STACK, задающий стек объектов типа INTEGER. Компоненты будут включать count (число элементов), put (вталкивание элемента), item (элемент в вершине), remove (выталкивание элемента), empty (пустой ли


Проблема

Из книги Программирование для Linux. Профессиональный подход автора Митчелл Марк

Проблема Из этих примеров ясно: нам может понадобиться механизм удостоверения типа объекта.Решение этой проблемы, возникающей в специфических, но критически важных случаях, должно быть найдено без потери преимуществ ОО-стиля разработки. В частности, мы не хотим


Проблема типизации

Из книги автора

Проблема типизации Эффективное применение объектной технологии требует четкого описания в тексте системы типов всех объектов, с которыми она работает на этапе выполнения. Это правило, известное как статическая типизация (static typing), делает наше ПО:[x]. более надежным,


Итак, у вас проблема...

Из книги автора

Итак, у вас проблема... Мы обсудим первые две проблемы вместе, потому что подчас бывает трудно определить, с которой из них имеешь дело.Предположим, что что-то вдруг перестало работать или работает не так, как ожидается. Что


В чем заключается проблема?

Из книги автора

В чем заключается проблема? В 1913 г. Томас Эдисон, изобретатель лампы накаливания, патефона и кино, писал в одной нью-йоркской газете: «Книги скоро выйдут из употребления в школах. Есть возможность изучать любую отрасль человеческих знаний с помощью фильмов. Наша школьная


5.1.8. Проблема выбора

Из книги автора

5.1.8. Проблема выбора Благодаря совместному использованию памяти можно организовать быстрое двустороннее взаимодействие произвольного числа процессов. Любой пользователь сможет получать доступ к сегментам памяти для чтения/записи, но для этого программа должна