- •Основи алгоритмізації
- •Машина Тьюринга (мт)
- •Перші еом
- •Частина 1. Основи програмування Розділ 1. Архітектура сучасних пк
- •1.1. Структурна схема пк
- •1.2. Загальні|загальні| принципи роботи комп'ютера
- •1.3. Позиційні системи числення
- •Завдання для самостійної роботи
- •Розділ 2. Історія розвитку мов|язиків| програмування високого рівня
- •Розділ 3. Загальні|загальні| принципи програмування
- •3.1. Вимоги до професії
- •3.2. Мови|язики| програмування і програмне|програмова| середовище|середовище|
- •3.3. Структура програмних комплексів
- •3.4. Структура програми
- •3.5. Технологія програмування і налагодження програм на мвр
- •3.6. Техніка обчислень|підрахунків|
- •3.7. Типи обчислювальних процесів
- •3.8. Цикли в обчислювальному процесі
- •3.9. Загальна структура прикладної програми
- •3.10. Типи підпрограм
- •Завдання для самостійної роботи
- •Кодування Windows-1251 (синоним cp1251)
- •Двобайтне кодування стандарту unicode – utf-8,utf-16
Кодування Windows-1251 (синоним cp1251)
|
.0 |
.1 |
.2 |
.3 |
.4 |
.5 |
.6 |
.7 |
.8 |
.9 |
.A |
.B |
.C |
.D |
.E |
.F |
8. |
Ђ 402 |
Ѓ 403 |
‚ 201A |
ѓ 453 |
„ 201E |
… 2026 |
† 2020 |
‡ 2021 |
€ 20AC |
‰ 2030 |
Љ 409 |
‹ 2039 |
Њ 40A |
Ќ 40C |
Ћ 40B |
Џ 40F |
9. |
ђ 452 |
‘ 2018 |
’ 2019 |
“ 201C |
” 201D |
• 2022 |
– 2013 |
— 2014 |
|
™ 2122 |
љ 459 |
› 203A |
њ 45A |
ќ 45C |
ћ 45B |
џ 45F |
A. |
A0 |
Ў 40E |
ў 45E |
Ј 408 |
¤ A4 |
Ґ 490 |
¦ A6 |
§ A7 |
Ё 401 |
© A9 |
Є 404 |
« AB |
¬ AC |
AD |
® AE |
Ї 407 |
B. |
° B0 |
± B1 |
І 406 |
і 456 |
ґ 491 |
µ B5 |
¶ B6 |
· B7 |
ё 451 |
№ 2116 |
є 454 |
» BB |
ј 458 |
Ѕ 405 |
ѕ 455 |
ї 457 |
C. |
А 410 |
Б 411 |
В 412 |
Г 413 |
Д 414 |
Е 415 |
Ж 416 |
З 417 |
И 418 |
Й 419 |
К 41A |
Л 41B |
М 41C |
Н 41D |
О 41E |
П 41F |
D. |
Р 420 |
С 421 |
Т 422 |
У 423 |
Ф 424 |
Х 425 |
Ц 426 |
Ч 427 |
Ш 428 |
Щ 429 |
Ъ 42A |
Ы 42B |
Ь 42C |
Э 42D |
Ю 42E |
Я 42F |
E. |
а 430 |
б 431 |
в 432 |
г 433 |
д 434 |
е 435 |
ж 436 |
з 437 |
и 438 |
й 439 |
к 43A |
л 43B |
м 43C |
н 43D |
о 43E |
п 43F |
F. |
р 440 |
с 441 |
т 442 |
у 443 |
ф 444 |
х 445 |
ц 446 |
ч 447 |
ш 448 |
щ 449 |
ъ 44A |
ы 44B |
ь 44C |
э 44D |
ю 44E |
я 44F |
Двобайтне кодування стандарту unicode – utf-8,utf-16
Для кодування складних алфавітів с числом символів більше 256, наприклад, китайських ієрогліфів, довелося перейти до двобайтного кодування стандарту UTF-8, UNF-16.
В UTF-16 (сучасна модифікація стандарту UTF-8) символи кодуються двобайтними словами з використанням всіх можливих діапазонів значень (від 0 до FFFF16). При цьому можна кодувати символи Unіcode у діапазонах 000016..D7FF16 і E00016..10FFFF16.
Виключений звідси діапазон D80016..DFFF16 використається саме для кодування так званих сурогатних пар - символів, які кодуються двома 16-бітними словами (наприклад, китайські ієрогліфи).
Символи Unіcode до FFFF16 включно (крім діапазону для сурогатів) записуються як є 16-бітним словом. Символи ж у діапазоні 1000016..10FFFF16 (більше 16 біт) уже кодуються парою 16-бітних слів. Для цього їхній код арифметично зрушується до нуля (з нього віднімається мінімальне число 1000016). У результаті вийде значення від нуля до FFFFF16, що займає до 20 біт. Старші 10 біт цього значення йдуть у лідируюче (перше) слово, а молодші 10 біт - у наступне (друге). При цьому в обох словах з 6 біт використаються для позначення сурогату. Біти з 11 по 15 зі значення 110112, а 10-ий біт містить 0 у лідируючого слові й 1 - у наступному. У зв'язку із цим можна легко визначити до чого ставиться кожне слово.
Алгоритм сортування Шелла:
Метод ‘бульбашки’ з послідовністю інтервалів d1>d2>…>dm=1.
Швидкодія – O(N2)->O(N3/2)->O(Nlog2N)
program ShellSrt;
{$APPTYPE CONSOLE}
uses SysUtils;
type massive=array[1..100] of integer;
var A:massive; n:integer;
procedure RndArrInput(var a1:massive; n1:integer);
var i1:integer;
begin
randomize;
for i1:=1 to n1 do
a1[i1]:=10-random(20);
end;
procedure Arroutput(a2:massive; n2:integer);
var i2:integer;
begin
for i2:=1 to n2 do
write(a2[i2],' ');
end;
Procedure change (var k,l:integer);
var tmp:integer;
begin
tmp:=k; k:=l; l:=tmp;
end;
procedure ShellSort(var A:massive; n:integer);
Var i,j,h:integer;
Begin
h:=N div 2;
While h>0 do
Begin
For i:=1 to N-h do
Begin
j:=i;
While (j>=1)and(A[j]>A[j+h]) do
Begin
change(a[j],a[j+h]);
dec(j);
End;
End;
h:=h div 2;
end;
end;
begin
writeln('enter data:');
readln(n);
RndArrInput(a,n);
ArrOutPut(a,n); readln;
ShellSort(a,n);
ArrOutPut(a,n);
readln;
end.
Швидке сортування (гнома): O(N2) <->O(NlogN). Переставляє тільки першу зустрічну «неправильну» пару і починає аналіз спочатку.
program Quick_Sort;
var A:array[1..100] of integer;
N,i : integer;
{У процедуру передаються ліва та права границі фрагменту, що сортується}
procedure QSort(L,R:integer);
var X,y,i,j:integer;
begin
X:=A[(L+R) div 2];
i:=L; j:=R;
while i<=j do
begin
while A[i]<X do i:=i+1;
while A[j]>X do j:=j-1;
if i<=j then
begin
y:=A[i]; A[i]:=A[j]; A[j]:=y;
i:=i+1; j:=j-1;
end;
end;
if L<j then QSort(L,j);
if i<R then QSort(i,R);
end;
begin
write('Кількість елементів масиву ');
read(N);
for i:=1 to n do read(A[i]);
QSort(1,n); {Впорядкувати елементи з першого по n-ий}
for i:=1 to n do write(A[i],' '); {Упорядкований масив}
end.
Сортування злиттям:попарные перестановки, почетверочные (берутся и переставляются только первые солдаты из каждой группы), по восемь и т.д.
Пример:
56 |
19 |
3 |
95 |
23 |
17 |
38 |
44 |
84 |
73 |
64 |
19 56 |
3 95 |
17 23 |
38 44 |
73 84 |
64 |
|||||
3 19 56 95 |
17 23 38 44 |
73 64 84 |
||||||||
3 17 19 23 38 44 56 95 |
64 73 84 |
|||||||||
3 |
17 |
19 |
23 |
38 |
44 |
56 |
64 |
73 |
84 |
95 |
O(NlogN)
|
procedure MergeSort( var ar1, ar2: array of Integer; min, max: Integer);
var
middle, int1, int2, int3: Integer;
begin
if min<max then begin //інакше массив складається
//з одного елемента і є впорядкованим.
middle:=min div 2+max div 2;
// рекурсивно сортуєму підсписки
MergeSort(ar1, ar2, min, middle);
MergeSort(ar1, ar2, middle+1, max);
int1:=min; //вказівник на 1-й массив
int2:=middle+1; //вказівник на 2-й массив
int3:=min; //вказівник на обєднаний масив
//обєднання сортованих масивів
while (int1<=middle) and (int2<=max) do begin
if ar1[int1] then begin
ar2[int3]:=ar1[int1];
int1:=int1+1;
end
else begin
ar2[int3]:=ar1[int2];
int2:=int2+1;
end;
inc(int3);
end;
// очистка не пустого списка
while (int1<=middle) do begin
ar2[int3]:=ar1[int1];
int1:=int1+1;
int3:=int3+1;
end;
while (int2<=middle) do begin
ar2[int3]:=ar1[int2];
int2:=int2+1;
int3:=int3+1;
end;
end;
//прирівнювання входящих массивів
for int1:=min to max do
ar1[int1]:=ar2[int1];
end;
Ще один приклад:
uses SysUtils;
const n=10;
type mas=array[1..n] of integer;
var x1,x2:mas;
i:integer;
procedure mrg(var y,x:mas; m,s,r:integer);
var mr,k,i,j:integer;
begin
mr:=m+s;
i:=m;
j:=mr;
for k:=m to m+s+r-1 do
if i>m+s-1 then
begin
x[k]:=y[j];
j:=j+1;
end
else
if j>mr+r-1 then
begin
x[k]:=y[i];
i:=i+1;
end
else if y[i]<y[j] then
begin
x[k]:=y[i];
i:=i+1;
end
else
begin
x[k]:=y[j];
j:=j+1;
end;end;
procedure Mrg_rec(var a,b:mas; l,r:integer);
var m,k:integer;
begin
if l>=r then exit;
m:=(l+r)div 2;
Mrg_rec(a,b,l,m);
Mrg_rec(a,b,m+1,r);
mrg(a,b,l,m-l+1,r-m);
for k:=1 to r do
a[k]:=b[k];
end;
begin
randomize;
for i:=1 to n do
x1[i]:=random(10)-5;
for i:=1 to n do
writeln(x1[i]);
mrg_rec(X1,X2,1,n);
writeln;
for i:=1 to n do
writeln(x1[i]);
readln; writeln('that''s all'); readln;
end.
А це - складний приклад реалізації сортування масивів:
program SortArrays;
{$APPTYPE CONSOLE}
uses SysUtils;
type Massive=array[1..25] of integer;
var A:massive; n:integer;
procedure RndArrInput (var a1:massive; n1:integer);
var i1:integer;
begin
Randomize;
for i1:=1 to n1 do
a1[i1]:=20-random(20);
end;
procedure ArrOutPut(a2:massive; n2:integer);
var i2:integer;
begin
for i2:=1 to n2 do
write(a2[i2],' ');
end;
procedure Annihilate(var an:massive; nn:integer);
var i_:integer;
begin
for i_:=1 to nn do
an[i_]:=0;
end;
procedure MergeUnion(const a:massive; N_a:integer;
const b:massive; N_b:integer; var c:massive; {var N_c:integer}start:integer);
var i_a,i_b,i_c:integer;
Begin
i_a:=1; i_b:=1; i_c:={1;}start;
while (i_a<=N_a)and(i_b<=N_b) do begin
if a[i_a]<b[i_b] then begin
c[i_c]:=a[i_a];
inc(i_a);
inc(i_c);
end else
if a[i_a]>b[i_b] then begin
c[i_c]:=b[i_b];
inc(i_b);
inc(i_c);
end else begin (* a[i_a]=b[i_b] *)
c[i_c]:=a[i_a];
inc(i_a);
{inc(i_b);} //we shouldn't write the equal value only once
inc(i_c); c[i_c]:=b[i_b]; inc(i_b); inc(i_c);
end
end;
while (i_a<=N_a) do begin
c[i_c]:=a[i_a];
inc(i_a);
inc(i_c);
end;
while (i_b<=N_b) do begin
c[i_c]:=b[i_b];
inc(i_b);
inc(i_c);
end;
End;
procedure MergeSort(var a3:massive; n3:Integer);
var hlp1,hlp2,hlp3:massive; cnt:integer; LineChanged:Boolean;
cur_1, cur_2:integer; i:integer;
cur:Integer; pnt:integer; hlp_cur:integer; WtoHlp1,WtoHlp2:Boolean;
begin
Annihilate(hlp1,n3);
Annihilate(hlp2,n3);
Annihilate(hlp3,n3);
cnt:=1; LineChanged:=true;
while LineChanged do
begin
pnt:=1; lineChanged:=false;
while pnt<=n3 do
begin
cur:=1; WtoHlp1:=false; Wtohlp2:=false; cur_1:=0; cur_2:=0;
while (cur<=cnt)and(pnt<=n3) do
begin
hlp1[cur]:=a3[pnt];
inc(pnt);
inc(cur); inc(cur_1);
WtoHlp1:=true;
end;
cur:=1;
while (cur<=cnt)and(pnt<=n3) do
begin
hlp2[cur]:=a3[pnt];
inc(pnt);
inc(cur); inc(cur_2);
WtoHlp2:=true; lineChanged:=true;
end;
if WToHlp1 and WToHlp2 then
MergeUnion(hlp1,cur_1,hlp2,cur_2,hlp3,pnt-{2*cnt}(cur_1+cur_2));
if WToHlp1 and not(WtoHlp2) then
for i:=1 to cur_1 do
begin
hlp3[pnt-(cur_1+cur_2)]:=hlp1[i];
inc(pnt);
end;
//tail-writting. cur_1 is the point, how many elements have we in hlp1.
end;
cnt:=cnt*2;
a3:=hlp3;
end;{of while LineChanged}
end;{of procedure}
begin
writeln('enter data:');
readln(n);
RndArrInput(a,n);
ArrOutput(a,n);
readln;
MergeSort(a,n);
readln;
ArrOutput(a,n);
readln;
end.
Сортування перерахунком.
K-діапазон ключів. Наприклад, байтів ключ має К=256. Масив A, що сортується, має N членів. Масив лічильників ключів С має К комірок. B-робочий масив з довжиною А.
У прикладі, що наведений нижче, K=10, N=11
A= |
1 |
9 |
3 |
9 |
1 |
5 |
3 |
4 |
5 |
2 |
0 |
Ключі |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
С= |
1 |
2 |
1 |
2 |
1 |
2 |
0 |
0 |
0 |
2 |
B= |
0 |
1 |
1 |
2 |
3 |
3 |
4 |
5 |
5 |
9 |
9 |
Далі В переписується в А.