Процедурный подход к программированию Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»

Презентация:



Advertisements
Похожие презентации
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 1 Процедурный подход к разработке программ (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем,
Advertisements

ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Лабораторная работа 1 Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 4 Работа с бинарными файлами (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем УКАЗАТЕЛИ Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Алгоритмы поиска Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных.
ПРОГРАММИРОВАНИЕ/ ЯЗЫКИ ПРОГРАММИРОВАНИЯ Лекция 5 Структуры данных (весенний семестр 2012 г.) Доцент Кафедры вычислительных систем, к.т.н. Поляков Артем.
Практическое занятие ОПЕРАЦИИ (сравнение) Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
ОСНОВЫ ПРОГРАММИРОВАНИЯ Раздел 2. Математические основы программирования Логические алгоритмы Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем Юрьевич.
Часть 1: «Основы программирования». Содержание Основные понятия. Структура программы. Ввод-вывод Программирование циклов. Операторы цикла while, for и.
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ Работа с ОС GNU/Linux в терминальных классах Кафедры ВС Старший преподаватель Кафедры ВС, к.т.н. Поляков Артем.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Методические указания к лабораторной работе 1 Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем.
ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Подготовка входных данных Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных.
Время жизни и области видимости программных объектов Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ.
Функции Лекция 8. Назначение функций Функции - самостоятельные программные единицы, спроектированные для решения конкретной задачи. Функции по структуре.
Лекция 7. Структура языка С/С++. Операторы ветвления: условный оператор if. Полное ветвление. Неполное ветвление. Оператор множественного выбора switch.
Практическое занятие Ввод-вывод информации Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Основы информатики Лекция. Функции Заикин Олег Сергеевич
Подпрограммы 1.Принцип модульности 2.Область действия переменных 3.Параметры подпрограмм 4.Модули.
Краткое введение в язык программирования С Аксёнов Сергей Владимирович к.т.н., доцент каф.ОСУ ТПУ Томский политехнический университет.
Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных.
Транксрипт:

Процедурный подход к программированию Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем ЯЗЫКИ ПРОГРАММИРОВАНИЯ / ПРОГРАММИРОВАНИЕ

Подпрограммы Подпрограммы упрощают структуру сложных программ. Разбиение программы на подпрограммы облегчает ее отладку в целом, так как каждая подпрограмма может быть тестироваться и отлаживаться отдельно. Повторное использование кода позволяет уменьшить размер программы. Подпрограммы могут использоваться в нескольких программах как в виде исходного кода, так и через вызов объектного (бинарного) кода (программные библиотеки). 2 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ»

Использование "копирования кода" для решения сходных задач 3 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; int i = 0; sum1 = 0; for(i=0; i < 5; i++) sum1 += m1[i]; sum2 = 0; for(i=0; i < 3; i++) sum2 += m2[i]; sum3 = 0; for(i=0; i < 4; i++) sum3 += m3[i]; printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); }

Сложность поддержки кода 4 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; int i = 0; sum1 = 0; for(i=0; i < 5; i++) sum1 += m1[i]; sum2 = 0; for(i=0; i < 3; i--) sum2 += m2[i]; sum3 = 0; for(i=0; i < 4; i--) sum3 += m3[i]; printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); } То, что ошибка была обнаружена и исправлена в одном из фрагментов кода. не обеспечивает исправления аналогичных ошибок в подобных фрагментах программы, расположенных в других местах программы.

Высокая вероятность ошибки 5 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; int i = 0; sum1 = 0; for(i=0; i < 5; i++) sum1 += m1[i]; sum1 = 0; for(i=0; i < 3; i++) sum2 += m2[i]; sum3 = 0; for(i=0; i < 3; i++) sum2 += m3[i]; printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); } При копировании и доработке аналогичного кода высока вероятность опечаток. Такие опечатки достаточно сложно обнаружить, так как код выглядит корректным.

Использование функций для решения сходных задач 6 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int summas(int cnt, int mas[]){ int sum = 0, i; for(i=0; i < cnt; i++) sum += mas[i]; return sum; } int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; sum1 = summas(5,m1); sum2 = summas(3,m2); sum3 = summas(4,m3); printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); }

Поддержка кода 7 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int summas(int cnt, int mas[]){ int sum = 0, i; for(i=0; i < cnt; i--) sum += mas[i]; return sum; } int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; sum1 = summas(5,m1); sum2 = summas(3,m2); sum3 = summas(4,m3); printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); } Исправление требуется только в одном месте программы! После этого все действия по подсчету суммы эл-тов массива будут производиться корректно.

Решение задачи в новом фрагменте программы 8 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include #define ASIZE(x,type) ( sizeof(x)/sizeof(type) ) int summas(int cnt, int mas[]){ int sum = 0, i; for(i=0; i < cnt; i--) sum += mas[i]; return sum; } int main() { int m1[5] = {1,2,3,4,5}, m2[3] = {3,6,0}; int m3[4] = {12, 20, 1, 1}; int sum1, sum2, sum3; sum1 = summas(ASIZE(m1,int),m1); sum2 = summas(ASIZE(m2,int),m2); sum3 = summas(ASIZE(m3,int),m3); printf("sum1=%d, sum2=%d, sum3=%d\n",sum1,sum2,sum3); } Исправление требуется только в одном месте программы! После этого все действия по подсчету суммы эл-тов массива будут производиться корректно.

Функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 9 Функция – это совокупность объявлений и операторов, предназначенная для решения некоторой задачи. Для обращения к функции используется ее имя. В любой программе, написанной на языке СИ, должна быть функция с именем main (главная функция или точка входа в программу), с которой начинается выполнение программы. С использованием функций в языке СИ связаны три понятия: определение функции – описание действий, выполняемых функцией; объявление (прототип) функции – задание формы обращения к функции; вызов функции;

Определение функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 10 int sum_count(int quant,int nums[]) { int i, sum = 0; for(i=0;i

int sum_count(int quant,int nums[]) { int i, sum = 0; for(i=0;i

Объявление (прототип) функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 12 int sum_count(int quant,int nums[]); { int i, sum = 0; for(i=0;i

Объявление (прототип) функции (2) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 13 Прототип необходим в тех случаях, когда вызов функции необходимо выполнить до ее определения ИЛИ если определение функции располагается в ДРУГОМ файле. int sum_count(int quant,int nums[]); // прототип..... int main(){ int mas[] = {1,2,3,4,5,6,7}; int sum = sum_count(sizeof(mas)/sizeof(int),nums); // вызов return 0; }..... int sum_count(int quant,int nums[]) // определение { int i, sum = 0; for(i=0;i

Изменение аргументов в функции © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 14 В языке си аргументы передаются по значению. Это означает, что значение из фактического параметра копируется в формальный. Все дальнейшие изменения формального параметра не затронут фактический. int sum_sub(int x, int y, int sum, int sub){ sum = x + y; sub = x – y; } int main(){ int s = 5, sm = 0, sub = 0; sum_sub(10,s,sm,sub); printf("sum = %d, sub = %d\n", sm, sub); return 0; } Изменяются только формальные параметры! sum = 0, sub = 0

Изменение аргументов в функции (глобальные переменные) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 15 Данная возможность существует, однако использование глобальных переменных не рекомендуется, так как оно ограничивает способы использования функции (недопустимы рекурсивные вызовы), а также не является потоко-безопасным (не допускает многопоточность). Требуется постоянно помнить имена глобальных переменных. #include int sum = 0, sub = 0; int sum_sub(int x, int y, int sum, int sub){ sum = x + y; sub = x – y; } int main(){ int s = 5, sm = 0, sub = 0; sum_sub(10,s,sm,sub); printf("sum = %d, sub = %d\n", sm, sub); return 0; } sum = 15, sub = 5

Изменение аргументов в функции (указатели) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 16 Указатели являются более предпочтительным вариантом, который не обладает недостатками, связанными с глобальными переменными. #include int sum_sub(int x, int y, int *sum, int *sub){ *sum = x + y; *sub = x – y; } int main(){ int s = 5, sm = 0, sb = 0; sum_sub(10, s, &sm, &sb); printf("sum = %d, sub = %d\n", sm, sb); return 0; } sum = 15, sub = 5 5 s AsAs A sm A sb smsb 105 A sm x AsAs A sum ysum A sub sub A sb

Изменение аргументов в функции (массивы) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 17 Имя массива является указателем-константой. В языке Си массивы передаются по указателю, а не по значению. Поэтому все изменения, внесенные в массив, сохраняются после завершения функции. #include int sum_sub(int x, int y, int out[2]){ out[0] = x + y; out[1] = x – y; } int main(){ int s = 5, m[2]; sum_sub(10, s, m); printf("sum = %d, sub = %d\n", m[0], m[1]); return 0; } sum = 15, sub = 5 5 s AsAs AmAm m = A m 105 AmAm x AsAs A sm A out yout

Перевод символов строки в число 18 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» \ Название подпрограммы: my_atoi. Входные данные: строка символов, заканчивающаяся '\0'. Выходные данные: 1) индикатор корректности данных: можно ли перевести входную строку в число. 2) если входные данные корректны – число в целочисленном формате. Примеры входных данных: "102345" -> -1132\ "-1132" -> "123s54" -> 123s54\

Алгоритм решения задачи (корректные данные, положительные числа) 19 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» \ s = "102345" -> Стратегия обработки положительных чисел?

Алгоритм решения задачи (корректные данные, положительные числа) 20 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» \ s = "102345" -> ОСОБЕННОСТИ ЗАДАЧИ 1. Первая цифра в строке – самая старшая! Пусть строка s содержит только корректные символы, n – длина s, тогда целочисленное представление s выглядит следующим образом: v = s 0 10 n-1 + s 1 10 n-2 + s 2 10 n-3 + … + s n s n Цифра представлена символом, т.е. его ASCII-кодом: Цифры располагаются в таблице ASCII кодов по возрастанию и непрерывно. Поэтому для перевода цифры из символьного представления в целочисленное достаточно отнять код '0'! 0x31 0 0x300x320x330x340x \ >

Алгоритм решения задачи (корректные данные, положительные числа) 21 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» s s[i] != '\0' v = v*10 + (s[i] – '\0') i = i + 1 i=0 v = 0 v ДА НЕТ

Алгоритм решения задачи (корректные данные, положительные числа) 22 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» -1132\ s = "-1132" -> Стратегия обработки отрицательных чисел?

Алгоритм решения задачи (корректные данные, положительные числа) 23 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» -1132\ s = "-1132" -> ОСОБЕННОСТИ ЗАДАЧИ 1. Перевод модуля числа выполняется по тому же алгоритму, что и для целых положительных чисел: v = s 0 10 n-1 + s 1 10 n-2 + s 2 10 n-3 + … + s n s n Если первым в строке обнаружен символ "минус" знак числа необходимо изменить на противоположный путем умножения его на -1.

Алгоритм решения задачи (корректные данные, положительные числа) 24 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» s s[i]!='\0' v = v*10 + (s[i]–'\0') i = i + 1 i=0 sign = 1 v = 0 v*sign s[0]=='-' sign = -1 i = i + 1 НЕТ ДА

Алгоритм решения задачи (некорректные данные) 25 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 123s54\ s = "123s54 " -> Стратегия обработки некорректных данных?

Алгоритм решения задачи (некорректные данные) 26 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» 123s54\ s = "123s54 " -> ОСОБЕННОСТИ ЗАДАЧИ 1. Перед обработкой каждый символ необходимо проверять на принадлежность интервалу ASCII-кодов, соответствующих цифрам: s[i] >= '0' && s[i]

Символьные константы (вопросы) © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» 27 1) '!' >= '0' – false, '!' ('!' >= '0') && ('!' ='0' – true, 'A' ('!' >= '0') && ('!' ='0' – true, '1' ('!' >= '0') && ('!'

Алгоритм решения задачи (произвольные данные) 28 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» s s[i]!='\0' && isOK(s[i]) v = v*10 + (s[i]–'\0') i = i + 1 i=0 sign = 1 v = 0 v*sign s[0]=='-' sign = -1 i = i + 1 НЕТ ДА s[0]=='\0' ДА error НЕТ

Проверка допустимости символа 29 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int isOK(char c){ if( (c >= '0' && c

Функция перевода строки в число 30 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» int my_atoi(char s[], int *val) { int i = 0, sign=1; if( s[0] == '-' ){ sign = -1; i++; } *val = 0; for(;s[i]!='\0' && isOK(s[i]); i++) *val = (*val)*10 + (s[i] - '0'); if( s[i] != '\0' ) return -1; *val *= sign; return 0; }

Демонстрационная программа 31 © Кафедра вычислительных систем ГОУ ВПО «СибГУТИ» #include int isOK(char c){ if( (c >= '0' && c