c71e249a4e
First substantive commit: the entire Sprinter C compiler tree on top of
the bare README+gitignore initial commit.
What's in here:
bin/sprinter-cc — driver script invoking SDCC + linker + mkexe
libc/ — Sprinter-specific libc layer over ESTEX/BIOS
(conio, gfx, io, mem, stdio + headers)
runtime/ — crt0 variants (default/small/banked/minimal)
+ heap + bank trampolines
toolchain/ — mkexe (SprintEXE packer, C + tests)
examples/ — 30 demo programs (gfx, file I/O, env, time, …)
lib/Makefile — builds the libc archive (sprinter.lib)
docs/ — converted Sprinter manuals + asm reference samples
third_party/ — solid-c reference compiler dump + sdcc setup script
release_docs/ — packaging / release notes
gitignore overhaul:
• Drop dangerous blanket patterns: *.asm (would hide docs/samples/*.asm)
and *.exe (case-insensitive match was hiding third_party/solid-c/*.EXE
on macOS APFS). Replaced with examples/*/*.{asm,exe,…} and lib/*.lib.
• Restore tracking of toolchain/mkexe/tests/{one,big}.bin — those are
INPUT fixtures, not build outputs.
• Collapse the duplicated SDCC/C/Sdcc sections into one section per
concern (build outputs / vendored / OS-junk).
• Add .sprinter-cc-*/, build/ (catches lib/build/ too), .claude/.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
394 lines
12 KiB
C++
394 lines
12 KiB
C++
/*
|
||
MM> �®á¬®âà¨â¥, ¯«¨§ ã ᥡï, ¬®¦¥â ã ª®£®-¨âì ¥áâì ®¯¨á ¨¥ ¬¥â®¤®¢
|
||
MM> á®àâ¨à®¢ª¨ (quick sort, buble sort, ŠŒ� ¨ â.¤.). ˆå â ¬ ¯à¨¬¥à® 6
|
||
MM> ¥áâì. ˆâ¥à¥áãîâ ¨¬¬¥® «£®à¨â¬ë á ®¯¨á ¨¥¬, ª®â®àë¥ ï ¨á¯®«ì§ãî
|
||
MM> ¯®â®¬ ¤«ï ªãàᮢ®© à ¡®âë. Š¨â¥ ¬¥, ¯¦ «áâ , ¨«¨ ¯®¤¥«¨â¥áì url¨ª®¬.
|
||
MM> ‘¯ ᨡ®!
|
||
|
||
EI> ޝ¨è¨â¥ c ¯p¨¬¥p ¬¨ ¯ cª «¥, ¯®¦ «ã©câ , ®c®¢ë¥ ¬¥â®¤ë
|
||
EI> c®pâ¨p®¢ª¨,
|
||
EI> 祬 ¡®«ìè¥ â¥¬ «ãçè¥, ¢c¥¬ § p ¥¥ ®£p®¬®¥ c¯ c¨¡®«
|
||
|
||
H . H® C (â ¬ ᪮«ìª® ï ¯®ï« £« ¢®¥ «£®à¨â¬ë ã¦ë). Ÿ ¯¨á « ¨
|
||
ª®¬¯¨«¨« ¯®¤ BC3.1. �।áâ ¢«ï¥â ᮡ®© ¯à®£ã ¯® á¡®àã áâ â¨á⨪¨ íä䥪⨢-
|
||
®á⨠«£®à¨â¬®¢.
|
||
�à®èã ¯®ªà¨â¨ª®¢ âì :) (å®âï ®¯ïâì ¦¥ á ¡¦ ¡ë« ¯¥à¢®¬ ªãàá¥).
|
||
----------------
|
||
*/
|
||
|
||
#include<stdio.h>
|
||
#include<stdlib.h>
|
||
#include<conio.h>
|
||
|
||
#define SIZE 15
|
||
|
||
/* Prototypes */
|
||
void Binsort();
|
||
void Choise();
|
||
void Include();
|
||
void Bubble();
|
||
void Quick();
|
||
void Shell();
|
||
void Join();
|
||
void Prn();
|
||
void Test();
|
||
|
||
unsigned ITERATION, // Š®«¨ç¥á⢮ ¯à®©¤¥ëå æ¨ª«®¢
|
||
EXCHANGES, // ®¡¬¥®¢ ï祥ª
|
||
CONDITIONS; // ¯à®©¤¥ëå ãá«®¢¨©
|
||
|
||
int Mass[SIZE];
|
||
|
||
int i, NumElem;
|
||
char key;
|
||
|
||
|
||
/* ÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞÞ */
|
||
int main()
|
||
{
|
||
|
||
NumElem = sizeof(Mass) / sizeof(Mass[0]);
|
||
clrscr();
|
||
|
||
do {
|
||
for(i=0; i < NumElem; i++) Mass[i] = rand() % 100 - 50;
|
||
clrscr();
|
||
puts("Œ¥î:\n");
|
||
puts(" 1. ‘®àâ¨à®¢ª ®¡¬¥ ¬¨ (¬¥â®¤ ¯ã§ëàìª )");
|
||
puts(" 2. ‘®àâ¨à®¢ª ¢ë¡®à®¬");
|
||
puts(" 3. ‘®àâ¨à®¢ª ¯à®áâ묨 ¢áâ ¢ª ¬¨");
|
||
puts(" 4. ‘®àâ¨à®¢ª ¡¨ à묨 ¢áâ ¢ª ¬¨ (¢áâ ¢ª ¤¥«¥¨¥¬ ¯®¯®« ¬)");
|
||
puts(" 5. ‘®àâ¨à®¢ª ¬¥â®¤®¬ ˜¥«« ");
|
||
puts(" 6. ‘®àâ¨à®¢ª ¡ëáâàë¬ ¬¥â®¤®¬\n");
|
||
puts(" 7. ‘«¨ï¨¥ á®àâ¨à®¢ ëå ¬ áᨢ®¢");
|
||
puts(" 8. ’¥á⠯ந§¢®¤¨â¥«ì®áâì\n");
|
||
puts(" ESC. ‚ë室\n\n->");
|
||
if ((key=getch()) == 27)
|
||
goto done;
|
||
|
||
clrscr();
|
||
if (key >= '0' && key <= '6')
|
||
{
|
||
cprintf("\nŒ áᨢ (®à¨£¨ «):");
|
||
Prn(Mass, NumElem);
|
||
}
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
|
||
switch(key)
|
||
{
|
||
case '1': Bubble(Mass, NumElem); break;
|
||
case '2': Choise(Mass, NumElem); break;
|
||
case '3': Include(Mass, NumElem); break;
|
||
case '4': Binsort(Mass, NumElem); break;
|
||
case '5': Shell(Mass, NumElem); break;
|
||
case '6': Quick(Mass, 0, NumElem); break;
|
||
case '7': Join(); continue;
|
||
case '8': Test(Mass, NumElem); continue;
|
||
default : continue;
|
||
}
|
||
cprintf("\n(á®àâ¨à®¢ ë©):");
|
||
Prn(Mass, NumElem);
|
||
cprintf("\n\n\n�ਠá®àâ¨à®¢ª¥ ¯®âॡ®¢ «®áì ¨â¥à 権: %d\n",ITERATION);
|
||
cprintf(" ¯à®¨§¢¥¤¥® ®¡¬¥®¢ ï祥ª: %d\n",EXCHANGES);
|
||
cprintf(" ¯à®©¤¥® ãá«®¢¨©: %d\n",CONDITIONS);
|
||
puts("\n\n\nAny key...");
|
||
getch();
|
||
} while(1);
|
||
|
||
done:
|
||
puts("\n\nSee you... ;)");
|
||
return 0;
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Prn(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i;
|
||
cprintf("\n[");
|
||
for (i=0; i < count; i++)
|
||
cprintf(" %3d", PtrMass[i]);
|
||
puts("]");
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Test(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
|
||
uint ITERATION1, EXCHANGES1, CONDITIONS1, ITERATION2,
|
||
EXCHANGES2, CONDITIONS2, ITERATION3, EXCHANGES3,
|
||
CONDITIONS3, ITERATION4, EXCHANGES4, CONDITIONS4,
|
||
ITERATION5, EXCHANGES5, CONDITIONS5, i, j;
|
||
|
||
ITERATION1=EXCHANGES1=CONDITIONS1=ITERATION2=EXCHANGES2=CONDITIONS2=0;
|
||
ITERATION3=EXCHANGES3=CONDITIONS3=ITERATION4=EXCHANGES4=CONDITIONS4=0;
|
||
ITERATION5=EXCHANGES5=CONDITIONS5=0;
|
||
|
||
clrscr();
|
||
puts("‘®àâ¨à®¢ª ®¡¬¥ ¬¨: ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =\n");
|
||
puts("‘®àâ¨à®¢ª ¢ë¡®à®¬: ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =\n");
|
||
puts("‘®àâ¨à®¢ª ¯à®áâ묨 ¢áâ ¢ª ¬¨: ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =\n");
|
||
puts("‘®àâ¨à®¢ª ¡¨ à묨 ¢áâ ¢ª ¬¨: ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =\n");
|
||
puts("‘®àâ¨à®¢ª ¬¥â®¤®¬ ˜¥«« : ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =\n");
|
||
puts("‘®àâ¨à®¢ª ¡ëáâàë¬ ¬¥â®¤®¬: ¯à®©¤¥ëå æ¨ª«®¢ =");
|
||
puts(" ®¡¬¥®¢ ï祩ª ¬¨ =");
|
||
puts(" ¯®áâ ¢«¥ëå ãá«®¢¨© =");
|
||
|
||
for(j=1; j <= 100; j++)
|
||
{
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Bubble(PtrMass ,count);
|
||
ITERATION1+=ITERATION; EXCHANGES1+=EXCHANGES; CONDITIONS1+=CONDITIONS;
|
||
gotoxy(52,1); cprintf("%d ",ITERATION1/j);
|
||
gotoxy(52,2); cprintf("%d ",EXCHANGES1/j);
|
||
gotoxy(52,3); cprintf("%d ",CONDITIONS1/j);
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Choise(PtrMass ,count);
|
||
ITERATION2+=ITERATION; EXCHANGES2+=EXCHANGES; CONDITIONS2+=CONDITIONS;
|
||
gotoxy(52,5); cprintf("%d ",ITERATION2/j);
|
||
gotoxy(52,6); cprintf("%d ",EXCHANGES2/j);
|
||
gotoxy(52,7); cprintf("%d ",CONDITIONS2/j);
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Include(PtrMass ,count);
|
||
ITERATION3+=ITERATION; EXCHANGES3+=EXCHANGES; CONDITIONS3+=CONDITIONS;
|
||
gotoxy(52,9); cprintf("%d ",ITERATION3/j);
|
||
gotoxy(52,10); cprintf("%d ",EXCHANGES3/j);
|
||
gotoxy(52,11); cprintf("%d ",CONDITIONS3/j);
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Binsort(PtrMass ,count);
|
||
ITERATION4+=ITERATION; EXCHANGES4+=EXCHANGES; CONDITIONS4+=CONDITIONS;
|
||
gotoxy(52,13); cprintf("%d ",ITERATION4/j);
|
||
gotoxy(52,14); cprintf("%d ",EXCHANGES4/j);
|
||
gotoxy(52,15); cprintf("%d ",CONDITIONS4/j);
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Shell(PtrMass ,count);
|
||
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
|
||
gotoxy(52,17); cprintf("%d ",ITERATION5/j);
|
||
gotoxy(52,18); cprintf("%d ",EXCHANGES5/j);
|
||
gotoxy(52,19); cprintf("%d ",CONDITIONS5/j);
|
||
|
||
ITERATION=EXCHANGES=CONDITIONS=0;
|
||
for (i=0; i < count; i++) PtrMass[i] = rand() % 100 - 50;
|
||
Quick(PtrMass , 0, count);
|
||
ITERATION5+=ITERATION; EXCHANGES5+=EXCHANGES; CONDITIONS5+=CONDITIONS;
|
||
gotoxy(52,21); cprintf("%d ",ITERATION5/j);
|
||
gotoxy(52,22); cprintf("%d ",EXCHANGES5/j);
|
||
gotoxy(52,23); cprintf("%d ",CONDITIONS5/j);
|
||
}
|
||
puts("\n\n\nOk...");
|
||
getch();
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Include(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i, j, temp;
|
||
|
||
for (i=1; i< count; ++i)
|
||
{
|
||
temp=PtrMass[i];
|
||
for (j=i-1; j>=0 && temp<PtrMass[j]; j--)
|
||
{
|
||
ITERATION++;
|
||
EXCHANGES++;
|
||
PtrMass[j+1]=PtrMass[j];
|
||
}
|
||
ITERATION++;
|
||
PtrMass[j+1]=temp;
|
||
}
|
||
ITERATION -= count-1;
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Binsort(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i, j, pos, a, b, middle, num;
|
||
|
||
for (i=1; i < count; i++)
|
||
{
|
||
a=0; /* H¨¦ïï £à ¨æ ¯®¨áª = 1-¬ã í«-âã */
|
||
b=i; /* ‚¥àåïï = á® 2 ¯® count */
|
||
EXCHANGES++;
|
||
num=PtrMass[i]; /* —¨á«® ¤«ï ª®â. 㦮 ©â¨ ¬¥áâ® */
|
||
|
||
while ( a!=b ) /* ...¯®ª £à ¨æë ¥ ᫨«¨áì... */
|
||
{
|
||
middle=(a+b)/2; /* –¥« ï ç áâì áà. à¨ä¬. áã¬¬ë £à ¨æ */
|
||
|
||
if (num > PtrMass[middle]) /* ..¥á«¨ ç¨á«® >ç¨á« áâ®ïé.¯®¤ */
|
||
{ /* ®¬¥à®¬ middle â®: */
|
||
a=middle+1; /* ¨¦. £à . = æ¥âàã+1 */
|
||
} /* */
|
||
else /* ¨«¨ */
|
||
{ /* */
|
||
b = middle; /* ¢¥àåïï £à ¨æ = æ¥âàã... */
|
||
}
|
||
CONDITIONS++;
|
||
ITERATION++;
|
||
}
|
||
pos=a; /* ‘®¤¥à¦¨â ©¤¥ãî ¯®§¨æ¨î ª®â. */
|
||
/* 㦮 ¯®áâ ¢¨âì ç¨á«® */
|
||
|
||
for (j=i; j > pos; j--)
|
||
{ /* �®¤¢¨£ ¥¬ ( 1 ¢¯à ¢®) í«-âë */
|
||
PtrMass[j]=PtrMass[j-1]; /* ¬ áᨢ «¥¦ 騥 ¯¥à¥¤ í«¥¬¥â®¬, */
|
||
EXCHANGES++;
|
||
ITERATION++; /* ¤«ï ª®â®à®£® ¨é¥âáï ¬¥áâ® ®á¢®- */
|
||
} /* ¡®¦¤ ï 1 ¬¥áâ® */
|
||
|
||
PtrMass[pos]=num; /* “áâ ¢«¨¢ ¥¬ í«¥¬¥â ¬¥áâ® */
|
||
}
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Bubble(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i,j;
|
||
for (i=0; i<count; i++)
|
||
for (j=i+1; j<count; j++)
|
||
{
|
||
if (PtrMass[i] > PtrMass[j])
|
||
{
|
||
PtrMass[i]+=PtrMass[j];
|
||
PtrMass[j]= PtrMass[i] - PtrMass[j];
|
||
PtrMass[i]-=PtrMass[j];
|
||
EXCHANGES++;
|
||
CONDITIONS++;
|
||
}
|
||
ITERATION++;
|
||
}
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Choise(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i,j;
|
||
|
||
for (i=0; i<count; i++)
|
||
for (j=0; j<count-1; j++)
|
||
{
|
||
if(PtrMass[j]>PtrMass[j+1])
|
||
{
|
||
PtrMass[j]+=PtrMass[j+1];
|
||
PtrMass[j+1]=PtrMass[j]-PtrMass[j+1];
|
||
PtrMass[j]-=PtrMass[j+1];
|
||
EXCHANGES++;
|
||
CONDITIONS++;
|
||
}
|
||
ITERATION++;
|
||
}
|
||
}
|
||
|
||
|
||
int A[]={-1,1,2,3,3}, B[]={-2,0,2,4,4};
|
||
|
||
/*.......................................................................*/
|
||
/* ‘«¨ï¨¥ ¤¢ãå ®âá®àâ¨à®¢ ëå ¢¥ªâ®à®¢ ¢ ®¤¨ */
|
||
void Join()
|
||
{
|
||
int C[10], i,j,k;
|
||
|
||
for (i=j=k=0; k < 10; k++)
|
||
{
|
||
if (A[i] <= B[j])
|
||
{ C[k]=A[i]; i++; }
|
||
else
|
||
{ C[k]=B[j]; j++; }
|
||
}
|
||
cprintf("\nŒ áᨢ A[]:");
|
||
Prn(A, sizeof(A) / sizeof(A[0]));
|
||
cprintf("\nŒ áᨢ B[]:");
|
||
Prn(B, sizeof(B) / sizeof(B[0]));
|
||
cprintf("\nŒ áᨢ C[]:");
|
||
Prn(C, sizeof(C) / sizeof(C[0]));
|
||
puts("\n\n\nAny key...");
|
||
getch();
|
||
}
|
||
|
||
|
||
|
||
int aa[]={9,5,3,2,1};
|
||
|
||
/*.......................................................................*/
|
||
void Shell(PtrMass, count)
|
||
int *PtrMass, count;
|
||
{
|
||
int i, j, gap, k, x;
|
||
|
||
for(k=0; k < 5; k++)
|
||
{
|
||
gap = aa[k];
|
||
for(i=gap; i < count; ++i)
|
||
{
|
||
x=PtrMass[i];
|
||
for(j=i-gap; x < PtrMass[j] && j >= 0; j = j-gap)
|
||
{
|
||
PtrMass[j+gap]=PtrMass[j];
|
||
ITERATION++;
|
||
EXCHANGES++;
|
||
}
|
||
PtrMass[j+gap]=x;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
/*.......................................................................*/
|
||
void Quick(PtrMass, left, right)
|
||
int *PtrMass, left, right;
|
||
{
|
||
int x, y, i, j;
|
||
i = left;
|
||
j = right;
|
||
x = PtrMass[(left+right) / 2];
|
||
do {
|
||
while(PtrMass[i] < x && i < right) { i++; ITERATION++; }
|
||
while(x < PtrMass[j] && j > left) { j--; ITERATION++; }
|
||
|
||
if(i <= j)
|
||
{
|
||
y=PtrMass[i];
|
||
PtrMass[i]=PtrMass[j];
|
||
PtrMass[j]=y;
|
||
i++;
|
||
j--;
|
||
EXCHANGES++;
|
||
CONDITIONS++;
|
||
}
|
||
} while(i <= j);
|
||
|
||
if(left < j) Quick(PtrMass,left,j);
|
||
if(i < right) Quick(PtrMass,i,right);
|
||
}
|