Основы алгоритмизации и программирования. Основы ввода-вывода

Содержание

Слайд 2

Содержание лекции Основы ввода-вывода Преобразование типов данных

Содержание лекции

Основы ввода-вывода
Преобразование типов данных

Слайд 3

Основы ввода-вывода (C) Основная задача программирования – обработка информации, поэтому любой

Основы ввода-вывода (C)

Основная задача программирования – обработка информации, поэтому любой язык

программирования имеет средства для ввода и вывода информации.
Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле cstdio.h. Эта библиотека содержит функции
printf() — для вывода информации
scanf() — для ввода информации.
Слайд 4

Вывод информации Функция printf() позволяет выводить на дисплей данные всех типов,

Вывод информации

Функция printf() позволяет выводить на дисплей данные всех типов, работать

со списком из нескольких аргументов и определять способ форматирования данных:
printf(, );
– строка символов, заключенных в кавычки, которая показывает, каким образом должны быть напечатаны аргументы .
Слайд 5

Вывод информации Строка форматирования состоит из следующих элементов: управляющих символов; текста,

Вывод информации

Строка форматирования состоит из следующих элементов:
управляющих символов;
текста, представленного для непосредственного

вывода;
спецификаций преобразований.
double pi = 3.1415926;
printf("The number PI is equal %f\n", pi);
// The number PI is equal 3.141593
Слайд 6

Спецификации преобразования Спецификация преобразования состоит из необязательных и обязательных полей, имеющих

Спецификации преобразования

Спецификация преобразования состоит из необязательных и обязательных полей, имеющих следующий

вид:
%[flags][width][.precision][size]type
Каждое поле спецификации преобразования — это символ или число, указывающее конкретный параметр формата или описатель преобразования:
обязательное поле type определяет тип преобразования, которое применяется к аргументу
необязательные поля flags, width и precision управляют дополнительными аспектами формата, такими как начальные пробелы или нули, выравнивание и отображаемая точность
поле size указывает размер использованного и преобразованного аргумента.
Слайд 7

Типы преобразований

Типы преобразований

Слайд 8

Пример #include int main() { int a = 5; float x

Пример

#include
int main() {
int a = 5;
float x = 2.78;
printf("a=%d\nx=%f\n", a,

x);
// a=5
// x=2.780000
return 0;
}
Слайд 9

Пример #include int main() { float x = 1.23456789; float y

Пример

#include
int main() {
float x = 1.23456789;
float y = 111.0 /

7;
printf("x = %10.4f\n", x);
printf("y = %10.4f\n", y);
// x = 1.2346
// y = 15.8571
return 0;
}
Слайд 10

Escape-последовательности

Escape-последовательности

Слайд 11

Ввод информации Функция scanf() является многоцелевой функцией, дающей возможность вводить в

Ввод информации

Функция scanf() является многоцелевой функцией, дающей возможность вводить в компьютер

данные любых типов. Указатели формата аналогичны тем, которые используются функцией printf():
scanf(, );
Для формирования адреса переменной используется символ &:
address = &object
Слайд 12

Пример #include int main() { float y; printf("Enter y: "); scanf("%f",

Пример

#include
int main() {
float y;
printf("Enter y: ");
scanf("%f", &y);
printf("You entered y=%f", y);
//

Enter y: 111
// You entered y=111.000000
return 0;
}
Слайд 13

Ввод/вывод в C #include int main() { char name[80]; printf("Enter the

Ввод/вывод в C

#include
int main() {
char name[80];
printf("Enter the name: ");
scanf("%s", name);
printf("Hello,

%s", name);
// Enter the name: test user
// Hello, test
return 0;
}
Слайд 14

Ввод/вывод в C #include int main() { char name[80]; printf("Enter the

Ввод/вывод в C

#include
int main() {
char name[80];
printf("Enter the name: ");
gets(name);
printf("Hello, %s",

name);
// Enter the name: test user
// Hello, test user
return 0;
}
Слайд 15

Еще пара примеров int x, y; printf("Calculator: "); scanf("%d + %d",

Еще пара примеров

int x, y;
printf("Calculator: ");
scanf("%d + %d", &x, &y);
printf("%d+%d=%d", x,

y, x+y);
// Calculator: 20 + 30
// 20+30=50
char name[5];
printf("Enter your login (>= 5 symbols):");
scanf("%5s", name);
printf("Your login: %s", name);
// Enter your login (>= 5 symbols):Long_login
// Your login: Long_
Слайд 16

Слайд 17

Базовый ввод/вывод (C++) iostream: содержит набор классов, функций и переменных для

Базовый ввод/вывод (C++)

iostream: содержит набор классов, функций и переменных для организации

ввода-вывода, включая потоки cin, cout, cerr и т.п.
iomanip: содержит информацию об манипуляторах ввода-вывода. Содержит методы, необходимые для управления потоками ввода-вывода, такие как setw, setprecision и т.п.
fstream: содержит набор классов, методов и функций, которые предоставляют интерфейс для чтения/записи данных из/в файл.
Слайд 18

Потоки в С++ Ввод/вывод в языке C++ реализован с помощью потоков

Потоки в С++

Ввод/вывод в языке C++ реализован с помощью потоков (stream).
Поток

— это последовательность символов, к которым можно получить доступ. Поток может производить или потреблять потенциально неограниченные объемы данных.
Поток ввода (или «входной поток») используется для хранения данных, полученных от источника данных: клавиатуры, файла, сети и т.д.
Поток вывода (или «выходной поток») используется для хранения данных, предоставляемых конкретному потребителю данных: монитору, файлу, принтеру и т.д.
Некоторые устройства, такие как файлы и сети, могут быть источниками как ввода, так и вывода данных.
Слайд 19

Базовый ввод/вывод Для ввода/вывода используется стандартная библиотека iostream. Она определяет несколько

Базовый ввод/вывод

Для ввода/вывода используется стандартная библиотека iostream. Она определяет несколько потоков

для ввода и вывода:
cout – чаще всего консольный вывод
cin – ввод данных пользователем
cerr, clog
endl – манипулятор, который используется только с выходными потоками и вставляет конец строки (\n) в поток и сбрасывает его.
Слайд 20

Базовый ввод/вывод Два оператора: >> – получить из входного потока (извлечение);

Базовый ввод/вывод

Два оператора:
>> – получить из входного потока (извлечение);
<< – поместить

в выходной поток (вставка).
Слайд 21

Пример int age; cout cin >> age; if (age cerr exit(1); } cout

Пример

int age;
cout << "Enter your age: " << endl;
cin >> age;
if

(age <= 0) {
cerr << "You entered an invalid age!\n";
exit(1);
}
cout << "You entered " << age
<< " years old\n";
Слайд 22

Пример: getline() string name; cout // We want to save name

Пример: getline()

string name;
cout << "Enter the name: ";
// We want to

save name with spaces:
// `cin >> name;` => name = "Test"
getline(cin, name); // => name = "Test User"
cout << "Entered name: " << name << endl;
Слайд 23

Управление вводом-выводом Для управления вводом-выводом в C++ используются флаги форматного ввода-вывода

Управление вводом-выводом

Для управления вводом-выводом в C++ используются флаги форматного ввода-вывода и

манипуляторы форматирования.
Флаги позволяют установить параметры ввода-вывода, которые буду действовать во всех последующих операторах ввода-вывода, до тех пор, пока не будут отменены.
Манипуляторы вставляются в операторы cin (cout) и устанавливают параметры текущего оператора ввода-вывода.
Слайд 24

Флаги форматного ввода-вывода Флаги позволяют включить или выключить один из параметров

Флаги форматного ввода-вывода

Флаги позволяют включить или выключить один из параметров вывода

на экран. Для установки флага вывода используется следующая конструкция языка C++.
cout.setf(ios::flag)
Для снятия флага используется конструкция
cout.unsetf(ios::flag)
здесь flag – имя конкретного флага.
Слайд 25

Флаги форматного ввода-вывода Если при выводе необходимо установить несколько флагов, то

Флаги форматного ввода-вывода

Если при выводе необходимо установить несколько флагов, то можно

воспользоваться логической операцией «или» (|). В этом случае конструкция будет такой.
cout.setf(ios::flag1|ios::flag2)
В данном случае flag1, flag2 – имена устанавливаемых флагов вывода.
Слайд 26

Флаги форматирования

Флаги форматирования

Слайд 27

Примеры int p = 404; cout.unsetf(ios::dec); cout.setf(ios::hex | ios::showbase); cout //

Примеры

int p = 404;
cout.unsetf(ios::dec);
cout.setf(ios::hex | ios::showbase);
cout << "p=" << p <<

endl;
// p=0x194
double p = 40440.4;
cout.setf(ios::scientific | ios::showpos);
cout << "p=" << p<< endl;
// p=+4.044040e+004
Слайд 28

Манипуляторы форматирования Манипуляторы встраиваются непосредственно в операторы ввода-вывода Для корректного использования

Манипуляторы форматирования

Манипуляторы встраиваются непосредственно в операторы ввода-вывода
Для корректного использования всех манипуляторов

необходимо подключить библиотеку iomanip с помощью оператора
#include
Слайд 29

Манипуляторы форматирования

Манипуляторы форматирования

Слайд 30

Примеры double p = 1234.65789; cout.setf(ios::fixed); cout // p= 1234.658 cout // x=####0.1429

Примеры

double p = 1234.65789;
cout.setf(ios::fixed);
cout << "p=" << setw(15)
<< setprecision(3) <<

p << endl;
// p= 1234.658
cout << "x=" << right << setw(10)
<< setprecision(4) << setfill('#')
<< (float) 1/7 << endl;
// x=####0.1429
Слайд 31

Примеры int r = -25; cout.setf(ios::right); cout.width(10); cout cout // ########r=-25

Примеры

int r = -25;
cout.setf(ios::right);
cout.width(10);
cout << setfill('#') << "r=" << r <<

endl;
cout << setfill('#') << setw(10) << "r=" << r;
// ########r=-25
double d = 1234.56789;
cout.precision(3);
cout.setf(ios::fixed);
cout << "d=" << d << endl;
cout << "d=" << setprecision(3) << d << endl;
// d=1234.568
Слайд 32

Флаги vs манипуляторы Флаги удобно использовать в тех случаях, когда следует

Флаги vs манипуляторы

Флаги удобно использовать в тех случаях, когда следует изменить

параметры всех последующих операторов ввода-вывода.
Использование большого количества флагов для управления одним или несколькими операторами ввода-вывода не совсем удобно, потом все установленные необходимо будет отключить.
Слайд 33

Слайд 34

Преобразования типов int main() { int count = 7; float avgWeight

Преобразования типов

int main() {
int count = 7;
float avgWeight =

155.5F;
double totalWeight = count * avgWeight;
cout << "Total weight: «
<< totalWeight << endl;
return 0;
}
Слайд 35

Преобразование типов C++ предполагает, что смешивание типов произошло сознательно и является

Преобразование типов

C++ предполагает, что смешивание типов произошло сознательно и является задумкой

программиста, следовательно не мешает ему реализовывать идеи.
Преобразование типов является одной из причин популярности языков C и C++.
Преобразование типов может быть неявным и явным.
Слайд 36

Неявные преобразования типов Все типы данных можно условно считать «ниже» или «выше» по отношению к другим:

Неявные преобразования типов

Все типы данных можно условно считать «ниже» или «выше»

по отношению к другим:
Слайд 37

Неявные преобразования типов Арифметические операции, действуют следующим образом: если их операнды

Неявные преобразования типов

Арифметические операции, действуют следующим образом: если их операнды имеют

различные типы, то операнд с более «низким» типом будет преобразован к более «высокому» типу.
Подобные преобразования типов данных происходят неявно, и обычно нет необходимости задумываться над ними, поскольку C++ сам выполняет то, что необходимо разработчику.
Слайд 38

Пример

Пример

Слайд 39

Явное преобразование типов В ряде случаев компилятор не столь понятно проводит

Явное преобразование типов

В ряде случаев компилятор не столь понятно проводит преобразования

типов. Например, при работе с объектами, разработчик оперирует собственными типами данных.
В таких ситуациях возникает необходимость применять переменные новых типов в смешанных выражениях, включающих в себя как стандартные, так и пользовательские типы данных.
Явные преобразования типов, в отличие от неявных, совершаются самим программистом. Они необходимы в тех случаях, когда компилятор не может безошибочно преобразовать типы автоматически.
Слайд 40

Явное преобразование типов В языке C++ есть 5 видов операций явного

Явное преобразование типов

В языке C++ есть 5 видов операций явного преобразования

типов:
конвертация C-style;
применение оператора static_cast;
применение оператора const_cast;
применение оператора dynamic_cast;
применение оператора reinterpret_cast.
Слайд 41

Явное преобразование типов Пример оператора, осуществляющего преобразование типа int к типу

Явное преобразование типов

Пример оператора, осуществляющего преобразование типа int к типу char:
int

number = 65;
char symbol = static_cast(number);
cout << "Number: " << number << endl;
cout << "Symbol in ASCII: " << symbol << endl;
Слайд 42

Явное преобразование типов int number = 1.5e9; // 1 500 000

Явное преобразование типов

int number = 1.5e9; // 1 500 000 000
number

= (number * 10) / 10;
cout << "number = " << number << endl;
// number = 211509811
number = 1.5e9; // 1 500 000 000
number = (static_cast(number) * 10) / 10;
cout << "number = " << number << endl;
// number = 1500000000
Слайд 43

Явное преобразование типов До появления стандартного C++ приведение типов осуществлялось в

Явное преобразование типов

До появления стандартного C++ приведение типов осуществлялось в несколько

ином формате. Если сейчас оператор с приведением типов выглядит так:
aCharVar = static_cast(anIntVar);
то раньше он записывался подобным образом:
aCharVar = (char)anIntVar;
aCharVar = char(anIntVar);
Слайд 44

Пример int i = 49; char ch = i; // неявное

Пример

int i = 49;
char ch = i; // неявное преобразование
Компилятор выдаст

предупреждение, т.к. конвертация типа int (4 байта) в тип char (1 байт) потенциально опасна.
Лучше записать:
int i = 49;
char ch = static_cast(i);
Слайд 45

Пример вопроса на экзамене Какой заголовочный файл следует подключить, чтобы можно

Пример вопроса на экзамене

Какой заголовочный файл следует подключить, чтобы можно было

пользоваться приведением типов данных?
iomanip
cmath
Никакого
cctype
Слайд 46

Пример вопроса на экзамене Укажите правильное приведение типа данных! char:a; to(char, a); (char)a; a(char);

Пример вопроса на экзамене

Укажите правильное приведение типа данных!
char:a;
to(char, a);
(char)a;
a(char);