
- •Л. Б. Бузюков, о. Б. Петрова
- •Учебное пособие
- •Предисловие
- •Глава 1. Введение в язык с
- •1.1. История создания и особенности языка с
- •1.3. Элементы языка с
- •1.3.1. Основные символы
- •1.3.2. Ключевые слова
- •1.3.3. Идентификаторы
- •1.3.4. Константы
- •1.3.5. Лексемы
- •1.3.6. Комментарии
- •Глава 2. Типы данных языка c
- •2.1. Числовые типы данных
- •2.2. Объявление переменных
- •2.3. Данные целого типа
- •2.4. Данные вещественного типа
- •Глава 3. Выражения
- •3.1. Операции
- •3.1.1. Арифметические операции
- •3.1.2. Операция присваивания
- •Глава 4. Составление простейших программ
- •4.1. Препроцессор и его функции
- •4.2. Основные директивы препроцессора
- •4.2.1. Директива include
- •4.2.2. Директива define
- •4.2.3. Директива undef
- •4.3. Структура и правила составления программ
- •4.3.1. Структура функции
- •4.3.2. Функция main()
- •4.3.3. Структура простой программы
- •4.3.4. Правила записи объявлений, операторов и комментариев
- •4.3.5. Пример простейшей программы
- •Глава 5. Средства ввода/вывода
- •5.1. Общие замечания
- •5.2. Функция форматированного вывода printf()
- •5.2.1. Основные форматы
- •5.2.2. Модификации форматов
- •5.3. Функция форматированного ввода scanf()
- •Глава 6. Управляющие операторы
- •6.1. Условные операторы
- •6.1.1. Логические выражения
- •6.1.2. Формы оператора if
- •6.1.3. Оператор выбора switch
- •6.2. Операторы цикла
- •6.2.1. Оператор while
- •6.2.2. Оператор for
- •6.2.3. Оператор do-while
- •6.3. Операторы перехода
- •6.3.1. Оператор break
- •6.3.2. Оператор continue
- •6.3.3. Оператор return
- •6.3.4. Применение оператора goto и меток
- •Глава 7. Функции
- •7.1. Основные понятия
- •7.2. Определение функции
- •7.3. Прототип функции
- •7.4. Вызов функции
- •Глава 8. Классы памяти
- •8.1. Логическаяструктура памяти программы
- •8.2. Особенности классов памяти
- •8.3. Объявления переменных
- •8.4. Объявления функций
- •8.5. Время жизни и область видимости программных объектов
- •8.6. Инициализация глобальных и локальных переменных
- •Глава 9. Указатели
- •9.1. Операция получения адреса
- •9.2. Операции над указателями
- •Глава 10. Массивы
- •10.1. Общие сведения о массивах
- •10.2. Одномерные массивы
- •10.3. Двумерные массивы
- •10.4. Массивы и указатели
- •10.5. Массивы и функции
- •Глава 11. Строки
- •11.1. Представление символьной строки при помощи одномерного массива
- •11.2. Указатель на символьную строку
- •11.3. Ввод/вывод символьных строк
- •11.4. Массивы символьных строк
- •11.5. Функции работы состроками
- •Глава 12. Структуры
- •12.1. Определение структуры
- •12.2. Структуры и функции
- •12.3. Указатели на структуру
- •12.4. Массивы структур
- •12.5. Вложенные структуры
- •12.6. Использование синонима типа
- •12.7. Объединения
- •Глава 13. Файлы
- •13.1. Работа с файлами
- •13.2. Функции ввода/вывода
- •Глава 14. Динамическая память
- •14.1. Распределение памяти
- •14.2. Функции управление памятью
- •Глава 15. Проект
- •15.1. Основы создания проекта
- •15.2. Пример создания проекта
- •Глава 17. Основы объектно-ориентированного программирования
- •17.1. Объектно-ориентированный подход
- •17.3. Конструкторы и деструкторы
- •17.4. Инкапсуляция
- •17.5. Полиморфизм
- •17.6. Наследование
- •17.7. Виды взаимодействия классов
- •17.8. Способы графического представления объектно-ориентированной задачи
- •18.2. Библиотека Win32 api
- •18.3. Библиотека owl
- •18.4. Библиотека vcl
- •18.5. Библиотека clx
- •18.6. Библиотека mfc
- •18.7. Библиотека OpenGl
- •19.3. Создание проекта
- •19.4. Редактирование проекта
- •19.5. Компиляция и выполнение программы
- •19.6. Файловая структура проекта
- •19.7. Создание консольного приложения
- •Глава 20. Разработка приложений для операционных систем windows
- •20.1. Взаимодействие программы и Windows
- •20.2. Компоненты библиотеки Win32 api
- •20.3.Функция WinMain()
- •20.4. Оконная процедура
- •20.5. Структура программы для ос Windows
- •20.6. Ресурсы Windows
- •20.7. Взаимодействие прикладной программы и устройств в Windows
- •Глава 21. Создание приложений для ос windows на основе библиотеки mfc
- •21.1. Обзор классов библиотеки mfc
- •21.2. Класс cString
- •21.3. Класс cFile
- •21.4. Класс cPoint
- •21.5. Класс cRect
- •21.7. Приложение, основанное на диалоге
- •21.8. Использование в приложении элементов управления
- •21.9. Мастер классов mfc ClassWizard
- •21.10. Установка начального значения элементам управления
- •21.11. Элементы управления Picture
- •21.12. Элемент управления Group Box
- •21.13. Элемент управления Radio Button
- •21.14. Элемент управления Check Box
- •21.15. Элемент управления List Box
- •21.16. Создание меню
- •21.17. Приложение с двумя диалоговыми панелями
- •21.18. Приложение sdi
- •21.19. Создание панели инструментов
- •21.20. Приложение mdi
- •21.21. Контекстыустройств в mfc
- •21.22. Графические объекты Windows в mfc
- •21.23. Графические операции в mfc
- •П.1. Основы методологии конструирования программ
- •П.1.1. Основные понятия. Программа и алгоритм
- •П.1.2. Этапы разработки программ
- •П.2. Алгоритмы
- •П.2.1. Алгоритм и его свойства
- •П.2.2. Способы описания алгоритмов
- •П.2.3. Средства графического изображения алгоритмов Схемы алгоритмов
- •Псевдокоды
- •Структурограммы
- •П.3. Основные приемы программирования
- •П.3.1. Разновидности структур программирования
- •П.3.2. Программирование линейных и разветвляющихся процессов
- •П.3.3. Программирование циклических процессов
- •Арифметический цикл (цикл с параметром)
- •Итерационный цикл
- •Вложенный цикл
- •Литература
5.3. Функция форматированного ввода scanf()
Структура (синтаксис) обращения к функции:
scanf("строка формата", список аргументов);
С помощью данной функции производится ввод с клавиатуры значений переменных, перечисленных в списке аргументов в формате, определенном строкой формата (см. 5.2.1). Функция преобразует последовательность вводимых символов в различные формы: целые числа, числа с плавающей точкой, символы и строки C.
Особенности функции:
в языке C в строке формата рекомендуется писать только спецификаторы форматов; количество спецификаторов должно быть равно числу аргументов в строке; каждый спецификатор имеет ту же структуру, что и в функции printf();
список аргументов может состоять из одного или нескольких аргументов; разделителем в списке аргументов служит [,];
в качестве аргументов функции используются только адреса переменных.
Задачей аргумента в данной функции является указание адреса ячейки памяти, куда должно быть помещено вводимое значение. Так, символ& обозначает операцию получения адреса переменной, т. е. конструкция &p обеспечивает ввод значения в ячейку памяти, где размещена переменная p.
При использовании функции scanf() необходимо помнить два правила:
при считывании значений для переменных простого типа перед именем переменной ставится символ &;
при считывании строки символ & не ставится, так как строковая переменная задается с помощью указателя.
В качестве примера приведем программу ввода с клавиатуры произвольного символа и воспроизведения на экране монитора как самого символа, так и его кода ASCII:
#include <stdio.h>
int main(void)
{
char c;
printf("\n Input your symbol");
scanf("%c",&c);
printf("\n Code of your symbol %c is equal %d",c, c);
return 0;
}
При выполнении программы в момент вызова функции scanf() программа приостанавливается в ожидании ввода данных. После ввода пользователем символа с клавиатуры и нажатия клавиши Enter выполнение программы будет продолжено.
Следует отметить, что иногда во время выполнения программы наблюдается пропуск ввода в символьную переменную. Причина такой ошибки – коды символов, оставшиеся в буфере клавиатуры после предыдущего ввода данных, обычно это бывают управляющие коды. В этом случае функция scanf() не останавливает работу программы в ожидании ввода данных, а считывает в символьную переменную код, сохранившийся в буфере клавиатуры после предыдущего ввода.
Чтобы избежать пропуска ввода, следует перед вводом в символьную переменную очистить буфер клавиатуры (входной поток stdin) с помощью функции fflush():
#include <stdio.h>
int main(void)
{
char c,d;
printf("Введите первый символ->");
scanf("%c",&c);
printf ("Введите второй символ->");
fflush(stdin); /* Очистка буфера клавиатуры */
scanf("%c",&d);
printf("Вы ввели: %c %c\n",c,d);
return 0;
}
Используя одну функцию scanf(), можно вводить значения переменных различных типов, например:
int a;
float b;
char c[25];
scanf ("% d %f %s",&a,&b,c);
Для ввода числовых значений можно применить следующие строки формата:
int a;
float b,w;
scanf ("%d%f%f",&a,&b,&w);
Если функция scanf() заполняет несколько переменных, при выполнении программы значения могут вводиться либо вместе в одной строке через пробел, либо каждое вводится в отдельной строке, и каждый ввод завершается нажатием клавиши Enter.
Часто программисты избегают пользоваться функцией scanf(). Если данные, прочитанные scanf(), не соответствуют строке формата, то функция может вести себя непредсказуемо.
Альтернативой мощной, но требовательной функции scanf() является использование функции gets(), которая читает вводимые данные в указанный программистом символьный буфер и, в отличие от функции scanf(), позволяет ввести строку с пробелами. Функция gets() также объявлена в заголовочном файле stdio.h.
Вводимые данные представляются в виде строки. Если введенные данные должны представлять числовые значения, то вызывается одна из функций atoi(), atol(), или atof() для преобразования строки соответственно в целое, длинное целое или вещественное число. Функции преобразования объявлены в заголовочном файле stdlib.h. Если данные, введенные с клавиатуры, не соответствуют ожидаемому типу данных, функции преобразования формируют код ошибки. Например, если atoi() не может выполнить преобразование в целое, она возвращает ноль. При успешном преобразовании – возвращает значение введенного целого числа.
Таким образом, можно представить следующую программу ввода числа:
#include <stdio.h > /*В stdio.h объявлена функция gets*/
#include <stdlib.h> /*В stdlib.h объявлены функции преобразования строк */
int main(void)
{
char c[10]; /*Объявление строки из 10 элементов*/
int age;
gets (c);
age=atoi(c);
…
return 0;
}
Следует отметить, что функция atoi() достаточно проста в использовании, но не очень надежна. Лучше для преобразования строки в целое использовать функцию strtol().