
- •Г.В. Ваныкина, т.О. Сундукова
- •Часть 1. Введение в программирование Тула - 2009
- •Содержание
- •Предисловие
- •Лабораторная работа №1
- •Лабораторная работа №2 Типы данных. Стандартные потоки ввода-вывода данных
- •Лабораторная работа №3 Константы. Стандартные потоки ввода-вывода вещественных данных
- •Лабораторная работа №4 Форматированный ввод-вывод данных
- •Лабораторная работа №5 Присваивание. Арифметические операции
- •Лабораторная работа №6 Логические и поразрядные операции. Операции сравнения и определения размера
- •Лабораторная работа №7 Математические функции. Выражения
- •Математические функции – файл math.H
- •Лабораторная работа №8 Линейные программы. Преобразование типов
- •Лабораторная работа №9 Операторы выбора: оператор условия if
- •Лабораторная работа №10 Решение задач с использование оператора условия if
- •Лабораторная работа №11 Операторы перехода. Операторы выбора: оператор-переключатель switch
- •Лабораторная работа №12 Решение задач с использованием оператора-переключателя switch
- •Лабораторная работа №13 Операторы цикла: оператор цикла с параметром for
- •Лабораторная работа №14 Операторы цикла: оператор цикла с предусловие while
- •Лабораторная работа №15 Операторы цикла: оператор цикла с постусловием do … while
- •Лабораторная работа №16 Решение задач с использованием операторов цикла
- •Лабораторная работа №17 Функции пользователя
- •Лабораторная работа №18 Решение задач методом процедурной абстракции
- •Лабораторная работа №19 Рекурсивные функции
- •Индивидуальные задания Требования к оформлению индивидуальных заданий
- •Задание 1. Линейные программы
- •Задание 2. Задачи на составление логических выражений
- •Задание 3. Условный оператор
- •Задание 4. Цикл с параметром
- •Задание 5. Циклы с условиями
- •Задание 6. Числовые функции
- •Задание 7. Функции
- •Задание 8. Рекурсия
- •Литература
- •Часть 1. Введение в программирования
Лабораторная работа №4 Форматированный ввод-вывод данных
Цель работы: научиться работать с форматированным вводом-выводом данных в языке C++.
Теоретические сведения
Форматированный ввод-вывод данных организуется функциями scanf и printf соответственно. Их прототипы содержатся в заголовочном файле stdio.h. Название заголовочного файла есть объединение аббревиатур: std – standard (стандартный); i – input (ввод); o – output (вывод).
Функция printf переводит данные из машинного представления в символьное для вывода на экран. Функция scanf – в обратном направлении – при вводе данных с клавиатуры.
Форматированный вывод данных
Для функции printf приемлема следующая форма операторной записи:
printf ("СтрокаФормата", [Аргументы]);
где:
СтрокаФормата состоит из необязательных символов, приводимых пользователем, и символов, определяющих собственно спецификацию (-ции) формата(-ов) преобразования значений данных из машинного представления (последовательности нулей и единиц) в требуемый;
Аргументы – одно либо несколько имен соответственно объектов и ссылок на их адреса, перечисленных через запятую. Адрес памяти, которому поставлен в соответствие простой объект, извлекается операцией взятия адреса &, то есть описывается как &ИмяОбъекта.
Спецификации форматного вывода
Обобщенно спецификация формата вывода имеет в функции printf следующий вид (в в квадратных скобках ”[]” указаны необязательные элементы):
%[Флаги][Ширина][.Точность][Модификатор]Тип
где:
Флаги – необязательная последовательность символов, указывающих форму вывода (выравнивание вывода, знак числа, десятичная точка, конечные нули, восьмеричные и шестнадцатеричные префиксы);
Флаг |
Название |
Описание |
– |
знак минуса, код ASCII #45 |
выводимое значение выравнивается по левому краю в пределах минимальной ширины поля (если флаг не указан – по правому) |
+ |
знак плюс |
всегда указывать знак (+ или –) для выводимого десятичного числового значения (если флаг не указан, то знак выводится только для отрицательных чисел) |
|
пробел |
помещать перед результатом пробел, если первый символ значения не знак. Символ + имеет больший приоритет, чем пробел. Используется только для десятичных числовых значений. |
# |
диез |
«альтернативная форма» вывода значения |
0 |
символ нуля |
дополнять поле символом '0' до ширины, указанной в поле ширина управляющей последовательности. Символ «минус» имеет больший приоритет, чем '0'. Используется для типов d, i, o, u, x, X, a, A, e, E, f, F, g, G. Для типов d, i, o, u, x, X, если точность указана, этот флаг игнорируется. Для остальных типов поведение не определено. |
Ширина – максимальное число выводимых символов с учетом дополнения нулями и пробелами;
Точность – максимальное число позиций, предоставляемых для вывода значений данных. Спецификатор звездочка '*' в позициях Ширина и/или Точность означает, что число выводимых символов определяется текущим значением аргумента.
Модификатор замещает размер аргумента, принятый по умолчанию,
например: h – short int;
l – long int;
L – long double;
Тип – символ типа преобразования данных. Значения типов (спецификаторы) формата вывода:
Символ формата |
Тип |
Описание |
%i |
int |
десятичное целое число |
%d |
int |
десятичное целое число |
%o |
int |
восьмеричное беззнаковое число (без нуля слева) |
%u |
unsigned int |
десятичное беззнаковое целое число |
%x, %X |
int |
шестнадцатеричное беззнаковое число (без '0х' или '0Х' слева) |
%ld |
long |
десятичное целое число |
%lo |
long |
восьмеричное беззнаковое число (без нуля слева) |
%lu |
unsigned long |
десятичное беззнаковое целое число |
%lx, %lX |
long |
шестнадцатеричное беззнаковое число (без '0х' или '0Х' слева) |
%с |
char |
одиночный символ |
%s |
строка символов |
строка символов |
%f, %F |
float/double |
десятичное вещественное число c фиксированной точкой, количество знаков в дробной части по умолчанию равно 6 |
%e, %E |
float/double |
десятичное вещественное число с плавающей точкой, количество знаков в дробной части по умолчанию равно 6 |
%g, %G |
float/double |
десятичное вещественное число (в виде %f или %е в зависимости от значения) |
%lf,%lF |
double / long double |
десятичное вещественное число c фиксированной точкой |
%le, %lE |
double / long double |
десятичное вещественное число с плавающей точкой |
%lg, %lG |
double / long double |
десятичное вещественное число (в виде %f или %е в зависимости от значения) |
Пример 1.
//Программа форматированного вывода символов
#include <stdio.h>
void main(){
char s='Z';
printf("\n\t%c",s);
printf("\n\t%5c",s);
printf("\n\t%-5c",s);
}
Пример 2.
//Программа форматированного вывода целого числа со знаком
#include <stdio.h>
void main(){
int g=123;
printf("\n%d",g);
printf("\n%+d",g);
printf("\n% d",g);
}
Пример 3.
// Программа форматированного вывода вещественного числа
#include <stdio.h>
void main(){
float p=164.153;
printf("\n%f",p);
printf("\n%.2f",p);
printf("\n%12.2f",p);
printf("\n%4.1f",p);
printf("\n%E",p);
}
Форматированный ввод данных
Для функции scanf приемлема следующая форма операторной записи:
scanf ("СтрокаФормата", АдресаАргументов);
где:
СтрокаФормата состоит из необязательных символов, приводимых пользователем, и символов, определяющих собственно спецификацию (-ции) формата(-ов) преобразования значений вводимых данных в машинное представление (последовательности нулей и единиц);
АдресаАргументов – одно либо несколько имен соответственно объектов и ссылок на их адреса, перечисленных через запятую. Адрес памяти, которой поставлен в соответствие простой объект, извлекается операцией взятия адреса &, то есть описывается как &ИмяОбъекта.
Для функции scanf спецификация СтрокаФормата имеет синтаксис:
%[*][Ширина][Модификатор]Тип
где:
* – вводимое значение не присваивать переменной;
Ширина – максимальное число вводимых символов;
Модификатор – один из символов h – short int;
l – long int;
L – long double;
Тип – символ типа. Значения типов (спецификаторы) формата ввода:
Символ формата |
Тип |
Описание |
%i |
int |
целое число; оно может быть восьмеричным (с нулем слева) или шестнадцатеричное (с '0х' или '0Х' слева) |
%d |
int |
десятичное целое число |
%o |
int |
восьмеричное целое число (с нулем слева или без него) |
%u |
unsigned int |
десятичное беззнаковое целое число |
%x, %X |
int |
шестнадцатеричное целое число (с '0х' или '0Х' слева или без них) |
%с |
char |
символ |
%s |
строка символов |
строка символов (вводится без кавычек) |
%f, %F %e, %E %g, %G |
float |
десятичное вещественное число, возможно со знаком; обязательно присутствие либо десятичной точки, либо экспоненциальной части, а возможно обеих вместе |
%lf, %lF %le, %lE %lg, %lG |
double / long double |
В СтрокеФормата функции scanf могут быть указаны любые символы (кроме символов пробела, табуляции, новой строки и '%'). Причем при запросе выполняемой программы эти символы (называемые образцом ввода) должны быть введены с клавиатуры в указанной последовательности.
Пример 4.
// Программа форматированного ввода-вывода данных
#include <stdio.h>
void main(){
int t;
float p;
char s;
scanf("%c",&s);
printf("s=%c\n",s);
scanf("%d",&t);
printf("t=%d\n",t);
scanf("%f",&p);
printf("p=%f\n",p);
}
Пример 5.
//Программа форматированного ввода-вывода данных
#include <stdio.h>
void main(){
int year, /*год рождения*/
height, /*рост*/
weight;/*вес*/
printf("Введите год рождения \n");
scanf("%d", &year);
printf("Введите рост \n");
scanf("%d", &height);
printf("Введите вес \n");
scanf("%d", &weight);
printf("\nВведенные данные: год рождения %d, рост %d,
вес %d\n", year, height, weight);
}
Ввод-вывод одиночных данных
Чтение символа, вводимого с клавиатуры, осуществляется функцией getchar, а его вывод на экран – putchar. При этом символ считается введенным, если после его набора нажата клавиша Enter.
Прототип первой функции выглядит так:
int getchar();
Эта функция считывает вводимый символ, и его значение переводится в тип int.
Прототип второй функции:
int putchar(char ch);
Функция выводит на экран символ, помещенный в ch. Если вывод прошел успешно, то функция возвращает значение целого типа, иначе – EOF (то есть 1).
Пример 6.
//Программа вывода на экран символа D.
#include <stdio.h>
void main(){
char S=’D’;
printf("\nВывод отдельного символа=>");
putchar(S);
}
Результат выполнения программы:
Вывод отдельного символа=> D
Пример 7.
/*Программа ввода и отображения на экране одиночного символа.*/
#include <stdio.h>
void main(){
char S;
printf("\nВведите любой символ=>");
S=getchar();
printf("\nВведен символ=>%с", S);
}
Результат выполнения программы:
Введите любой символ=> Q
Введен символ=>Q
Задания
Наберите коды программ из Примеров 1, 2 и 3. Сохраните коды программ. Выполните компиляцию и запуск программ. Введите свои данные в качестве входных. Поясните комментариями к программному коду формат выходных данных.
Наберите код программы из Примера 4. Сохраните код программы. Выполните компиляцию и запуск программы. Введите свои данные в качестве входных. Поясните комментариями к программному коду формат входных и выходных данных.
Напишите программу, которая выводит на экран четверостишие через форматированный ввод-вывод. Используйте в начале каждой выводимой строки горизонтальную табуляцию.
Унылая пора! Очей очарованье!
Приятна мне твоя прощальная краса —
Люблю я пышное природы увяданье,
В багрец и золото одетые леса.
А. С. Пушкин
Домашние задания
Наберите код программы из Примера 5. Сохраните код в файле с именем formio.cpp. Выполните компиляцию и запуск программы. Введите свои данные в качестве входных.
Наберите коды программ из Примера 6 и 7. Сохраните коды в файлы с именами symbol.cpp и onesymb.cpp. Выполните компиляцию и запуск программ.
Написать программу ввода значений переменных h и l (типа float), которые содержат высоту и длину прямоугольника. Выведите перед значением каждой переменной пояснительный текст (высота=, ширина=), а после – единицы измерения (см). Используйте форматированный ввод-вывод данных.