Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програмиррование по СИ мои ответы на вопросы.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
306.31 Кб
Скачать

Символьный тип

Данные типа char в памяти компьютера всегда занимают 1 байт. Символьный тип может быть со знаком или без него. В величинах со знаком signed char можно хранить значение от -128 до 127. Соответственно значения переменных типаunsigned char могут находиться в диапазоне от 0 до 255. При работе с символьными данными нужно помнить, что если в выражении встречается одиночный символ, то он должен быть заключен в одинарные кавычки (‘a’).

Целочисленный тип

Переменная типа int в памяти компьютера может занимать либо 2, либо 4 байта. Это зависит разрядности процессора. По умолчанию все целые типы считаются знаковыми, то есть спецификатор signed можно не указывать. Спецификаторunsigned позволяетпредставлять только положительные числа. Ниже представлены некоторые диапазоны значений целого типа

 

Тип

Диапазон

Размер

int

-2147483648…2147483647

4 байта

unsigned int

0…4294967295

4 байта

signed int

-2147483648…2147483647

4 байта

short int

-32768…32767

2 байта

long int

-2147483648…2147483647

4 байта

unsigned short int

0…65535

2 байта

Вещественный тип

Число с плавающей точкой представлено в форме mE +- p, где m — мантисса (целое или дробное число с десятичной точкой), p — порядок (целое число). Обычно величины типа float занимают 4 байта, а double 8 байт. Таблица диапазонов значений вещественного типа:

 

float

3,4E-38…3,4E+38

4 байта

double

1,7E-308…1,7E+308

8 байт

long double

3,4E-4932…3,4E+4932

8 байт

Логический тип

Переменная типа bool может принимать только два значения true (истина) или fasle (ложь). Любоезначение, не равное нулю, интерпретируется как true. Значениеfalse представлено в памяти как 0.

Тип void

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

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

В 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 — «тройной») (обычно записывается как ?:) — во многих языках программирования операция, возвращающая свой второй или третийоперанд в зависимости от значения логического выражения, заданного первым операндом. Как можно судить из названия, тернарная операция принимает всего три указанных операнда. Аналогом тернарной условной операции в математической логике и булевой алгебре является условная дизъюнкция, которая записывается в виде [pqr] и реализует алгоритм: «Если 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.

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

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