Лекции.Орг


Поиск:




Категории:

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

 

 

 

 


Возврат в вызывающую функцию

Массив

Массив (или массив данных) – это набор однородных(одного типа) элементов, к которым можно обратиться по их порядковому номеру (индексу).

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

Элемент массива (значение элемента массива) – значение, хранящееся в определенной ячейке памяти, расположенной в пределах массива, а также адрес этой ячейки памяти.

Каждый элемент массива характеризуется тремя величинами:

· адресом элемента - адресом начальной ячейки памяти, в которой расположен этот элемент;

· индексом элемента (порядковым номером элемента в массиве);

· значением элемента.

Адрес массива – адрес начального(нулевого) элемента массива.
Имя массива – идентификатор, используемый для обращения к элементам массива.
Размер массива – количество элементов массива
Размер элемента – количество байт, занимаемых одним элементом массива.

 

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


 

Представленный на рисунке массив содержит q элементов с индексами от 0 до q-1. Каждый элемент занимает в памяти компьютера k байт, причем расположение элементов в памяти последовательное.

 

Адреса i-го элемента массива имеет значение

n+k·i

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

 

Длина массива – количество байт, отводимое в памяти для хранения всех элементов массива.

 

ДлинаМассива = РазмерЭлемента * КоличествоЭлементов

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

int sizeof(тип);

Например,

sizeof(char) = 1; sizeof(int) = 4; sizeof(float) = 4; sizeof(double) = 8;

Объявление и инициализация массивов

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

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

Инициализация представляет собой набор начальных значений элементов массива, разделенных запятыми.

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

или int a [0]=0, a[1]=1, …, a[10]=9;

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

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

int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};

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

Пример

int main()

{

int a[5] = {0,1, 2, 3, 4};

int i;

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

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

return 0;

}

 

Однако часто требуется задавать значения элементов массива в процессе выполнения программы. При этом используется объявление массива без инициализации. В таком случае указание количества элементов в квадратных скобках! обязательно.!

 

int a[10];

Для задания начальных значений элементов массива очень часто используется параметрический цикл:

#include <stdio.h>
int main()
{
int i,a[5]; // объявлен массив a из 5 элементов

// Ввод элементов массива
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]); // пробел в формате печати обязателен
return 0;
}

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

 

2.

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

 

#include <stdio.h>

/* подсчет цифр, символов-разделителей и прочих символов */

int main()

{

int c,i,nwhite, other;

int ndigit[10];

nwhite = other = 0;

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

ndigit[i]= 0;

while ((c = getchar())!= 'EOF')

if (c>= '0' && c<='9')//проверка является ли находящийся в c символ цифрой.

++ndigit[c - '0'];// есть числовое значение цифры, в кодировке они по порядку

else if (c == ' ' || c == '\n' || c == '\t')

++nwhite;

else

++other;

printf("digits =");

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

printf("%d", ndigit[i]);

printf(", white space =%d, other =%d\n", nwhite, other);

return 0;

}

 

Дз1.Ввести координаты трёх вершин треугольника. Вывести его площадь. Считаем, что ввод корректный.

 

Функция pow() возвращает значение base, возведенное в степень ехр, т. е. baseexp. Переполнение вызывает ошибку области значений. Также может возникнуть ошибка области определения. Версия этой функции для данных типа long double называется powl().

 

Параметры:

· basis Значение с плавающей точкой — основание.

· exponent Значение с плавающей точкой — степень.

 

 

Функции в языке Си

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

 

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

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

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

 

Определение функции

Каждая функция в языке Си должна быть определена, то есть должны быть указаны:

Ø тип возвращаемого значения;

Ø имя функции;

Ø информация о формальных аргументах;

Ø тело функции.


Определение функции имеет следующий синтаксис:

 

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


Пример: Функция сложения двух вещественных чисел

float sum(float x, float z)
{
float y;
y = x+z;
return y;//return (y);
}

 

В указанном примере возвращаемое значение имеет тип float. В качестве возвращаемого значения в вызывающую функцию передается значение переменной y. Формальными аргументами являются значения переменных x и z.

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

 

Различают системные (в составе систем программирования) и собственные функции.

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

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

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

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

Ø Одну и ту же функцию можно использовать в разных программах.

Ø Функции повышают уровень модульности программы и облегчают ее проектирование.

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


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

 

Вызов функции

Общий вид вызова функции

 

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


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

Возврат в вызывающую функцию

По окончании выполнения вызываемой функции осуществляется возврат значения в точку ее вызова. Это значение присваивается переменной, тип которой должен соответствовать типу возвращаемого значения функции. Функция может передать в вызывающую программу только одно значение.Для передачи возвращаемого значения в вызывающую функцию используется оператор return в одной из форм:

 

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

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


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

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

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

return;


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

#include <stdio.h>
// Функция вычисления суммы двух чисел
int sum(int x, int y) // в функцию передаются два целых числа
{
int k = x + y; // вычисляем сумму чисел и сохраняем в k
return k; // возвращаем значение k
}
int main()
{
int a, s; // описание двух целых переменных
printf("a= ");
scanf("%d", &a); // вводим a

printf("b= ");
scanf("%d", &b);
s = sum(a, b); // вызов функции: x=a, y=b
printf("%d +%d = %d", a,b, s); // вывод: a + b = s
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);
return 0;
}
int sum(int x, int y) // семантика
{
int k;
k = x + y;
return(k);
}

 

дз2.Напишите простой калькулятор на Си

 

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

 

дз3.Реализовать функцию void swap(int,int) с массивом

дз4.Заполняем числами массив из 10 элементов. Нужно поменять местами наибольший и начальный элементы массива. Используем функцию для поиска максимального элемента и обмена

 



<== предыдущая лекция | следующая лекция ==>
Теплопередача. Основные уравнения теплопередачи. Передачи тепла через плоскую стенку. | Классификация элементарных частиц.
Поделиться с друзьями:


Дата добавления: 2017-04-15; Мы поможем в написании ваших работ!; просмотров: 433 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Человек, которым вам суждено стать – это только тот человек, которым вы сами решите стать. © Ральф Уолдо Эмерсон
==> читать все изречения...

2307 - | 2155 -


© 2015-2025 lektsii.org - Контакты - Последнее добавление

Ген: 0.014 с.