ТОП 10:

Типы данных с плавающей точкой



Лекция №1 Введение. Основные понятия.

Алгоритм – это последовательность команд, предназначенная исполнителю, в результате выполнения которой он должен решить поставленную задачу.

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

Запись алгоритма на формальном языке называется программой.

Компьютерная программа – последовательность инструкций, определяющих процедуру решения конкретной задачи компьютером

Язык программирования — формальная знаковая система, предназначенная для записи компьютерных программ

Все языки программирования состоят из алфавита, синтаксиса и семантики.

Алфавит - это набор различимых символов: букв, цифр, специальных знаков и т.п. Например, алфавит машинного языка состоит из двух символов: 0 и 1

Синтаксис – правила построения конструкций языка

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

Все ЯП делятся на ЯП высокого и низкого уровня.

ЯП высокого уровня – это ЯП, средства которого обеспечивают описание задачи в наглядном, легко воспринимаемом виде, удобном для программиста. Он не зависит от внутренних машинных кодов ЭВМ любого типа, поэтому программы, написанные на языках высокого уровня, требуют перевода в машинные коды программами транслятора либо интерпретатора.

Язык низкого уровня – язык программирования, предназначенный для определенного типа ЭВМ и отражающий его внутренний машинный код

Этапы построения программы

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

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

3.Разработка или выбор алгоритма решения задачи выполняется на основе ее математического описания. Многие задачи можно решить различными способами. Программист должен выбрать оптимальное решение. Неточности в постановке, анализе задачи или разработке алгоритма могут привести к скрытой ошибке программист получит неверный результат, считая его правильным.

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

5. Кодирование запись алгоритма на языке программирования.

6.Отладка и тестирование программы.

Тестирование – поиск ошибок в программе.

Отладка – устранение ошибок.

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

В программе могут возникать ошибки.

Виды ошибок:

Синтаксические – неверно написан код, ошибка в названии функции и т.п.

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

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

Любая программа обрабатывает данные. Классификация данных:

Данные можно разделить на исходные, промежуточные и результативные.

Пример. Найти площадь треугольника по трем сторонам. Исходные данные – стороны, результат – площадь, промежуточные данные – полупериметр.

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

Данные бывают разного типа.

 

Типы данных в С++

Тип данных – это множество значений, которое может принимать переменная.

Тип данных bool

Первый в таблице — это тип данных bool целочисленный тип данных, так как диапазон допустимых значений — целые числа от 0 до 255. Но как Вы уже заметили, в круглых скобочках написано — логический тип данных, и это тоже верно. Так какbool используется исключительно для хранения результатов логических выражений. У логического выражения может быть один из двух результатов true или false. true — если логическое выражение истинно, false — если логическое выражение ложно.

Но так как диапазон допустимых значений типа данных bool от 0 до 255, то необходимо было как-то сопоставить данный диапазон с определёнными в языке программирования логическими константами true и false. Таким образом, константе true эквивалентны все числа от 1 до 255 включительно, тогда как константе false эквивалентно только одно целое число — 0. Рассмотрим программу с использованием типа данных bool.

Тип данных char

Тип данных char — это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте — 8 бит, тогда возведем двойку в степень 8 и получим значение 256 — количество символов, которое можно закодировать. Таким образом, используя тип данных char можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.

Целочисленные типы данных

Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук:short int, unsigned short int, int, unsigned int, long int, unsigned long int.Все они имеют свой собственный размер занимаемой памяти и диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned — без знака. Приставка unsigned говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int и unsigned short int.

Приставки целочисленных типов данных:

shortприставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;

long приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;

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

Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел — это тип данных int. Благодаря приставкам short, long,unsigned появляется некоторое разнообразие типов данных int, различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.

Арифметические функции

Основные бинарные операции, расположенные в порядке уменьшения приоритета:

· умножение *;

· деление /;

· сложение +;

· вычитание -;

· остаток от целочисленного деления %.

Группа выполняет задания. После все задания рассматриваются на доске.

Оператор присваивания

В С++ существует пять операций присваивания, не считая основную операцию присваивания: =.

  1. +=операция присваивания-сложения;
  2. -=операция присваивания-вычитания;
  3. *=операция присваивания-умножения;
  4. /=операция присваивания-деления;
  5. %=операция присваивания-остатка от деления;


 

Операторы ввода и вывода

Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h. Эта библиотека содержит функции

printf() - для вывода информации

scanf() - для ввода информации.

Вывод информации

Функция printf() предназначена для форматированного вывода. У программиста имеется возможность форматировать данные, то есть влиять на их представление на экране.

Общая форма записи функции printf():

printf("СтрокаФорматов", объект1, объект2, ..., объектn);

СтрокаФорматов состоит из следующих элементов:

· управляющих символов;

· текста, представленного для непосредственного вывода;

· форматов, предназначенных для вывода значений переменных различных типов.

Объекты могут отсутствовать.

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

Основные управляющие символы:

'\n'— перевод строки;

'\t'— горизонтальная табуляция;

'\v'— вертикальная табуляция;

'\b'— возврат на символ;

'\r'— возврат на начало строки;

'\a'— звуковой сигнал.

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

%d— целое число типа intсо знаком в десятичной системе счисления;

%u— целое число типа unsigned int;

%x— целое число типа int со знаком в шестнадцатеричной системе счисления;

%o— целое число типа int со знаком в восьмеричной системе счисления;

%hd— целое число типа shortсо знаком в десятичной системе счисления;

%hu— целое число типа unsigned short;

%hx— целое число типа short со знаком в шестнадцатеричной системе счисления;

%ld— целое число типа long int со знаком в десятичной системе счисления;

%lu — целое число типа unsigned long int;

%lx— целое число типа long int со знаком в шестнадцатеричной системе счисления;

%f— вещественный формат (числа с плавающей точкой типа float);

%lf— вещественный формат двойной точности (числа с плавающей точкой типа double);

%e— вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);

%c— символьный формат;

%s— строковый формат.

Пример

int a=5;
float x = 2.78;
printf("\n Значение переменной a=%d", a);
printf("\n Значение переменной x=%f", x);

Результат работы программы

Значение переменной a=5
Значение переменной x=2.780000

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

float y=1.2345;
printf("\n Значение переменной y=%10.5f\n", y);

Результат работы программы
Значение переменной y= 1.23450

В приведенном примере 10 — общее количество знакомест под значение переменной; 5 — количество позиций после десятичной точки. В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.

Ввод информации

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

scanf ("CтрокаФорматов", адрес1, адрес2,...);

Строка форматов аналогична функции printf(). Для формирования адреса переменной используется символ амперсанд '&':

адрес = &объект

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

Пример

float y;

printf("Введите y: ");

scanf("%f",&y); // Ввод значения переменной y

printf("Значение переменной y=%f",y);

 

Результат работы программы:

Введите у: 12.5

Значение переменной у = 12.5

Пишем первую программу

Программа на языке Си состоит из одной или более подпрограмм, называемых функциями. Язык Си является блочно-структурированным. Каждый блок заключается в фигурные скобки {}. Основным блоком в программе консольного приложения на языке Си является главная функция, имеющая имя main().

Каждое действие в языке Си заканчивается символом "точка с запятой" - ;. В качестве действия может выступать вызов функции или осуществление некоторых операций.

Комментарии в языке Си

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

/* - начало комментария;

*/ - конец комментария.

Вся последовательность, заключенная между этими символами, является комментарием.

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

int a; /* целая

переменная */

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

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

float b; // вещественная переменная

Главная функция

При выполнении консольного приложения, написанного на языке Си, операционная система компьютера передаёт управление функции с именем main(). Функцию main() нельзя вызывать из других функций программы, она является управляющей.

Следующие за именем функции круглые скобки предназначены для указания параметров (аргументов), которые передаются в функцию при обращении к ней. В данном случае операционная система не передаёт в функцию main() никаких аргументов, поэтому список аргументов в круглых скобках пустой.

В фигурные скобки заключены описания и операторы, которые в данном случае обеспечивают вывод на экран сообщения "Здравствуй, мир!".

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

Перед завершением функции дописывается строка return 0;

 

Пример: Вывод на экран сообщения "Hello, world!".

#include <stdio.h> // Подключение библиотеки ввода-вывода

int main() // Главная функция

{

printf("Hello, world!"); // Вывод сообщения

getchar(); // Задержка окна консоли

return 0;

}

Результат работы программы:

Теперь попробуем написать текст на русском языке.

#include <stdio.h>
int main()
{

printf("Здравствуй, мир!");

getchar();

return 0;
}

Результат работы программы:

Проблема русского языка в консольных приложениях заключается в том, что консоль и редактор кода Microsoft Visual Studio поддерживают разные кодовые страницы. Для того, чтобы увидеть русские символы в консоли необходимо поменять кодовую страницу в консоли, чтобы она соответствовала кодовой странице редактора (1251). С этой целью вызывается функция system("chcp 1251") с соответствующей командной строкой. Прототип функции system()содержится в библиотеке <stdlib.h>.

При этом текст программы будет выглядеть следующим образом:

#include <stdio.h>
#include <stdlib.h>
int main()

{

system("chcp 1251"); // Текущая кодовая страница 1251

system("cls"); // Очистка консоли

printf("Здравствуй, мир!"); // Вывод сообщения

getchar();

return 0;
}

Результат работы программы:


 

Разветвляющиеся алгоритмы

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

Для разработки таких алгоритмов применяют условный оператор. Условный оператор может использоваться в форме полной или неполной развилки.

 

В случае неполной развилки если условие истинно, то блок операций выполняется, если условие ложно, то блок операций не выполняется. В случае полной развилки если условие истинно, то выполняется блок операций 1, иначе выполняется блок операций 2.

Условие может быть простым и составным.

В простых условия используются операторы сравнения:

< - меньше, чем..

> - больше, чем...

<= - меньше, чем... или равно

>= - больше, чем... или равно

<> - не равно

= = - равно

Например, простыми отношениями являются следующие:

x-y>10; k<= (a+b); s = = 0;

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

&& - И

|| - ИЛИ

! – НЕ

Например

((y>10) && (k<= a))

 

На языке Си условный оператор имеет вид:

Оператор условия может быть вложенным.


 

Примеры.

Если число больше 5, вывести информацию об этом.

#include <stdio.h>
int main() {

int k;

printf("k= ");

scanf("%d",&k);

if(k >= 5) {

printf("%d >= 5", k);

} else {

printf("%d < 5", k);

}

return 0;
}

Задания для самостоятельной работы:

1) Вычислить значение S=1/x

2) Составить программу, которая, если введенное число отрицательное, меняет его на противоположное.

 

Оператор ветвления switch (оператор множественного выбора)

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

Общая форма записи

switch (целое выражение) {

case константа1: блок операций1;

break;

case константа2: блок операций2;

break;. . .

case константаn: блок операцийn;

break;

default: блок операций по умолчанию;

break;}

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

· вычисляется целочисленное выражение в скобках оператора switch;

· полученное значение сравнивается с метками (константами) в опциях case, сравнение производится до тех пор, пока не будет найдена метка, соответствующая вычисленному значению целочисленного выражения;

· выполняется оператор соответствующей метки case;

· если соответствующая метка не найдена, то выполнится оператор в опции default.

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


 

Циклические алгоритмы

Цикл – набор команд, который выполняется многократно.

Тело цикла – последовательность выполняемых команд.

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

Шаг цикла — это значение, на которое будет увеличиваться или уменьшаться счетчик цикла при каждом проходе.

1. Цикл с предусловием.

Блок схема:

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

while(условие)

{

Блок команд

}

 

Пример. Напечатать квадраты чисел от 1 до 10. Здесь переменная i является параметром цикла, она участвует в условии и она же изменяется при каждом прохождении тела цикла.

int i=1;

While (i<=10)

{

Printf(“%d\n”, i*i);

i = i +1;

}

 

Еще пример. Найдем сумму чисел от i до k.

int k=5;
int i=1;
int sum=0;
while(i <=k) {

sum = sum + i;

i++;
}

2. Цикл с постусловием

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

do
{
тело цикла
}
while (условие);

Пример.

Напечатать квадраты чисел от 1 до 10.

int i=1;

do

{ printf(“%d\n”, i*i);

i = i +1;

}

while (i<=10)

 

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

 

3. Цикл с заданным числом повторений (параметрический цикл)

for (Параметр = НачЗн; Условие; Шаг)

{

Тело цикла;

}

 

Условие проверяется перед каждым повторением тела цикла. Если оно истинно, то тело цикла выполняется и так до тех пор, пока параметр цикла будет удовлетворять условию.

Пример.

Напечатать квадраты чисел от 1 до 10.

int i;

for(i=1;i<=10;i=i+1)

{ printf(“%d\n”, i*i);

}

 

Оператор break делает принудительный выход из цикла, даже когда условие цикла — истинно. Оператор break удобно использовать, когда необходимо выйти из цикла при особых обстоятельствах. Оператор continue нужен если необходимо пропустить какой-то блок кода, но при этом не прекращать работу цикла.

 

Упражнения:

1. Найти сумму четных чисел от 1 до 100

2. Вывести все числа от 1 до 100 кратные пяти

Массивы

Массив — это пронумерованная последовательность величин одинакового типа, обозначаемая одним именем. Элементы массива располагаются в последовательных ячейках памяти, обозначаются именем массива и индексом.

Доступ к элементам массива осуществляется с помощью номера (индекса) нужного элемента.

Размер массива – количество элементов массива.

Размерность массива – количество индексов массива.

Примером одномерного массива может служить последовательность чисел, примером двумерного массива – матрица, примером трехмерного массива – точка в системе координат (ХУZ)

Для объявления массива в языке Си используется следующий синтаксис:

тип имя[размерность]={инициализация};

int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; // массив a из 10 целых чисел

int a[10] = {0}; // массив a из 10 элементов, инициализированных 0

При обращении к элементам массива индекс требуемого элемента указывается в квадратных скобках [].

Пример

#include <stdio.h>
int main() {

int a[]={5, 4, 3, 2, 1}; // массив a содержит 5 элементов

printf("%d %d %d %d %d\n",a[0], a[1], a[2], a[3], a[4]);

getchar();

return 0;
}

 

Пример. Ввод, вывод элементов массива.

#include <stdio.h>
int main() {

int a[5]; // объявлен массив a из 5 элементов

int i;

// Ввод элементов массива

for(i=0; i<5; i++) {

printf("a[%d] = ", i);

scanf("%d", &a[i]); // &a[i] - адрес i-го элемента массива

}

// Вывод элементов массива

for(i=0;i<5;i++) {

printf("%d ",a[i]); // пробел в формате печати обязателен

}

getchar();

getchar();

return 0;
}

Упражнения:

1. Организовать ввод-вывод элементов двумерного массива;

2. Найти количество нулей в одномерном массиве;

3. Найти количество нулей в каждой строке двумерного массива.

4. Дан массив из 10 элементов. Поменять местами наибольший и начальный элементы массива.

Функция ввода символов

Для ввода символов может использоваться функция

char getchar();

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

 

Функция вывода символов

Для вывода символов может использоваться функция

char putchar(char);

которая возвращает значение выводимого символа и выводит на экран символ, переданный в качестве аргумента.

 

Пример Посчитать количество определенного символа во введенной строке.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main() {

char s[80], sym;

int count, i;

system("chcp 1251");

system("cls");

printf("Введите строку: ");

gets(s);

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

sym = getchar();

count = 0;

for(i=0; s[i]!='\0'; i++)

{

if(s[i]==sym)

count++;

}

printf("В строке\n");

puts(s); // Вывод строки

printf("символ ");

putchar(sym); // Вывод символа

printf(" встречается %d раз",count);

getchar(); getchar();

return 0;
}

 

Процедуры и функции

 

Много раз мы уже использовали различные функции в работе. Например, функция strlen(s). Результатом работы этой функции является количество символов в строке s. В данном случае s – это аргумент функции. Количество символов в строке – результат функции или возвращаемое значение. Мы с вами можем писать свои собственные функции и помещать их в свои собственные библиотеки.

Для этого обязательно нужно указать:

1. Тип результата функции;

2. Имя функции;

3. Информацию об аргументах функции;

4. Тело функции.

Синтаксис следующий:

ТипВозвращаемогоЗначения ИмяФункции(СписокФормальныхАргументов)

{

ТелоФункции;

...

return(ВозвращаемоеЗначение);

}

 

Для чего используют функции:

1. Если какой-то фрагмент кода встречается несколько раз, то его лучше поместить в функцию и вызывать из текста основной программы. Это упростит код.

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

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

переменная = ИмяФункции(СписокФактическихАргументов);

Как только в программе зафиксирован вызов функции, управление передается телу функции. В ходе выполнения тела функции, получаем некоторый результат, который необходимо вернуть в тело основной программы. Для этого предназначен оператор return. Оператор return говорит о том, что выполнение функции надо завершить. Оператор return может находится не только в конце функции. Тип функции и тип результата должны совпадать. Оператор return может отсутствовать совсем. Тогда функция называется процедурой и тип возвращаемого ей значения указывается void.

Пример Посчитать сумму двух чисел.

#include <stdio.h>

 

int sum(int x, int y) {

int k;

k = x + y;

return(k);}

 

int main() {

int a, r;

printf("a= ");

scanf("%d",&a);

r = sum(a, 5); // вызов функции: x=a, y=5

printf("%d + 5 = %d",a, r);

getchar();getchar();

return(0);
}

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

Пример

#include <stdio.h>
int sum(int, int);

int main() {

int a, r;

printf("a= ");

scanf("%d",&a);

r = sum(a, 5); // вызов функции: x=a, y=5

printf("%d + 5 = %d",a, r);

getchar();getchar();

return 0;
}

int sum(int x, int y) {

int k; // семантика

k = x + y;

return(k);}

 

Создание библиотеки.

Мы рассмотрели два типа функций, причём объявление функций выполняли в области программы, после подключения заголовочных файлов, но до начала функции main().

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

Требуется создать два файла типа *.cpp и *.h.

Файл *.h нужен для того, чтобы скрыть реализацию функций, т. е. в файле *.h будут содержаться прототипы функций. С помощью обозревателя решений MVS создаём файл типа *.h и называем его.

// код файла summa.h #ifndef summa #define summa int summa(int A, int B); // прототип функции нахождения палиндрома пятизначных чисел #endif

Директивы в строках 2,3,5 необходимо всегда объявлять в файлах с прототипами функций, причём прототипы функций всегда объявляются в файлах типа *.h. После директив записанных в строках 2,3, но до директивы #endif объявляются прототипы функций. В строке 4 объявлен прототип функции summa() Объявление данной функции находится в файле summa.cpp, который предварительно тоже был создан с помощью обозревателя решений MVS.

// содержимое файла palendrom.cpp #include "stdafx.h" #include "summa.h" int summa(int A, int B) { return (A+B); // }

В файле summa.cpp находится объявление функции summa(). Так как файл summa.cppявляется исполняемым файлом (*.cpp — исполняемые файлы), то в нём обязательно нужно подключить контейнер "stdafx.h", как в строке 2. Чтобы связать файл, где объявлена функция summa() и файл с её прототипом, подключим заголовочный файл (файл с прототипом), это сделано в строке 3. Обратите внимание на то, что при подключении созданного нами файла используются двойные кавычки, а не знаки больше, меньше. Осталось только запустить функцию summa()в главном исполняемом файле.

#include "stdafx.h" #include <iostream> // подключение заголовочного файла, с прототипом функции summa () #include " summa.h" using namespace std;   int main(int argc, char* argv[]) { Summa(2,4); return 0; }

В строке 6 мы подключили файл с прототипом функции summa(), после чего можно использовать эту функцию. Итак, мы разбили программу на три файла:

  • файл проекта
  • заголовочный файл summa.h
  • исполняемый файл summa.cpp

Файл проекта связываем с заголовочным файлом, а заголовочный файл связываем с исполняемым файлом, в таком случае файл проекта увидит функцию summa () и сможет её запустить.

 

Про функцию main()

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

int main(int argc, char* argv[]) { /* ... */ }

 

Как мы видим у функции main() также есть формальные параметры. Они нужны для запуска программы из командной строки. Первый параметр содержит количество параметров командной строки, второй это массив строк, содержащий параметры командной строки. Т.е. первый параметр показывает количество элементов массива во втором параметре. Первый элемент массива строк (argv[0]) всегда содержит строку, использованную для запуска программы (либо пустую строку). Следующие элементы (от 1 до argc - 1) содержат параметры командной строки, если они есть. Элемент массива строк argv[argc] всегда должен содержать 0.

 

Указатели

 

При объявлении переменных, в оперативной памяти компьютера выделяется память под них. Переменная типа int занимает 4 байта памяти, соответственно массив из 100 элементов типа int будет занимать 4*100 байтов памяти. Для работы с большими проектами это создает проблемы. Программы зависают. Поэтому, зачастую используется указатели.

Указатель — это переменная, хранящая в себе адрес ячейки оперативной памяти, например 0x100.

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

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

тип *имя_объекта;

Тип указателя— это тип переменной, адрес которой он содержит.

ля работы с указателями в Си определены две операции:

· операция * (звездочка) — позволяет получить значение объекта по его адресу - определяет значение переменной, которое содержится по адресу, содержащемуся в указателе;

· операция & (амперсанд) — позволяет определить адрес переменной.

Например,

сhar c; // переменная

char *p; // указатель

p = &c; // p = адрес c

 

Пример, демонстрирующий работу указателя:

#include "stdio.h"

#include <iostream>

#include <string.h>

 

using namespace System;

 

int main()

{

//простой пример указателей

int a = 4;

int *pr;

pr=&a;

printf(" pr = %p\n",pr);

printf("adress a = %p\n",&a);

printf("a = %d\n",a);

printf("znach pr = %d\n",*pr);

system("pause");

 

В результате:

 

Как же использовать переменные при динамическом выделении памяти:

Выделение памяти осуществляется с помощью оператора new и имеет вид:

тип_данных *имя_указателя = new тип_данных;

например int *a = new int;.

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

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

тип данных *имя_указателя = new тип_данных(значение).

Для того, чтобы освободить память, выделенную оператором new, используется оператор delete.

Пример:

#include "stdafx.h"

#include "stdio.h"

#include <iostream>

 

using namespace System;

 

int main()

{

int *a = new int; // Объявление указателя для переменной типа int

int *b = new int(5); // Инициализация указателя

 

*a = 10;

*b = *a + *b;

printf("b = %d\n",*b);

 

delete b;

delete a;

printf("b = %d\n",b);

Динамическое выделение памяти под массив позволяет формировать массивы произвольной длины.

Пример:

#include "stdafx.h"

#include "stdio.h"

#include <iostream>

int main()

{

int num; // размер массива

printf("Enter integer value: ");

scanf("%d",&num); // получение от пользователя размера массива

 

int *p_darr = new int[num]; // Выделение памяти для массива

for (int i = 0; i < num; i++) {

// Заполнение массива и вывод значений его элементов

p_darr[i] = i;

printf("Value of %d element is %d \n" , i, p_darr[i]);

}

delete [] p_darr; // очистка памяти

 

//

 

system("pause");

 

return 0;

}

Структуры

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

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

Общая форма объявления структуры:

struct тип_структуры
{

тип ИмяЭлемента1;

тип ИмяЭлемента2;

. . .

тип ИмяЭлементаn;

};

После закрывающей фигурной скобки } в объявлении структуры обязательно ставится точка с запятой.

Пример объявления структуры

struct date
{

int day; // 4 байта

char *month; // 4 байта







Последнее изменение этой страницы: 2017-02-10; Нарушение авторского права страницы

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