Файл: Понятие переменной в программировании. Виды и типы переменных.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 06.04.2023

Просмотров: 99

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

В программировании особе внимание уделяется концепции о локальных и глобальных переменных, а также связанное с ними представление об областях видимости. Соответственно, локальные переменные видны только в локальной области видимости, которой может выступать отдельно взятая функция. Глобальные переменные видны во всей программе. "Видны" – значит, известны, доступны. К ним можно обратиться по имени и получить связанное с ними значение.[6]

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

2.2. Общие понятия о типах данных в С++

Тип данных определяет все множество значений, а также множество операций и метод представления данных непосредственно в памяти компьютера. [9]

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

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

Рассмотрим простейшие скалярные типы данных в С++ (рисунок 3):[16]

Рисунок 3 – Скалярные типы данных

Стоит отметить, что могут также использоваться и модификации этих основных типов. Производные (модифицированные) форматы данных задаются при помощи 4 спецификаторов типа, что изменяют диапазон значений основного типа (рисунок 4).[7]

Рисунок 4 – Спецификаторы длины типа

Стоит отметить, что спецификатор signed определяет знаковый (как положительные, так и отрицательные значения), а спецификатор unsigned –беззнаковый (лишь положительные значения).

Кроме этого, в C++ определяется специальный тип void – скалярный тип, у которого множество значений пусто.[17]

По умолчанию также используются спецификаторы signed и short, то есть отсутствие спецификатора длины будет соответствовать значению «короткий», а отсутствие спецификатора знака – значениям «знаковый».


Особенность типа под названием char в C++ может состоять в двойственности трактовки. [11]

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

Значения типа char (или символьные константы) заключаются в одинарные кавычки: 'g’, 'a'; к типу char также относятся и некоторые спецсимволы (двухсимвольные значения), к примеру, ‘\n’ – это переход к последующей строке.[18]

Заметим, что в C++ все строковые константы заключаются в двойных кавычках, например, “stroka”. Поэтому ‘a’ – символьное значение (литерал), “a” – строковое значение, то есть строка, что состоит с одного символа.[13]

Размер формата int стандартом не определяется и зависит только от разрядности процессора, а также особенностей компилятора. Спецификатор short устанавливает независимо от разрядности применяемого процессора размер памяти целого типа 2 байта, а спецификатор long определяет уже 4 байта.[9]

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

sizeof(<название типа>) – размер в байтах указанного типа,

sizeof < название переменной> – размер в байтах формата данных, соответствующего указанной переменной.

Даже не устанавливая конкретных значений для объема памяти типов данных, стандарт С++ определяет следующие соотношения для них:[17]

sizeof(char) < sizeof(short) < sizeof(int) < sizeof(long),

sizeof(float) < sizeof(double) < sizeof(long double).

В таблице 1 указаны характеристики типов для 32 разрядного процессора.

Таблица 1 – Характеристика скалярных типов для 16-разрядного процессора

Тип

Диапазон

Размер (байты)

bool

true (1), false (0)

1

char

-127 .. 128

1

signed char

-127 .. 128

1

unsigned char

0 .. 255

1

int

-32767 .. 32768

2

signed int

-32767 .. 32768

2

unsigned int

0 .. 65536

2

short int

-32767 .. 32768

2

signed short int

-32767 .. 32768

2

unsigned short int

0 .. 65536

2

long int

-2147484648 .. 2147484647

4

signed long int

-2147484648 .. 2147484647

4

unsigned long int

0 .. 4294567295

4

float

3.4e-37 .. 3.4e+37

4

short float

3.4e-37 .. 3.4e+37

4

long float

1.7e-307 .. 1.7e+307

8

double

1.7e-307 .. 1.7e+307

8

short double

1.7e-307 .. 1.7e+307

8

long double

3.4e-4933 .. 3.4e+4933

10


Заметим, что в некоторых системах программирования C++ для типа данных char может определяться диапазон значений от 0 до 255, в таком случае тип char будет совпадать с unsigned char, но не с signed char. [8]

Также, очевидно, в таблице 1 есть типы данных, что имеют различную спецификацию, хотя по существу они ничем не отличающиеся, к примеру, int или signed int. [19]

Этот факт позволяет ограничиться самым минимальным набором простых спецификаций типа.[3]

2.2. Структурированные типы данных в С++

2.2.1. Массивы.

Как и на языке Паскаль, массив представляет собой упорядоченную последовательность хранимых данных одного типа, что занимают последовательные ячейки памяти. [4]

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

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

<базовый тип> <название массива> [<константа целого типа>];

К примеру:

int a, b[6], c;

const float n=11;

double s1[n];

Здесь определяется массив b, что состоит из 6 основных элементов типа int, а именно: b[0] b[1] … b[5] и массив s1 из 11 элементов типа double: s1[0] s1[1] … s[10].

При определении массив также может быть проинициализирован:

int a1[5]={2, 4, -3, 5, 38};

Во разных случаях удобно бывает определять новый тип-массив для этого используется оператор typedef:[6]

typedef long float mas[10];

mas a1,b1d;

В программе все элементы массива представляются переменными с индексами.

При работе с одномерными массивами необходимо иметь также в виду, что на C++ не контролируются значения для индексов на предмет их выхода за пределы имеющегося массива. [15]

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


Весь контроль этой ситуации возлагается полностью на программиста.[6]

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

int a1 [5][3];

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

К примеру:

int a1 [2][3]={{3, 6, -2}, //первая строка

{5, 23, 0}}; //вторая строка

Все такие операции над массивами, включая ввод-вывод, присваивание, выполняются поэлементно.

Например, ввод 2-мерного массива:

for (int i1=0; i1<5; i1++)

for (int j1=0; j1<3; j1++)

cin >>a1[i][j];

2.2.2. Символьные строки.

Символьная строка является полным аналогом типа string в Паскале. В C++ она будет объявляться как массив символов, хотя при этом дополняется в конце нуль-символом ‘\0’:

char str1[10]=”alfa”; // str1[0]=’a’ str1[1]=’l’ str1[2]=’f’ str1[3]=’a’ str1[4]=’\0’

При инициализации также можно было опускать длину строки:[7]

char str1[]=”alfa”;

хотя при этом было под нее бы выделено не все 10 байт, а лишь 5.

Строки можно применять в операторах ввода и вывода, однако при вводе строк с клавиатуры необходимо брать во внимание то, что оператор >> в качестве признаков конца строки рассматривает символ пробела, табуляции или же Enter и, встретив только один из них, завершает ввод. [9]

Эта проблема может разрешаться при использовании библиотечной функции:

gets(<название массива>)

с стандартной библиотеки stdio.h, что должна быть подключена директивой #include <stdio.h>.

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

2.2.3. Структуры

Структура (struct) на C++ является аналогом типа данных record в Паскале.

Структуры имеют возможность группировать данные для разных типов. Определение структуры выглядит так:[11]

struct <название типа> {

<тип для поля> <название поля>;

<тип для поля> < название поля>;

……………..

<тип для поля> < название поля>;

}

К примеру:[3]

struct anketa {

char name1[20];

enum {man1, woman1} pol;


int born1;

}

anketa a[4], b1;

Можно определять переменные структуры, не определяя новые имена типа, то есть используя анонимный тип.

Такое описание переменных структуры будет выглядеть так:[11]

struct {

<тип для поля> <название поля>;

<тип для поля> < название поля>;

……………..

<тип для поля> < название поля>;

} <список переменных>;

Во втором разделе курсовой работы рассмотрены основные понятия о типах данных:[10]

– приведены определения и примеры переменных базовых типов;

– рассмотрены основные понятие структурированных типов данных на языке С++.

3. ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННЫХ НА ЯЗЫКЕ С++

3.1. Использование переменных в массивах в С++

Рассмотрим на примере использование массивов (одномерных и двумерных) реализацию их обработки. Стоит заметить, что каких-то стандартных функций для обработки числовых массивов в С++ не используется.

Пусть дана прямоугольная матрица А(M,N). Нужно составить программу, вычисляющую сумму элементов каждой строки. Из сумм надо сформировать одномерный массив, упорядочить его по убыванию методом пузырька (Bubble Sort).

Преобразовать этот массив, заменив все положительные элементы единицами, а все отрицательные элементы нулями.

Необходимо вывести на экран исходную матрицу, отсортированный массив и преобразованный массив.

//подключение заголовочных файлов

#include <iostream>

#include <conio.h>

//определение пространства имен

using namespace std;

int main()

{

//объявление переменных

float a2[20][20],b2[20],s;

int i,j,n2,m2;

//ввод размерности

cout<<"n=";

cin>>n2;

cout<<"m=";

cin>>m2;

//ввод матрицы

cout<<"Array:"<<endl;

for(i2=0;i2<n2;i2++)

for(j2=0;j2<m2;j2++)

cin>>a[i2][j2];

//вычисление сумм по строкам

for(i2=0;i2<n2;i2++)

{

s=0;

for(j2=0;j2<m2;j2++)

s=s+a2[i2][j2];

b2[i2]=s;

}

//вывод одномерного массива

cout<<"Vector:"<<endl;

for(i2=0;i2<n2;i2++)

cout<<b2[i2]<<" ";

//сортировка одномерного массива

for(i2=0;i2<n2;i2++)

for(j2=0;j2<m2;j2++)

if(b2[i2]<b2[j2])

swap(b2[i2],b2[j2]);

cout<<endl;

//вывод отсортированного вектора

cout<<"Sorted Vector:"<<endl;

for(i2=0;i2<n2;i2++)

cout<<b2[i2]<<" ";

getch();

return 0;

}

В результате получим (рисунок 5):