Студопедия — Преобразование типов данных
Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

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






В C++ различают два вида преобразования типов данных: явное и неявное.

· Неявное преобразование происходит автоматически. Это выполняется во время сравнения, присваивания или вычисления выражения различных типов. Например, следующая программа выведет на консоль значение типа float.

 

1 2 3 4 5 6 7 8 9 10 #include "stdafx.h"#include <iostream>; using namespace std; int main() { int i=5; float f=10.12; cout<<i/f; system("pause>>void"); return 0; }

 

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

· Явное преобразование в отличие от неявного осуществляется программистом. Существует несколько способов такого преобразования:

1. Преобразование в стили C: (float)a

2. Преобразование в стили C++: float()

Также приведения типов может осуществляться при помощи следующих операций:

 

1 2 3 4 static_cast <> () const_cast <> () reinterpret_cast <> () dynamic_cast <> ()

 

static_cast - осуществляет преобразование связанных типов данных. Этот оператор приводит типы по обычным правилам, что может потребоваться в случае, когда компилятор не выполняет автоматическое преобразование. Синтаксис будет выглядеть так:

Типstatic_cast<Тип> (объект);

С помощью static_cast нельзя убрать константность у переменной, но это по силам следующему оператору. const_cast — применяется только тогда, когда нужно снять константность у объекта. Синтаксис будет выглядеть следующим образом:

Типconst_cast<Тип> (объект);

reinterpret_cast - применяется для преобразования указателей разных типов, целых к указателю и наоборот. Если вы увидели новое слово «указатель» — не пугайтесь! это тоже тип данных, но работать с ним Мы будем не скоро. Синтаксис тут такой же как, у ранее рассмотренных операторах:

Типreinterpret_cast<Тип> (объект);

dynamic_cast — используется для динамического преобразования типов, реализует приведение указателей или ссылок. Синтаксис:

Типdynamic_cast<Тип> (объект);

7Программирование ввода и вывода.

Функция printf() позволяет выводить информацию на экран при программировании в консольном режиме. Данная функция определена в библиотеке stdio.h и имеет следующий синтаксис:

int printf(const char * format [, argument]...);

Здесь первый аргумент *format определяет строку, которая выводится на экран и может содержать специальные управляющие символы для вывода переменных. Затем, следует список необязательных аргументов, которые поясняются ниже. Функуция возвращает либо число отображенных символов, либо отрицательное число в случае своей некорректной работы.

В самой простой реализации функция printf() просто выводит заданную строку на экран монитора:

printf("Привет мир.");

Однако с ее помо щь ю можно выводить переменные разного типа: начиная с числовых и заканчивая строковыми. Для выполнения этой операции используются специальные управляющие символы, которые называются спецификаторами и которые начинаются с символа %. Следующий пример демонстрирует вывод целочисленной переменной num на экран монитора с помо щь ю функции printf():

int num;

num = 5;

printf("%d", num);

В первых двух строках данной программы задается переменная с именем num типа int. В третьей строке выполняется вывод переменной на экран. Работа функции printf() выглядит следующим образом. Сначала функция анализирует строку, которую необходимо вывести на экран. В данном случае это «%d». Если в этой строке встречается спецификатор, то на его место записывается значение переменной, которая является вторым аргументом функции printf(). В результате, вместо исходной строки «%d» на экране появится строка «5», т.е. будет выведено число 5.

Следует отметить, что спецификатор «%d» выводит только целочисленные типы переменных, например int. Для вывода других типов следует использовать другие спецификаторы. Ниже перечислены основные виды спецификаторов:

%с - одиночный символ

%d - десятичное целое число со знаком

%f - число с плавающей точкой (десятичное представление)

%s - строка символов (для строковых переменных)

%u - десятичное целое без знака %% - печать знака процента

С помощью функции printf() можно выводить сразу несколько переменных. Для этого используется следующая конструкция:

int num_i; float num_f; num_i = 5; num_f = 10.5;

printf("num_i = %d, num_f = %f", num_i, num_f);

Результат выполнения программы будет выглядеть так:

num_i = 5, num_f = 10.5

Кроме спецификаторов в функции printf() используются управляющие символы, такие как перевод строки \n, табуляции \t и др. Например, если в ранее рассмотренном примере необходимо вывести значения переменных не в строчку, а в столбик, то необходимо переписать функцию printf() следующим образом:

printf("num_i = %d,\n num_f = %f", num_i, num_f);

Аналогично используется и символ табуляции.

Для ввода информации с клавиатуры удобно использовать функцию scanf() библиотеки stdio.h, которая имеет следующий синтаксис:

int scanf(const char *format [,argument]...);

Здесь, как и для функции printf(), переменная * format определяет форматную строку для определения типа вводимых данных и может содержать те же спецификаторы что и функция printf(). Затем, следует список необязательных аргументов. Работа функции scanf() демонстрируется на листинге 1.4.

Листинг 1.4. Пример использования функции scanf().

#include <stdio.h> int main()

{

int age;

float weight;

printf("Введите информацию о Вашем возрасте: "); scanf("%d", &age);

printf("Введите информацию о Вашем весе: "); scanf("%f", &weigth);

printf("Ваш возраст = %d, Ваш вес = %f", age, weigth); return 0;

}

Основным отличием применения функции scanf() от функции printf() является знак & перед именем переменной, в которую записываются результаты ввода.

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

scanf(" %d, %d ", &n, &m);

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

88,221 или 88, 221

Функция scanf() возвращает число успешно считанных элементов. Если операции считывания не происходило, что бывает в том случае, когда вместо ожидаемого цифрового значения вводится какая-либо буква, то возвращаемое значение равно 0.

8Оператор условного перехода if - else, оператор альтернативного выбора switch.

Таблица 2.1. Простые логические выражения
if(a < b) Истинно, если переменная а меньше переменной Ь и ложно в противном случае.
if(a > b) Истинно, если переменная а больше переменной Ь и ложно в противном случае.
if(a == b) Истинно, если переменная а равна переменной Ь и ложно в противном случае.
if(a <= b) Истинно, если переменная а меньше либо равна переменной Ь и ложно в противном случае.
if(a >= b) Истинно, если переменная а больше либо равна переменной Ь и ложно в противном случае.
if(a!= b) Истинно, если переменная а не равна переменной Ь и ложно в противном случае.
if(a) Истинно, если переменная а не равна нулю, и ложно в противном случае.

 

Приведем пример использования оператора ветвления Следующая программа позволяет определять знак введенной переменной.

Листинг 2.1. Первая программа определения знака введенного числа.

#include <stdio.h> int main()

{

float x;

printf("Введите число: ");

scanf("%f",&x);

if(x < 0)

printf("Введенное число %f является отридательн^1м.\п", x); if(x >= 0)

printf("Введенное число %f является неотрицательным.^", x); return 0;

}

Анализ приведенного текста программы показывает, что два условных оператора можно заменить одним, используя конструкцию

if (выражение)

<оператор1>

else

<оператор2>

которая интерпретируется таким образом. Если «выражение» истинно, то выполняется «оператор 1», иначе выполняется «оператор2». Перепишем ранее приведенный пример определение знака числа с использованием данной конструкции.

Условная операция if облегчает написание программ, в которых необходимо производить выбор между небольшим числом возможных вариантов. Однако иногда в программе необходимо осуществить выбор одного варианта из множества возможных. Формально для этого можно воспользоваться конструкцией if else if... else. Однако во многих случаях оказывается более удобным применять оператор switch языка С++

Оператор switch имеет следующую особенность. Допустим, значение переменной равно значению константы 1 и выполняются операторы, стоящие после первого ключевого слова case. После этого выполнение программы продолжится проверкой переменной на равенство константы2, что часто приводит к неоправданным затратам ресурсов ЭВМ. Во избежание такой ситуации следует использовать оператор break для перехода программы к следующему оператору после switch.

На листинге 2.4 представлен пример программирования условного оператора switch.

Листинг 2.4. Пример использования оператора switch.

#include <stdio.h>

int main()

{

int x;

printf("Введите число: ");

scanf("%d",&x);

switch(x)

{

case 1: printf("Введено число 1\n");break; case 2: printf("Введено число 2\n"); break; default: printf("Введено другое число\и");

}

char ch;

printf("Введите символ: ");

scanf("%c",&ch);

switch(ch)

{

case 'a': printf("Введен символ a\n"); break; case 'b': printf("Введен символ b\n"); break; default: printf("Введен другой символ\п");

}

return 0;

}

Данный пример демонстрирует два разных варианта использования оператора switch. В первом случае выполняется анализ введенной цифры, во втором - анализ введенного символа. Следует отметить, что данный оператор может производить выбор только на основании равенства своего аргумента одному из перечисленных значений case, т.е. проверка выражений типа x<0 в данном случае невозможна.

9Условная тернарная операция «?:». Операторы передачи управления

Терна́рная усло́вная опера́ция (от лат. ternarius — «тройной») (обычно записывается как?:) — во многих языках программирования операция, возвращающая свой второй или третийоперанд в зависимости от значения логического выражения, заданного первым операндом. Как можно судить из названия, тернарная операция принимает всего три указанных операнда. Аналогом тернарной условной операции в математической логике и булевой алгебре является условная дизъюнкция, которая записывается в виде [ p, q, r ] и реализует алгоритм: «Если q, то p, иначе r», что можно переписать как «p или r, в зависимости от q или не q».

В Си тернарная операция имеет следующий синтаксис:[2]

o1? o2: o3

В C++ тернарная условная операция имеет тот же синтаксис, что и в Си.[3] Однако за счёт наличия разницы между инициализацией и присваиванием, бывают ситуации, когда операцию?:нельзя заменить конструкцией if-then-else, как, например, в следующем случае:

#include <iostream>#include <fstream>#include <string> using namespace std; int main(int argc, char** argv){ string name; ofstream fout; if (argc > 1 && argv[1]) { name = argv[1]; fout.open(name.c_str(), ios::out | ios::app); } ostream& sout = name.empty()? cout: fout; return 0;}

Здесь переменная sout инициализируется в момент объявления результатом работы тернарной операции. Подобного эффекта не удалось бы достичь простым присваиванием в том или ином случае.

10Операторы цикла: оператор цикла с постусловием do - while, оператор цикла с постусловием и коррекцией for.

2.2. Операторы цикла языка С++

Часто при создании программ на ЭВМ требуется много раз выполнить одну и ту же группу операторов. Например, для вычисления суммы ряда длиной N или перебора элементов массива с целью определения наибольшего или наименьшего значения и т.п. Во всех этих случаях необходим инструмент для реализации повторяющихся операций и таким инструментом являются операторы цикла.

2.2.1. Оператор цикла while

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

while(<условие>)

{

<тело цикла>

}

Приведем пример реализации данного цикла, в котором выполняется

ГО

суммирование элементов ряда S = ^ i пока S < N:

i=0

int N=2 0, i = 0; long S = 0L; while(S < N)

{

S=S+i;

i++;

}

В данном примере реализуется цикл while с условием i < N. Так как начальное значение переменной i=0, а N=20, то условие истинно и выполняется тело цикла, в котором осуществляется суммирование переменной

i и увеличение ее на 1. Очевидно, что на 20 итерации значение i=20, условие станет ложным и цикл будет завершен. Продемонстрируем гибкость языка С++, изменив данный пример следующим образом:

int N=2 0, i = 0; long S = 0L; while((S=S+i++) < N);

В данном случае при проверке условия сначала выполняются операторы, стоящие в скобках, где и осуществляется суммирование элементов ряда и только, затем, проверяется условие. Результат выполнения обоих вариантов программ одинаковый и S=21. Однако последняя конструкция бывает удобной при реализации опроса клавиатуры, например, с помощью функции scanf():

int num;

while(scanf("%d",&mun) == 1)

{

printf("Bb ввели значение %d\n",num);

}

Данный цикл будет работать, пока пользователь вводит целочисленные значения и останавливается, если введена буква или вещественное число. Следует отметить, что цикл while можно принудительно завершить даже при истинном условии цикла. Это достигается путем использования оператора break. Перепишем предыдущий пример так, чтобы цикл завершался, если пользователь введет число 0.

int num;

while(scanf("%d",&mun) == 1)

{

if(num == 0) break;

printf("Bb ввели значение %d\n",num);

}

Цикл завершается сразу после использования оператора break, т.е. в приведенном примере, при вводе с клавиатуры нуля функция printf() выполняться не будет и программа перейдет на следующий оператор после while. Того же результата можно добиться, если использовать составное условие в цикле:

int num;

while(scanf("%d",&mun) == 1 && num!= 0)

{

printf("Bb ввели значение %d\n",num);

}

Таким образом, в качестве условия возможны такие же конструкции, что и в операторе if.

2.2.2. Оператор цикла for

Работа оператора цикла for подобна оператору while с той лишь разницей, что оператор for подразумевает изменение значения некоторой переменной и проверки ее на истинность. Работа данного оператора продолжается до тех пор, пока истинно условие цикла. Синтаксис оператора for следующий:

^^^нициализация счетчика>;<условие>;<изменение значения счетчика>)

{

<тело цикла>

}

Рассмотрим особенность реализации данного оператора на примере вывода таблицы кодов ASCII символов.

char ch;

for(ch = 'a'; ch <= 'z'; ch++)

printf("Значение ASCII для %c - %d.\n",ch,ch);

В данном примере в качестве счетчика цикла выступает переменная ch, которая инициализируется символом ‘a’. Это означает, что в переменную ch заносится число 97 - код символа ‘a’. Именно так символы представляются в памяти компьютера. Код символа ‘z’ - 122, и все малые буквы латинского алфавита имеют коды в диапазоне [97; 122]. Поэтому, увеличивая значение ch на единицу, получаем код следующей буквы, которая выводится с помощью функции printf(). Учитывая все вышесказанное, этот же пример можно записать следующим образом:

for(char ch = 97; ch <= 122; ch++)

printf("Значение ASCII для %c - %d.\n",ch,ch);

Здесь следует отметить, что переменная ch объявлена внутри оператора for. Это особенность языка С++ - возможность объявлять переменные в любом месте программы.

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

int line_cnt = 1; double debet;

for(debet = 100.0; debet < 150.0; debet = debet*1.1, line_cnt++)

printf("%d. Ваш долг теперь равен %.2f.\n",line_cnt, debet);

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

int exit = 1;

for(int num = 0;num < 100 &&!exit; num += 1)

{

scanf("%d",&mov);

if(mov == 0) exit = 0;

printf("Произведение num*mov = %d.\n",num*mov);

}

Оператор for с одним условием:

int i=0;

for(;i < 100;) i++;

и без условия

int i=0;

for(;;;) {i++; if(i > 100) break;}

В последнем примере оператор break служит для выхода из цикла for, т.к. он будет работать «вечно» не имея никаких условий.

2.2.3. Оператор цикла do while

Все представленные выше операторы циклов, так или иначе, проверяют условие перед выполнением цикла, благодаря чему существует вероятность, что операторы внутри цикла никогда не будут выполнены. Такие циклы называют циклы с предусловием. Однако бывают ситуации, когда целесообразно выполнять проверку условия после того, как будут выполнены операторы, стоящие внутри цикла. Это достигается путем использования операторов do while, которые реализуют цикл с постусловием. Следующий пример демонстрирует реализацию такого цикла.

const int secret_code = 13; int code_ent; do {

printf("Введите секретный код: "); scanf("%d",&code_ent);

}

while(code_ent!= secret_code);

Из приведенного примера видно, что цикл с постусловием работает до тех пор, пока истинно условие, т.е. в данном случае пока значение введенного кода будет отличаться от значения секретного кода. Также следует обратить внимание на то, что после ключевого слова while должна стоять точка с запятой. При реализации данного цикла можно использовать составные условия, подобно циклу while, а также принудительно выходить из цикла с помощью оператора break.

2.2.4. Программирование вложенных циклов

Все рассмотренные выше операторы циклов допускают использование любых других операторов языка С++ внутри цикла, в том числе и операторов цикла. Это значит, что внутри одного цикла может находиться другой, что приводит к реализации вложенных циклов. Вложенные циклы необходимы для решения большого числа задач, например, вычисления двойных, тройных и т.д. сумм, просмотр элементов двумерного массива и многих других задач. В

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

N M

двойного ряда S =

i=0 j=0

long S = 0L;

int M = 10, N = 5;

for(int i = 0; i <= N;i++)

{

for(int j = 0;j <= M;j++)

S += i*j;

}

Того же результата можно добиться и с помощью оператора цикла while.

12Операции со строками

Строка в C# — это массив знаков, объявленный с помощью ключевого слова string. Строковый литерал объявляется с помощью кавычек, как показано в следующем примере.

string s = "Hello, World!";;






Дата добавления: 2015-04-19; просмотров: 3544. Нарушение авторских прав; Мы поможем в написании вашей работы!



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

ТЕОРЕТИЧЕСКАЯ МЕХАНИКА Статика является частью теоретической механики, изучающей условия, при ко­торых тело находится под действием заданной системы сил...

Теория усилителей. Схема Основная масса современных аналоговых и аналого-цифровых электронных устройств выполняется на специализированных микросхемах...

Логические цифровые микросхемы Более сложные элементы цифровой схемотехники (триггеры, мультиплексоры, декодеры и т.д.) не имеют...

Плейотропное действие генов. Примеры. Плейотропное действие генов - это зависимость нескольких признаков от одного гена, то есть множественное действие одного гена...

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

Классификация холодных блюд и закусок. Урок №2 Тема: Холодные блюда и закуски. Значение холодных блюд и закусок. Классификация холодных блюд и закусок. Кулинарная обработка продуктов...

БИОХИМИЯ ТКАНЕЙ ЗУБА В составе зуба выделяют минерализованные и неминерализованные ткани...

Типология суицида. Феномен суицида (самоубийство или попытка самоубийства) чаще всего связывается с представлением о психологическом кризисе личности...

ОСНОВНЫЕ ТИПЫ МОЗГА ПОЗВОНОЧНЫХ Ихтиопсидный тип мозга характерен для низших позвоночных - рыб и амфибий...

Studopedia.info - Студопедия - 2014-2024 год . (0.01 сек.) русская версия | украинская версия