21

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

koala написав:

Змінна st1 контролюється оператором for, її не можна змінювати всередині циклу.

Добрий день пане koala.
А не підскажете як це можна виправити?

22

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

Відповідь на ваше питання: ніяк, це особливість мови Pascal.
Відповідь на питання, яке ви хотіли поставити: залежить від того, чого ви хочете досягти. Наприклад, переробіть цикл на while. Або додайте ще одну змінну і змінюйте її.

Подякували: ProgramBandera, root2

23 Востаннє редагувалося topprogrammer (15.04.2019 10:42:03)

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

можна так записати

  for st1 := 1 to 10 do
  begin
   RichEdit1.Lines.Add(FloatToStr (Power(10, st1)));
  end;

А так підносити

   st := 3;
   x := 4;
   x := x * Power(10, st);

Функція Power міститься в модулі Math(Uses Math;)

Подякували: Torbins, ProgramBandera2

24 Востаннє редагувалося ProgramBandera (15.04.2019 18:17:15)

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

Класна функція!!! В Uses додав (System.Math;) Прописав процедуру

procedure TForm1.Bring_to_Power;
var
x: variant;
st: extended;
begin
   st := StrToFloat(Edit8.Text);
   x := 4;
   x := x * Power(10, st);
   RichEdit1.Lines.Add(FloatToStr (Power(10, st)));
end;

і все працює, але не зовсім чудово.
В поле Edit8 вводжу
1 виводить 10
2 виводить 100
3 виводить 1000
.....
14 виводить 100000000000000
А от після  15
15 виводить 1E15 А це вже не дуже добре. :((
Правда не зрозуміло чуму х := 4. Я спробував підставити 3 працює так само, підставляю 6 теж той самий результат.

25

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

А нащо вам узагалі x тут?

Подякували: root, ProgramBandera2

26 Востаннє редагувалося ProgramBandera (15.04.2019 18:33:24)

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

Таки треба якось складати свій цикл, тому що варіанти
1E15
...
.....
1E25
....
.....
1E-20

НЕ ПІДХОДЯТЬ!

Але як не придумую, в мене як не проблема несумістності типів з полем Edit8 і не запускає програму, то проблема з плаваючою крапкою після запуску програми вибиває помилку. Як же це вирішити.

27 Востаннє редагувалося topprogrammer (15.04.2019 19:08:50)

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

x я привів в якості прикладу, тому його не потрібно використовувати

procedure TForm1.Bring_to_Power;
var
st: extended;
begin
   st := StrToFloat(Edit8.Text);
   RichEdit1.Lines.Add(FloatToStr (Power(10, st)));
end;

Вам краще використовувати представлення чисел в формі *10^x, так легше їх сприймати, ніж рахувати кількість нулів.

По помилці з плаваючою крапкою, можна так конвертувати числа(код на Lazarus, можливо в Dephi підключають інший модуль):

program Project1;
uses sysutils;
function ComToDotStrToFloat(s: String): Real;
begin
    s := StringReplace(s, ',', DecimalSeparator, [rfReplaceAll]);
    s := StringReplace(s, '.', DecimalSeparator, [rfReplaceAll]);
    Result := StrToFloat(s);
end;
begin
  Writeln(ComToDotStrToFloat('3,14'));
  Writeln(ComToDotStrToFloat('3.14'));
  Readln();
end.
Подякували: ProgramBandera1

28 Востаннє редагувалося topprogrammer (15.04.2019 19:58:22)

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

До речі для вводу чисел ви можете використати формат x*10^y , а потім конвертувати рядок в числовий тип даних.

program Project1;
uses Classes, SysUtils, math;
var x1, x2:real;

function ComToDotStrToFloat(s: String): Real;
begin
    s := StringReplace(s, ',', DecimalSeparator, [rfReplaceAll]);
    s := StringReplace(s, '.', DecimalSeparator, [rfReplaceAll]);
    Result := StrToFloat(s);
end;

function StringToReal(s: string): real;
var list: TStringList;
    x, y: real;
begin
  //x*10^y
  s := StringReplace(s, '*', '|', [rfReplaceAll]);
  s := StringReplace(s, '^', '|', [rfReplaceAll]);
  //x|10|y
  list := TStringList.Create;
  list.Delimiter := '|';
  list.DelimitedText := s;

  x := ComToDotStrToFloat(list[0]);
  if list.Count = 3 then
  begin
     y := StrToInt(list[2]);
     StringToReal := x*Power(10,y);
  end
  else
     StringToReal := x;
end;

function RealToString(x: real): string;
begin
  RealToString := FloatToStr(x);
  RealToString := StringReplace(RealToString, 'E', '*10^', [rfReplaceAll]);
end;

begin
  x1 := StringToReal('3,114*10^15');
  x2 := StringToReal('2,114*10^15');
  Writeln(RealToString(x1+x2));
  Writeln(RealToString(StringToReal('123.1')));
  Readln;
end. 
Подякували: ProgramBandera1

29

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

ProgramBandera написав:

14 виводить 100000000000000
А от після  15
15 виводить 1E15 А це вже не дуже добре. :((

Це звичайний експоненціальний запис. Чим він вам не подобається?

Подякували: Не Зелений, ProgramBandera2

30

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

І ми знову приходимо до ідеї, що перед програмуванням треба скласти завдання.

Подякували: root, ProgramBandera2

31

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

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

14 виводить 100000000000000
А от після  15
15 виводить 1E15 А це вже не дуже добре. :((

Це звичайний експоненціальний запис. Чим він вам не подобається?

Тут навіть питання UX і сприйняття інформації, не просто так в математиці використовують експоненціальну форму. Рахувати нулі не дуже приємне заняття.

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

32 Востаннє редагувалося ProgramBandera (16.04.2019 18:55:59)

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

Привіт усім!
Я розумію що є експоненціальний запис, і він кращий для сприйняття.

Тоді підкажіть як мені в поле RichEdit1 вивести текст ось так
https://replace.org.ua/uploads/images/6671/c0be1298ec85992d1fa0714e6ff2e578.png
щоб порядок прописувався вище основи показникової функції.

Але всерівно, мені в деяких моментах програми прийдеться, виводити всі нулі.

33

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

{\rtf1\ansi\ansicpg1251\deff0\nouicompat\deflang1049{\fonttbl{\f0\fnil\fcharset0 Calibri;}}
{\*\generator Riched20 6.3.9600}\viewkind4\uc1 
\pard\sa200\sl276\slmult1\f0\fs22\lang9 10\super 15\nosupersub\par
}

Пишете текст в редакторі WordPad зберігаєте в *.rtf потім відкрийте в Notepad.
Як записати RTF текст в RichEdit описано тут https://stackoverflow.com/questions/407 … -trichedit

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

34 Востаннє редагувалося ProgramBandera (17.04.2019 23:46:28)

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

koala написав:

І ми знову приходимо до ідеї, що перед програмуванням треба скласти завдання.

Пане koala в мене завдання приходять під час написання програми.
Я шукаю найрізноманітніші задачі з фізики, вводжу потрібні формули в процедури і тестую.
Наразі підійшло завдання піднесення в ступінь.
Експоненціальний запис в мене є на формі форма з вимкненим CheckBox1

https://replace.org.ua/uploads/images/6671/fcb9556f55f7745c7fb96525db2a192f.png

а ось форма з увімкненим CheckBox1 де вже графічно є експоненціальний запис.

https://replace.org.ua/uploads/images/6671/7b11f2dc0f3a1fec01ef2a249e05e276.png

На разі мені потрібно, якось через, цикл вивести в поле RichEdit1 всі нулі.
От я поки і пробую написати цикл, потрохи виходить, сьогодні вже поєднав типи extended та integer через round. Лишилася проблема з плаваючою крапкою після запуску програми. Потрібно прописати якесь виключення на цю помилку.

Змінна st2 глобальна.

procedure TForm1.Bring_to_Power2;
var
st0: extended;
st1: integer;
begin
 st2 := 1;
 st0 := StrToFloat(Edit9.Text);
 for st1 := 1 to round (st0) do
  begin
   st2 := st2*10;
  end;
  RichEdit1.Lines.Add(FloatToStr (st2));
end;

35 Востаннє редагувалося ProgramBandera (23.04.2019 16:13:09)

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

Привіт панове програмісти! В інтернеті знайшов код який виводить надрядковий текст в поле RichEdit1.
Створив для випробування новий проект.
https://replace.org.ua/uploads/images/6671/48263e4372ab498695722659f910d52e.png
Запрограмував кнопку

procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.SetTextBuf(PChar(Format('{\rtf %s\super %s}', [Label1.Caption , Edit1.Text])));
end;

І в мене все чудово спрацювало при випробуванні
https://replace.org.ua/uploads/images/6671/e20d619e1bf51e5b1adb96609b5f94f8.png
Але підставити в свій код я чомусь не можу

RichEdit1.Lines.Add(ComboBox9.Text + '  ' + '=  ' + FloatToStr(Variables[1,0]) + '  ' + 'Секунд');

Вибиває помилку Несумісні типи: 'string' і 'procedure, нетипізований покажчик або нетипізований параметр

RichEdit1.Lines.Add(ComboBox9.Text + '  ' + Edit1.Text + (RichEdit1.SetTextBuf(PChar(Format('{\rtf %s\super %s}', [Label5.Caption , Edit8.Text])))) + '=  ' + FloatToStr(Variables[1,0]) + '  ' + 'Секунд');

Буду дуже вдячний за усунення помилки в коді.
Тобто мені після Edit1.Text потрібно вставити *10 і надрядковий Edit8.Text і далі щоб писало звичайним текстом  + '=  ' + FloatToStr(Variables[1,0]) + '  ' + 'Секунд'

36

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

Пепевіряйте дужки, відкриті і закриті

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

37

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

Chemist-i написав:

Пепевіряйте дужки, відкриті і закриті

Здається все добре, шість відкритих і шість закритих.

38

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

Помилка через те, що Ви конкатенуєте рядки з процедурою.
Процедура RichEdit1.SetTextBuf додає текст в RichEdit. Не можу сказати 100%, але скоріш за все, єдине вирішення Вашої проблеми полягає в формуванні рядка, а вже потім додавання його в RichEdit.
Наприклад, якщо у Вас є цикл де додаються рядки в RichEdit:

for i := 1 to 10 do
   RichEdit1.Lines.Add(IntToStr(i));

Його потрібно замінити на:

s := '';
for i := 1 to 10 do
   s := s + IntToStr(i) + '#13#10'; {формування всього тексту який повинен бути поміщений в RichEdit}
RichEdit1.SetTextBuf(PChar(s));
Подякували: koala, ProgramBandera2

39 Востаннє редагувалося ProgramBandera (23.04.2019 17:01:21)

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

topprogrammer написав:

Помилка через те, що Ви конкатенуєте рядки з процедурою.
Процедура RichEdit1.SetTextBuf додає текст в RichEdit. Не можу сказати 100%, але скоріш за все, єдине вирішення Вашої проблеми полягає в формуванні рядка, а вже потім додавання його в RichEdit.
Наприклад, якщо у Вас є цикл де додаються рядки в RichEdit:

for i := 1 to 10 do
   RichEdit1.Lines.Add(IntToStr(i));

Його потрібно замінити на:

s := '';
for i := 1 to 10 do
   s := s + IntToStr(i) + '#13#10'; {формування всього тексту який повинен бути поміщений в RichEdit}
RichEdit1.SetTextBuf(PChar(s));

От мій повний код

 case ComboBox9.ItemIndex of
 0   :  begin
         if Pos('=',Edit1.Text)<>0 then
         begin
          case ComboBox15.ItemIndex of
          4: RichEdit1.Lines.Add('t = t1');
          5: RichEdit1.Lines.Add('t = t2');
          6: RichEdit1.Lines.Add('t = t3');
          7: RichEdit1.Lines.Add('t = t4');
          8: RichEdit1.Lines.Add('t = t5');
          9: RichEdit1.Lines.Add('t = t6');
          end;
         end
         else
         begin
          Variables[1,0] := StrToFloat(Edit1.Text);
          if CheckBox1.Checked then
          begin
           Bring_to_Power1;
           Variables[1,0] := Variables[1,0]*st1;
          end;

          case ComboBox15.ItemIndex of
          1: begin
              RichEdit1.Lines.Add('t = t*60');
              Time_Minute(Variables[1,0]);
             end;

          2: begin
              RichEdit1.Lines.Add('t = t*3600');
              Time_Hour(Variables[1,0]);
             end;
          end;
         end;
         RichEdit1.Lines.Add(ComboBox9.Text + '  ' + '=  ' + FloatToStr(Variables[1,0]) + '  ' + 'Секунд');
        end;

це без вставляння +10 в степені
Пане topprogrammer мені якось в останній рядок RichEdit1.Lines.Add потрібно вставити Label5.Caption і надрядковий текст з поля Edit8.Text
Наразі в полі RichEdit1 мені виводиться текст t - Час  =  2000  Секунд, а потрібно t - Час 2*10^3  =  2000  Секунд

40 Востаннє редагувалося topprogrammer (23.04.2019 17:04:42)

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

 textBuffer : string; {змінна рівня форми}
 
 procedure AddTextLine(string text)
 begin
    textBuffer := textBuffer + text + '#13#10';
    {якщо текст дублюється, то в цей рядок додайте виклик очистки RichEdit1, скорше за все RichEdit1.Clear(), або RichEdit1.Lines.Clear()}
    RichEdit1.SetTextBuf('{\rtf ' + textBuffer + '}' );
 end;
 
 
 
 case ComboBox9.ItemIndex of
 0   :  begin
         if Pos('=',Edit1.Text)<>0 then
         begin
          case ComboBox15.ItemIndex of
          4: AddTextLine('t = t1');
          5: AddTextLine('t = t2');
          6: AddTextLine('t = t3');
          7: AddTextLine('t = t4');
          8: AddTextLine('t = t5');
          9: AddTextLine('t = t6');
          end;
         end
         else
         begin
          Variables[1,0] := StrToFloat(Edit1.Text);
          if CheckBox1.Checked then
          begin
           Bring_to_Power1;
           Variables[1,0] := Variables[1,0]*st1;
          end;

          case ComboBox15.ItemIndex of
          1: begin
              AddTextLine('t = t*60');
              Time_Minute(Variables[1,0]);
             end;

          2: begin
              AddTextLine('t = t*3600');
              Time_Hour(Variables[1,0]);
             end;
          end;
         end;
         {я додав 10^3 Ви можете змамінити на змінні}
         AddTextLine(ComboBox9.Text + '  ' + '=  ' +  '10'+'\super '+ '3' + '\nosupersub ' + '  ' + 'Секунд');
        end;
Подякували: ProgramBandera1