Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.
А, так, вибачте. Змінював назву змінної і не помітив. Тільки можна не від 0, а від 1 - бо 0 вже взятий перед циклом.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Програма розв'язування задач з фізики! Для учнів 7-го класу.
Сторінки Попередня 1 … 5 6 7 8 9 … 26 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
А, так, вибачте. Змінював назву змінної і не помітив. Тільки можна не від 0, а від 1 - бо 0 вже взятий перед циклом.
Привіт найкращим програмістам України!
var a, b, MaxRow, MaxColumn, MinRow, MinColumn: Integer; Max, Min: Extended;
Таки напевно потрібні мені рядки і стовпці.
Мені ж потрібно це ще якось вивести в поле RichEdit щоб користувач бачив що від чого віднімається
RichEdit1.Lines.Add ('l=h-h1');
Variables[2,0] := Variables[MaxRow,MaxColumn] - Variables[MinRow,MinColumn];
RichEdit1.Lines.Add (FloatToStr(Variables[MaxRow,MaxColumn]) + ' - ' + FloatToStr(Variables[MinRow,MinColumn]) + ' = ' + FloatToStr(Variables[2,0]));
Variables[MaxRow,MaxColumn] має те ж значення, що й Max
Variables[MinRow,MinColumn] має те ж значення, що й Min
Маємо
RichEdit1.Lines.Add ('l=h-h1');
Variables[2,0] := Max - Min;
RichEdit1.Lines.Add (FloatToStr(Max) + ' - ' + FloatToStr(Min) + ' = ' + FloatToStr(Variables[2,0]));
Variables[MaxRow,MaxColumn] має те ж значення, що й Max
Variables[MinRow,MinColumn] має те ж значення, що й Min
МаємоRichEdit1.Lines.Add ('l=h-h1'); Variables[2,0] := Max - Min; RichEdit1.Lines.Add (FloatToStr(Max) + ' - ' + FloatToStr(Min) + ' = ' + FloatToStr(Variables[2,0]));
Так пане koala, але я трохи неправильно написав, мені ось цей рядок коду потрібно вивести в RichEdit
RichEdit1.Lines.Add ('l=h-h1');
тут же може бути l=h-h1, l=h5-h1, l=h4-h, ... Тобто всі можливі варіани, тоді я зможу записати:
а от як його вивести я іще зараз подумаю
Я дуже раджу вам розібратися із функцією Format.
Row := 48;
MaxColumn := 0;
MinColumn := 0;
for Column:=1 to 6 do begin
if Variables[Row, MaxColumn] < Variables[Row, Column] then
MaxColumn:=Column;
if Variables[Row, MinColumn] > Variables[Row, Column] then
MinColumn:=Column;
end;
Variables[2,0] := Variables[Row, MaxColumn] - Variables[Row, MinColumn];
RichEdit1.Lines.Add (Format('l = h%d - h%d',[MaxColumn,MinColumn]));
RichEdit1.Lines.Add (Format('%e - %e = %e',[Variables[Row, MaxColumn], Variables[Row, MinColumn], Variables[2,0]]));
Я дуже раджу вам розібратися із функцією Format.
Пане koala я не можу зрозуміти цю функцію. Напевно що через те що в мене є:
h, h1, h2, h3, h4, h5, h6 а не h0, h1, h2, h3, h4, h5, h6
на місце вашого коду
RichEdit1.Lines.Add (Format('l = h%d - h%d',[MaxColumn,MinColumn]));
Я підставив такий рядок
RichEdit1.Lines.Add ('l=h' + FloatToStr(MaxColumn) + '-' + 'h' + FloatToStr(MinColumn));
і всерівно вона виводить h0 а не h. Але вже хоч так
Але в загальному мені ваша порада дуже допомогла! Дякую!
if (CheckBox2.Checked) or (CheckBox3.Checked) or (CheckBox4.Checked) or (CheckBox5.Checked) or (CheckBox6.Checked) or (CheckBox7.Checked) then
begin
MaxColumn := 0;
MinColumn := 0;
for Column :=0 to 6 do
begin
if Variables[48,MaxColumn] < Variables[48,Column] then
MaxColumn:=Column;
if Variables[48,MinColumn] > Variables[48,Column] then
MinColumn:=Column;
end;
Variables[2,0] := Variables[48,MaxColumn] - Variables[48,MinColumn];
RichEdit1.Lines.Add ('l=h' + FloatToStr(MaxColumn) + '-' + 'h' + FloatToStr(MinColumn));
RichEdit1.Lines.Add (FloatToStr(Variables[48,MaxColumn]) + ' - ' + FloatToStr(Variables[48,MinColumn]) + ' = ' + FloatToStr(Variables[2,0]));
end
else
begin
RichEdit1.Lines.Add ('l=h+h1+h2+h3+h4+h5+h6');
Variables[2,0] := Variables[48,0] + Variables[48,1] + Variables[48,2] + Variables[48,3] + Variables[48,4] + Variables[48,5] + Variables[48,6];
RichEdit1.Lines.Add (FloatToStr(Variables[48,0]) + ' + ' + FloatToStr(Variables[48,1]) + ' + ' + FloatToStr(Variables[48,2]) + ' + ' + FloatToStr(Variables[48,3]) + ' + ' + FloatToStr(Variables[48,4]) + ' + ' + FloatToStr(Variables[48,5]) + ' + ' + FloatToStr(Variables[48,6]) + ' = ' + FloatToStr(Variables[2,0]));
end;
Скажіть, а я правильно зрозумів, що вам воно не лише для 48-го рядка потрібно, а ще такий самий код зі зміною пари цифр та символів (наприклад, 'l','h', Variables[2,0]) доведеться повторювати?
Ну і якась така функція вам дуже в нагоді стане:
function VarName(letter:String, number: Integer) : String;
begin
if number = 0 then
Result := letter
else
Result := letter + IntToStr(number);
end;
...
RichEdit1.Lines.Add('l=' + VarName('h',MaxColumn) + '-' + VarName('h',MinColumn));
{чи навіть}
RichEdit1.Lines.Add(Format('l = %s - %s',[VarName('h',MaxColumn), VarName('h',MinColumn)]));
Ну і звісно ж
RichEdit1.Lines.Add (Format('%f + %f + %f + %f + %f + %f = %f', [Variables[48,0], Variables[48,1], Variables[48,2], Variables[48,3], Variables[48,4], Variables[48,5], Variables[48,6], Variables[2,0]]));
Стрічка форматування функції Format - це дуже просто: все, крім %, виводиться як є, а % із чимось бере значення з другого параметра (масива). %d - десяткове ціле, %f - рухома кома, %s - стрічка. Якщо потрібен символ %, треба написати %%. І головне - ви одразу бачите, як виглядає стрічка в цілому, а не продираєтеся крізь ланцюжки плюсів і лапок.
Доброї ночі! Пане koala підкажіть функція Format взагалі виводить дійсні числа?
І якщо так то як мені переробити ось цей рядок
RichEdit1.Lines.Add('(' + FloatToStr(Variables[2,0]) + 'м. + ' + FloatToStr(Variables[2,1]) + 'м. + ' + FloatToStr(Variables[2,2]) + 'м.) ' + '/' + ' (' + FloatToStr(Variables[1,0]) + 'с. + ' + FloatToStr(Variables[1,1]) + 'с. + ' + FloatToStr(Variables[1,2]) + 'с.)');
Загальний формат специфікаторів:
%["-"][ширина][.точність]тип
[] позначають необов'язковість поля
- - вирівняти ліворуч (без нього - праворуч)
ширина - мінімальна кількість символів, решта доповнюються пробілами.
точність - кількість знаків після десяткової крапки
тип: d - ціле десяткове
u - беззнакове десяткове (невід'ємне)
e - експоненційна форма дійсного числа (1.2345e3)
f - дійсне число з фіксованою крапкою (1234.5)
g - автоматичний вибір з e та f, що коротше (як на мене, іноді дає трохи нелогічні результати)
s - стрічка
x - шістнадцяткове ціле
Таким чином
Format('%8d %.3g %.3f %.3f',[5,0.0001,0.0001,0.0001]) -> " 5 0.0001 0.000 1.00E-004"
(якщо вірити FPC)
Усім добрий вечір! Я десь читав що в Delphi в налаштуваннях компілятора можна налаштувати деякі опції. Наразі мене цікавить щоб компілятор точно розрізняв мої ітеми в комбобоксах. Бо наразі він плутає l - Шлях та l - Довжина він вибирає перший ітем l - Шлях а до останнього не доходить l - Довжина. Тому я вимушений записувати в коді номера ітемів, а хотілося б для наочності записувати їхній текст.
if ((ComboBox9.Text = 't - Час') or (ComboBox10.Text = 't - Час') or
(ComboBox11.Text = 't - Час') or (ComboBox12.Text = 't - Час') or
(ComboBox13.Text = 't - Час') or (ComboBox14.Text = 't - Час')) and
((ComboBox9.Text = 't1 - Час') or (ComboBox10.Text = 't1 - Час') or
(ComboBox11.Text = 't1 - Час') or (ComboBox12.Text = 't1 - Час') or
(ComboBox13.Text = 't1 - Час') or (ComboBox14.Text = 't1 - Час')) and
((ComboBox9.Text = 't2 - Час') or (ComboBox10.Text = 't2 - Час') or
(ComboBox11.Text = 't2 - Час') or (ComboBox12.Text = 't2 - Час') or
(ComboBox13.Text = 't2 - Час') or (ComboBox14.Text = 't2 - Час')) and
((ComboBox9.Text = 'l - Шлях') or (ComboBox10.Text = 'l - Шлях') or
(ComboBox11.Text = 'l - Шлях') or (ComboBox12.Text = 'l - Шлях') or
(ComboBox13.Text = 'l - Шлях') or (ComboBox14.Text = 'l - Шлях')) and
((ComboBox9.Text = 'l1 - Шлях') or (ComboBox10.Text = 'l1 - Шлях') or
(ComboBox11.Text = 'l1 - Шлях') or (ComboBox12.Text = 'l1 - Шлях') or
(ComboBox13.Text = 'l1 - Шлях') or (ComboBox14.Text = 'l1 - Шлях')) and
((ComboBox9.Text = 'l2 - Шлях') or (ComboBox10.Text = 'l2 - Шлях') or
(ComboBox11.Text = 'l2 - Шлях') or (ComboBox12.Text = 'l2 - Шлях') or
(ComboBox13.Text = 'l2 - Шлях') or (ComboBox14.Text = 'l2 - Шлях')) then
Буду дуже вдячний тому хто підкаже шлях до тієї галочки яку треба увімкнути в Delphi 10.3
Бо наразі він плутає l - Шлях та l - Довжина він вибирає перший ітем l - Шлях а до останнього не доходить l - Довжина.
Можете це розшифрувати? Що значить "плутає"? Якби він плутав, то взагалі програма була б недетерміністична. Що саме ви робите, що він видає одне значення замість іншого?
Загалом правильно саме з номерами працювати, просто треба їх не прямо писати в коді (це зветься "магічними числами" і вважається поганим стилем), а проголошувати константи.
Прописую код (ComboBox9.Text = 'l - Довжина') or (ComboBox10.Text = 'l - Довжина') а в RichEdit виводить l - Шлях
Тобто він находить текст який першим починається на (Ел) l і виводить його а далі не читає Шлях це чи Довжина. Так само і s - Переміщення та S - Площа і так далі. s - Переміщення стоїть першим ітемом за площу і він присвоює не S - Площа значення бо цей ітем один з останніх а s - Переміщення. і от я мушу писати наприклад не
(ComboBox9.Text = 'l - Довжина') or (ComboBox10.Text = 'l - Довжина')
а
(ComboBox9.ItemIndex = 56) or (ComboBox10.ItemIndex = 56)
а це для наочності в коді не є добре, хотілосяб записувати не
ComboBox9.ItemIndex = 56
а
ComboBox9.Text = 'l - Довжина'
Вибачте, але ми тут не телепати. Код
(ComboBox9.Text = 'l - Довжина') or (ComboBox10.Text = 'l - Довжина')
ніяк не може вивести в RichEdit "l - Шлях". Наведіть повний фрагмент коду.
Вибачте, але ми тут не телепати. Код
(ComboBox9.Text = 'l - Довжина') or (ComboBox10.Text = 'l - Довжина')
ніяк не може вивести в RichEdit "l - Шлях". Наведіть повний фрагмент коду.
Я вже наразі не згадаю де саме в коді я знайшов цю помилку но я зараз записую ось так
if ((ComboBox9.ItemIndex = 7) or (ComboBox10.ItemIndex = 7) or // l - Шлях
(ComboBox11.ItemIndex = 7) or (ComboBox12.ItemIndex = 7) or
(ComboBox13.ItemIndex = 7) or (ComboBox14.ItemIndex = 7)) and
((ComboBox9.ItemIndex = 21) or (ComboBox10.ItemIndex = 21) or // v - Швидкість
(ComboBox11.ItemIndex = 21) or (ComboBox12.ItemIndex = 21) or
(ComboBox13.ItemIndex = 21) or (ComboBox14.ItemIndex = 21)) then
begin
Definition := CHAS;
RichEdit1.Lines.Add(Definition);
Definition := EmptyLine;
RichEdit1.Lines.Add(Definition);
RichEdit1.Lines.Add ('Визначаємо час прямолінійного рівномірного руху.');
Pict := TPicture.Create;
try
Pict.LoadFromFile('Формули\Час прямолінійного рівномірного руху tlv.jpg');
Clipboard.Assign(Pict);
RichEdit1.PasteFromClipboard;
finally
Pict.Free;
end;
RichEdit1.Lines.Add(Definition);
Variables[1,0] := Variables[2,0] / Variables[4,0];
RichEdit1.Lines.Add (FloatToStr(Variables[2,0]) + 'м. / ' + FloatToStr(Variables[4,0]) + 'м.с. = ' + FloatToStr(Variables[1,0]) + 'c.');
undo := False;
Output_Value := True;
end
else
if ((ComboBox9.ItemIndex = 14) or (ComboBox10.ItemIndex = 14) or // s - Переміщення
(ComboBox11.ItemIndex = 14) or (ComboBox12.ItemIndex = 14) or
(ComboBox13.ItemIndex = 14) or (ComboBox14.ItemIndex = 14)) and
((ComboBox9.ItemIndex = 21) or (ComboBox10.ItemIndex = 21) or // v - Швидкість
(ComboBox11.ItemIndex = 21) or (ComboBox12.ItemIndex = 21) or
(ComboBox13.ItemIndex = 21) or (ComboBox14.ItemIndex = 21)) then
begin
Definition := CHAS;
RichEdit1.Lines.Add(Definition);
Definition := EmptyLine;
RichEdit1.Lines.Add(Definition);
RichEdit1.Lines.Add ('Визначаємо час прямолінійного рівномірного руху.');
Pict := TPicture.Create;
try
Pict.LoadFromFile('Формули\Час прямолінійного рівномірного руху tsv.jpg');
Clipboard.Assign(Pict);
RichEdit1.PasteFromClipboard;
finally
Pict.Free;
end;
RichEdit1.Lines.Add(Definition);
Variables[1,0] := Variables[3,0] / Variables[4,0];
RichEdit1.Lines.Add (FloatToStr(Variables[3,0]) + 'м. / ' + FloatToStr(Variables[4,0]) + 'м.с. = ' + FloatToStr(Variables[1,0]) + 'с.');
undo := False;
Output_Value := True;
end
else
а не
if ((ComboBox9.Text = 'l - Шлях') or (ComboBox10.Text = 'l - Шлях') or
(ComboBox11.Text = 'l - Шлях') or (ComboBox12.Text = 'l - Шлях') or
(ComboBox13.Text = 'l - Шлях') or (ComboBox14.Text = 'l - Шлях')) and
((ComboBox9.Text = 'v - Швидкість') or (ComboBox10.Text = 'v - Швидкість') or
(ComboBox11.Text = 'v - Швидкість') or (ComboBox12.Text = 'v - Швидкість') or
(ComboBox13.Text = 'v - Швидкість') or (ComboBox14.Text = 'v - Швидкість')) then
begin
Definition := CHAS;
RichEdit1.Lines.Add(Definition);
Definition := EmptyLine;
RichEdit1.Lines.Add(Definition);
RichEdit1.Lines.Add ('Визначаємо час прямолінійного рівномірного руху.');
Pict := TPicture.Create;
try
Pict.LoadFromFile('Формули\Час прямолінійного рівномірного руху tlv.jpg');
Clipboard.Assign(Pict);
RichEdit1.PasteFromClipboard;
finally
Pict.Free;
end;
RichEdit1.Lines.Add(Definition);
Variables[1,0] := Variables[2,0] / Variables[4,0];
RichEdit1.Lines.Add (FloatToStr(Variables[2,0]) + 'м. / ' + FloatToStr(Variables[4,0]) + 'м.с. = ' + FloatToStr(Variables[1,0]) + 'c.');
undo := False;
Output_Value := True;
end
else
if ((ComboBox9.Text = 's - Переміщення') or (ComboBox10.Text = 's - Переміщення') or
(ComboBox11.Text = 's - Переміщення') or (ComboBox12.Text = 's - Переміщення') or
(ComboBox13.Text = 's - Переміщення') or (ComboBox14.Text = 's - Переміщення')) and
((ComboBox9.Text = 'v - Швидкість') or (ComboBox10.Text = 'v - Швидкість') or
(ComboBox11.Text = 'v - Швидкість') or (ComboBox12.Text = 'v - Швидкість') or
(ComboBox13.Text = 'v - Швидкість') or (ComboBox14.Text = 'v - Швидкість')) then
begin
Definition := CHAS;
RichEdit1.Lines.Add(Definition);
Definition := EmptyLine;
RichEdit1.Lines.Add(Definition);
RichEdit1.Lines.Add ('Визначаємо час прямолінійного рівномірного руху.');
Pict := TPicture.Create;
try
Pict.LoadFromFile('Формули\Час прямолінійного рівномірного руху tsv.jpg');
Clipboard.Assign(Pict);
RichEdit1.PasteFromClipboard;
finally
Pict.Free;
end;
RichEdit1.Lines.Add(Definition);
Variables[1,0] := Variables[3,0] / Variables[4,0];
RichEdit1.Lines.Add (FloatToStr(Variables[3,0]) + 'м. / ' + FloatToStr(Variables[4,0]) + 'м.с. = ' + FloatToStr(Variables[1,0]) + 'с.');
undo := False;
Output_Value := True;
end
else
Компілятор якби знаходить перше входження (строки) в (подстроку) а що там далі він не дивиться, якось так, наскільки я вам можу пояснити.
Чи він не враховує усі or and
я вже не пам'ятаю от тыльки не зручно писати
if ((ComboBox9.ItemIndex = 7) or (ComboBox10.ItemIndex = 7) or // l - Шлях
(ComboBox11.ItemIndex = 7) or (ComboBox12.ItemIndex = 7) or
(ComboBox13.ItemIndex = 7) or (ComboBox14.ItemIndex = 7)) and
((ComboBox9.ItemIndex = 21) or (ComboBox10.ItemIndex = 21) or // v - Швидкість
(ComboBox11.ItemIndex = 21) or (ComboBox12.ItemIndex = 21) or
(ComboBox13.ItemIndex = 21) or (ComboBox14.ItemIndex = 21)) then
Так код, який ви наводили вище, не еквівалентний цьому. Ви скоротили варіанти?
Ну і покажу один фокус, як можна це спростити. Є такий тип в Delphi - set, множина. Множини бувають лише злічених типів, тому перехід на стрічки тут не підійде.
var ComboboxIndexes: set of integer;
....
ComboboxIndexes = [ComboBox9.ItemIndex, ComboBox10.ItemIndex, ComboBox11.ItemIndex,
ComboBox12.ItemIndex, ComboBox13.ItemIndex, ComboBox14.ItemIndex];
if (7 in ComboboxIndexes) and (21 in ComboboxIndexes) then //l - Шлях та v - Швидкість
...
else if (14 in ComboboxIndexes) and (21 in ComboboxIndexes) then //s - Переміщення та v - Швидкість
Також можна (і треба) вводити імена для магічних чисел, наприклад, константи:
const WAY:integer = 7;
DISPLACEMENT:integer = 14;
SPEED:integer = 21;
...
if WAY in ComboboxIndexes then ... //а це практично людською мовою написано
Але, як я розумію, вам треба перевіряти комбобокси не на одне значення, а на одне з групи - l, l1, l2 і т.д. Ну ок:
var WayValues, DisplacementValues, SpeedValues, ComboboxIndexes : set of integer;
...
WayValues = [7..13]; //скорочення для [7,8,9,10,11,12,13]
DisplacementValues = [14..20];
SpeedValues = [21..27];
ComboboxIndexes = [ComboBox9.ItemIndex, ComboBox10.ItemIndex, ComboBox11.ItemIndex,
ComboBox12.ItemIndex, ComboBox13.ItemIndex, ComboBox14.ItemIndex];
if WayValues * ComboboxIndexes <> [] and SpeedValues * ComboboxIndexes <> [] then //* - перетин множин
Так код, який ви наводили вище, не еквівалентний цьому. Ви скоротили варіанти?
Ну і покажу один фокус, як можна це спростити. Є такий тип в Delphi - set, множина. Множини бувають лише злічених типів, тому перехід на стрічки тут не підійде.var ComboboxIndexes: set of integer; .... ComboboxIndexes = [ComboBox9.ItemIndex, ComboBox10.ItemIndex, ComboBox11.ItemIndex, ComboBox12.ItemIndex, ComboBox13.ItemIndex, ComboBox14.ItemIndex]; if (7 in ComboboxIndexes) and (21 in ComboboxIndexes) then //l - Шлях та v - Швидкість ... else if (14 in ComboboxIndexes) and (21 in ComboboxIndexes) then //s - Переміщення та v - Швидкість
Оце класна порада пане koala, дякую! Вже буду пробувати прописувати її в коді щоб скоротити ось це неподобство
if ((ComboBox9.ItemIndex = 7) or (ComboBox10.ItemIndex = 7) or // l - Шлях
(ComboBox11.ItemIndex = 7) or (ComboBox12.ItemIndex = 7) or
(ComboBox13.ItemIndex = 7) or (ComboBox14.ItemIndex = 7)) and
((ComboBox9.ItemIndex = 21) or (ComboBox10.ItemIndex = 21) or // v - Швидкість
(ComboBox11.ItemIndex = 21) or (ComboBox12.ItemIndex = 21) or
(ComboBox13.ItemIndex = 21) or (ComboBox14.ItemIndex = 21)) then
ну а імена для магічних чисел я не бачу сенсу вводити, для чого? За умови якщо я вас правильно зрозумів!!!
В фізиці s, s1, s2, s3, s4, s5, s6 хоч і одне фізичне явище, але це зовсім різні змінні!!! Тому групувати їх ні в якому разі не можна вони в одній процедурі майже ніколи не пересікаються за виключенням того що в їх можуть бути тільки однакові цифрові значення.
Наприклад s = 30 метрів s1 = 30 метрів
Но!!!!
s - це переміщення автомобіля, а
s1 - це переміщення людини.
s шукається за допомогою змінних t*v, а
s1 за допомогою змінних t1*v1
Тому я в процедурі для переміщення s не можу використати змінні t1 та v3 і так далі.
t, t1, t2.... це змінні для розв'язування задач по діям.
В першій дії визначаємо перший час t для першого тіла
В другій дії визначаємо другий час для другого тіла
....... і ак далі.
Але іще раз підкреслюю це за умови якщо я вас правильно зрозумів.
PS: хоча я можливо таки і не зрозумів правильно значення ось цього рядка коду
if WayValues * ComboboxIndexes <> [] and SpeedValues * ComboboxIndexes <> [] then //* - перетин множин
От халепа!!!!! І це мені не підійшло
ComboboxIndexes: set of integer;
Видало помилку
Набори можуть мати не більше 256 елементів
а в мене їх 378
"ми зрозуміли, що настав час рефакторити код, коли отримали повідомлення компілятора "більше 256 вкладених if не підтримується".
"ми зрозуміли, що настав час рефакторити код, коли отримали повідомлення компілятора "більше 256 вкладених if не підтримується".
Напевно що if тут не причому, я переніс
var ComboboxIndexes: set of integer;
в локальну процедуру Time в який 7 чи 8 вкладених if результат той самий видало ту ж помилку.
Я думаю що це ItemIndex перевищує 256 значень. А от їх в мене поки що 378, але буде іще більше.
Тут потрібно set якось замінити щоб визначало множину більшу ніж 255 різних значень.