Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Общие сведения о языке С++
2.9 Ввод и вывод данных
Ввод-вывод данных в языке С++ осуществляется либо с помощью функций ввода-вывода в стиле С, либо с использованием библиотеки классов С++. Преимущество объектов С++ в том, что они легче в использовании, особенно если ввод-вывод достаточно простой. Функции ввода-вывода, унаследованные от С — громоздкие, но более гибко управляют форматированным выводом данных.
printf(строка форматов, список выводимых переменных);
выполняет форматированный вывод переменных, указанных в списке, в соответствии со строкой форматов.
scanf(строка форматов, список адресов вводимых переменных);
выполняет ввод переменных, адреса которых указанны в списке, в соответствии со строкой форматов.
Строка форматов содержит символы, которые будут выводиться на экран или запрашиваться с клавиатуры, и так называемые спецификации. Спецификации это строки, которые начинаются символом % и выполняют управление форматированием:
% флаг ширина.точность модификатор тип
Параметры флаг, ширина, точность и модификатор в спецификациях могут отсутствовать. Значения параметров спецификаций приведены в табл. 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.
Символ | Назначение |
---|---|
\b | Сдвиг текущей позиции влево. |
\n | Перевод строки. |
\r | Перевод в начало строки, не переходя на новую строку |
\t | Горизонтальная табуляция. |
\' | Символ одинарной кавычки. |
\" | Символ двойной кавычки. |
\? | Символ ? |
Первой строкой программы, в которой будут применяться функции вводавывода языка С, должна быть директива #include <stdio.h>. Заголовочный файл stdio.h содержит описание функций ввода-вывода.
Рассмотрим работу функций на примере следующей задачи.
Задача 2.2. Зная a, b, c — длины сторон треугольника, вычислить площадь S и периметр P этого треугольника.
Входные данные: a, b, c. Выходные данные: S, P.
Для вычисления площади применим формулу Герона: , где — полупериметр.
Далее приведены две программы для решения данной задачи и результаты их работы (рис. 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. Вариант второй #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.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