Re: Програма розв'язування задач з фізики! Для учнів 7-го класу.
Змінна st1 контролюється оператором for, її не можна змінювати всередині циклу.
Добрий день пане koala.
А не підскажете як це можна виправити?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Програма розв'язування задач з фізики! Для учнів 7-го класу.
Сторінки Попередня 1 2 3 4 … 26 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
Змінна st1 контролюється оператором for, її не можна змінювати всередині циклу.
Добрий день пане koala.
А не підскажете як це можна виправити?
Відповідь на ваше питання: ніяк, це особливість мови Pascal.
Відповідь на питання, яке ви хотіли поставити: залежить від того, чого ви хочете досягти. Наприклад, переробіть цикл на while. Або додайте ще одну змінну і змінюйте її.
можна так записати
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;)
Класна функція!!! В 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 теж той самий результат.
А нащо вам узагалі x тут?
Таки треба якось складати свій цикл, тому що варіанти
1E15
...
.....
1E25
....
.....
1E-20
НЕ ПІДХОДЯТЬ!
Але як не придумую, в мене як не проблема несумістності типів з полем Edit8 і не запускає програму, то проблема з плаваючою крапкою після запуску програми вибиває помилку. Як же це вирішити.
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.
До речі для вводу чисел ви можете використати формат 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.
14 виводить 100000000000000
А от після 15
15 виводить 1E15 А це вже не дуже добре. (
Це звичайний експоненціальний запис. Чим він вам не подобається?
І ми знову приходимо до ідеї, що перед програмуванням треба скласти завдання.
ProgramBandera написав:14 виводить 100000000000000
А от після 15
15 виводить 1E15 А це вже не дуже добре. (Це звичайний експоненціальний запис. Чим він вам не подобається?
Тут навіть питання UX і сприйняття інформації, не просто так в математиці використовують експоненціальну форму. Рахувати нулі не дуже приємне заняття.
Привіт усім!
Я розумію що є експоненціальний запис, і він кращий для сприйняття.
Тоді підкажіть як мені в поле RichEdit1 вивести текст ось так
щоб порядок прописувався вище основи показникової функції.
Але всерівно, мені в деяких моментах програми прийдеться, виводити всі нулі.
{\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
І ми знову приходимо до ідеї, що перед програмуванням треба скласти завдання.
Пане koala в мене завдання приходять під час написання програми.
Я шукаю найрізноманітніші задачі з фізики, вводжу потрібні формули в процедури і тестую.
Наразі підійшло завдання піднесення в ступінь.
Експоненціальний запис в мене є на формі форма з вимкненим CheckBox1
а ось форма з увімкненим CheckBox1 де вже графічно є експоненціальний запис.
На разі мені потрібно, якось через, цикл вивести в поле 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;
Привіт панове програмісти! В інтернеті знайшов код який виводить надрядковий текст в поле RichEdit1.
Створив для випробування новий проект.
Запрограмував кнопку
procedure TForm1.Button1Click(Sender: TObject);
begin
RichEdit1.SetTextBuf(PChar(Format('{\rtf %s\super %s}', [Label1.Caption , Edit1.Text])));
end;
І в мене все чудово спрацювало при випробуванні
Але підставити в свій код я чомусь не можу
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]) + ' ' + 'Секунд'
Пепевіряйте дужки, відкриті і закриті
Пепевіряйте дужки, відкриті і закриті
Здається все добре, шість відкритих і шість закритих.
Помилка через те, що Ви конкатенуєте рядки з процедурою.
Процедура 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));
Помилка через те, що Ви конкатенуєте рядки з процедурою.
Процедура 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 Секунд
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;