Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2136 / 487 | Длительность: 24:14:00
Лекция 2:

Общие сведения о языке С++

< Лекция 1 || Лекция 2: 123456 || Лекция 3 >

2.9 Ввод и вывод данных

Ввод-вывод данных в языке С++ осуществляется либо с помощью функций ввода-вывода в стиле С, либо с использованием библиотеки классов С++. Преимущество объектов С++ в том, что они легче в использовании, особенно если ввод-вывод достаточно простой. Функции ввода-вывода, унаследованные от С — громоздкие, но более гибко управляют форматированным выводом данных.

Функция

printf(строка форматов, список выводимых переменных);
		

выполняет форматированный вывод переменных, указанных в списке, в соответствии со строкой форматов.

Функция

scanf(строка форматов, список адресов вводимых переменных);
		

выполняет ввод переменных, адреса которых указанны в списке, в соответствии со строкой форматов.

Строка форматов содержит символы, которые будут выводиться на экран или запрашиваться с клавиатуры, и так называемые спецификации. Спецификации это строки, которые начинаются символом % и выполняют управление форматированием:

% флаг ширина.точность модификатор тип
		

Параметры флаг, ширина, точность и модификатор в спецификациях могут отсутствовать. Значения параметров спецификаций приведены в табл. 2.10.

Таблица 2.10. Символы управления
Параметр Назначение
Флаги
- Выравнивание числа влево. Правая сторона дополняется пробелами. По умолчанию выравнивание вправо.
+ Перед числом выводится знак "+" или "-"
Пробел Перед положительным числом выводится пробел, перед отрицательным "–"
# Выводится код системы счисления: 0 — перед восьмеричным числом, 0х (0Х) перед шестнадцатеричным числом.
Ширина
n Ширина поля вывода. Если n позиций недостаточно, то поле вывода расширяется до минимально необходимого. Незаполненные позиции заполняются пробелами.
On То же, что и n, но незаполненные позиции заполняются нулями.
Точность
ничего Точность по умолчанию
n Для типов e, E, f выводить n знаков после десятичной точки
Модификатор
h Для d, i, o, u, x, X тип short int.
l Для d, i, o, u, x, X тип long int.
Тип
c Символьный тип char.
d Десятичное int со знаком.
i Десятичное int со знаком.
o Восьмеричное int unsigned.
u Десятичное int unsigned.
x,X Шестнадцатеричное int unsigned, при х используются символы a-f, при Х — A - F.
f Значение со знаком вида [-]dddd.dddd.
e Значение со знаком вида [-]d.dddde[+|-]ddd.
E Значение со знаком вида [-]d.ddddE[+|-]ddd.
g Значение со знаком типа e или fв зависимости от значения и точности.
G Значение со знаком типа E или f в зависимости от значения и точности.
s Строка символов.

Кроме того, строка форматов может содержать некоторые специальные символы, которые приведены в табл. 2.11.

Таблица 2.11. Специальные символы
Символ Назначение
\b Сдвиг текущей позиции влево.
\n Перевод строки.
\r Перевод в начало строки, не переходя на новую строку
\t Горизонтальная табуляция.
\' Символ одинарной кавычки.
\" Символ двойной кавычки.
\? Символ ?

Первой строкой программы, в которой будут применяться функции вводавывода языка С, должна быть директива #include <stdio.h>. Заголовочный файл stdio.h содержит описание функций ввода-вывода.

Рассмотрим работу функций на примере следующей задачи.

Задача 2.2. Зная a, b, c — длины сторон треугольника, вычислить площадь S и периметр P этого треугольника.

Входные данные: a, b, c. Выходные данные: S, P.

Для вычисления площади применим формулу Герона: S=\sqrt{r\cdot(r-a)\cdot(r-b)\cdot(r-c)}, где r=\frac{a+b+c}{2} — полупериметр.

Далее приведены две программы для решения данной задачи и результаты их работы (рис. 2.7,рис. 2.8).

//ЗАДАЧА 2.2 Вариант первый
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main ( )
{
	float a, b, c, S, r; //Описание переменных.
	printf ( " a = " ); //Вывод на экран символов a=.
	//В функции scanf для вычисления адреса переменной применяется операция &.
	scanf ( " % f ",&a ); //Запись в переменную а значения введённого с клавиатуры .
	printf ( " b = " ); //Вывод на экран символов b=.
	scanf ( " % f ",&b ); //Запись в переменную b значения введённого с клавиатуры.
	printf ( " c = " ); //Вывод на экран символов c=
	scanf ( " % f ",&c ); //Запись в переменную c значения введённого с клавиатуры.
	r=(a+b+c ) / 2; //Вычисление полупериметра.
	S=sqrt ( r * ( r -a ) *( r -b )*( r -c ) ); //Вычисление площади треугольника.
	printf ( " S =%5.2 f \ t ", S ); //Вывод символов S=, значения S и символа табуляции \t.
	//Спецификация %5.2f означает, что будет выведено вещественное
	//число из пяти знаков, два из которых после точки.
	printf ( " p =%5.2 f \ n ",2 *r ); //Вывод символов p=, значения выражения 2*r
	//и символа окончания строки.
	//Оператор printf("S=%5.2f \t p=%5.2f \n",S,2*r) выдаст тот же результат.
	return 0;
}
		
Результаты работы программы к задаче 2.2 (вариант 1)

Рис. 2.7. Результаты работы программы к задаче 2.2 (вариант 1)
//ЗАДАЧА 2.2. Вариант второй
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main ( )
{
	float a, b, c, S, r;
	printf ( " Vvedite a, b, c \ n " ); //Вывод на экран строки символов.
	scanf ( " % f % f % f ",&a,&b,& c ); //Ввод значений.
	r=(a+b+c ) / 2;
	S=sqrt ( r * ( r-a ) * ( r-b ) * ( r -c ) );
	printf ( " S =%5.2 f \ t p =%5.2 f \ n ",S, 2 * r ); //Вывод результатов.
	return 0;
}
		
Результаты работы программы к задаче 2.2 (вариант 2)

Рис. 2.8. Результаты работы программы к задаче 2.2 (вариант 2)

2.9.1 Объектно-ориентированные средства ввода-вывода.

Описание объектов для управления вводом-выводом содержится в заголовочном файле iostream. При подключении этого файла с помощью директивы #include <iostream> в программе автоматически создаются объекты-потоки8Поток — виртуальный канал связи, создаваемый в программе для передачи данныхcin для ввода с клавиатуры и cout для вывода на экран, а также операции помещения в поток << и чтения из потока >>.

Итак, с помощью объекта cin и операции >> можно ввести значение любой переменной. Например, если переменная i описана как целочисленная, то команда cin>> i; означает, что в переменную i будет записано некое целое число, введённое с клавиатуры. Если нужно ввести несколько переменных, следует написать cin>>x>>y>>z; .

Объект cout и операция << позволяют вывести на экран значение любой переменной или текст. Текст необходимо заключать в двойные кавычки, кроме того, допустимо применение специальных символов \t и \n (табл. 2.11). Запись cout<<i; означает вывод на экран значения переменной i. А команда cout<<x<<"\t"<<y;выведет на экран значения переменных xи y, разделённые символом табуляции.

Задача 2.3. Дано трехзначное число. Записать его цифры в обратном порядке и вывести на экран новое число.

Разберём решение данной задачи на конкретном примере. Здесь будут использоваться операции целочисленной арифметики.

Пусть P=456. Вычисление остатка от деления числа P на 10 даст его последнюю цифру (количество единиц в числе P): 456 % 10 =6.

Операция деления нацело числа P на 10 позволит уменьшить количество разрядов и число станет двузначным:

456 / 10 = 45.
			

Остаток от деления полученного числа на 10 будет следующей цифрой числа P (количество десятков в числе P):

45 % 10 = 5.
			

Последнюю цифру числа P (количество сотен) можно найти так:

456 / 100 = 4.
			

Так как в задаче требовалось записать цифры числа P в обратном порядке, значит в новом числе будет 6 сотен, 5 десятков и 4 единицы:

S = 6*100 + 5*10 + 4 = 654.
			

Далее приведён текст программы, реализующей данную задачу для любого трехзначного числа.

#include <iostream>
using namespace std;
int main ( int argc, char *argv [ ] )
{
unsigned int P, S; //Определение целочисленных переменных без знака .
cout<<" P = "; //Вывод на экран символов P=.
cin >>P; //Ввод заданного числа P.
S=P%10*100+P/10%10*10+P/ 100; //Вычисление нового числа S .
cout<<" S = "<<S<<endl; //Вывод на экран символов S= и значения переменной S .
return 0;
}
			

Задача 2.4. Пусть целочисленная переменная i и вещественная переменная d вводятся с клавиатуры. Определить размер памяти, отведённой для хранения этих переменных и их суммы, в байтах. Вычислить, сколько памяти будет выделено для хранения строки С Новым Годом!.Вывести на экран размеры различных типов данных языка С++ в байтах.

Далее приведён текст программы.

#include <iostream>
using namespace std;
int main ( )
{
int i; //Определение целочисленной переменной .
double d; //Определение вещественной переменной .
cout<<" i = "; cin >>i; //Ввод переменной i .
cout<<" d = "; cin >>d; //Ввод переменной d .
//Размер памяти, отведённой под переменную i .
cout<<" Размер i : "<< sizeof i <<" \ n ";
//Размер памяти, отведённой под переменную d .
cout<<" Размер d : "<< sizeof d<<" \ n ";
//Размер памяти, отведённой под значение выражения i+d .
cout<<" Размер i + d : "<< sizeof ( i+d )<<" \ n ";
cout<<" Размер строки <С Новым Годом!>: ";
//Размер памяти, отведённой под строку.
cout<<sizeof " С Новым годом! "<<" \ n ";
//Вычисление размеров различных типов данных:
cout<<" Размер char : "<< sizeof ( char )<<" \ n ";
cout<<" Размер int : "<< sizeof ( int )<<" \ n ";
cout<<" Размер short int : "<< sizeof ( short int )<<" \ n ";
cout<<" Размер long int : "<< sizeof ( long int )<<" \ n ";
cout<<" Размер long long int : ";
cout<<sizeof ( long long int )<<" \ n ";
cout<<" Размер float : "<< sizeof ( float )<<" \ n ";
cout<<" Размер double : "<< sizeof ( double )<<" \ n ";
cout<<" Размер long double : "<<sizeof ( long double )<<" \ n ";
return 0;
}
			

Результаты работы программы9Обратите внимание, что при использовании кодировки utf-16 один кириллический символ занимает в памяти 2 байта.

i= 23
d= 45.76
Размер i: 4
Размер d: 8
Размер i+d: 8
Размер <С Новым годом!>:26
Размер char: 1
Размер int: 4
Размер short int: 2
Размер long int: 4
Размер long long int:8
Размер float: 4
Размер double: 8
Размер long double: 12
			
< Лекция 1 || Лекция 2: 123456 || Лекция 3 >
Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?