Эта страница предназначена для тех, кто, написав теоретическую часть курсовой, лабораторной работы, столкнулся с проблемой программной реализации. Все примеры, приведённые здесь, полностью работают и взяты с занятий по программированию. Примеры работают в системах Borland C++ и Turbo Pascal. Страница постоянно расширяется, и мы надеемся, поможет Вам в решении практических задач.
Borland C++
Сортировка
Сортировка вставками.
Пузырьковая сортировка
Сортировка Шейкером
Указатели
Простейшие действия над указателями
Сортировка вставками.
Это изящный и простой для понимания метод. Вот в чем его суть: создается новый массив, в который мы последовательно вставляем элементы из исходного массива так, чтобы новый массив был упорядоченным. Вставка происходит следующим образом: в конце нового массива выделяется свободная ячейка, далее анализируется элемент, стоящий перед пустой ячейкой (если, конечно, пустая ячейка не стоит на первом месте), и если этот элемент больше вставляемого, то подвигаем элемент в свободную ячейку (при этом на том месте, где он стоял, образуется пустая ячейка) и сравниваем следующий элемент. Так мы прейдем к ситуации, когда элемент перед пустой ячейкой меньше вставляемого, или пустая ячейка стоит в начале массива. Помещаем вставляемый элемент в пустую ячейку . Таким образом, по очереди вставляем все элементы исходного массива. Очевидно, что если до вставки элемента массив был упорядочен, то после вставки перед вставленным элементом расположены все элементы, меньшие его, а после — большие. Так как порядок элементов в новом массиве не меняется, то сформированный массив будет упорядоченным после каждой вставки. А значит, после последней вставки мы получим упорядоченный исходный массив.
#include < vcl.h >
#pragma hdrstop
//---------------------------------------------------------------------------
#include < stdio.h >
#include < iostream.h >
#pragma argsused
#define SIZ_ARRAY 20 // размер массивов
//
// алгоритм сортировки вставками
// учебный центр "ОМЕГА" 2008
//
int main(int argc, char* argv[])
{
int a[SIZ_ARRAY], // исходный массив
b[SIZ_ARRAY], // отсортированный массив
j,i;
// заполнение массива а случайными числами на промежутке
// от -50 до 50, вывод на монитор
for(i=0;i< SIZ_ARRAY;i++){
a[i]=random(100)-50;
cout << a[i] << ' ';
}
cout << '\n';
for(i=0;i< SIZ_ARRAY;i++){
j=i;
while((j> 0)&&(b[j-1]> a[i])){
b[j]=b[j-1];
j--;
}
b[j]=a[i];
}
// вывод на монитор результатов
for(i=0;i< SIZ_ARRAY;i++)
cout << b[i] << ' ';
getchar();
return 0;
}
Назад >>
Пузырьковая сортировка
Реализация данного метода не требует дополнительной памяти. Метод очень прост и состоит в следующем: берется пара рядом стоящих элементов, и если элемент с меньшим индексом оказывается больше элемента с большим индексом, то мы меняем их местами. Эти действия продолжаем, пока есть такие пары. Легко понять, что когда таких пар не останется, то данные будут отсортированными. Для упрощения поиска таких пар данные просматриваются по порядку от начала до конца. Из этого следует, что за такой просмотр находится максимум, который помещается в конец массива, а потому следующий раз достаточно просматривать уже меньшее количество элементов. Максимальный элемент как бы всплывает вверх, отсюда и название алгоритма. Вот как это можно реализовать
#include < vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#include < stdio.h>
#include < iostream.h>
#pragma argsused
#define SIZ_ARRAY 10 // размер массива
//
// алгоритм пузырьковой сортировки
// учебный центр "ОМЕГА" 2008
//
int main(int argc, char* argv[])
{
int a[SIZ_ARRAY], // исходный массив
i,k;
bool fl_exit;
// заполнение массива а случайными числами на промежутке
// от -50 до 50, вывод на монитор
for(i=0;i< SIZ_ARRAY;i++){
a[i]=random(100)-50;
cout << a[i] << ' ';
}
cout << '\n';
do{
fl_exit=true;
for(i=0;i< SIZ_ARRAY-1;i++){
if(a[i]> a[i+1]){
k=a[i];
a[i]=a[i+1];
a[i+1]=k;
fl_exit=false;
}
}
} while(!fl_exit);
// вывод на монитор результатов
for(i=0;i< SIZ_ARRAY;i++)
cout << a[i] << ' ';
getchar();
return 0;
}
Назад >>
Сортировка Шейкером
Когда данные сортируются не в оперативной памяти, а на жестком диске, особенно если ключ связан с большим объемом дополнительной информации, то количество перемещений элементов существенно влияет на время работы. Этот алгоритм уменьшает количество таких перемещений, действуя следующим образом: за один проход из всех элементов выбирается минимальный и максимальный. Потом минимальный элемент помещается в начало массива, а максимальный, соответственно, в конец. Далее алгоритм выполняется для остальных данных. Таким образом, за каждый проход два элемента помещаются на свои места, а значит, понадобится N/2 проходов, где N — количество элементов. Реализация данного алгоритма выглядит так:
#include < vcl.h >
#pragma hdrstop
//---------------------------------------------------------------------------
#include < stdio.h >
#include < iostream.h >
#pragma argsused
#define SIZ_ARRAY 20 // размер массива
//
// алгоритм сортировки Шейкером
// учебный центр "ОМЕГА" 2008
//
int main(int argc, char* argv[])
{
int a[SIZ_ARRAY], // исходный массив
i,min,max,pmin,pmax,p,k,n;
// заполнение массива а случайными числами на промежутке
// от -50 до 50, вывод на монитор
for(i=0;i< SIZ_ARRAY;i++){
a[i]=random(100)-50;
cout << a[i] << ' ';
}
cout << '\n';
k=0;
n=SIZ_ARRAY;
do {
min=a[k];
pmax=k;
max=a[k];
pmin=k;
for(i=k+1;i< n;i++){
if(a[i]> max){
max=a[i];
pmax=i;
}
if(a[i]< min){
min=a[i];
pmin=i;
}
}
p=a[n-1];
a[n-1]=a[pmax];
a[pmax]=p;
//
p=a[k];
a[k]=a[pmin];
a[pmin]=p;
//
k++; n--;
}while(k< n);
// вывод на монитор результатов
for(i=0;i< SIZ_ARRAY;i++)
cout << a[i] << ' ';
getchar();
return 0;
}
Назад >>
Простейшие действия над указателями
В этом примере описаны объявления указателей и простейшие действия над ними. Это полезно для понимания понятия «указатель», что иногда вызывает определенные трудности.
//---------------------------------------------------------------------------
#include < vcl.h >
#include < stdio.h >
#include < math.h >
#include < iostream.h >
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
//
// простейшие действия над указателями
// учебный центр "ОМЕГА" 2008
//
int main(int argc, char* argv[])
{
// объявление переменной и указателя
// на переменную типа int
int b, *ptr;
// объявление указателя на void
// это универсальный указатель на любой тип
void *pt;
// чтобы его использовать, нужно ему присвоить указатель
// на определенный тип данных. Например
pt=ptr;
// PS. лучше не использовать...
// так безопаснее
int *ppt;
ppt=ptr;
// инициализация указателей
// NULL - символическая константа,
// показывающая, что pt и ptr ни на что не указывает
pt = NULL;
ptr = NULL;
// объявление и инициализация массива
int mas[5]={1,2,3,4,5};
// имя массива указывает на его первый эл-т =>
// присвоение адреса 1-го эл-та массива указателю
ptr=mas;
// эта операция эквивалентна такой
// выражение &mas[0] - это адрес 1-го эл-та массива
//ptr = &mas[0];
// разыменование (получение значения)
// переменной b присваивается значение 1-го эл-та массива,
// на который укахывает *ptr
b=*ptr;
cout << " b or 1 element mas[0] = "<< b;
// аналогично
cout<< "\n *ptr or 1 element mas[0] = "<< *ptr;
// к указателям применимы арифметические операции
// сослаться на эл-т массива mas[4] можно так:
b=*(ptr+4);
cout<< "\n (arifmetic) b or 5 element mas[4] = "<< b;
// указатели можно индексировать также, как и массивы
// операция, аналогичеая предыдущей
b = ptr[4];
cout<< "\n (indecs) b or 5 element mas[4] = "<< b;
// еще арифметические операции
ptr++;
b=*ptr;
cout<< "\n (arifmetic) b or 2 element mas[1] = "<< b;
ptr--;
b=*ptr;
cout<< "\n (arifmetic) b or 1 element mas[0] = "<< b;
ptr+=2;
b=*ptr;
cout<< "\n (arifmetic) b or 3 element mas[2] = "<< b;
// операция присваивания
ppt=ptr;
cout<< "\n (arifmetic) *ppt or 3 element mas[2] = "<< *ppt;
//--------------------------------------------------------------------
getchar();
return 0;
}
//---------------------------------------------------------------------------
Назад >>