Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Символьный тип данных (тип char)

Поиск

В стандарте C++ нет типа данных, который можно было бы считать действительно символьным. Для представления символьной информации есть два типа данных, пригодных для этой цели, – это типы char и wchar_t.

Переменная типа char рассчитана на хранение только одного символа (например, буквы или пробела). В памяти компьютера символы хранятся в виде целых чисел. Соответствие между символами и их кодами определяется таблицей кодировки, которая зависит от компьютера и операционной системы. Почти во всех таблицах кодировки есть прописные и строчные буквы латинского алфавита, цифры 0,..., 9, и некоторые специальные символы. Самой распространенной таблицей кодировки является таблица символов ASCII (American Standard Code for Information Interchange – Американский стандартный код для обмена информацией).

Так как в памяти компьютера символы хранятся в виде целых чисел, то тип char на самом деле является подмножеством типа int.

Под величину символьного типа отводится 1 байт.

Тип char может использоваться со спецификаторами signed и unsigned. В данных типа signed char можно хранить значения в диапазоне от –128 до 127. При использовании типа unsigned char значения могут находиться в диапазоне от 0 до 255. Для кодировки используется код ASCII. Символы с кодами от 0 до 31 относятся к служебным и имеют самостоятельное значение только в операторах ввода-вывода.

Величины типа char также применяются для хранения чисел из указанных диапазонов.

Тип wchar_t предназначен для работы с набором символов, для кодировки которых недостаточно 1 байта, например в кодировке Unicode. Размер типа wchar_t равен 2 байтам. Если в программе необходимо использовать строковые константы типа wchar_t, то их записывают с префиксом L, например, L "Слово".

Например:

char c='c';

char a,b;

char r[]={'A','B','C','D','E','F','\0'};

char s[] = "ABCDEF";

Логический (булевый) тип данных (тип bool)

В языке С++ используется двоичная логика (истина, ложь). Лжи соответствует нулевое значение, истине – единица. Величины данного типа могут также принимать значения true и false.

Внутренняя форма представления значения false соответствует 0, любое другое значение интерпретируется как true. В некоторых компиляторах языка С++ нет данного типа, в этом случае используют тип int, который при истинных значениях выдает 1, а при ложных – 0. Под данные логического типа отводится 1 байт.

 

Вопрос 25. Операции над данными стандартных типов и их старшинство.

Знак Математическая операция
* Умножение
/ Деление и целочисленное деление нацело
% Деление по модулю и остаток от деления
+ Сложение
- Вычитание

 

Присваивание

В одной строке может стоять больше одной операции присваивания =.

Пример.

a=b=c=d=100;

Знак = всегда означает: "переменной слева присвоить значение, стоящее справа ". Операция выполняется справа налево. Поэтому первой значение 100 получает переменная d, затем с, b и а.

Знак присвоить может стоять даже внутри математического выражения:

value=5+(r=9-c)

Присваивание имеет более высокий приоритет, чем сложение и вычитание. Поэтому сначала переменной r будет присвоено значение 9-с. А затем переменная value получит значение 5+9-с.

Составное присваивание

При написании программы часто требуется изменить значение переменной. Например, требуется взять текущее значение переменной, прибавить или умножить это значение на какое-то выражение, а затем присвоить это значение той же переменной. Такие операции выполняют операторы составного присваивания.

Операция Пример Эквивалент
+ = B+ = 500; B= b+ 500;
- = С- = 50; C = с - 50;
* = D* = 1.2; D = d*1.2;
/ = F/ = 50; f = f/.50;
% = m% = 7; M = m% 7;

 

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

(тип данных) выражение

v=(double)age*f;

- переменная age временно преобразуется к типу с плавающей точкой двойной точности и умножается на переменную f.

 

Операции отношения

Операции Описание
= = Равно
> Больше
< Меньше
>= Больше или равно
<= Меньше или равно
!= Не равно

 

Операции инкремента (++) и декремента (-)

В языке C++ предусмотрены две уникальные операции, которые увеличивают или уменьшают значение переменной на 1.

Оператор Пример Описание Эквивалентное выражение
+ + i + +; Постфиксная i =i+1; или i+=1;
+ + + + i; Префиксная i =i+1; или i+=1;
- - i - -; Постфиксная i =i-1; или i-=1;
- - - - i; Префиксная i =i-1; или i-=1;

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

Операция sizeof

Имеет формат

sizeof данные

или

sizeof (тип данных)

Операция sizeof возвращает размер в байтах указанного в ней данного или типа данных.

Пример.

cout " "Размер типа float в байтах=\t" "sizeof (float)

Результат: 4.

Операция "запятая"

Дополнительная операция (,) не работает непосредственно с данными, а приводит к вычислению выражения слева направо. Эта операция позволяет Вам использовать в одной строке несколько выражений, разделенных запятой.

Оператор?:

(Условие)? (выражение1):(выражение2)

Если условие истинно, то выполняется выражение1, а если ложно, то выражение2.

Пример.

(а>b)? (ans =10):(ans=25);

или

ans=(a>b)?(10):(25);

Если а>b, то переменная ans получается значение 10, иначе - значение 0.25

Поразрядные операции

&, и

|,или

^ исключающее или

Логические бинарные операции (&&-конъюнкция(И) и || дизъюнкция (или))

Унарные операции:

& - операция получения адреса операнда

* - операция обращения по адресу, т.е. раскрытия ссылки, иначе операция разыменования (доступа по адресу к значению того объекта, на который указывает операнд (адрес)).

- - унарный минус- изменяет знак арифметического операнда.

+ - унарный плюс (введен для симметрии с унарным минусом)

! – логическое отрицание значения операнда.

++ - увеличение на единицу (инкремент или автоувеличение):

префиксная операция – увеличение значения операнда на 1 до его использования

постфиксная операция – увеличение значения операнда на 1 после его использования.

Операнд не может быть константой.

-- - уменьшение на 1 (декремент)

sizeof – операция вычисления размера(в байтах) для объекта того типа, который имеет операнд.

Бинарные операции:

- Аддитивные (+- сложение арифметических операндов, - вычитание арифметических операндов)

- Мультипликативные (* - умножение операндов арифметического типа, / - деление операндов арифметического типа, %- получение остатка от деления целочисленных операндов (деление по модулю))

-Операции сдвига (<<- сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда, >>- сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда)

-Операции отношения (сравнения) (> < <= >=!= = =-равно)

-Логические бинарные операции (&&-конъюнкция(И) и || дизъюнкция (или))

-Операции присваивания (=- присвоить значение выражения-операнда из правой части операнду левой части p=10.3 – 2*x, *= присвоить левой части произведение значений обоих операндов P*=2 эквивалентно P = P*2, /= P/=2.2-d эквивалентно P=P/ (2.2-d), %= N%3 эквивалентно N=N % 3;,+= присвоить операнду левой части сумму значений обоих операндов А+= В эквивалентно А=А+В, -= Х -=4.5 – z эквивалентно Х=Х – (4.2 – z),

-Запятая в качестве операции (несколько выражений, разделенных запятыми, вычисляются последовательно слева направо. В качестве результата сохраняются тип и результат самого правого значения).

Приоритеты операций задают последовательность вычислений в сложном выражении

 

Вопрос 26. Потоковый ввод и вывод информации в языке С++

Дело в том, что никакая полезная программа не может быть написана на языке С++ без привлечения библиотек, включаемых в конкретную среду (в компилятор) языка. Самая незаменимая из этих библиотек - библиотека ввода-вывода.

Потоки ввода-вывода

В соответствии с названием заголовочного файла iostream.h (stream - поток; "i" - сокращение от input - ввод; "o" - сокращение от output - вывод) описанные в этом файле средства ввода-вывода обеспечивают программиста механизмами для извлечения данных из потоков и для включения (внесения) данных в потоки. Поток определяется как последовательность байтов (символов) и с точки зрения программы не зависит от тех конкретных устройств (файл на диске, принтер, клавиатура, дисплей, стример и т.п.), с которыми ведется обмен данными. При обмене с потоком часто используется вспомогательный участок основной памяти - буфер потока.

В буфер потока помещаются выводимые программой данные перед тем, как они будут переданы к внешнему устройству. При вводе данных они вначале помещаются в буфер и только затем передаются в область памяти выполняемой программы. Использование буфера как промежуточной ступени при обменах с внешними устройствами повышает скорость передачи данных, так как реальные пересылки осуществляются только тогда, когда буфер уже заполнен (при выводе) или пуст (при вводе).

Работу, связанную с заполнением и очисткой буферов ввода-вывода, операционная система очень часто берет на себя и выполняет без явного участия программиста. Поэтому поток в прикладной программе обычно можно рассматривать просто как последовательность байтов. При этом очень важно, что никакой связи значений этих байтов с кодами какого-либо алфавита не предусматривается. Задача программиста при вводе-выводе с помощью потоков - установить соответствие между участвующими в обмене типизированными объектами и последовательностью байтов потока, в которой отсутствуют всякие сведения о типах представляемой (передаваемой) информации.

Используемые в программах потоки логически делятся на три типа:

• входные, из которых читается информация;

• выходные, в которые вводятся данные;

• двунаправленные, допускающие как чтение, так и запись.

Все потоки библиотеки ввода-вывода последовательные, т.е. в каждый момент для потока определены позиции записи и (или) чтения, и эти позиции после обмена перемещаются по потоку на длину переданной порции данных.

В соответствии с особенностями "устройства", к которому "присоединен" поток, потоки принято делить на

• стандартные,

• консольные,

• строковые и

• файловые.

В заключение перечислим отличительные особенности применения механизма потоков. Потоки обеспечивают:

• буферизацию при обменах с внешними устройствами;

• независимость программы от файловой системы конкретной операционной системы;

• контроль типов передаваемых данных;

• возможность удобного обмена для типов, определенных пользователем.

Под вводом-выводом в программировании понимается процесс обмена информацией между оперативной памятью и внешними устройствами: клавиатурой, дисплеем, магнитными накопителями и т. п. Ввод — это занесение информации с внешних устройств в оперативную память, а вывод — вынос информации из оперативной памяти на внешние устройства. Такие устройства, как дисплей и принтер, предназначены только для вывода; клавиатура — устройство ввода. Магнитные накопители (диски, ленты) используются как для ввода, так и для вывода.

Основным понятием, связанным с информацией на внешних устройствах ЭВМ, является понятие файла. Всякая операция ввода-вывода трактуется как операция обмена с файлами: ввод — это чтение из файла в оперативную память; вывод — запись информации из оперативной памяти в файл. Поэтому вопрос об организации в языке программирования ввода-вывода сводится к вопросу об организации работы с файлами.

Вспомним, что в Паскале мы использовали представления о внутреннем и внешнем файле. Внутренний файл — это переменная файлового типа, являющаяся структурированной величиной. Элементы файловой переменной могут иметь разный тип и, соответственно, разную длину и форму внутреннего представления. Внутренний файл связывается с внешним (физическим) файлом с помощью стандартной процедуры Assign. Один элемент файловой переменной становится отдельной записью во внешнем файле и может быть прочитан или записан с помощью одной команды. Попытка записать в файл или прочитать из него величину, не совпадающую по типу с типом элементов файла, приводит к ошибке.

Аналогом понятия внутреннего файла в языках Си/Си++ является понятие потока. Отличие от файловой переменной Паскаля состоит в том, что потоку в Си не ставится в соответствие тип. Поток — это байтовая последовательность, передаваемая в процессе ввода-вывода.

Поток должен быть связан с каким-либо внешним устройством или файлом на диске. В терминологии Си это звучит так: поток должен быть направлен на какое-то устройство или файл.

Основные отличия файлов в Си состоят в следующем: здесь отсутствует понятие типа файла и, следовательно, фиксированной структуры записи файла. Любой файл рассматривается как байтовая последовательность:

 

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

Стандартные потоки (istream, ostream, iostream) служат для работы с терминалом. Строковые потоки (istrstream, ostrstream, strstream) служат для ввода-вывода из строковых буферов, размещенных в памяти. Файловые потоки (ifstream, ofstream, fstream) служат для работы с файлами.

· ios базовый потоковый класс

· streambuf буферизация потоков

· istream потоки ввода

· ostream потоки вывода

· iostream двунаправленные потоки

· iostream_withassign поток с переопределенной операцией присваивания

· istrstream строковые потоки ввода

· ostrstream строковые потоки вывода

· strstream двунаправленные строковые потоки

· ifstream файловые потоки ввода

· ofstream файловые потоки вывода

· fstream двунаправленные файловые потоки

· Потоки для работы с файлами создаются как объекты следующих классов:

· ofstream - запись в файл;

· ifstream - чтение из файла;

· fstream - чтение/запись.

·

·

·

· Ввод/вывод в C++ осуществляется с помощью потоков библиотеки C++, доступных при подключении заголовочного файла iostream.h (в VC++.NET – объекта-заголовка iostream). Поток представляет собой объект какого-либо потокового класса.

· Потоковые классы сконструированы на основе базового класса ios:

· ios – базовый потоковый класс;

· istream – класс входных потоков;

· ostraem – класс выходных потоков;

· iostream – класс двунаправленных потоков ввода/вывода.

· В потоковые классы включены операторы добавления данных в поток << и извлечения данных из потока >>.

· На основе класса istream в библиотеке C++ объявлен объект-поток cin, представляющий собой стандартный буферизованный входной поток, связанный обычно с клавиатурой консоли. Извлечение данных из потока имеет следующую форму записи:

· int a;

· float b;

· cin >> a >> b;

· где a и b – переменные заданного типа, в которые помещаются данные из потока cin.

· В роли разделителей значений в потоке используются пробельные символы (пробел, знак табуляции, перевод строки), поэтому для ввода данных с помощью cin при выполнении программы следует ввести с клавиатуры значения следующими способами:

· 34 5.78 Enter

· или

· 34 Enter 5.78 Enter

· Ввод данных в поток завершается нажатием клавиши Enter. Если количество заполняемых переменных меньше, чем количество значений в потоке, из потока извлекается столько значений, сколько переменных надо заполнить, а остальные значения сохраняются в потоке и будут прочитаны при следующем извлечении данных из потока.

· На основе класса ostream объявлен объект-поток cout, представляющий собой стандартный буферизованный выходной поток, связанный обычно с дисплеем консоли.

· Форма записи добавления данных в поток следующая:

· cout << a << b;

· при этом значения переменных a и b выводятся на экран без разделителя и в формате, заданном по умолчанию. Перемещение курсора на следующую строку экрана после вывода данных не происходит.

· Для перевода курсора на новую строку используется манипулятор endl:

· cout << a <<" "<< b << endl;

· В этом примере значения переменных a и b на экране разделены пробелом, после вывода данных происходит переход на новую строку, а сами значения выводятся на экран в виде, соответствующем их типу: 34 5.78.

· Для потока cin определен специальный метод для ввода символов – getline(Str,Count), позволяющий в строковую переменную Str ввести из потока заданное количество символов(Count−1):

· char str1[128];

· cout <<"STR1-->";

· cin.getline(str1,9);

· cout << str1 << endl;

· Если при выполнении этого фрагмента программы ввести с клавиатуры последовательность символов abcdefghj, в переменную str1 будут помещены 8 символов и символ '\0', а на экране появится строка abcdefgh.

· В потоках cin и cout можно форматировать данные, для этого используются специальные манипуляторы, доступные через заголовочный файл iomanip.h.

· Пример

· Форматирование вывода в потоке cout:

· #include <iostream.h>

· #include <iomanip.h>

· int main(void)

· {

· //Выравнивание по левому краю – left, по правому краю – right

· cout.setf(ios_base::left);

· //Вывод с плавающей точкой – scientific, с фиксированной – fixed

· cout.setf(ios_base::scientific);

· //Точность вывода числа на экране

· cout << setprecision(3);

· double x=2.5,y=125.76435;

· //Ширина поля вывода числа – 15 знаков

· cout << setw(15) << x << setw(15) << y << endl;

· return 0;

· }

· Ответ на экране

  .       e +                   .       e +                

 



Поделиться:


Последнее изменение этой страницы: 2016-08-15; просмотров: 2565; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.191.93.122 (0.009 с.)