Создание и использование функций. Ввод строки с клавиатуры

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

   
Создадим функцию, вводящую строку символов с клавиатуры и возвращаю щую длину введенной строки. Такая функция 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 (в условии стоит i<lim-1, потому что номер последнего элемента массива, размерность которого lim, будет
    lim-1, а надо еще оставить место и для признака конца строки \0);
  • будет введен признак конца ввода (он должен быть задан в вызывающей программе так, чтобы был известен в этой функции);
  • ввод строки завершится, когда будет введен признак конца строки символ \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. Подключение отладчика к программе

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий