- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Форматированный ввод
Рассмотрим форматированный ввод функцией scanf.
int scanf(const char*, ...)
Функция принимает строку формата ввода (она похожа на строку формата printf) и адреса, по которым необходимо записать считанные данные. Возвращает количество успешно проинициализированных аргументов.
Формат спецификатора ввода
%[*][ширина][длинна]спецификатор
Спецификатор |
Описание |
Выбранные символы |
i, u |
Целые |
Произвольное число цифр (0-9), возможно, начинающихся с + или -. Если число начинается с 0, то считывается в восьмеричном формате, если с 0x, то в шестнадцатеричном. |
d |
Десятичное целое |
Произвольное число цифр (0-9), возможно, начинающихся с + или -. |
o |
восьмеричное целое |
Произвольное число цифр (0-7), возможно, начинающихся с + или -. |
x |
Шестнадцатеричное целое |
Произвольное число цифр (0-F), возможно, начинающихся с + или - и префикса 0x или 0X. |
f, e, g, а |
Число с плавающей точкой |
Число, состоящее из набора цифр 0-9, возможно с десятичным разделителем (точкой). Возможно также представление в экспоненциальной форме. C99 позволяет также вводить число в шестнадцатеричном формате. |
c |
Символ |
Если ширина не передана, то считывает один символ. Если ширина передана, то считывает нужное количество символов и размещает их в массиве БЕЗ терминального символа на конце. |
s |
Строка |
Считывает все не пробельные символы. Если указана ширина, то не более n символов. Ставит на место n+1 символа терминальный. |
p |
Адрес указателя |
Последовательность символов, трактуемая как адрес указателя. Формат зависит от реализации, но совпадает с тем, как выводит printf с ключом p |
[символы] |
Множество символов |
Считывает только те символы, которые записаны в квадратных скобках, С99 |
[^символы] |
Множество символов |
Считывает только те символы, которые не указаны в квадратных скобках, С99 |
n |
Ничего не считывает |
Сохраняет число уже считанных символов по указанному адресу |
Как и в printf, ширина, заданная символом * ожидает аргумента, который будт задавать ширину. Флаг длина совпадает с таким же флагом функции printf.
Примеры.
#include <stdio.h>
#include <conio.h>
void main() {
int year, month, day;
char buffer[128];
int count;
//Требует форматированного ввода, например 2013:12:12
printf("Enter data like x:x:x = ");
scanf("%d:%d:%d", &year, &month, &day);
printf("year = %d\nmonth = %d, day = %d\n", year, month, day);
//Считываем строку, не более 127 символов. При считывании в массив писать & не надо,
//так как массив подменяется указателем
printf("Enter string = ");
scanf("%127s", buffer);
printf("%s", buffer);
getch();
}
Кроме функций scanf и printf есть ещё ряд функций, которые позволяют получать вводимые данные.
int getch()
int getchar()
Возвращает введённый символ, при этом не выводит его на консоль.
#include <stdio.h>
#include <conio.h>
void main() {
char c = 0;
do {
c = getch();
printf("%c", c);
} while (c != 'q');
}
Функция fgets:
char * fgets ( char * str, int num, FILE * stream )
Функция позволяет считывать строку с пробельными символами. Несмотря на то, что она работает с файлом, можно с её помощью считывать и из стандартного потока ввода. Её преимущество относительно gets в том, что она позволяет указать максимальный размер считываемой строки и заканчивает строку терминальным символом.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main() {
char buffer[128];
//Считываем из стандартного потока ввода
fgets(buffer, 127, stdin);
printf("%s", buffer);
//Этим можно заменить ожидание ввода символа
scanf("1");
}
Это не полный набор различных функций символьного ввода и вывода. Таких функций много, но очень многие из них небезопасны, поэтому перед использованием внимательно читайте документацию.
