Хранение и обработка данных с использованием линейных списков
Выбор алгоритма решения задачи. Разработка программы, обеспечивающую эффективную обработку и хранение информации с использованием линейных списков. Написание программы на псевдокоде и на языке программирования высокого уровня. Результаты работы программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.04.2012 |
Размер файла | 2,1 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Содержание
Введение
1. Уяснение задачи
2. Выбор алгоритма решения задачи
3. Написание программы на псевдокоде
4. Составление программы на языке программирование высокого уровня
5. Тестирование и отладка программы
6. Результаты работы программы
Заключение
Список используемых источников
Приложение
ВВЕДЕНИЕ
Список - это набор записей, выстроенных в определенной последовательности. Списки очень распространены в настоящее время и используются везде: от крупного офиса до самой мелкой квартиры. Примерами таких списков могут служить списки сотрудников, клиентов какой либо компании, списки телефонов и адресов, даже самый простой список продуктов, с которым идешь в магазин.
Цель курсовой работы - разработать программу, обеспечивающую эффективную обработку и хранение информации с использованием линейных списков.
Для достижения этой цели определены следующие задачи:
· Уяснить и разобрать задачу;
· Выбрать алгоритм решения этой задачи;
· Написать программу на псевдокоде;
· Написать программу на языке программирования высокого уровня;
· Провести тестирование и отладку программы.
1. Уяснение задачи
Формулировка задачи «Считалка» звучит так: даны натуральные n, m. Предполагается, что n человек встают в круг и получают номера, считая против часовой стрелки, 1, 2, ... , n. Затем, начиная с первого, также против часовой стрелки отсчитывается m-й человек (поскольку люди стоят по кругу, то за n-м человеком стоит первый). Этот человек выходит из круга, после чего, начиная со следующего, снова отсчитывается m-й человек и так до тех пор, пока из всего круга не остается один человек. Определить его номер.
Уясним эту задачу на следующем примере. Пример основан на легенде: “Отряд Иосифа Флавия, защищавший город Йодфат, не пожелал сдаваться в плен блокировавшим пещеру превосходящими силам римлян. Воины, в составе сорока человек, стали по кругу и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. При этом двое воинов, оставшихся последними в живых, должны были убить друг друга. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно встать ему и его товарищу, чтобы остаться последними, но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам”.
2. Выбор алгоритма решения задачи
Существует несколько алгоритмов решения данной задачи.
Способ первый. Будем хранить в массиве имена (то есть номера) всех живых на текущий момент воинов. Причем удобно, чтобы номера людей были записаны в элементах массива с 0 по N -- 1 (это свойство будет использоваться для операции взятия остатка). Когда воин будет умирать, будем удалять его из массива, и тех, кто стоял за ним, «сдвигать» на один элемент влево. Заметим, что если мы уже убили L человек, то в живых осталось M = N -- L. Пусть мы только что (на L-ом шаге) убили человека, который был записан в нашем массиве в элементе с номером j (и сдвинули людей, которые были записаны в массиве в элементах с j + 1 по M на один элемент влево). Тогда следующим нужно убивать человека, который записан в этом массиве в элементе с номером (j + k -- 1) % M. [9]
Способ второй. Заведем массив, где будем помечать мертвых воинов (то есть в i-м элементе хранится, жив воин i, или уже нет). Пусть у нас на текущем шаге M живых людей и на предыдущем шаге умер воин j. Чтобы найти следующего, будем бежать по массиву, отсчитывая живых и пропуская мертвых. Тот человек, на котором мы насчитаем k % M и должен умереть следующим. Через N -- 1 шаг останется один человек.[10]
Рекурсивное решение[5][7]. Простейшее моделирование будет работать O (). Используя дерево отрезков, можно произвести моделирование за . Однако попытаемся найти закономерность, выражающую ответ для задачи (N,K) через решение предыдущих задач. С помощью моделирования построим таблицу значений, скажем, приведенную ниже.
Таблица |
|||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
||
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
|
2 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
2 |
1 |
|
3 |
3 |
3 |
2 |
2 |
1 |
1 |
3 |
3 |
2 |
2 |
|
4 |
4 |
1 |
1 |
2 |
2 |
3 |
2 |
3 |
3 |
4 |
|
5 |
5 |
3 |
4 |
1 |
2 |
4 |
4 |
1 |
2 |
4 |
|
6 |
6 |
5 |
1 |
5 |
1 |
4 |
5 |
3 |
5 |
2 |
|
7 |
7 |
7 |
4 |
2 |
6 |
3 |
5 |
4 |
7 |
5 |
|
8 |
8 |
1 |
7 |
6 |
3 |
1 |
4 |
4 |
8 |
7 |
|
9 |
9 |
3 |
1 |
1 |
8 |
7 |
2 |
3 |
8 |
8 |
|
10 |
10 |
5 |
4 |
5 |
3 |
3 |
9 |
1 |
7 |
8 |
И здесь достаточно отчётливо видна следующая закономерность:
joseph (n, k) = ( joseph (n-1, k) + k - 1 ) % n + 1;
joseph (1, k) = 1
(здесь индексация с единицы несколько портит элегантность формулы).
На мой взгляд, самым простым и понятным является первый способ решения. В связи с этим, алгоритм решения моей задачи, основывается именно на этом способе.
3. Написание программы на псевдокоде
Выводятся на экран сообщения - Vvedite chiclo n и Vvedite chiclo m (число n - количество людей, стоящих в кругу, а число m - число людей, которое отсчитывается)
printf("\Vvedite chiclo n ");
scanf("%d", &n);
printf("\Vvedite chiclo m ");
scanf("%d", &m);
После того, как мы ввели числа n и m запускаем, функцию "add_item"[1]. Эта функция производит все вычисления, отсчет людей и нахождение номера последнего человека в кругу.
for (i=0; i<n; i++)
add_item(i+1);
и замыкаем список
s->next=first;
first->prev=s;
p=first;
for(i=0; i<n; i++){
Выводим на экран исходный список, из списка с порядковыми номерами участников удаляем m-ый по счёту столько раз, пока не останется один участник (после удаления участника считать начинаем со следующего после удалённого);
Перед удалением m-ого элемента списка выстраивается связь между предыдущим и следующим элементами списка, и выводим на экран номер оставшегося участника
printf("%d ",p->n);
p=p->next;
}
printf("\n");
s=first;
while(n>1)
{
p=s;
for(i=1; i<m; i++)
p=p->next;
p->next->prev=p->prev;
p->prev->next=p->next;
s=p->next;
delete p;
n--;
}
printf("%d ",s->n);
getch();
}
4. Составление программы на языке программирования высокого уровня
1. Объявляем директиву include, которая сообщает компилятору о необходимости подключения библиотек stdio.h и conio.h[2][6]
#include<stdio.h>
#include<conio.h>
2. Создаем структуру Titem[3]
struct Titem {
int n;
Titem *next,*prev;
} *first,*s,*p;
int n,m;
3. Описываем функцию "add_item", добавляющую в список порядковые номера участников
void add_item(int v){
Titem *p;
if (s==NULL && first==NULL){
s=new Titem;
s->n = v;
s->next = NULL;
s->prev = NULL;
first=s;
}
else{
p = new Titem;
p->n = v;
p->next=NULL;
p->prev=s;
s->next=p;
s=p;
}
return;
}
4. Описываем главную функцию
int main (){
int i;
printf("\Vvedite chiclo n ");
scanf("%d", &n);
printf("\Vvedite chiclo m ");
scanf("%d", &m);
for (i=0; i<n; i++) //Запускаем функцию "add_item"
add_item(i+1);
s->next=first; //Замыкаем список
first->prev=s;
p=first;
for(i=0; i<n; i++){
printf("%d ",p->n); //Выводим на экран исходный список
p=p->next;
}
printf("\n");
s=first;
while(n>1){
/*Из списка с порядковыми номерами участников удаляем m-ый по счёту столько раз, пока не останется один участник (после удаления участника считать начинаем со следующего после удалённого)*/
p=s;
for(i=1; i<m; i++)
p=p->next;
p->next->prev=p->prev;
/*Перед удалением m-ого элемента списка выстраивается связь между предыдущим и следующим элементами списка*/
p->prev->next=p->next;
s=p->next;
delete p;
n--;
}
printf("%d ",s->n); //Выводим на экран номер оставшегося участника
getch();
}
5. Тестирование и отладка программы
После завершения написания программного кода я запускаю программу (конфигурация решения Debug), на экране появляется окно о подтверждении запуска программы (рисунок 1).
Рисунок 1 - Подтверждение запуска программы
На рисунке 1 изображено диалоговое окно с подтверждением построение проекта kurs.
После нажатия кнопки «Да» выходит программная консоль, на которой выводится сообщение - «Vvedite chislo n» (рисунок 2), число n характеризует количество людей, стоящих в кругу.
Рисунок 2 - Ввод количества людей
На рисунке 2 изображена программная консоль с запросом ввода числа n и с введенным числом n. После ввода числа n, запрашивается ввод числа m, характеризующее какой по счету человек выйдет из круга, после отсчета числа m (рисунок 3).
Рисунок 3 - Запрос ввода числа m
На рисунке 3 изображена программная консоль с запросом ввода числа n и с введенным числом n, с запросом ввода числа m и с введенным числом m.
После ввода числа m, на экране программной консоли выводится ряд из количества человек, стоящих в ряду и в конце выводится номер человека, который остается в ряду после всех исключений.
линейный список алгоритм информация
Рисунок 4 - Результат работы программы
На рисунке 4 - изображена программная консоль, на которой показаны сообщения «Vvedite chiclo n» и «Vvedite chiclo m», значения этих чисел, выведен полный список людей и конечное число, т.е. номер человека оставшегося после всех выбываний.
6. Результаты работы программы
После запуска программы появляется рабочее окно программы и оно имеет следующий вид
Рисунок 5 - Конечный результат
На рисунке 5 изображена окончательная работа выполнения программы.
ЗАКЛЮЧЕНИЕ
В ходе выполнения курсовой работы были выполнены следующие задачи:
- уяснена и разобрана задача;
- выбран алгоритм решения этой задачи;
- написана программа на псевдокоде и на языке программирования высокого уровня;
- проведено тестирование и отладка программы.
Вследствие этого была достигнута цель курсовой работы - разработана программа, обеспечивающая эффективную обработку и хранение информации с использованием линейных списков.
СПИСОК ИСПОЛЬЗУЕМЫХ ИСТОЧНИКОВ
1. С/C++. Структурное программирование: Практикум /Т.А.Павловская, Ю.А.Щупак. - СПб.: Питер, 2003. - 240 с.: ил.
2. С/C++. Программирование на языке высокого уровня / Т.А. Павловская. - СПб.: Питер, 2003. - 461 с.: ил.
3. C++. Объектно-ориентированное программирование: Практикум. - СПб.: Питер, 2006. - 265 с.: ил.
4. Основы алгоритмизации. Методическое руководство для самостоятельного изучения. / Сост. С.Г.Кузин. Н.Новгород - ННГУ, 1998.
5. Брукшир Дж. Информатика и вычислительная техника. 7-е изд. - СПб.: Питер, 2004. - 620 с.: ил.
6. Березин Б. И., Березин С. Б. Начальный курс С и C++. -- М: ДИАЛОГ-МИФИ, 1996.--288 с.
7. Болски М.И. Язык программирования Си. Справочник: Пер. с англ. -- М..-Радио и связь, 1988. -- 96 с.
8. Ван Тассел Д. Стиль, разработка, эффективность, отладка и испытание программ. -- М: Мир, 1981. -- 89 с.
10. С# в задачах и примерах. -- СПб.: БХВ-Петербург, 2007. -- 240 е.: ил. + CD-ROM
ПРИЛОЖЕНИЕ
Листинг программного кода
#include<stdio.h>
#include<conio.h> //библиотека с функцией getch
struct Titem //Создаём структуру "Titem"
{
int n;
Titem *next,*prev;
}
*first,*s,*p;
int n,m;
void add_item(int v) /*Описываем функцию "add_item" добавляющую в список порядковые номера участников*/
{
Titem *p;
if (s==NULL && first==NULL){
s=new Titem;
s->n = v;
s->next = NULL;
s->prev = NULL;
first=s;
}
else
{
p = new Titem;
p->n = v;
p->next=NULL;
p->prev=s;
s->next=p;
s=p;
}
return;
{
int main ()
{
int i;
printf("\Vvedite chiclo n ");
scanf("%d", &n);
printf("\Vvedite chiclo m ");
scanf("%d", &m);
for (i=0; i<n; i++) //Запускаем функцию "add_item"
add_item(i+1);
s->next=first; //Замыкаем список
first->prev=s;
p=first;
for(i=0; i<n; i++){
printf("%d ",p->n); //Выводим на экран исходный список
p=p->next;
}
printf("\n");
s=first;
while(n>1){
/*Из списка с порядковыми номерами участников удаляем m-ый по счету столько раз, пока не останется один участник (после удаления участника считать начинаем со следующего после удалённого)*/
p=s;
for(i=1; i<m; i++)
p=p->next;
p->next->prev=p->prev;
/*Перед удалением m-ого элемента списка выстраивается связь между предыдущим и следующим элементами списка*/
p->prev->next=p->next;
s=p->next;
delete p;
n--;
}
printf("%d ",s->n); //Выводим на экран номер оставшегося участника
getch();
}
Размещено на Allbest.ru
Подобные документы
Реализация линейных списков в языке программирования C++. Основные операции при работе с ними. Разработка интерфейса и алгоритмов. Описание работы программы на псевдокоде. Составление программного кода. Тестирование, отладка и результат работы программы.
курсовая работа [1,1 M], добавлен 07.01.2014Разработка комплекса алгоритмов. Кодирование и компиляция. Тестирование, отладка, испытание и сдача программы. Минимальные системные требования для использования Delphi 7. Написание программы с использованием инструментального языка высокого уровня.
курсовая работа [2,7 M], добавлен 21.02.2011Создание программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С# средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Определение математического аппарата, применение его в задаче.
курсовая работа [500,4 K], добавлен 13.01.2015Разработка программы с использованием принципов объектно-ориентированного программирования на языке высокого уровня С средствами Microsoft Visual Studio 2010. Построение алгоритма реализации. Класс программы, инструкция по использованию программы.
курсовая работа [1,0 M], добавлен 26.12.2013Системы линейных алгебраических уравнений. Матричный метод решения систем линейных уравнений. Решение задачи математическим методом. Блок-схема алгоритма и листинг программы. Расчет трудоемкости разработки программы. Расчет себестоимости и цены программы.
дипломная работа [144,8 K], добавлен 25.04.2012Разработка программы "Игроки КХЛ 2012-2013" на языке С++ с использованием классов списков структур для обработки данных. Описание глобальных переменных, разработанных функций. Главное меню программы. Чтение данных из файла, их просмотр и сохранение.
курсовая работа [2,2 M], добавлен 17.03.2016Написание программы для работы с клиентами средствами языка Delphi, которая предусматривает ввод, редактирование и удаление информации. Разработка алгоритма решения задачи, описание переменных, вспомогательных процедур, входных и выходных данных.
курсовая работа [355,7 K], добавлен 21.09.2010Метод Гаусса-Зейделя как модификация метода Якоби, его сущность и применение. Разработка программы решения системы линейных алгебраических уравнений на языке VB, проверка правильности работы программы в MS Excel и математических пакетах MathCad и MatLab.
курсовая работа [325,5 K], добавлен 27.10.2013Сравнительный анализ языков программирования высокого уровня Си и Паскаль. Реализация алгоритма обработки данных. Тестирование и отладка программы или пакета программ. Структура программы на языке Турбо Паскаль. Указатели и векторные типы данных.
курсовая работа [233,5 K], добавлен 14.12.2012Анализ эффективности методов сортировки данных в языке Turbo Pascal. Разработка эскизного и технического проекта программы. Сортировка без и с использованием дополнительной памяти, за исключением небольшого стека (массива). Сортировка связанных списков.
курсовая работа [359,0 K], добавлен 23.05.2012