Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Основные типы данных. Целый, символьный, вещественный, voit





Основные типы данных. Целый, символьный, вещественный, voit

Любая программа предназначена для обработки каких либо данных, например, чисел или текстов. Понятно, что данные могут быть различного вида или типа и, в зависимости от их типа, с ними можно выполнять разные действия. А что такое тип данных?

Тип данных характеризует:

· объем памяти, выделяемый под данные;

· их внутреннее представление в памяти компьютера;

· набор допустимых операций (действий);

· множество допустимых значений.

Все типы данных можно подразделить на простые — они предопределены стандартом языка, и сложные (или составные) — задаются пользователем. Данные простого типа нельзя разложить на более простые составляющие без потери сущности данного. Простые типы данных создают основу для построения более сложных типов: массивов, структур, классов. Простые типы в языке C++ — это целые, вещественные типы, символьный и логический тип и тип void.

Рассмотрим более подробно простые типы данных.

Целые типы

Целый тип данных предназначен для представления в памяти компьютера обычных целых чисел. Основным и наиболее употребительным целым типом является тип int. Гораздо реже используют его разновидности: short (короткое целое) и long (длинное целое). Также к целым типам относится тип char (символьный). Кроме того, при необходимости можно использовать и тип long long (длинное-предлинное!), который хотя и не определён стандартом, но поддерживается многими компиляторами C++. По-умолчанию все целые типы являются знаковыми, т.е. старший бит в таких числах определяет знак числа: 0 — число положительное, 1 — число отрицательное. Кроме знаковых чисел на C++ можно использовать беззнаковые. В этом случае все разряды участвуют в формировании целого числа. При описании беззнаковыхцелыхпеременных добавляется слово unsigned (без знака).

Сводная таблица знаковых целых типов данных:

Тип данных Размер, байт Диапазон значений
char   -128... 127
short   -32768... 32767
int   -2147483648... 2147483647
long   -2147483648... 2147483647
long long   -9223372036854775808... 9223372036854775807

Сводная таблица беззнаковых целых типов данных:

Тип данных Размер, байт Диапазон значений
unsigned char   0... 255
unsigned short   0... 65535
unsigned int (можно просто unsigned)   0... 4294967295
unsigned long   0... 4294967295
unsigned long long   0... 18446744073709551615

Запоминать предельные значения, особенно для 4-х или 8-ми байтовых целых, вряд ли стоит, достаточно знать хотя бы какого порядка могут быть эти значения, например, тип int — приблизительно 2·109.

На практике рекомендуется везде использовать основной целый тип, т.е. int. Дело в том, что данные основного целого типа практически всегда обрабатываются быстрее, чем данные других целых типов. Короткие типы (char, short) подойдут для хранения больших массивов чисел с целью экономии памяти при условии, что значения элементов не выходят за предельные для этих типов. Длинные типы необходимы в ситуации, когда не достаточно типа int.

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

В стандарте C++ нет типа данных, который можно было бы считать действительно символьным. Для представления символьной информации есть два типа данных, пригодных для этой цели, — это типы char и wchar_t, хотя оба эти типа по сути своей вообще-то являются целыми типами. Например, можно взять символ 'A' и поделить его на число 2. Кстати, а что получится? Подсказка: символ пробела. Для «нормальных» символьных типов, например, в Паскале или C#, арифметические операции для символов запрещены.

Тип char используется для представления символов в соответствии с системой кодировки ASCII (American Standard Code for Information Interchange — Американский стандартный код обмена информации). Это семибитный код, его достаточно для кодировки 128 различных символов с кодами от 0 до 127. Символы с кодами от 128 до 255 используются для кодирования национальных шрифтов, символов псевдографики и др.

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

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

Логический (булевый) тип обозначается словом bool. Данные булевого типа могут принимать только два значения: true и false. Значение false обычно равно числу 0, значение true — числу 1. Под данные булевого типа отводится 1 байт.

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

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

Имеется три вещественных типа данных: float, double и long double. Основным считается тип double. Так, все математические функции по-умолчанию работают именно с типом double. В таблице ниже приведены основные характеристики вещественных типов:

Тип данных Размер, байт Диапазон абсолютных величин Точность, количество десятичных цифр
float   от 3.4Е—38 до 3.4Е+38  
double   от 1.7Е—308 до 1.7Е+308  

Тип long double в настоящее время, как правило, совпадает с типом double и на практике обычно не применяется. При использовании старых 16-ти разрядных компиляторов данные типа long double имеют размер 10 байт и обеспечивают точность до 19 десятичных цифр.

Рекомендуется везде использовать только тип double. Работа с ним всегда ведётся быстрее, меньше вероятность заметной потери точности при большом количестве вычислений. Тип float может пригодиться только для хранения больших массивов при условии, что для решения поставленной задачи будет достаточно этого типа.

Тип void

Тип void — самый необычный тип данных языка C++. Множество значений этого типа пусто, т.е. нельзя переменной такого типа присвоить какое-нибудь значение. Более того, нельзя даже описать переменную этого типа. Зачем же нужно то, чем вроде бы невозможно воспользоваться?

Оказывается, это очень полезный тип данных! Он используется:

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

· для указания того, что список параметров функции пуст;

· а так же этот тип является базовым для работы с указателями. Достаточно сказать, что всё программирование с использованием Win32 API построено на применении указателей на тип void.


 

 

Константы

В языке Си константы представляют фиксированные величины, которые не могут быть изменены в программе. Константы могут быть любого базового типа данных. Пример констант:

char - 'a','\n','8'
int - 1, 134, -500
unsigned int - 53500
long int - 87000, -37, 7L
short int - 11, 13, -128
float - 133.34, 3.36E-6, 5E+5
double - 133.45, 133340, -2.789


Правила определения типа констант следующие. Целая константа относится к типу int, если эта константа входит в интервал значений типа int.
Если эта константа не входит в интервал значений типа int, например - 37750 (а как известно тип int, как правило принимает значения в диапазоне от -32768 до 32767), то она считается константой типа unsigned (применительно к int это уже от 0 до 65535). Если же и этого мало, то она считается константой типа long (т.е. long int).
Константа с десятичной точкой считается константой типа double, если она помещается в соответствующий интервал измерения.
Для явного задания типа констант используется механизм суффиксов. В качестве суффиксов целочисленных (int) констант используются u,l,h,U,L,H. Для чисел с плавающей точкой - l,L,f,F.

Например:

13h, 35H - short int
25L, -223l - long int
87lu, 88Lu, 89ul - unsigned long int
55uh - unsigned short int
27.43f, 7.7E-6F - float
1.41l, 3.2E+12L - double

Символьная переменная - это величина размером в 1 байт, которая используется для представления литер и целых чисел в диапазоне от 0 до 255 или от -128 до 127, в зависимости от того, знаковая переменная или беззнаковая. Символьные константы заключаются в одинарные кавычки. Примеры символьных констант: 'd', '+', '8'. Приведем пример программы с использованием символьных переменных и констант:

#include /* Пример 4 */ main() { char ch; ch='c'; printf("%c",ch); ch='+'; printf("%c%c", ch,ch); }  

В функции printf() появилась новая спецификация - %c. В таком формате печатается символ. Этот же формат можно использовать в функции scanf() для ввода символа с клавиатуры. В языке Си в стандартной библиотеке ввода/вывода есть специальная функция getche(). Эта функция ожидает, пока не будет нажата какая-либо клавиша клавиатуры, и затем вводит код этой клавиши. Рассмотрим пример программы, использующей указанную функцию:

4. Условный оператор, оператор переключатель-свитч

Условный оператор

Основная форма условного оператора выглядит следующим образом:

if(условие) оператор;
else оператор;


Если значение условия истинно, о выполняется оператор (это может быть и составной оператор), следующий за условием. Если же условие принимае значение ложно, о выполняется оператор, следующий за словом else. В записи оператора if вторая часть (т.е. оператор else) может отсутствовать. Тогда, если условие принимает значение ложно, выполняется следующий оператор программы. В качестве условия может стоять произвольное выражение. В операторе if лишь проверяеся, является ли значение эого выражения ненулевым (истинным) или нулевым (ложным). Рассморим пример программы определения знака воодимого с клавиатуры вещественного числа с использованием нашего оператора if.

#include<stdio.h> /* Пример 9 */ main() { int sgn; float x; printf("Введите число: \n"); scanf("%f",&x); if(x>0) { sgn=1; printf("Число %f\n, положительное sgn = %d\n", x, sgn);} if(x==0) { pritf("Число %f\n равно нулю sgn = %d\n", x, sgn);} if(x<0) {sgn=-1; printf("Число %f отрицательное sgn=%d\n", x, sgn);} }  


Нередко возникает необходимость в использовании конструкции вложенных if-else-if:

if(условие1) оператор1;
else if(условие2) оператор2;
else if(условие3) оператор3;
...
else оператор;


В такой форме условия оператора if проверяютсяч сверху вниз. Как только некоторое условие принимает значение истинно, выполняется оператор, следующий за этим условием, а вся остальная часть конструкции будет проигнорирована. Поэтому, предыдущую программу можно было бы написать следующим образом:

#include<stdio.h> /* Пример 9 */ main() { int sgn; float x; printf("Введите число: \n"); scanf("%f",&x); if(x>0) { sgn=1; printf("Число %f\n, положительное sgn = %d\n", x, sgn);} if(x<0) {sgn=-1; printf("Число %f отрицательное sgn=%d\n", x, sgn);} else { pritf("Число %f\n равно нулю sgn = %d\n", x, sgn);} }  


Для того чтобы проверить, равно число x нулю или нет, можно написать

if(x==0) printf("Число равно нулю...");
else printf("Число не равно нулю...");


Такой же результат можно получить, написав более компактный код

if(!x) printf("Число равно нулю...");
else printf("Число не равно нулю...");


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

if(x)
if(y) printf("...");
else операторX....;


В такой форме непонятно, к какому из операторов if относится else. В языке Си оператор else ассоциируется с ближайшим if в соответствующем блоке. Поэтому в указанной конструкции else относится к if(y). Для того чтобы отнести else к if(x), необходимо соответствующим образом расставить операторные скобки:

if(x){
if(y) printf("...");
if(x)}
else операторX....;


Теперь if(y) относится к другому блоку.

Операторы

Все операторы языка СИ могут быть условно разделены на следующие категории:

- условные операторы, к которым относятся оператор условия if и оператор выбора switch;

- операторы цикла (for,while,do while);

- операторы перехода (break, continue, return, goto);

- другие операторы (оператор "выражение", пустой оператор).

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

Все операторы языка СИ, кроме составных операторов, заканчиваются точкой с запятой ";".

Оператор выражение

Любое выражение, которое заканчивается точкой с запятой, является оператором.

Выполнение оператора выражение заключается в вычислении выражения. Полученное значение выражения никак не используется, поэтому, как правило, такие выражения вызывают побочные эффекты. Заметим, что вызвать функцию, невозвращающую значения можно только при помощи оператора выражения. Правила вычисления выражений были сформулированы выше.

Примеры:

++ i;

Этот оператор представляет выражение, которое увеличивает значение переменной i на единицу.

a=cos(b * 5);

Этот оператор представляет выражение, включающее в себя операции присваивания и вызова функции.

a(x,y);

Этот оператор представляет выражение состоящее из вызова функции.

Пустой оператор

Пустой оператор состоит только из точки с запятой. При выполнении этого оператора ничего не происходит. Он обычно используется в следующих случаях:

- в операторах do, for, while, if в строках, когда место оператора не требуется, но по синтаксису требуется хотя бы один оператор;

- при необходимости пометить фигурную скобку.

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

Пример:

int main () {: { if (...) goto a; /* переход на скобку */ {... } a:; } return 0; }

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

Составной оператор представляет собой несколько операторов и объявлений, заключенных в фигурные скобки:

{ [oбъявление]: оператор; [оператор];: }

Заметим, что в конце составного оператора точка с запятой не ставится.

Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов.

Пример:

int main () { int q,b; double t,d;: if (...) { int e,g; double f,q;: }: return (0); }

Переменные e,g,f,q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие последних необязательно.

Оператор if

Формат оператора:

if (выражение) оператор-1; [else оператор-2;]

Выполнение оператора if начинается с вычисления выражения.

Далее выполнение осуществляется по следующей схеме:

- если выражение истинно (т.е. отлично от 0), то выполняется оператор-1.

- если выражение ложно (т.е. равно 0),то выполняется оператор-2.

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

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

Пример:

if (i < j) i++: else { j = i-3; i++; }

Этот пример иллюстрирует также и тот факт, что на месте оператор-1, так же как и на месте оператор-2 могут находиться сложные конструкции.

Допускается использование вложенных операторов if. Оператор if может быть включен в конструкцию if или в конструкцию else другого оператора if. Чтобы сделать программу более читабельной, рекомендуется группировать операторы и конструкции во вложенных операторах if, используя фигурные скобки. Если же фигурные скобки опущены, то компилятор связывает каждое ключевое слово else с наиболее близким if, для которого нет else.

Примеры:

int main () { int t=2, b=7, r=3; if (t>b) { if (b < r) r=b; } else r=t; return (0); }

В результате выполнения этой программы r станет равным 2.

Если же в программе опустить фигурные скобки, стоящие после оператора if, то программа будет иметь следующий вид:

int main () { int t=2,b=7,r=3; if (a>b) if (b < c) t=b; else r=t; return (0); }

В этом случае r получит значение равное 3, так как ключевое слово else относится ко второму оператору if, который не выполняется, поскольку не выполняется условие, проверяемое в первом операторе if.

Следующий фрагмент иллюстрирует вложенные операторы if:

char ZNAC; int x,y,z;: if (ZNAC == '-') x = y - z; else if (ZNAC == '+') x = y + z; else if (ZNAC == '*') x = y * z; else if (ZNAC == '/') x = y / z; else...

Из рассмотрения этого примера можно сделать вывод, что конструкции использующие вложенные операторы if, являются довольно громоздкими и не всегда достаточно надежными. Другим способом организации выбора из множества различных вариантов является использование специального оператора выбора switch.

Оператор switch

Оператор switch предназначен для организации выбора из множества различных вариантов. Формат оператора следующий:

switch (выражение) { [объявление]: [ case константное-выражение1]: [ список-операторов1] [ case константное-выражение2]: [ список-операторов2]:: [ default: [ список операторов ]] }

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

Значение этого выражения является ключевым для выбора из нескольких вариантов. Тело оператора smitch состоит из нескольких операторов, помеченных ключевым словом case с последующим константным-выражением. Следует отметить, что использование целого константного выражения является существенным недостатком, присущим рассмотренному оператору.

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

Все константные выражения в операторе switch должны быть уникальны. Кроме операторов, помеченных ключевым словом case, может быть, но обязательно один, фрагмент помеченный ключевым словом default.

Список операторов может быть пустым, либо содержать один или более операторов. Причем в операторе switch не требуется заключать последовательность операторов в фигурные скобки.

Отметим также, что в операторе switch можно использовать свои локальные переменные, объявления которых находятся перед первым ключевым словом case, однако в объявлениях не должна использоваться инициализация.

Схема выполнения оператора switch следующая:

- вычисляется выражение в круглых скобках;

- вычисленные значения последовательно сравниваются с константными выражениями, следующими за ключевыми словами case;

- если одно из константных выражений совпадает со значением выражения, то управление передается на оператор, помеченный соответствующим ключевым словом case;

- если ни одно из константных выражений не равно выражению, то управление передается на оператор, помеченный ключевым словом default, а в случае его отсутствия управление передается на следующий после switch оператор.

Отметим интересную особенность использования оператора switch: конструкция со словом default может быть не последней в теле оператора switch. Ключевые слова case и default в теле оператора switch существенны только при начальной проверке, когда определяется начальная точка выполнения тела оператора switch. Все операторы, между начальным оператором и концом тела, выполняются вне зависимости от ключевых слов, если только какой-то из операторов не передаст управления из тела оператора switch. Таким образом, программист должен сам позаботится о выходе из case, если это необходимо. Чаще всего для этого используется оператор break.

Для того, чтобы выполнить одни и те же действия для различных значений выражения, можно пометить один и тот же оператор несколькими ключевыми словами case.

Пример:

int i=2; switch (i) { case 1: i += 2; case 2: i *= 3; case 0: i /= 2; case 4: i -= 5; default:; }

Выполнение оператора switch начинается с оператора, помеченного case 2. Таким образом, переменная i получает значение, равное 6, далее выполняется оператор, помеченный ключевым словом case 0, а затем case 4, переменная i примет значение 3, а затем значение -2. Оператор, помеченный ключевым словом default, не изменяет значения переменной.

Рассмотрим ранее приведенный пример, в котором иллюстрировалось использование вложенных операторов if, переписанной теперь с использованием оператора switch.

char ZNAC; int x,y,z; switch (ZNAC) { case '+': x = y + z; break; case '-': x = y - z; break; case '*': x = y * z; break; case '/': x = u / z; break; default:; }

Использование оператора break позволяет в необходимый момент прервать последовательность выполняемых операторов в теле оператора switch, путем передачи управления оператору, следующему за switch.

Отметим, что в теле оператора switch можно использовать вложенные операторы switch, при этом в ключевых словах case можно использовать одинаковые константные выражения.

Пример:

: switch (a) { case 1: b=c; break; case 2: switch (d) { case 0: f=s; break; case 1: f=9; break; case 2: f-=9; break; } case 3: b-=c; break;: }

Оператор break

Оператор break обеспечивает прекращение выполнения самого внутреннего из объединяющих его операторов switch, do, for, while. После выполнения оператора break управление передается оператору, следующему за прерванным.

Оператор for

Оператор for - это наиболее общий способ организации цикла. Он имеет следующий формат:

for (выражение 1; выражение 2; выражение 3) тело

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

Схема выполнения оператора for:

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

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

Пример:

int main() { int i,b; for (i=1; i<10; i++) b=i*i; return 0; }

В этом примере вычисляются квадраты чисел от 1 до 9.

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

Пример:

int main() { int top, bot; char string[100], temp; for (top=0, bot=100; top < bot; top++, bot--) { temp=string[top]; string[bot]=temp; } return 0; }

В этом примере, реализующем запись строки символов в обратном порядке, для управления циклом используются две переменные top и bot. Отметим, что на месте выражение 1 и выражение 3 здесь используются несколько выражений, записанных через запятую, и выполняемых последовательно.

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

Пример:

for (;;) {...... break;... }

Так как согласно синтаксису языка Си оператор может быть пустым, тело оператора for также может быть пустым. Такая форма оператора может быть использована для организации поиска.

Пример:

for (i=0; t[i]<10; i++);

В данном примере переменная цикла i принимает значение номера первого элемента массива t, значение которого больше 10.

Оператор while

Оператор цикла while называется циклом с предусловием и имеет следующий формат:

while (выражение) тело;

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

1. Вычисляется выражение.

2. Если выражение ложно, то выполнение оператора while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполняется тело оператора while.

3. Процесс повторяется с пункта 1.

Оператор цикла вида

for (выражение-1; выражение-2; выражение-3) тело;

может быть заменен оператором while следующим образом:

выражение-1; while (выражение-2) { тело выражение-3; }

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

Внутри операторов for и while можно использовать локальные переменные, которые должны быть объявлены с определением соответствующих типов.

Оператор do while

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

do тело while (выражение);

Схема выполнения оператора do while:

1. Выполняется тело цикла (которое может быть составным оператором).

2. Вычисляется выражение.

3. Если выражение ложно, то выполнение оператора do while заканчивается и выполняется следующий по порядку оператор. Если выражение истинно, то выполнение оператора продолжается с пункта 1.

Чтобы прервать выполнение цикла до того, как условие станет ложным, можно использовать оператор break.

Операторы while и do while могут быть вложенными.

Пример:

int i,j,k;... i=0; j=0; k=0; do { i++; j--; while (a[k] < i) k++; } while (i<30 && j<-30);

Оператор continue

Оператор continue, как и оператор break, используется только внутри операторов цикла, но в отличие от него выполнение программы продолжается не с оператора, следующего за прерванным оператором, а с начала прерванного оператора. Формат оператора следующий:

continue;

Пример:

int main() { int a,b; for (a=1,b=0; a<100; b+=a,a++) { if (b%2) continue;... /* обработка четных сумм */ } return 0; }

Когда сумма чисел от 1 до а становится нечетной, оператор continue передает управление на очередную итерацию цикла for, не выполняя операторы обработки четных сумм.

Оператор continue, как и оператор break, прерывает самый внутренний из объемлющих его циклов.

Оператор return

Оператор return завершает выполнение функции, в которой он задан, и возвращает управление в вызывающую функцию, в точку, непосредственно следующую за вызовом. Функция main передает управление операционной системе. Формат оператора:

return [выражение];

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

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

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

Пример:

int sum (int a, int b) { renurn (a+b); }

Функция sum имеет два формальных параметра a и b типа int, и возвращает значение типа int, о чем говорит описатель, стоящий перед именем функции. Возвращаемое оператором return значение равно сумме фактических параметров.

Пример:

void prov (int a, double b) { double c; if (a<3) return; else if (b>10) return; else { c=a+b; if ((2*c-b)==11) return; } }

В этом примере оператор return используется для выхода из функции в случае выполнения одного из проверяемых условий.

Оператор goto

Использование оператора безусловного перехода goto в практике программирования на языке СИ настоятельно не рекомендуется, так как он затрудняет понимание программ и возможность их модификаций.

Формат этого оператора следующий:

goto имя-метки;... имя-метки: оператор;

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

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

ТРАНСПОНИРОВАНИЕ МАТРИЦ.

В данном алгоритме транспонирования матрицы необходимо заменить строки матрицы ее столбцами, а столбцы - строками, т.е. вычислить b[i][j]=a[j][i], где i=1,…,n; j=1,…,m.

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 5
  5. # define m 7
  6. main ()
  7. {
  8. int a[n][m],b[m][n];
  9. clrscr ();
  10. randomize();
  11. printf ("\n Сформирована матрица A[%i][%i].\n",n,m);
  12. for (int i=0;i
  13. {
  14. for (int j=0;j
  15. {
  16. a[i][j]=random(31)-15;
  17. printf ("%6i",a[i][j]);
  18. }
  19. puts (" ");
  20. }
  21. for (i=0;i
  22. for (j=0;i
  23. b[j][i]=a[i][j];
  24. printf ("\n Получена транспонированная матрица B[%i][%i].\n",m,n);
  25. for (i=0;i
  26. {
  27. for (j=0;j
  28. printf ("%6i",b[i][j]);
  29. puts (" ");
  30. }
  31. getch();
  32. }

Транспонированную матрицу можно получить в исходном массива А. Для квадратной матрицы n*n для этого необходимо поменять местами каждый элемент верхнего треугольника с соответствующим элементом нижнего (диагональные элементы переставлять не нужно). При этом для каждой строки нужно выполнять перестановку для элементов, расположенных правее главной диагонали, с элементами соответствующего столбца, расположенными ниже главной диагонали. При перестановке используем вспомогательную переменную tmp, помещая в нее для временного хранения один из переставляемых элементов, чтобы не потерять его значение.

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 6
  5. int main ()
  6. {
  7. int a[n][n];
  8. clrscr ();
  9. randomize();
  10. printf ("\n Сформирована квадратная матрица A[%i][%i].\n",n,n);
  11. for (int i=0;i
  12. {
  13. for (int j=0;j
  14. {
  15. a[i][j]=random(61)-30;
  16. printf ("%6i",a[i][j]);
  17. }
  18. puts (" ");
  19. }
  20. for (int i=0;i<(n-1);i++)
  21. for (int j=(i+1);i
  22. {
  23. int tmp=a[i][j];
  24. a[i][j]=a[j][i];
  25. a[j][i]=tmp;
  26. }
  27. printf ("\n Транспонированная матрица.\n");
  28. for (int i=0;i
  29. {
  30. for (int j=0;j
  31. printf ("%6i",a[i][j]);
  32. puts (" ");
  33. }
  34. getch();
  35. }

Для прямоугольной матрицы алгоритм усложняется.

УДАЛЕНИЕ СТРОК МАТРИЦ.

Алгоритм удаления строки является сходным с алгоритмом удаление элементов одномерного массива, за тем исключением, что операция переноса элементов выполняется для каждого столбца при переборе строк. Рассмотрим программу удаления из матрицы А заданной с клавиатуры строки T.

Программа:

  1. # include
  2. # include
  3. # include
  4. # define n 10
  5. # define m 5
  6. int main ()
  7. {
  8. int a[n][m];
  9. clrscr ();
  10. randomize();
  11. printf ("\n Целочисленная матрица A[%i][%i] сформированные случайными числами \n диапазона от -150 до 150.\n",n,m);
  12. for (int i=0;i
  13. {
  14. for (int j=0;i
  15. {
  16. a[i]=random(301)-150;
  17. printf ("%6i",a[i]);
  18. }
  19. puts(" ");
  20. }
  21. int t;
  22. printf ("\n Введите номер строки матрицы для ее удаления: ");
  23. scanf ("%i",&t);
  24. int k=n;
  25. for (int i=t;i<(n-1);i++)
  26. for (int j=0;j
  27. a[i][j]=a[i+1][j];
  28. k--;
  29. printf ("\n Получена матрица A[%i][%i]. \n",k,m);
  30. for (int i=0;i
  31. {
  32. for (j=0;j
  33. printf ("%6i",a[i][j]);
  34. puts (" ");
  35. }
  36. getch();
  37. }

Основные типы данных. Целый, символьный, вещественный, voit

Любая программа предназначена для обработки каких либо данных, например, чисел или текстов. Понятно, что данные могут быть различного вида или типа и, в зависимости от их типа, с ними можно выполнять разные действия. А что такое тип данных?

Тип данных характеризует:

· объем памяти, выделяемый под данные;

· их внутреннее представление в памяти компьютера;

· набор допустимых операций (действий);

· множество допустимых значений.

Все типы данных можно подразделить на простые — они предопределены стандартом языка, и сложные (или составные) — задаются пользователем. Данные простого типа нельзя разложить на более простые составляющие без потери сущности данного. Простые типы данных создают основу для построения более сложных типов: массивов, структур, классов. Простые типы в языке C++ — это целые, вещественные типы, символьный и логический тип и тип void.

Рассмотрим более подробно простые типы данных.

Целые типы

Целый тип данных предназначен для представления в памяти компьютера обычных целых чисел. Основным и наиболее употребительным целым типом является тип int. Гораздо реже используют его разновидности: short (короткое целое) и long (длинное целое). Также к целым типам относится тип char (символьный). Кроме того, при необходимости можно использовать и тип long long (длинное-предлинное!), который хотя и не определён стандартом, но поддерживается многими компиляторами C++. По-умолчанию все целые типы являются знаковыми, т.е. старший бит в таких числах определяет знак числа: 0 — число положительное, 1 — число отрицательное. Кроме знаковых чисел на C++ можно использовать беззнаковые. В этом случае все разряды участвуют в формировании целого числа. При описании беззнаковыхцелыхпеременных добавляется слово unsigned (без знака).

Сводная таблица знаковых целых типов данных:

Тип данных Размер, байт Диапазон значений
char   -128... 127
short   -32768... 32767
int   -2147483648... 2147483647
long   -2147483648... 2147483647
long long   -9223372036854775808... 9223372036854775807

Сводная таблица беззнаковых целых типов данных:

Тип данных Размер, байт Диапазон значений
unsigned char   0... 255
unsigned short   0... 65535
unsigned int (можно просто unsigned)   0... 4294967295
unsigned long   0... 4294967295
unsigned long long   0... 18446744073709551615

Запоминать предельные значения, особенно для 4-х или 8-ми байтовых целых, вряд ли стоит, достаточно знать хотя бы какого порядка могут быть эти значения, например, тип int — приблизительно 2·109.

На практике рекомендуется везде использовать основной целый тип, т.е. int. Дело в том, что данные основного целого типа практически всегда обрабатываются быстрее, чем данные других целых типов. Короткие типы (char, short) подойдут для хранения







Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем...

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

ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.