201

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

topprogrammer написав:

http://docwiki.embarcadero.com/CodeExam … t_(Delphi)

program ideone;
uses SysUtils;
begin
  writeln(FormatFloat('0.####################', 0.002*0.002*0.002));
end.

https://ideone.com/SqYt0h

Дякую величезне пане topprogrammer!!!
Код працює  *YAHOO* . Правда він з гарного

Variables[49,0] :=  IntPower(Variables[41,0],3) ;
   RichEdit1.Lines.Add (Format('%.25gм * %.25gм * %.25gм = %.25gм³.',
                       [Variables[41,0], Variables[41,0], Variables[41,0], Variables[49,0]]));

став негарний,  *SCRATCH*

Variables[49,0] :=  IntPower(Variables[41,0],3) ;
   RichEdit1.Lines.Add (FormatFloat('0.########################', Variables[41,0])+'м * '+
                       FormatFloat('0.########################', Variables[41,0])+'м * '+
                       FormatFloat('0.########################', Variables[41,0])+'м = '+
                       FormatFloat('0.########################', Variables[49,0])+'м³');

але грець з ним. Дітям треба бачити цифри, а який там код вони й знати не будуть.

202

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Ховайте негарні константи в const:

const FloatFmt:String = '0.########################'
...
FormatFloat(FloatFmt, Variables[41,0])+'м * '+

чи негарний код у функції:

function VarToString(var_type, var_index:integer):String;
begin
  VarToString:= FormatFloat('0.########################', Variables[41,0]);
end;
...
RichEdit1.Lines.Add (VarToString(41,0)+'м * ' + VarToString(41,0)+'м * ' + VarToString(41,0) + 'м = ' + VarToString(49,0) +'м³');
Подякували: ProgramBandera1

203

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

koala написав:

Ховайте негарні константи в const:

const FloatFmt:String = '0.########################'
...
FormatFloat(FloatFmt, Variables[41,0])+'м * '+

чи негарний код у функції:

function VarToString(var_type, var_index:integer):String;
begin
  VarToString:= FormatFloat('0.########################', Variables[41,0]);
end;
...
RichEdit1.Lines.Add (VarToString(41,0)+'м * ' + VarToString(41,0)+'м * ' + VarToString(41,0) + 'м = ' + VarToString(49,0) +'м³');

Величезне дякую пане koala!!! Але нічого що в ось цьому рядку змінна Variables[41,0]

VarToString:= FormatFloat('0.########################', Variables[41,0]);

а вона там може бути люба з 398-ми масиву

Variables: array [1..57, 0..6] of extended;

204

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Упс. Звісно

function VarToString(var_type, var_index:integer):String;
begin
  VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);
end;
Подякували: ProgramBandera1

205

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Як варіант можна свою функцію написати:

const 
    FloatFmt:String = '0.##########'; //трохи зменшив к-ть цифр після коми(в попередньому варіанті не виводило 8.7)
    FloatNum:String = '%.25g'; //тут символи замість яких буде виводитись число


function BN(format: string; const a: array of extended): string;
var i, j: integer;
 s: string;
 x: extended;
begin
   s:=format;
   for i := Low(a) to High(a) do
   begin
     j := Pos(FloatNum, s);  
     Delete(s, j, Length(FloatNum));
     x := a[i];
     Insert(FormatFloat(FloatFmt, x), s, j);
   end;
   
   BN:=s;
end;

З функцією можна записати так:

Variables[49,0] :=  IntPower(Variables[41,0],3) ;
   RichEdit1.Lines.Add (BN('%.25gм * %.25gм * %.25gм = %.25gм³.',
                       [Variables[41,0], Variables[41,0], Variables[41,0], Variables[49,0]]));
Подякували: ProgramBandera1

206

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera
ZReal - не є стандартним типом, значить точно треба щось в uses дописувати.

Я так розумію що в функції (Format ('%g за кількість знаків після коми відповідає ось цей запис (Format ('%.25g, то чому ж вона не виводить 25 знаків після крапки?

Вона більше 18-ти не вміє. Вам точно треба 25?

Подякували: ProgramBandera1

207

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Який же красивий вивід в поле редагування в мене помалу виходить. І формули нехай малюнками, але виводить ті що треба і числа виводяться  коректно, без усіляких 8E-006. Як буду закінчувати програму обов'язково впишу код який при старті програми буде виводити відеоролик з подякою пану koala, пану topprogrammer, та пану Torbins. Якщо ви не проти панове. Без вашої допомоги мені було б дуже складно. І ще раз дякую!!!

208

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Torbins написав:

ProgramBandera
ZReal - не є стандартним типом, значить точно треба щось в uses дописувати.

Я так розумію що в функції (Format ('%g за кількість знаків після коми відповідає ось цей запис (Format ('%.25g, то чому ж вона не виводить 25 знаків після крапки?

Вона більше 18-ти не вміє. Вам точно треба 25?

*PARDON* Мені було б і 56 добре коли дійду до процедур з Планківськими величинами.

209

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

koala написав:

Упс. Звісно

function VarToString(var_type, var_index:integer):String;
begin
  VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);
end;

Ще одне питання, а цю функцію змінити не можна щоб вона і до коми писала 25 знаків а не, наприклад, 2,2E19.?

210

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

program ideone;
uses SysUtils;

const 
    FloatFmt10:String = '0.##########';
    FloatFmt25:String = '0.#########################';
    FloatNum:String = '%.25g'; //тут символи замість яких буде виводитись число


function BN(format: string; const a: array of extended): string;
var i, j: integer;
 s: string;
 x: extended;
begin
   s:=format;
   for i := Low(a) to High(a) do
   begin
     j := Pos(FloatNum, s);  
     Delete(s, j, Length(FloatNum));
     x := a[i];
     if x>1e6 then
       Insert(FloatToStrF(x, ffFixed, 50, 0), s, j)
     else
       if x<1e-10 then
         Insert(FormatFloat(FloatFmt25, x), s, j)
       else
         Insert(FormatFloat(FloatFmt10, x), s, j)
   end;
   
   BN:=s;
end;


var e:extended;
begin
  writeln(BN('%.25g', 123456.789123456789e19));
  writeln(BN('%.25g', 8.789123456789e-8));
  writeln(BN('%.25g', 8.789123456789));
  writeln(BN('%.25g', 8.789123456789e-19));
end.
Подякували: ProgramBandera1

211

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Я правильно зрозумів що ця функція і перед комою збільшить число і після коми також?

212 Востаннє редагувалося topprogrammer (10.09.2019 20:00:48)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ProgramBandera написав:

Я правильно зрозумів що ця функція і перед комою збільшить число і після коми також?

Так. Тільки пограйтеся ще з діапазоном(рядок if x<1e-10 then ), тому що деякі значення можуть відображатись не правильно(специфіка зберігання дробових чисел). Якщо напряму використати

writeln(FormatFloat(FloatFmt25, 8.789123456789));

то програма виведе значення 8.78912345678899999991
саме тому я обмежив к-ть знаків після коми, для чисел x>=1e-10 до 10, однак я не тестував програму на наближених до 1e-10 чисел.

Подякували: ProgramBandera1

213

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Пане koala якщо ваша ласка допоможіть вашу функцію

Function VarToString(var_type, var_index:integer):String;
 begin
  VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);
 end;

зробити так щоб вона працювала як функція пана topprogrammer.

function BN(format: string; const a: array of extended): string;
var i, j: integer;
 s: string;
 x: extended;
begin
   s:=format;
   for i := Low(a) to High(a) do
   begin
     j := Pos(FloatNum, s);
     Delete(s, j, Length(FloatNum));
     x := a[i];
     if x>1e6 then
       Insert(FloatToStrF(x, ffFixed, 50, 0), s, j)
     else
       if x<1e-10 then
         Insert(FormatFloat(FloatFmt25, x), s, j)
       else
         Insert(FormatFloat(FloatFmt10, x), s, j)
   end;

   BN:=s;
end;

Бо в принципі я знаю що робить функція пана topprogrammer, але я не знаю навіть приблизно як потім нею записати ось такий рядок коду

RichEdit1.Lines.Add (VarToString(13,0)+'кг / ' + VarToString(49,0)+'м³ = ' + VarToString(14,0) + 'кг/м³');

214

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

1. FloatNum:String = '%.25g'; - тут краще використати символи, які не будуть зустрічатись в самому тексті(%.25g я використав тільки тому, що в попередній версії програми у Вас викликалась ф-ція Format з таким параметром).
Для зручності я використаю '***'
2. Викликаєте її аналогічно тому, як Ви до цього користувались ф-цією Format.

Не забуваємо змінити FloatNum:String = '***';
Наприклад:

RichEdit1.Lines.Add (BN('*** кг / *** м³ = *** кг/м³',[ Variables[13,0], Variables[49,0], Variables[14,0] ]);

При цьому замість перших *** буде підставлено конвертоване в рядок значення Variables[13,0], замість наступних *** Variables[49,0] і т.д.

Подякували: ProgramBandera1

215

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

так буде виглядати модифікована ф-ція Пана koala:

Function VarToString(var_type, var_index:integer):String;
var x: extended;
 begin
  x := Variables[var_type,var_index];
  ///VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);

     if x>1e6 then
       VarToString:=FloatToStrF(x, ffFixed, 50, 0);
     else
       if x<1e-10 then
         VarToString:=FormatFloat('0.########################', x)
       else
         VarToString:=FormatFloat('0.##########', x)
 end;
Подякували: ProgramBandera1

216

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

topprogrammer написав:

так буде виглядати модифікована ф-ція Пана koala:

Function VarToString(var_type, var_index:integer):String;
var x: extended;
 begin
  x := Variables[var_type,var_index];
  ///VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);

     if x>1e6 then
       VarToString:=FloatToStrF(x, ffFixed, 50, 0);
     else
       if x<1e-10 then
         VarToString:=FormatFloat('0.########################', x)
       else
         VarToString:=FormatFloat('0.##########', x)
 end;

Але вивід в мене записується так само

RichEdit1.Lines.Add ( VarToString('*** кг / *** м³ = *** кг/м³',[ Variables[13,0], Variables[49,0], Variables[14,0] ]);

Просто BN замінюю на  VarToString

217

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

ні у випадку з VarToString треба записувати

RichEdit1.Lines.Add (VarToString(13,0)+'кг / ' + VarToString(49,0)+'м³ = ' + VarToString(14,0) + 'кг/м³');

Подякували: ProgramBandera1

218 Востаннє редагувалося ProgramBandera (10.09.2019 21:35:36)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

topprogrammer написав:

ні у випадку з VarToString треба записувати

RichEdit1.Lines.Add (VarToString(13,0)+'кг / ' + VarToString(49,0)+'м³ = ' + VarToString(14,0) + 'кг/м³');

Так уже перевірив, все супер працює *YAHOO* Дякую!
Константи я взагалі прибираю

const
    FloatFmt10:String = '0.##########';
    FloatFmt25:String = '0.#########################';
    FloatNum:String = '***'; //тут символи замість яких буде виводитись число

вони вже не потрібні.
далі я прибираю ось цей рядок

       else
         VarToString:=FormatFloat('0.##########', x)

він мені теж не потрібен.
І за вивід знаків перед комою відповідає ось цей рядок

if x>1e6 then
       VarToString:=FloatToStrF(x, ffFixed, 50, 0)

тобто їх може бути 50 перед комою?

А ні ось цей лишається для виводу мікро

       else
         VarToString:=FormatFloat('0.##########', x)

219

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

topprogrammer написав:
ProgramBandera написав:

Я правильно зрозумів що ця функція і перед комою збільшить число і після коми також?

Так.

Добрий вечір пане topprogrammer протестував я вашу функцію. Майже все добре, після коми виводить 25 знаків тут все чудово як і має бути, не виводить до коми після 10в 18 вибиває 2,2Е18.

function VarToString(format: string; const a: array of extended): string;
var i, j: integer;
 s: string;
 x: extended;
begin
   s:=format;
   for i := Low(a) to High(a) do
   begin
     j := Pos(FloatNum, s);
     Delete(s, j, Length(FloatNum));
     x := a[i];
     if x>1e18 then
       Insert(FloatToStrF(x, ffFixed, 50, 0), s, j)
     else
       if x<1e-10 then
         Insert(FormatFloat(FloatFmt25, x), s, j)
       else
         Insert(FormatFloat(FloatFmt10, x), s, j)
   end;

   VarToString:=s;
end;

Але це вже набагато краще як було дякую!!! *YES*

220 Востаннє редагувалося topprogrammer (11.09.2019 20:16:41)

Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.

Кількість знаків, скоріш за все, від компілятора залежить, на ideone і 22 знаки до коми виводить(https://ideone.com/gfE4kp).
Однак на Вашому місці я б зменшив к-ть знаків принаймні в остаточній відповіді, щоб користувачу не доводилося рахувати цифри. Тут я бачу 2 варіанти: формат 2.2*10³ м, або 2.2 км.

Подякували: ReAl1