Шаг 26.
Microsoft Visual C++ 2010. Язык С/С++.
Создание и использование функций. Ввод строки с клавиатуры

    На этом шаге мы рассмотрим особенности создания такой функции.

    Создадим функцию, вводящую строку символов с клавиатуры и возвращаю щую длину введенной строки. Такая функция getline() представлена ниже.

 int getline(char s[],int lim)
{
	int c,i;
	for(i=0; i<lim-1 && (c=getchar()) != eof && c != '\n'; i++)
		s[i]=c;
	s[i]='\0';
	i++;    //для учета количества 
	return i;
}

    Входным параметром функции является lim - ограничитель на количество вводимых в строку символов. Дело в том, что в языке С строка символов представляется в виде массива символов, а любой массив имеет свою конкретную размерность (количество элементов). Поэтому если символы будут вводиться в массив s[], размерность которого указана в вызывающей программе, то мы должны задавать параметр lim, значение которого не должно превосходить размерности массива (т. е. определенной длины строки). При определении функции можно писать s[], не указывая конкретной размерности, что удобно, т. к. такую функцию можно использовать в различных случаях, задавая разные размерности.

    Далее идет знакомый нам обычный цикл ввода по символу, организованный с помощью циклической конструкции for. Введенный функцией getchar() символ присваивается очередному элементу массива s[], так формируется строка. Ввод обеспечивается необходимостью вычисления условия продолжения/завершения цикла (цикл идет по переменной i):

  i<lim-1 && (c=getchar()) != eof && c != '\n';

    В момент вычисления этого выражения требуется ввести один символ с клавиатуры, иначе выражение не может быть вычислено. Цикл ввода может завершиться при нарушении хотя бы одного из выражений, связанных операцией "и":

    Первым в сложном условии продолжения/окончания цикла стоит выражение:

  i<lim-1
поскольку в языке С при вычислении такого рода выражений действует правило: если при вычислении части выражения становится ясным его значение, то вычисление всего выражения завершается. Этот принцип обеспечивает повышение скорости обработки. Поэтому если обнаружится, что выражение i<lim-1 нарушено (т. е. количество вводимых символов превосходит размерность массива), то не потребуется вводить очередной символ и проверять его на признак конца строки.

    Когда цикл ввода закончится, к введенным символам надо добавить признак конца строки, иначе строка в дальнейшем не сможет обрабатываться как строка. Этот символ добавляется и с его учетом корректируется количество введенных символов: к i добавляется единица, т. к. значение этой переменной фактически равно количеству введенных символов, хотя прямое назначение переменной i - формировать порядковый номер элемента массива, в который будет записываться очередной введенный символ.

    Оператор return i возвращает количество введенных символов. Здесь следует различать возвращаемые функцией значения. Результат ввода возвращается не только через возврат количества введенных символов, но и через массив s[], который играет роль выходного параметра.


   Замечание. Это возможно, потому что s (точнее s[0]) - это адрес первого элемента массива, как определено в языке С. Мы уже говорили, что в теле функции можно изменять значения тех переменных, которые передают в функцию не свои значения, а свои адреса. Массив s[] передан в функцию своим начальным адресом, поэтому мы и изменили значение s[0].

    Когда определяют функцию как подпрограмму, возвращающую обязательно какое-то значение, то имеют в виду, что речь идет о значениях, которые возвращает оператор return, а не о выходных параметрах. Если бы наш функция не возвращала количество введенных символов, то она "ничего не возвращала", и тогда мы бы определили тип возвращаемого значения как void. Функция, которая имеет тип void, не возвращает ничего. Функция может что-то возвращать, но не иметь совсем параметров. Тогда при ее создании пишут, например, float aaa(void) или float aaa(), а обращение к ней пойдет как float у=ааа().

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

    Детально посмотреть как работает функция или любая другая программ можно, воспользовавшись программой-отладчиком (Debugger), о которой мы упоминали на 17 шаге. Напомним, что включить его можно в любой точке программы, щелкнув мышью в поле подшивки Редактора текстов.

    При этом в поле подшивки редактора появится красный кружочек. Убрать точку останова (Breakpoint) можно, повторно щелкнув на красном кружочке. Запуск программы на выполнение должен осуществляться либо с помощью нг жатия клавиши F5, либо посредством команды Debug | Start Debugging (Отладка | Начать отладку). В обоих случаях включается режим отладки программы. От образовавшейся точки останова можно либо войти внутрь некоторой функции, нажав на клавишу F11, если мы остановились на этой функции, и тем самым проследить как она пошагово выполняется, либо дальше двигаться по тексту программы шаг за шагом, нажимая клавишу F10. При этом будут одновременно выполняться все операторы, находящиеся в той строке, на которую указывает желтая стрелка. Эта стрелка образуется в поле подшивки, когда после пуска програм мы происходит останов на заданной точке, и когда мы начинаем двигаться дальше с помощью клавиши F10, выполняя одну строку за другой. В этом случае мы имеем возможность просмотра значений переменных, что очень важно для процесса отладки программы: достаточно навести на имя переменной указатель мыши и немного подождать, как рядом с указателем мыши появится изображение содержимого переменной (рисунок 1).


Рис.1. Подключение отладчика к программе

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг