#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
// вывод отдельных чисел
void print(int x, int n, int c)
{
int q, p, t=x;
for(q=0; t!=0;++q,t/=10);
if(x<0)
++q;
for(p=0;p!=(n-q);++p)
cprintf(“ “);
textcolor(c);
cprintf(“%1d”,x); //выводим число
}
void out(int AA[],int Ap,int App,int BB[],int Bp,int nn,int ll, int x,int xp,int y,int yp)
/*где АА-исходный массив, Ар-номер элемента исходного массива, который необходимо выделить, Арр-номер второго выделенного элемента исходного массива, ВВ-выходной массив, Вр-номер выделенного элемента выходного массива,
nn-число элементов в массивах, ll-длина наибольшего числа в массиве,х-число, которое следует вывести во второй строке, хр-его позиция,у-число, которое следует вывести в третьей строке, ур-также его позиция */
{
int a,b;
gotoxy(2,2);
for(a=0;a<nn;++a)
{
if(a==Ap)
print(AA[a],ll,13); //при необходимости число выделяется
//разными цветами
else
if(a==App)
print(AA[a],ll,9);
else
print(AA[a],ll,10);
}
gotoxy(2,3);
for(a=0;a<nn;++a)
if(a==xp)
print(x,ll,13);
else
for(b=0;b<ll;++b,cprintf(“ “));
gotoxy(2,4);
for(a=0;a<nn;++a)
if(a==yp)
print(y,ll,13);
else
for(b=0;b<ll;++b,cprintf(“ “));
gotoxy(2,5);
for(a=0;a<nn;++a)
if(a==Bp)
print(BB[a],ll,13); //вывод чисел выходного массива
else
print(BB[a],ll,10);
delay(120);
}
void main()
{
int A[10]={10,87,90,-56,87,56,23,-1,-34,-2};
int B[10];
int n=sizeof(A)/sizeof(int);
int I,j,s,l,t,d;
_setcursortype(_NOCURSOR);
textbackgraund(0);
clrscr();
textcolor(12);
gotoxy(28,3);
cprintf(“Сортировка подсчетом”);
window(22,12,80,22);
textbackgraund(0);
clrscr();
for(i=0,l=0;i<n;++i) //поиск самого большого числа
{
for(j=0,t=A;t!=0;++j,t/=10);
if(j>l-1)
l=j+1;
}
for(i=0;i<n;++i) //заполнение выходного массива -1
B=-1;
for(j=0;j<n;++j)
{
for(i=0,s=0;i<n;++i)
{
if(A<A[j] || A==A[j] && i>j) // поиск чисел меньше j-го и отображение этого процесса
++s;
out(A,j,I,B,s,n,l,-1,-1,-1,-1);
}
if(j<s) //перенос выбранного числа в право
for(i=j;i<s;++i)
out(A,j,-1,B,s,n,l,A[j],I,-1,-1);
if(j>s) //влево, взависимости от его расположения в выходном массиве
for(i=j;i>=s;--i)
out(A,j,-1,B,s,n,l,A[j],I,-1,-1);
out(A,j,-1,B,s,n,l,-1,-1,A[j],s); //”опускание” числа в выходной массив
B=A[j];
out(A,j,-1,B,s,n,l,-1,-1,-1,-1);
}
for(i=0;i<n;++i)
if(B==-1)
{
out(A,-1,-1,B,I,n,l,-1,-1,-1,-1);
out(A,-1,-1,B,I,n,l,-1,-1,B,i);
out(A,-1,-1,B,I,n,l,B,I,-1,-1);
out(A,-1,-1,B,I,n,l,B,I,-1,-1);
out(A,-1.-1,B,I,n,l,-1,-1,B,i);
}
out(A,-1,-1,B,-1,n,l,-1,-1,-1,-1); // отображение окончательного результата
getch();
}
Анимация сортировки
Здравствуйте, посоветуйте, что нужно исправить, чтобы в данной программе при наличии в исходном массиве таких же чисел, какими инициализирован выходной массив(в данном случае -1) программа работала корректно. В данном случае, если видите -1 почему-то дважды показывается при выводе в выходной массив. Заранее благодарен.
Дебаггер
upd: Шедевр.
Цитата:
for(b=0;b<ll++b,cprintf(“ “));
Интересно, как оно вообще работает.
Цитата: Nixus
Выпрямить руки того, кто так оформляет код, или, если не удастся, посоветовать ему заняться более полезным делом.
upd: Шедевр.
Интересно, как оно вообще работает.
upd: Шедевр.
Интересно, как оно вообще работает.
Виноватс, друзья, исправлюсь. Посмотрите еще раз своим опытным глазом, вроде все исправил.