- •О.В. Курипта, о.В. Минакова, д.К. Проскурин Основы программирования и алгоритмизации
- •Оглавление
- •Введение
- •Лабораторная работа № 1 создание, отладка и запуск консольного приложения
- •1.1 Теоретические сведения
- •1.2 Приемы, используемые при отладке программ
- •1.3 Пример разработки консольного приложения – вывода текста
- •%[Флаг][ширина][.Точность][h|l|l]тип,
- •2.2 Приемы форматированного вывода информации
- •2.3 Примеры форматированного вывода информации
- •2.4 Практические задания
- •3.2 Приемы оформления кода
- •3.3 Пример конструирования программы
- •3.4 Практические задания
- •4.2 Приемы, используемые при вычислениях
- •4.3 Примеры выполнения заданий
- •4.4 Практические задания
- •4.5 Контрольные задания
- •Лабораторная работа № 5 Реализация разветвляющихся алгоритмов
- •5.1. Теоретические сведения
- •If (выражение) оператор 1;
- •5.2 Приемы оформления ветвлений
- •If (условие) оператор;
- •If (условие) оператор;
- •5.3 Примеры решения задач
- •5.4 Практические задания
- •5.5 Контрольные задания
- •Лабораторная работа №6 Многоальтернативная обработка данных
- •6.1 Теоретическая справка
- •6.2 Примеры использования управляющих конструкций
- •Int choice; /* Текущийвыборпунктаменю*/
- •6.3 Практические задания
- •6.4 Контрольные задания
- •Лабораторная работа №7 Циклический вычислительный процесс
- •7.1. Циклический вычислительный процесс
- •7.2. Приемы эффективного построения циклов
- •7.3. Примеры построения циклов
- •7.4. Практические задания
- •7.5 Контрольные задания
- •Лабораторная работа №8 Использование вложенных циклов
- •8.1. Практические аспекты использования циклов
- •8.2. Методы оптимизации циклов
- •8.3. Примеры использования вложенных циклов
- •8.4. Практические задания
- •8.5. Контрольные задания
- •Лабораторная работа №9 Структурирование программы с использованием функций
- •9.1. Теоретические сведения
- •9.2. Правила написания функций
- •9.3. Примеры написания и использования функций
- •Int fact(int k) //вычисление факториала
- •9.4. Практические задания
- •9.5. Контрольные задания
- •Лабораторная работа №10 Создание одномерных массивов
- •10. 1 Теоретические сведения
- •10.2 Приемы инициализации и заполнения массивов случайными числами
- •10.3 Примеры работы с массивами
- •10.4. Практические задания
- •10.5. Контрольные задания
- •Лабораторная работа №11 Адресная арифметика
- •11.1 Теоретические сведения
- •Int *p1, *p2;//объявление указателя
- •11.2 Способы инициализации указателей
- •11.3 Примеры работы с указателями
- •11.4 Практические задания
- •11.5 Контрольные задания
- •Лабораторная работа №12 Работа со строками через указатели
- •12. 1. Теоретические сведения
- •12. 2. Примеры работы со строками
- •12.3 Способы преобразования чисел в строки
- •12. 4 Практические задания
- •12.5 Контрольные задания
- •Лабораторная работа №13 Использование интегрированных типов данных для разработки программ и создания библиотек
- •13.1 Теоретические сведения
- •13.2 Примеры программ с использованием структур
- •13.3 Практические задания
- •13.4 Практические аспекты создания библиотек на языке Си
- •13.5 Контррольные задания для совместной разработки библиотеки
- •Int w, h; // размеры прямоугольника
- •Int x0, y0; // левая верхняя точка прорисовки
- •Лабораторная работа №14 Запись и чтение файлов
- •14.1 Теоретические сведения
- •Int fclose(указатель файла);
- •14.2 Примеры программ работы с файлами
- •14.3 Практические задания по записи файла
- •14.4 Практические задания на чтение файла
- •14.5 Контрольные задания
- •Лабораторная работа №15 поиск в статическом одномерном массиве
- •15.1 Теоретические сведения
- •15.2 Приемы реализации линейного поиска
- •15.3 Примеры реализации алгоритмов поиска
- •Inta[10]; // массив
- •Int min; // номер минимального элемента
- •Int I; // индекс массива
- •15.4 Практические задания
- •15.5 Контрольные задания
- •Лабораторная работа №16 статический многомерный массив
- •16.1 Теоретические сведения
- •16.2 Приемы работы со статическим многомерным массивом
- •16.3 Примеры работы со статическим многомерным массивом
- •16.4 Практические задания
- •16.5 Контрольные задания
- •Лабораторная работа № 17 динамическИе массиВы
- •17.1 Теоретические сведения
- •17.2 Примеры работы с динамическими массивами
- •Void input_arr_random (float *mas, int n);// прототип функции
- •Input_arr_random (mas,n);// вызов функции
- •17.3 Особенности работы с двумерными динамическими массивами
- •Int **a; /* указатель на двумерный массив */
- •Int ***b; /* указатель на трехмерный массив */
- •17.4 Практические задания
- •17.5 Контрольные задания
- •Лабораторная работа № 18 Передача параметров в функцию
- •18.1 Теоретические сведения
- •18.2 Передача параметров функции main
- •18.3 Примеры передачи структур данных по адресу
- •Int main(void) /* вывод строки в верхнем регистре */
- •Void arrprint (int*a, int n, int m);// прототип функции
- •Int *a; // указатель на массив
- •Int **a; // память под массив указателей на строку
- •18.4 Практические задания
- •18.5 Контрольные задания
- •Лабораторная работа № 19 алгоритмы сортировки
- •19.1 Теоретические сведения
- •19.2 Практические задания
- •Заключение
- •Библиографический список
- •Приложение
- •3 96006, Воронеж, ул. 20-летия Октября,84
9.2. Правила написания функций
Правило 1. Многократно используемый код должен быть помещен в функцию. Если в программе имеется почти идентичный код, появляющийся более чем в одном месте, то этот код должен быть выделен в подпрограмму, которая вызывается из нескольких мест. Выгода состоит в меньшем размере программы, ее лучшей сопровождаемости, необходимости исправления ошибки только в одном месте.
Имя функции также дает хорошую абстракцию. Вызовы функции с хорошо выбранным именем являются обычно самодокументирующимися, так как устраняется необходимость в лишних комментариях.
Правило 2. Функции должны иметь небольшие размеры (не более 100 операторов языка программирования высокого уровня) и, желательно, целиком помещаться на экране.
При росте размера функции следует разбивать ее на более мелкие функции — составные части.
Правило 3. Функция должна решать только одну задачу. Иначе говоря, все функции должны иметь четко выраженное функциональное назначение. Если нельзя кратко описать, что делает функция, следует пересмотреть структуру программы.
Функции, по возможности, не должны использовать общие блоки данных (глобальные переменные), то есть должны получать все необходимые для работы входные данные в форме параметров вызова и возвращать выходные данные вызывающей функции в явном виде.
Иногда в функцию передают всевозможные флаги (управляющие признаки), в зависимости от которых она выполняет весьма разнящиеся операции. Этого следует избегать. Чем меньше число получаемых функцией управляющих признаков, которые в ней анализируются, тем она более функционально проста.
Правило 4. Функция должна быть оформлена. С одной стороны это сделает код читабельным, с другой стороны еще раз заставит оценить функционал.
9.3. Примеры написания и использования функций
Пример 1. Функция вычисления котангенса
(реализация до функции main())
double cotan( double x ) |
Объявление функции cotan с типом возвращаемого значения double и формальным параметром х типа double |
{ |
Начало функции |
double ctg; |
Объявление текущей переменной для результата |
ctg = 1.0 / tan(x); |
Вычисление тангенса с использованием вызова стандартной функции tan(x) и присваивания результата переменной ctg |
return ctg; |
Возращение вычисленного значения |
} |
Конец функции |
Вариант кода без использования дополнительных переменных
double cotan( double x )
{
return 1.0 / tan(x);
}
Пример 2. Вычисление биномиальных коэффициентов
#include<stdio.h>
Описание функции:
Int fact(int k) //вычисление факториала
{
int i, j;
for(i=1, j=1; i<=k; i++) j*=i;
return j;
}// конец определения функции
/* Вычисление биномиального коэффициента
void main()
{
int n, m, nmc, nm;
while(1)
{
printf (“Введите n: ”);
scanf(“%d”, &n);
printf (“Введите m:”);
scanf(“%d”, &m);
if (m>=n && n>=m && n<10) break;
printf (“Должно быть 0<=m<=n”);
}
nm=n-m;
nmc=fact(n)/fact(m)/fact(nm);//вызов функции
printf (“\n Биномиальный коэффициент с (%d из %d) =%d”, m, n, nmc);
}// конец программы
Вариант реализации факториала через рекурсивную функцию
long faсt(int n)
{
if(n<0) return 0;
return ( (n==0) ? 1 : n*faсt(n-1) );
}