ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 1 Процедурный подход к разработке программ (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Императивная парадигма программирования Противопоставлена декларативной парадигме. Вычислительный процесс описывается в виде инструкций, изменяющих состояние программы. Аналогична приказам, выражаемым повелительным наклонением в естественных языках, то есть это последовательность команд, которые должен выполнить компьютер. 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Процедурное программирование Выполнение программы сводится к последовательному выполнению операторов с целью преобразования исходного состояния памяти, то есть значений исходных данных, в заключительное, то есть в результаты. Каждый шаг алгоритма однозначно определяется программистом. Задачи разбиваются на шаги, которые выполняются в некоторой последовательности. Используя процедурный язык, программист определяет языковые конструкции для выполнения последовательности алгоритмических шагов. 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Структурное программирование Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций: последовательное исполнение, ветвление и цикл. Базовые конструкции могут быть вложены друг в друга. Повторяющиеся или логически целостные фрагменты программы могут оформляться в виде подпрограмм. В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы. Разработка программы ведётся пошагово, методом «сверху вниз». 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Проектирование программ сверху-вниз Задача: вычислить значение выражения: A·B + С·B, где A, C – матрицы размерности m x n, а B – матрица n x k. 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» c 21
Проектирование программ "сверху-вниз" Задача: вычислить значение выражения: A·B + С·B, где A, C – матрицы размерности m x n, а B – матрица n x k. 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Задача Ввод данных X·Y X + Y Вывод данных Вычислить выражение Вычислить выражение Ввод Х Ввод вектора scanf (СИ) Произв. векторов Произв. векторов a·b (СИ) a+b (СИ) Сумма векторов Сумма векторов Вывод Х Ввод вектора printf (СИ)
Подпрограммы Подпрограммы упрощают структуру сложных программ. Разбиение программы на подпрограммы облегчает ее отладку в целом, так как каждая программа может быть тестироваться и отлаживаться отдельно. Повторное использование кода позволяет уменьшить размер программы. Подпрограммы могут использоваться в нескольких программах как в виде исходного кода, так и через вызов объектного (бинарного) кода (программные библиотеки). 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»
Подпрограммы в языке Си 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» В языке Си предусмотрены только функции (нет процедур). Однако с их помощью можно реализовать функционал процедуры. С функцией в языке Си связано 3 понятия: определение содержит информацию необходимую для вызова функции, а также код, формирующий тело функции. объявление содержит только информацию необходимую для вызова функции (указывается в заголовочных файлах, например stdio.h). вызов применяется в других подпрограммах для активации действий, связанных с функцией.
РБНФ определения функции 9 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ОпределениеФункции = ТипРезультата ИмяФункции "(" СписокФормПарам ")" "{" { ОператорОписания } Оператор { Оператор } "}" ТипРезультата = ТипДанного ИмяФункции = Идентификатор СписокФормПарам = [ ТипДанного Идентиф {"," ТипДанного Идентиф } ] ТипДанного = БазовыйТип | ПользовательскийТип int sum(int i,int j) { return i + j; }
РБНФ объявления функции 10 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ОпределениеФункции = ТипРезультата ИмяФункции "(" СписокФормПарам ")"";" ТипРезультата = ТипДанного ИмяФункции = Идентификатор СписокФормПарам = [ ТипДанного Идентиф {"," ТипДанного Идентиф } ] ТипДанного = БазовыйТип | ПользовательскийТип int sum(int i,int j);
РБНФ вызова функции 11 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» ОпределениеФункции = [Идентиф=] ИмяФункции "(" СписокФактПарам ")"";" Идентиф = Идентификатор ИмяФункции = Идентификатор СписокФактПарам = [ Идентиф {"," Идентиф } ] ТипДанного = БазовыйТип | ПользовательскийТип int main(){ int s, m=3; s = sum(m, 5); }
Формальные и фактические параметры функции 12 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Формальные параметры локальные переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих фактических параметров. int sum(int i,int j) { int r = i + j; return r; } int main(){ int s, m=3; s = sum(m, 5); } Память summain Cлужебн. информация sm Cлужебн. информация ijr 3 5 8
Формальные и фактические параметры функции (2) 13 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» При вызове функции значения фактических параметров приводятся к типу данного формального параметра. int sum(int i,int j) { int r = i + j; return r; } int main(){ float s, m=3.8; s=sum(m,5.5); } Память summain Cлужебн. информация sm Cлужебн. информация ijr 3 5 8
Передача параметров по значению 14 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» В языке Си параметры передаются по значению. Это означает, что: изменение формального параметра не приводит к изменению фактического! void sum(int i,int j) { i = i + j; } int main(){ int s, m=3; sum(m, 5); printf("%d",m); } Стек summain Cлужебн. информация sm Cлужебн. информация ijr
Передача результатов через параметры функции 15 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Если функция имеет более одного результата, возникает необходимость их возврата через параметры. Для этого выполняется передача указателей на фактические параметры (а не их значения). int sumsub(int *i,int j) { int k = *i *i = k - j; return k + j; } int main(){ int s, m=3; s = sum(&m, 5); printf("%d",m); }
-23 Передача результатов через параметры функции (2) 16 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int sumsub(int *i,int j) { int k = *i *i = k - j; return k + j; } int main(){ int s, m=3; s = sum(&m, 5); printf("%d",m); } Стек summain Cлужебн. информация sm Cлужебн. информация ijk 0x0FFA x0FFA 0FFA 3
Передача результатов через параметры функции 17 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» Если функция имеет более одного результата, возникает необходимость их возврата через параметры. Для этого выполняется передача указателей на фактические параметры (а не их значения). int sumsub(int *i,int j) { i = i - j; return i+2*j; } int main(){ int s, m=3; sum(m, 5); printf("%d",m); } Стек summain Cлужебн. информация sm Cлужебн. информация ijr
Литература 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 1.Подбельский В.В, Фомин С.С. Программирование на языке Си: Учеб. пособие. - 2-е доп. изд. - М.: Финансы и статистика, с. 2.Керниган Б., Ритчи Д., Фьюер А. Язык программирования Си. Задачи по языку Си: Пер. с англ. - М.: Финанасы и статистика, 1985.