
- •Тема 1. Основные этапы решения задач на эвм 5
- •Тема 2. Жизненный цикл программы. Критерии качества программы. 15
- •Тема 3. Схемы алгоритмов, данных, программ 29
- •Тема 1. Основные этапы решения задач на эвм Постановка задачи разработки программного обеспечения
- •Анализ формальной постановки задачи
- •Выбор или разработка математической модели и метода решения
- •Разработка алгоритма
- •Базовые структуры алгоритма
- •3.2. Цикл с постусловием.
- •Тема 2. Жизненный цикл программы. Критерии качества программы.
- •Техническое задание и спецификация программы
- •Разработка проекта программной системы
- •Программирование (кодирование) или программная реализация алгоритмов
- •Тестирование и отладка
- •Эксплуатация и сопровождение
- •Критерии качества программного обеспечения
- •Тема 3. Схемы алгоритмов, данных, программ
- •Символы данных
- •Отображает данные, вводимые в ручную, во время обработки с устройств любого типа (клавиатура, переключатели, кнопки, световое перо, полоски со штрих кодом и т.Д.).
- •Символы процесса
- •Символы линий
- •Специальные символы
- •Правила применения символов в схемах
- •Правила выполнения соединений
- •Специальные условные обозначения
- •Тема 4. Язык программирования высокого уровня Си Общие сведения о языке Си
- •Алфавит языка Си
- •Грамматика для описания языка, синтаксические диаграммы
- •Структура программы на языке Си
- •Void main() //функция main
- •Имена объектов в программе
- •Выражения, операции и приоритеты
- •Тема 5. Стандартные типы данных
- •Тема 6. Составные типы данных Данные регулярного типа (массивы)
- •Int b [n]; // вектор из 10 целых элементов
- •9 Strcpy(s1,&s2[k]); //копирует правую подстроку из s2 в s1
- •9 Strncpy(s1,&s[2],n); //копирует среднюю подстроку из s2 в s1
- •Void main() /*пример функции*/
- •If(strcmp(s, "пароль"))
- •If(!strсmp("quit", s)) break;
- •Данные комбинированного типа (структуры)
- •Int month;
- •Int year;
- •Перечисления
- •Объединения
- •Указатели
- •Void *addres;
- •Int arrey[25];
- •Тема 7. Представление основных управляющих структур программирования Оператор присваивания
- •Составной оператор
- •Оператор перехода Goto
- •Условный оператор If
- •Оператор выбора switch
- •Операторы цикла while, do – while, for
- •Int I,j,imax,jmax,imin,jmin;
- •Операторы прерывания циклов
- •If (!flag) printf("Отрицательных чисел нет"); Форматированный ввод данных
- •Форматированный вывод данных
- •Преобразование типов
- •Инициализация данных
- •Тема 8. Функции
- •Определение функций в языке Си
- •Int rus (unsigned char r)
- •Void change (int X, int y)
- •Void change (int *X, int *y)
- •Вызов функций в языке Си
- •Int *fun (intx,int *y);
- •Int main()
- •Рекурсивные функции
- •Int nodWhile (int m, int n)
- •Int nodWhile (int m, int n)
- •Int main()
- •Int fCalculated[nFib];
- •Int FibDinam (int n)
- •Int main()
- •Int Summa(int n, int a[100])
- •Int main()
- •Тема 9. Файлы
- •Int fseek(file *fp, long count, int access);
- •Int ferror(file *fp);
- •Int remove(char *file_name);
- •Void rewind(file *fp);
- •Int main()
- •Тема 10. Приемы программирования. Примеры алгоритмов Алгоритмы сортировки
- •Исходный массив
- •Void SortBubble (int count, int* pArr)
- •Исходный массив
- •Void SortSelect(int count, int* pArr)
- •Int i1,temp;
- •Int jmax;
- •Void SortInsert (int count, int* pArr)
- •Int temp, j;
- •Алгоритмы поиска
- •Int bfSearch(char *s, char *p)
- •Int bmtarr[255];
- •Int bmSearch(int startpos, char *s, char *p)
- •Int BinarySearch (int lb, int ub, int key, int* pArr)
- •Динамические структуры данных
- •Линейные списки
- •Int value; // значение элемента
- •Void PrintSearchList (list head, int val)
- •If (lfound) printf("Элемент в списке найден!");
- •Стек, очередь, дек
- •Int prior(char);
- •Void main(void)
- •Int k, point;
- •Int prior(char a)
- •Деревья
- •Int info; //информационное поле
- •Приложение 1. Стандартные библиотеки языка Си
- •Приложение 2. Примеры реализации алгоритмов
- •Int main()
- •Int arr[10]; // Массив arr из 10 целочисленных элементов
- •Int I; // Счетчик для циклов
- •Int main()
- •Int main()
- •Int main()
- •Int Temp;
- •Int CurrentYear, Diff, Day1, Day2, Month1, Month2, I, Visokos;
- •Int main()
- •InsertSort(d, max); // Сортируем массив b методом вставок
- •Int number;
- •Int main()
- •Не рекурсивный алгоритм решения задачи Ханойская башня.
- •Int main()
- •Рекурсивный алгоритм решения задачи Ханойская башня.
- •Void move(int I, int j, int d)
- •Void hanoy(int I, int j, int k, int d)
- •Int main()
- •Int Cubic(double *X,double a,double b,double c);
- •Int Cubic (double *X, double a, double b, double c)
- •Void lu_backsub (double **a, int n, int *indx, double *b)
- •Void lu_invert (double **a, int n, int *indx, double **inv, double *col)
- •Int BracketRoot (double x0, double *a, double *b, double d0, double di, double dmax, double (*fun)(double));
- •Int BracketRoot (double x0, double *a, double *b, double d0,
- •Int main()
- •Int expo, I;
- •If (expo & 1)
- •Int main()
- •Приложение 3. Лабораторные работы Лабораторная работа №1
- •Лабораторная работа №2
- •Лабораторная работа №3
- •Лабораторная работа №4
- •Лабораторная работа №5
- •Лабораторная работа №6
- •Лабораторная работа №7
- •Лабораторная работа №8
- •Лабораторная работа №9
- •Лабораторная работа №10
- •Лабораторная работа №11
- •Лабораторная работа №12
- •Список литературы
Оператор выбора switch
Оператор swith (переключатель), вызывает передачу управления к одному из нескольких операторов, в зависимости от значения выражения. Оператор имеет форму
switch (селектор)
{
case констанстное выражение_1: оператор_1; [break;]
case констанстное выражение_2: оператор_2; [break;]
. . .
case констанстное выражение_n: оператор_n; [break;]
[default: оператор; [break;]]
}
Селектор и константное выражение должны иметь тип int. Оператор помечается префиксом case и обычно является составным. Никакие две вариантные константы в одном и том же переключателе не могут иметь одинаковое значение.
При выполнении оператора swith вычисляется входящий в него селектор и сравнивается с каждой вариантной константой. Если одна из вариантных констант оказывается равной значению этого выражения, то управление передается оператору, который следует за совпадающим вариантным префиксом. Если ни одна из вариантных констант не совпадает со значением выражения и если при этом присутствует префикс default, то управление передается оператору, помеченному этим префиксом. Если ни один из вариантов не подходит и префикс default отсутствует, то ни один из операторов в переключателе не выполняется.
Сами по себе префиксы case и default не изменяют поток управления, которое беспрепятсвенно проходит через такие префиксы. Для выхода из переключателя используется оператор break.
Пример 16. Напишем два эквивалентных оператора: на основе swith и на основе последовательности условных операторов для выбора времени года в зависимости от целочисленного значения переменной months, в которой хранится номер текущего месяца.
// выбор на основе оператора switch
switch (months)
{
case 1 : season = “Зима”; break;
case 2 : season = “Зима”; break;
case 12 : season = “Зима”; break;
case 3 : season = “Весна”; break;
case 4 : season = “Весна”; break;
case 5 : season = “Весна”; break;
case 6 : season = “Лето”; break;
case 7 : season = “Лето”; break;
case 8 : season = “Лето”; break;
default : season = “Осень”; break;
}
// теперь тоже самое на основе операторов if
if (months==1 || months==2 || months==12) season = "Зима";
else
if (months==3 || months==4 || months==5) season = "Весна";
else
if (months==6 || months==7 || months==8) season = "Лето";
else season = "Осень";
На блок-схемах алгоритмов оператор выбора изображается следующим образом (рис.32):
Операторы цикла while, do – while, for
Операторы цикла позволяют реализовать в языке Си, рассмотренные ранее алгоритмические конструкции цикла с предусловием, цикла с постусловием и цикла с заданным количеством итераций.
Цикл с предусловием while
Синтаксис
while <условие> do <оператор>
Сначала вычисляется «условие», если оно истинно, то выполняется «оператор», потом повторяется проверка «условия», и если оно истинно опять выполняется «оператор» и так далее. Если условие ложно, то управление передается на оператор, расположенный после цикла. Вход в тело цикла возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break.
Пример 17. Необходимо ввести вектор вещественных чисел с помощью цикла с предусловием.
int n=10;
float a[10];
int i;
printf("Введите вектор\n");
i=0;
while (i<n)
{
scanf ("%d", &a[i]);
i++;
}
Цикл с постусловием do – while
Синтаксис
do <операторы> while <условие>
Сначала выполняются «операторы», затем вычисляется «условие», если оно ложно, то опять выполняются «операторы» и т.д. Если «условие» истинно, то управление передается на оператор, расположенный после цикла. Вход в тело цикла возможен только через его заголовок, т.е. нельзя войти во внутрь цикла, используя оператор goto. Однако с помощью этого оператора можно досрочно выйти из цикла, что делать не рекомендуется, для этого используется оператор break.
Отметим два ключевых отличия циклов с предусловием и постусловием:
-
Оператор внутри цикла с предусловием может не выполниться ни разу, если при входе в цикл условие сразу будет ложным. Операторы внутри цикла с постусловием выполнятся как минимум 1 раз вне зависимости от истинности условия в конце цикла.
-
Выход из цикла с предусловием происходит, когда условие ложно, а выход из цикла с постусловием – когда условие истинно, поэтому если нужно поменять циклы (цикл с постусловием поменять на цикл с предусловием или наоборот), условие нужно поменять на противоположное.
Эти особенности нужно учитывать при разработке и отладке программ.
Пример 18. Пусть имеется матрица вещественных чисел A[10,10]. Используя цикл с постусловием, написать программу, которая находит в нечетных строках матрицы минимальный элемент, а в четных строках – максимальный.
int n=3;
int a[3][3];
int min,max;