У вас вопросы?
У нас ответы:) SamZan.net

по теме- СОРТИРОВКА МАССИВОВ МЕТОДОМ ВСТАВОКrdquo; Выполнил- студент 326 групп

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.12.2024

Министерство Образования и Науки Украины

Национальный Аэрокосмический Университет

им. Н. Е. Жуковского “ХАИ”

Кафедра 302

Домашнее задание по курсу

 „Программирование и алгоритмические языки”

по теме:

„СОРТИРОВКА МАССИВОВ МЕТОДОМ ВСТАВОК”

Выполнил:

студент 326 группы

Чаплыгин В. И.

Проверил:

Момот М. А.

Харьков

2003

Содержание

  1.  Постановка задачи ……………………………………………………………… 3
  2.  Теоретическое обоснование и алгоритм решения задачи …………………… 3
  3.  Пример работы программы ……………………………………………………. 4
  4.  Исходный код программы с комментариями …………...……………………. 9
  5.  Список литературы …………………………………………………………… 13
  6.  Приложение 1: блок-схема программы ……………………………………... 14
  7.  Приложение 2: блок-схема функции сортировки (SortByIncrease()) ……… 15

Постановка задачи

Задание:

Упорядочить массив x по  убыванию или возрастанию (т.е. переставить его элементы так чтобы для всех k выполнялось xk<=xk-1 или xk>=xk-1 соответственно), используя следующий алгоритм сортировки (упорядочивания):

сортировка вставками: пусть первые k элементов массива уже упорядочены по не убыванию; берется (k+1)-й элемент и размещается среди первых k элементов так, чтобы упорядоченными оказались уже k+1 первых элементов; этот метод применяется при k от 1 до n-1.

Основные требования к программе:

  •  В программе должны использоваться функции, для которых следует явно сопоставить прототипы (объявления, описания), определения и вызовы.
  •  Как минимум в одной функции должны быть параметры по умолчанию и соответственно в программе должны быть вызовы такой функции в разной форме.
  •  Использовать все циклы С++.
  •  Доступ к элементам массива по [] и *.
  •  Заполнение массива случайным образом.
  •  Программа должна создаваться из проекта, содержащего несколько файлов исходного кода (*.h, *.срр).
  •  Должны использоваться уловная компиляция (стражи включения).
  •  Программа должна иметь дружественный интерфейс - основные операции должны вызываться через соответствующие элементы текстового меню.
  •  Итерации в текстовый файл отчета.
  •  Передача имени файла отчета в командной строке.
  •  Считывание исходных данных из файла.
  •  Использование параметров командной cтроки.

Теоретическое обоснование метода

«Сортировка при помощи прямого включения»

и алгоритм решения задачи

Метод основывается на следующем: считается, что перед рассмотрением записи R[j] предыдущие записи R[1],R[2],...,R[j-1] уже упорядочены, и R[j] вставляется в соответствующее место. Сортировка таблицы начинается со второй записи. Ее ключ сравнивается с ключом первой записи, и, если упорядоченность нарушена, то записи R[1] и R[2] переставляются. Затем ключ записи R[3] сравнивается с ключами записей R[2] и R[1]. Как только программа обнаруживает, что (j+1)-й элемент массива меньше (при сортировке по возрастанию) j-го элемента, она копирует значение этого элемента в буферную переменную и с начала массива до j анализирует, пока значение буферной переменной не будет меньше какого-либо элемента х. Затем кусок массива, начиная с х и до j, перемещается на одну ячейку в сторону возрастания, и на образовавшееся место х записывается значение перемещаемого элемента. Дальше продолжается перемещение по основному массиву до элемента n-1 (т.к. мы сравниваем j-й и (j+1)-й элементы):

41 54 10 66 27 42 80 61 43 37

^       <~~

10 41 54 66 27 42 80 61 43 37

    ^            <~~

10 27 41 54 66 42 80 61 43 37

              ^       <~~

10 27 41 42 54 66 80 61 43 37

                        ^       <~~

10 27 41 42 54 61 66 80 43 37

                   ^                 <~~

10 27 41 42 43 54 61 66 80 37

         ^                                <~~

10 27 37 41 42 43 54 61 66 80

см. приложение 2.

Пример работы программы

Запускаем программу InsetSort:

Программа прелагает нам выбрать один из пунктов меню для выполнения соответствующей операции. Итак, выбираем 1:

Введем желаемое количество элементов массива.

Массив создан. Теперь можно вывести массив на экран, добавить некоторое количество элементов, найти какой-либо элемент по значению и т.д. Выведем массив на экран.

Также эта программа предоставляет возможность удалить какой-либо элемент, введя его порядковый номер. Допустим, мы хотим удалить элемент под номером 7 со значением 89, затем выведем снова массив на экран:

Теперь добавим 6 элементов к существующему массиву:

В программе реализована функция чтения из файла. Если задано три параметра запуска программы, то она принимает argv[2], как название файла, из которого будет происходить считывание информации. Если же задано меньшее количество параметров, то InsetSort предложит ввести названии файла в течении выполнения программы.

Перед выбором пункта 7 (Open File) необходимо очистить массив (пункт 6), иначе программа сигнализирует об ошибке. А после выбора элемента меню 7 введем название считываемого файла данных, если это необходимо.

(Первым элементом файла должно быть число, значение которого равно количеству элементов в файле.) Проделаем вышеуказанные действия и выведем результат на экран:

При выборе пункта 9 у нас будет возможность отсортировать массив элементов, как по возрастанию, так и по убыванию. Например, отсортируем существующий массив по возрастанию и выведем результат на экран:

В итоге мы получили отсортированный массив и массу удовольствия при работе в этой чудотворной программе. А кроме этого еще и файл отчёта, в который были записаны все шаги к полной сортировке массива.

Помните, что файл будет создан только после корректного завершения программы InsetSort.

 

 

Исходный код программы с комментариями

----------------------------------------------------------------- MAIN.CPP

#include "func.h"

int menu();

ofstream f;

char fname[20],foname[20];

int *MasP[100]={0},n=0,argcGlobal;

////////////////////MAIN/////////////////////

int main(int argc,char *argv[]){

// int M[10];

 int bool=0;//Ïåðåìåííàÿ, ïðèíèìàþùàÿ äâà çíà÷åíèÿ.(Äëÿ âûõîäà)

 argcGlobal=argc;

 if (argc>1)//Åñëè çàäàí ïàðàìåòð, òî ïðèíÿòü åãî

 strcpy(fname,argv[1]);//êàê íàçâàíèå äëÿ ôàéëà îò÷åòà.

 else

 strcpy(fname,"Log.txt");

 if (argc>2)

 strcpy(foname,argv[2]);//Âòîðîé àðãóìåíò - äëÿ ÷òåíèÿ.

 f.open(fname);//Ñîçäàíèå è ïîäãîòîâêà ôàéëà ê çàïèñè. 

 do{//Âûïîëíÿòü ïîêà bool=0.

 bool=menu();//Áàçîâàÿ ôóíêöèÿ ïðîãðàììû.  

 }while (bool==0);

 f.close();//Çàêðûòèå ôàéëà è çàïèñü íà ÆÄ.

 cout<<"\n\n\n\n\n\n\n\n\n\n";

 cout<<"InsetSort. v 0.3 (C) 2003-2004 Created by Chaplygin Vasilij.";

 cin.get();

 cin.get();

 return 0;

}

////////////////////MENU////////////////////

int menu(){

 cout<<endl<<"   Main Menu:"<<endl;

 cout<<" 1. Make New List." <<endl;

 cout<<" 2. Add Element."   <<endl;

 cout<<" 3. Print List."    <<endl;

 cout<<" 4. Delete Element."<<endl;

 cout<<" 5. Save List."     <<endl;

 cout<<" 6. Erase List."    <<endl;

 cout<<" 7. Open File."     <<endl;

 cout<<" 8. Find Element."  <<endl;

 cout<<" 9. Sort List."     <<endl;

 cout<<" 0. Exit."          <<endl;

 cout<<endl<<"Your choice : ";

 int i;

 do

  {cin>>i;

   if (i<0 || i>9) cout<<endl<<"Error! Try again : ";

  }

 while (i<0 || i>9);

 switch (i)

  {case 1 : MakeNewList();    break; //Make New List

   case 2 : AddElements();    break; //Add Element

   case 3 : PrintList();               break; //Print List

   case 4 : DeleteElement();           break; //Delete Element

   case 5 : SaveList();                break; //Save List

   case 6 : n=0;      break; //Erase List

   case 7 : OpenList();                break; //Open File

   case 8 : FindElement();             break; //Find Element

   case 9 : SubMenu();     break; //Sort List

   case 0 : return -1;           //Exit

  }

 return 0;

}//menu

----------------------------------------------------------------- func.cpp

#include "func.h"

extern int *MasP[100],n,argcGlobal;

extern ofstream f;

const int N=100;

//////////////////MakeNewList//////////////////

void MakeNewList(){

if (n!=0) {cout<<endl<<"Error! You have existing list.";

cout<<endl<<"Erase your prvious list ang try again."<<endl;}

else {cout<<endl<<"Input quantity of elements: ";

do{

 cin>>n;

 if ((n<1)||n>N){

  cout<<endl<<"The quantity is incorrect!"<<endl;

  cout<<"Max quantity of elemets: "<<N<<endl;

  cout<<"Try again: ";}

}while ((n<1)||(n>N));

srand(time(NULL));

for (int i=0; i<n; i++){

MasP[i]=new int;

*MasP[i]=rand()%100;}

}

}

//////////////////AddElements///////////////////

void AddElements(){

cout<<endl<<"Input quantity of elements: ";

int p;

do{

 cin>>p;

 if ((p<1)||((n+p)>N)){

  cout<<endl<<"The quantity is incorrect!"<<endl;

  cout<<"You have "<<N-n<<" free cells."<<endl;

  cout<<"Try again: ";}

}while ((p<1)||((n+p)>N));

srand(time(NULL));

for (int i=n; i<(n+p); i++){

 MasP[i]=new int;

 *MasP[i]=rand()%100;}

n=n+p;

}

////////////////////PrintList///////////////////

void PrintList(){

if (n==0) cout<<endl<<"List is empty."<<endl;

else{

 cout<<endl;

 for(int i=0; i<n; i++){

  if (i%10==0) cout<<endl;

  cout<<setw(3)<<*MasP[i];}

 cout<<endl;

}

}

////////////////DeleteElement///////////////////

void DeleteElement(){

if (n==0) cout<<endl<<"List is empty."<<endl;

else{

 cout<<endl<<"Input number of element: ";

 int p;

 do{

  cin>>p;

  if ((p<0)||(p>n)) cout<<endl<<"Error! Try again: ";}

 while ((p<0)||(p>n));

 cout<<endl;

 for (int j=(p-1); j<n; j++)

  MasP[j]=MasP[j+1];

 MasP[n]=0;

 n--;

}

}

////////////////////Save List/////////////////////

void SaveList(){

if (n==0) cout<<endl<<"List is empty."<<endl;

else{

 for (int i=0; i<n; i++){

  if (i%10==0) f<<endl;

  f<<setw(3)<<*MasP[i];}

 f<<endl;

}

}

///////////////////FindElement////////////////////

void FindElement(){

if (n==0) cout<<endl<<"List is empty."<<endl;

else{

 cout<<endl<<"Input the value, which must be finded: ";

 int a,s=0; cin>>a;

 for (int i=0; i<n; i++){

  if (*MasP[i]==a) {

   cout<<endl<<(i+1)<<"-th element"<<" - "<<*MasP[i];

   s=i;}}

 if (s==0) cout<<endl<<"The existing list hasn't element with this value";

 cout<<endl;

}

}

//////////////////SubWork(Sort)///////////////////

void SubMenu(){

if (n==0) cout<<endl<<"List is empty."<<endl;

else{

 cout<<endl<<"   Sub Menu:"<<endl;

 cout<<" 1. Sort list by increase."<<endl;

 cout<<" 2. Sort list by decrease."<<endl<<endl;

 int i;

 cout<<"Your choice: ";

 do {

  cin>>i;

  if (i<1 || i>2) cout<<endl<<"Error! Try again : "<<endl;

 }while (i<1 || i>2);

 switch (i)

  {case 1 : SortByIncrease();   break; //Increase

   case 2 : SortByDecrease();   break; //Decrease

 }

  }

}

/////////////////SortByIncrease//////////////////

void SortByIncrease(){

int buf;

for (int i=0; i<(n-1); i++){

 if (*MasP[i]>*MasP[i+1]){

  SaveList();

  buf=*MasP[i+1];

  for (int j=0; j<(i+1); j++){

   if (buf<*MasP[j]){

    for (int q=i+1; q>j; q--)

     *MasP[q]=*MasP[q-1];

    *MasP[j]=buf;

    break;

   }//Incert place

  }//for Incert place

 }//Find unsorted element

}//for Find unsorted element

SaveList();

}

/////////////////SortByDecrease//////////////////

void SortByDecrease(){

int buf;

for (int i=0; i<(n-1); i++){

 if (*MasP[i]<*MasP[i+1]){

  SaveList();

  buf=*MasP[i+1];

  for (int j=0; j<(i+1); j++){

   if (buf>*MasP[j]){

    for (int q=i+1; q>j; q--)

     *MasP[q]=*MasP[q-1];

    *MasP[j]=buf;

    break;

   }//Incert place

  }//for Incert place

 }//Find unsorted element

}//for Find unsorted element

SaveList();

}

///////////////////Open File/////////////////////

void OpenList(char s[20]){

if (n!=0) {cout<<endl<<"Error! You have existing list.";

cout<<endl<<"Erase your prvious list ang try again."<<endl;}

else {

 if (argcGlobal<3){

  cout<<endl<<"Input file name: ";

  char *FileName=new char[20];

  cin>>FileName;

  s=FileName;}

 ifstream fo(s,ios::nocreate);

 if (! fo) cout<<"File not found."<<endl;

 else{

  int b;

  fo>>b;

  for (int i=0; i<b; i++){

   if (n==N) break;

   MasP[n]= new int;

   fo>>*MasP[n];

   n++;

  }   

 }//if (! fo)...

}

}

------------------------------------------------------------------- func.h

//Ïîäêëþ÷àåì ñòðàæè âêëþ÷åíèé.

#ifndef __func_h

#define __func_h

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

#include <iomanip.h>

#include <string.h>

#include <time.h>

extern char foname[20];

//Ïðîòîòèïû ôóíêöèé.

void MakeNewList();

void AddElements();

void PrintList();

void DeleteElement();

void SaveList();

void EraseList();

void FindElement();

void SubMenu();

void SortByIncrease();

void SortByDecrease();

void OpenList(char s[20]=foname);

#endif

Список литературы

  1.  Лафоре Р. Объектно-ориентированное программирование в С++, 4-е изд. - СПб.: Питер, 2003. – 928 с.: ил.
  2.  Дейтел Х.М., Дейтел П.Дж. Как программировать на С++.. – М.: Бином, 1999. - 1024 с.
  3.  Страуструп Б. Язык программирования С++, 3-е изд. - СПб.; М.: Невский Диалект - Бином, 1999. - 991 с.

4.   Керниган Б., Ритчи Д. Язык программирования Си.\Пер. с англ., 3-е изд., испр. - СПб.: "Невский Диалект", 2001. - 352 с.: ил.

Примечание 1.

Примечание 2.




1. Рынок труда Кыргызской Республики
2. А Базыма Цвет и психика В монографии освещаются различные аспекты взаимосвязи цвета и психики человека
3. на тему- Принципы русской орфографии
4. Реферат- История возникновения и развития международного права
5. Возрождение по французски Ренессанс был введен в XVI в
6. Разработка программного обеспечения для организации интерфейса программно-методического комплекса
7. Юриспруденция Москва Высшая школа 2000 УДК 343
8. на тему- Страховой рынок Выполнила студентка- Ганиева К
9.  Религиознофилософское осмысление отечественной культуры и православного государства 1617 веков На рубеж
10. . Диалектика и системный подход в медицине 2
11. острый живот обозначают клинический симптомокомплекс развивающийся при повреждениях и острых заболевания
12. Введение3 Идея народности воспитания ~центральная идея педагогической теории К
13. Нейрогенні розлади сечовипускання Енурез Діагностика Лікування
14. Михаил Иванович Глинка
15. і. Жол ж'рісіне 'атысушыны' 'з ы'тарын іске асыруы бас'а жол ж'рісіне 'атысушыларды' ы'ын шектеуге нем
16. транспортных происшествий
17. Издержки предприятия в краткосрочном и долгосрочном периоде
18. Избирательная система РФ
19. тема педагогических наук
20. Психологическое исследование особенностей самоотношения у тревожных и нетревожных студентов