
- •Тема 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
- •Список литературы
Не рекурсивный алгоритм решения задачи Ханойская башня.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <string.h>
int y = 0;
int N; // Количество дисков
int dest; // На какой стержень перекладываем
int step = 0; // Номер текущего шага
int max_steps = 0; // Необходимое количество шагов
int first_on = 1; // На каком стержне находится первый диск
// Состояние объекта управления - "содержимое" стержней
char s[4][100] = { "", "1", "", "" };
void hanoy(int from, int to, int disk_num);
int move(int disk, int from, int to);
int disk_on(int s_num);
// Переложить первый диск по часовой стрелке
void z1()
{
int from = first_on;
int i;
// Определить номер следующего стержня
if ((dest == 2 && N%2 != 0) || (dest == 3 && N%2 == 0))
first_on = (from + 1)%3; // Порядок стержней 1-2-3
else
first_on = (from + 2)%3; // Порядок стержней 1-3-2
if (first_on == 0) first_on = 3;
move(1, from, first_on);
}
// Переложить единственный возможный диск, кроме наименьшего
void z2()
{
int i, j;
int disk_from, disk_to;
// Определить перекладываемый диск
for (i = 1; i <= 3; i++)
{
disk_from = disk_on(i);
if (disk_from > 1)
// Определить, на какой стержень перекладывать
for (j = 1; j <= 3; j++)
{
disk_to = disk_on(j);
if (disk_to == 0 || disk_from < disk_to)
{
move(disk_from, i, j);
return;
}
}
}
}
// Вернуть номер диска на указанном стержне
int disk_on(int s_num) { return atoi(s[s_num]); }
// Проверить, завершено ли перекладывание
int x1() { return step >= max_steps; }
// Переложить заданный диск
int move(int disk, int from, int to)
{
char *str_pos = strchr( s[from], '-' );
if (str_pos == NULL)
s[from][0] = 0;
else
strcpy(s[from], str_pos+1);
if (s[to][0] == 0)
sprintf(s[to], "%d", disk);
else
{
strcpy(s[0], s[to]);
sprintf(s[to], "%d-%s", disk, s[0]);
}
step++;
printf("Шаг %d. Диск %d: %d -> %d\n", step, disk, from, to);
return 0;
}
void hanoy(int from, int to, int disk_num)
{
int i;
N = disk_num;
max_steps = (1 << N) - 1;
dest = to;
// Заполнить первый стержень дисками
for (i = 2; i <= N; i++)
{
sprintf(s[0], "-%d", i);
strcat(s[1], s[0]);
}
do
switch (y)
{
case 0:
z1(); y = 1;break;
case 1:
if (x1()) y = 0;
else { z2(); z1(); }
break;
}
while (y != 0);
// Вывести результат
printf("\nРезультат:\n");
for (i = 1; i <= 3; i++) printf("%d: %s\n", i, s[i]);
}
Int main()
{
int n = 4;
printf("Введите количество дисков : ");
scanf("%d",&n);
printf("\nХаной с %d дисками :\n", n);
hanoy(1, 3, n);
getch();
}
Результат выполнения программы
Введите количество дисков : 4
Ханой с 4 дисками :
Шаг 1. Диск 1: 1 -> 2
Шаг 2. Диск 2: 1 -> 3
Шаг 3. Диск 1: 2 -> 3
Шаг 4. Диск 3: 1 -> 2
Шаг 5. Диск 1: 3 -> 1
Шаг 6. Диск 2: 3 -> 2
Шаг 7. Диск 1: 1 -> 2
Шаг 8. Диск 4: 1 -> 3
Шаг 9. Диск 1: 2 -> 3
Шаг 10. Диск 2: 2 -> 1
Шаг 11. Диск 1: 3 -> 1
Шаг 12. Диск 3: 2 -> 3
Шаг 13. Диск 1: 1 -> 2
Шаг 14. Диск 2: 1 -> 3
Шаг 15. Диск 1: 2 -> 3
Результат:
1:
2:
3: 1-2-3-4