Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.
http://docwiki.embarcadero.com/CodeExam … t_(Delphi)
program ideone;
uses SysUtils;
begin
writeln(FormatFloat('0.####################', 0.002*0.002*0.002));
end.
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Програма розв'язування задач з фізики! Для учнів 7-го класу.
Сторінки Попередня 1 … 9 10 11 12 13 … 20 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
http://docwiki.embarcadero.com/CodeExam … t_(Delphi)
program ideone;
uses SysUtils;
begin
writeln(FormatFloat('0.####################', 0.002*0.002*0.002));
end.
http://docwiki.embarcadero.com/CodeExam … t_(Delphi)
program ideone; uses SysUtils; begin writeln(FormatFloat('0.####################', 0.002*0.002*0.002)); end.
Дякую величезне пане topprogrammer!!!
Код працює . Правда він з гарного
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]]));
став негарний,
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])+'м³');
але грець з ним. Дітям треба бачити цифри, а який там код вони й знати не будуть.
Ховайте негарні константи в 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) +'м³');
Ховайте негарні константи в 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;
Упс. Звісно
function VarToString(var_type, var_index:integer):String;
begin
VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]);
end;
Як варіант можна свою функцію написати:
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]]));
ProgramBandera
ZReal - не є стандартним типом, значить точно треба щось в uses дописувати.
Я так розумію що в функції (Format ('%g за кількість знаків після коми відповідає ось цей запис (Format ('%.25g, то чому ж вона не виводить 25 знаків після крапки?
Вона більше 18-ти не вміє. Вам точно треба 25?
Який же красивий вивід в поле редагування в мене помалу виходить. І формули нехай малюнками, але виводить ті що треба і числа виводяться коректно, без усіляких 8E-006. Як буду закінчувати програму обов'язково впишу код який при старті програми буде виводити відеоролик з подякою пану koala, пану topprogrammer, та пану Torbins. Якщо ви не проти панове. Без вашої допомоги мені було б дуже складно. І ще раз дякую!!!
ProgramBandera
ZReal - не є стандартним типом, значить точно треба щось в uses дописувати.Я так розумію що в функції (Format ('%g за кількість знаків після коми відповідає ось цей запис (Format ('%.25g, то чому ж вона не виводить 25 знаків після крапки?
Вона більше 18-ти не вміє. Вам точно треба 25?
Мені було б і 56 добре коли дійду до процедур з Планківськими величинами.
Упс. Звісно
function VarToString(var_type, var_index:integer):String; begin VarToString:= FormatFloat('0.########################', Variables[var_type,var_index]); end;
Ще одне питання, а цю функцію змінити не можна щоб вона і до коми писала 25 знаків а не, наприклад, 2,2E19.?
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.
Я правильно зрозумів що ця функція і перед комою збільшить число і після коми також?
Я правильно зрозумів що ця функція і перед комою збільшить число і після коми також?
Так. Тільки пограйтеся ще з діапазоном(рядок if x<1e-10 then ), тому що деякі значення можуть відображатись не правильно(специфіка зберігання дробових чисел). Якщо напряму використати
writeln(FormatFloat(FloatFmt25, 8.789123456789));
то програма виведе значення 8.78912345678899999991
саме тому я обмежив к-ть знаків після коми, для чисел x>=1e-10 до 10, однак я не тестував програму на наближених до 1e-10 чисел.
Пане 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) + 'кг/м³');
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] і т.д.
так буде виглядати модифікована ф-ція Пана 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;
так буде виглядати модифікована ф-ція Пана 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
ні у випадку з VarToString треба записувати
RichEdit1.Lines.Add (VarToString(13,0)+'кг / ' + VarToString(49,0)+'м³ = ' + VarToString(14,0) + 'кг/м³');
ні у випадку з VarToString треба записувати
RichEdit1.Lines.Add (VarToString(13,0)+'кг / ' + VarToString(49,0)+'м³ = ' + VarToString(14,0) + 'кг/м³');
Так уже перевірив, все супер працює Дякую!
Константи я взагалі прибираю
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)
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;
Але це вже набагато краще як було дякую!!!