Урок Delphi 6

Выражения и операторы Delphi




Уроки Delphi
  1.  Первая программа
  2.  Использование компонентов
  3.  События Delphi
  4.  Типы данных Delphi
  5.  Создание своих типов данных
  6.  Выражения и операторы
  7.  Работа с файлами в Delphi
  8.  Дополнительные формы
  9.  Подпрограммы в Delphi
  10. Исключительные ситуации
  11. Взаимодействие приложения с пользователем
  12. Указатели в Delphi
  13. Обзор компонентов
  14. Работа со строками
  15. Создание интерфейса
  16. Графика в Delphi
  17. Многопоточность в Delphi
  18. Динамическое создание
        компонентов
Поиск по сайту




 Это важно:
   Метод Application.ProcessMessages;

 Это полезно:
   Параметр Sender в обработчиках событий;










Бояться не надо



Выражения Delphi

   В программах Delphi применяются
  • математические выражения
  • логические выражения
  • выражения со строками
ну и другие.

Математические выражения

   В математических выражениях используются операции присваивания :=, сложения +, вычитания -, умножения *, деления /, целочисленного деления div, остатка от деления mod. При использовании этих операций важен приоритет их выполнения, так как в программировании на языке Delphi, как и в обычной математике, выражения выполняются не в порядке следования, а с учётом приоритета. У операций умножения и деления более высокий приоритет, чем у операций сложения и вычитания.
   То есть, результат выражения

X:=1+2*3-4/5;

будет равен не 1, как в случае последовательного выполнения, а 6.2 .

   Если же мы хотим получить именно последовательное выполнение, то необходимо применять скобки (), обособляющие те операции, которые необходимо выполнить первыми. Скобки могут быть вложены друг в друга неограниченное число раз:

X:=((1+2)*3-4)/5;

Вот теперь X будет равен 1.

   Помимо четырёх математических действий в Delphi доступно множество математических функций, таких, например, как тигонометрические, логарифмические, и т.д. Они становятся доступны в программе после добавления в секцию Interface uses модуля Math. Их описание также можно найти в модуле Math.pas (можно найти воспользовавшись поиском Windows). Многие из них можно реализовать и самому, но встроенные функции наверняка будут работать быстрее и лучше, т.к. написаны на языке ассемблера.

Логические выражения

   Логические выражения выполняются над операндами логического типа, то есть имеющими тип Boolean Delphi. Они применяются в основном в условных операторах.

Операторы Delphi

   Для создания приложений, реализующих сложную алгоритмическую логику, нужны средства управления ходом работы программы: изменения порядка выполнения операторов в зависимости от различных условий, и эффективной организации работы часто повторяющихся фрагментов. Математически доказано, что любой алгоритм можно закодировать с помощью
  • оператора присваивания
  • условного оператора
  • оператора цикла
   С оператором присваивания ":=" мы уже знакомились в уроке Delphi 2. Он работает следующим образом. Переменная, стоящая в левой части оператора, становится равной той величине, которая находится справа. Типы этих величин должны совпадать. В выражении, стоящем справа, также может использоваться переменная, стоящая слева. С математической точки зрения это неправильно, но в программировании это означает, что из ячейки памяти берётся исходное значение, производятся вычисления, и результат записывается в эту же ячейку памяти, затирая прежнее значение. Пример:

   var A, B : Integer;
   begin
     A:=3;
     B:=4;
     A:=A*A+B*B;
   end;


В начале фрагмента переменная A равна 3, а в конце -25.

   Условный оператор позволяет изменить порядок выполнения операторов в зависимости от выполнения некоторого условия. Вот как он записывается:

   if условие then действие else альтернатива ;

Слова if (если), then (тогда), else (иначе) - зарезервированные. Действие и else альтернатива - это любые операторы Delphi, или несколько операторов, заключённых в логические скобки begin/end, или вызов подпрограммы. Если условие истинно, то выполняется действие, если ложно, то выполняется альтернатива.
   Условие представляет собой логическое выражение. В нём сравниваются значения выражений (в том числе также и логических), вызов функций, возвращающих значения типа Boolean, и комбинирование этих значений с помощью логических операций:

Знак
операции
Название операции    Логические операции могут комбинироваться с помощью связок:
   and (логическое И)
   or (логическое ИЛИ)
   xor (исключающее ИЛИ)
Для некоторых типов данных есть дополнительные операции. Например, для множеств - оператор in, которая проверяет, входит ли некоторое значение в множество. Например:
      X := [2, 4, 5, 7, 8, 10] ;
Выражение 2 in X истинно (имеет значение true);
Выражение 6 in X ложно (имеет значение false);
   =       Равно   
   <>       Не равно   
   >       Больше   
   <       Меньше   
   >=       Больше или равно   
   <=       Меньше или равно   
   not    Логическое Не - отрицание

   Результат выполнения операции логического И равен true, если оба операнда равны true.
   Результат выполнения операции логического ИЛИ равен true, если хотя бы один из операндов равен true.
   Результат выполнения операции исключающего ИЛИ равен true, если операнды не равны друг другу.


   Операторы цикла позволяют организовать многократное повторение одной и той же последовательности действий. В Delphi имеются три оператора, позволяющих это сделать:
  • "простой" оператор цикла
  • условный оператор цикла
  • условный оператор повторения

Простой оператор цикла применяется, когда известно количество повторений цикла. Он записывается так:
   for счётчик := выражение-1 to выражение-2
   do действие ;
Счётчик - это переменная, которая должна быть объявлена перед логическим блоком, в котором оператор цикла расположен, и её тип должен относиться к одному из перечислимых типов, обычно Integer.
Выражение-1 и выражение-2 могут быть как константой или идентификатором, так и вызовом функции.
Действие - один или несколько операторов Delphi. Если это группа операторов, то они должны быть заключены в логические скобки begin/end.
   В начале работы оператора переменная-счётчик получает значение выражения-1. Если при этом значение счётчика окажется меньше или равно значению выражения-2, то выполняются операторы, входящие в действие. Это и есть один цикл. Затем переменная-счётчик принимает значение, следующее за текущим, и начинается новый цикл, то есть сравнение счётчика и выражения-2, выполнение действия, и так далее, до тех пор, пока значение переменной-счётчика не превысит значение выражения-2.
   Возможна работа оператора цикла, при котором переменная-счётчик будет не увеличиваться, а уменьшаться. В этом случае ключевое слово to заменяется на downto:
   for счётчик := выражение-1 downto выражение-2 do действие ;
Соответственно, выражение-1 должно быть больше или равно выражению-2.

Условный оператор цикла удобно использовать в том случае, когда количество повторений заранее не известно:
   while условие do
   тело цикла ;
Этот цикл будет выполняться до тех пор, пока истинно условие (логическое выражение, возвращающее значение типа Boolean). При этом если это выражение сразу равно false, тело цикла не будет выполнено ни разу.
   Нужно очень внимательно следить за написанием условия и контролем завершения цикла, так как в результате ошибки цикл while будет повторяться бесконечное количество раз, что приведёт к "зацикливанию" и "зависанию" программы.

Условный оператор повторения сначала выполняет тело цикла, а затем уже проверяет выполнение условия:
   repeat
   тело цикла
   until условие ;
Таким образом, этот вариант цикла гарантирует, что тело цикла будет выполнен по крайней мере один раз. И будет выполняться до тех пор, пока условие не станет истинным (т.е. true). Стоит отметить, что это единственный оператор Delphi, в котором тело цикла не требуется заключать в логические скобки begin/end. Начало и конец тела цикла определяются по ключевым словам repeat и until.

   Вместе с операторами цикла используются специальные команды:
  • команда прерывания цикла
  • команда продолжения цикла
   Команда прерывания цикла применяется, если в процессе выполнения операторов тела цикла выясняется необходимость его завершения. Вот эта команда:
   Break ;
При её выполнении управление передаётся на первый оператор, следующий за оператором цикла.
   Команда продолжения цикла позволяет немедленно продолжить выполнение цикла, пропустив все оставшиеся операторы в теле цикла, то есть начать следующую итерацию. Вот эта команда:
   Continue ;

   Справедливости ради стоит рассказать об ещё одном операторе, позволяющем изменить последовательность выполнения программы. Это оператор перехода:
   goto метка ;
В качестве метки может использоваться любой допустимый идентификатор или число в диапазоне от 0 до 9999. Метку предварительно необходимо объявить в разделе описания переменных, но с помощью не ключевого слова var, а ключевого слова label:
   label меткa ;
или
   label список меток ;

Переходить можно как вниз, так и вверх по программе. Двоеточие отделяет метку от оператора, на который производится переход. Пример использования оператора перехода:

   var X, Y: Integer;
   label A, B;
   begin
    A: X:=5 ;
       . . .
    операторы программы
    goto B;
       . . .
    B: Y:=25;
    goto A;
   end;

Из этого примера видно, что оператор end ; завершающий программу, никогда не будет выполнен, то есть программа зациклится. Именно поэтому, вообще, использование оператора перехода является плохим стилем программирования, и без его использования вполне можно обойтись использованием условных операторов и операторов цикла. Единственный случай, когда использование оператора goto может быть оправдано - это выход из нескольких вложенных циклов, что иначе требует применения нескольких операторов Break.

Пример. Сортировка одномерного массива
Рассматриваются процедуры программы, приводятся подробные комментарии. Также можно скачать проект в виде архива. Цикл while и операторы goto использованы только для демонстрации работы с ними. Здесь - более правильный вариант с применением цикла repeat и оператора break.
   Параллельно замечу, что сортировка массива "методом пузырька" - неэффективный метод. Количество итераций (проходов цикла) растёт гораздо быстрее роста количества элементов, пропорционально n2. Сортировка 50 000 элементов выполняется на моём компьютере секунд за пять. Но сортировка 100 000 - не за 10 секунд, а около 35 секунд! Можете поэкспериментировать, для этого достаточно во 2 варианте установить в описании массива нужное количество элементов.


Структурные типы данных           В начало урока          Работа с файлами в Delphi  

Уроки Delphi начинающим



Вопросы и комментарии (66)      Решение задач в Delphi

/Шум, добавлено 12.09.09, 08:32:01 
так себе=)
ПАаа, добавлено 17.09.09, 10:43:37 
ГДЕ ПРИМЕРЫ? (((
Madina, добавлено 28.11.09, 18:28:27 
Sposibo bol\'shoy vi mne ochen\' pomogli
online, добавлено 31.12.09, 07:59:16 
желаю все щастя в новом году

Ольга, добавлено 30.01.10, 17:39:10 
Андрей! Спасибо!
А можно вместо типов записи и одномерного массива использовать двумерный массив и сортировать только 2-ой столбец со значениями?
Андрей, добавлено 30.01.10, 19:21:13 
Почему же нет. Первый содержит номера и не меняется? А второй сортируем.
Ольга, добавлено 1.02.10, 13:22:24 
Андрей, скажите, а по аналогии с Pascal, существуют такие операторы, как:
1. abs(X) - вычисление модуля,
2. sqr(X) - возведение в квадрат,
3. pred(X) - целое значение, предшествующее Х,
4. succ(X) - целое значение, следующее за Х,
5. sin(X),
6. cos(X),
7. exp(X),
8. sqrt(X) - извлечение из корня,
9. atan(X) - arctg(X),
10. ln(X),
11. odd(X) - проверка четности/нечетности.
Каким образом осуществляется возведение в степень?
Существуют ли операторы lg(X) {десятичный логарифм} и tg(X)?
Андрей, прошу извинить меня за обилие вопросов. Надеюсь на понимание. С уважением, Ольга.
Ольга, добавлено 1.02.10, 13:28:59 
Извиняюсь, еще вспомниал, есть ли оператор варианта:
case K of
0: {оператор};
1: {оператор};
...
N: {оператор};
else {оператор};
Андрей, добавлено 1.02.10, 18:22:50 
Здравствуйте, Ольга!
Для использования этих функций (конечно они есть) нужно добавить в секцию uses (в са-а-амом верху) модуль Math. В нём куча функций. Берём и ищем поиском файл Math.pas. И открываем его в Delphi. Любуемся. Насчёт конкретных функций сам рыться не хочу. Если непонятно, что делает та или иная функция, ставим курсор на неё и жмём F1. Правда, по-английски!
Оператор выбора именно в такой форме существует. В вашем описании отсутствует заключительный end;
Скобки {} не нужны. Если операторов нескольно, они заключаются в
begin

end;
Ольга, добавлено 1.02.10, 18:44:48 
Андрей, Спасибо!
Под скобками {} я понимала, что выполняется какой-то оператор.
Саныч, добавлено 13.09.10, 12:29:40 
уважаемый автор, у вас есть такая возможность подробнее описать компонент RadioButton на мой почтовый ящик?
Автор, добавлено 13.09.10, 13:00:13 
Задавайте конкретные вопросы, что непонятно. Про RadioButton есть страничка, почитайте. Отдельно каждому писать статью, конечно, невозможно. Будут какие-то неясности, тогда отвечу.
Аноним, добавлено 4.10.10, 07:54:33 
как сложно...Блин мы че все косим под америку, че сами не можем что ли создать программу на русском языке?????
йцукен, добавлено 4.10.10, 11:54:47 
ты думаешь на русском было бы легче ? )))
Маша, добавлено 11.12.10, 15:10:28 
Подскажите пожалуйста, каким образом нужно написать цикл, в результате которого находилось бы максимальное или минимальное значение ячеек стринггрид? И можно ли как-то обойтись без цикла?
Автор, добавлено 11.12.10, 15:56:42 
Без циклов не обойтись. Два вложенных цикла - один по столбцам, другой но строкам проверяют всё ячейки таблицы. Вначале запоминаем значение первой же ячейки и как максимальное и как минимальное. Затем остальные ячейки сравниваем с этими переменными, и при необходимости даем им новые значения.

Маша, добавлено 11.12.10, 16:39:55 
Ну вот я все так и сделала, но когда запускаю и к примеру какое-то число в ячейке мне нужно заменить, получается, что минимальное и максимальное значение остается таким же. хотя новое число может быть и меньше (или больше). Что тогда делать?
Автор, добавлено 11.12.10, 19:48:17 
Непонятно, что вы имеете в виду. Но после каждого изменения таблицы пересчет нужно заново проводить. Или и после повторного пересчета ничего не меняется?
Маша, добавлено 11.12.10, 22:32:43 
У меня есть 12 ячеек. В них разные числа. После того, как все пересчитать получаются 2 числа минимальное и максимальное. Они находятся в определенных ячейках (например 4-ой и 8-ой). Допустим, мне нужно заменить во второй ячейке число, но оно меньше уже полученного минимального. И когда я снова все пересчитываю минимальное число получается все равно то же, что и было. Т.е. число минимальное только в одной ячейке может быть, а если оно в другой, то уже ничего не меняется. Так же и с максимальным.
Автор, добавлено 12.12.10, 07:24:51 
100% программа неправильно написана. Напрасно вы её не привели здесь. Сейчас попробую свой вариант написать.
Автор, добавлено 12.12.10, 08:49:45 
Что-то я увлёкся и написал цельное приложение по поиску min  и max чисел. Но процедура поиска вот:

//Сначала объявим глобальные переменные Min и Max
type Search = Record
     Value, ACol, ARow: Integer;
end;
var
  Min, Max: Search;

//Процедура поиска
procedure TForm1.Button1Click(Sender: TObject);
var i, j: Integer;
begin
  Min.Value:=StrToInt(StringGrid1.Cells[1, 1]);
  Min.ACol:=1;
  Min.ARow:=1;
  Max.Value:=StrToInt(StringGrid1.Cells[1, 1]);
  Max.ACol:=1;
  Max.ARow:=1;
with StringGrid1 do
  for i:=1 to RowCount-1 do
  for j:=1 to ColCount-1 do
    begin
      if StrToInt(Cells[j, i]) > Max.Value then
        begin
          Max.Value:=StrToInt(Cells[j, i]);
          Max.ARow:=i;
          Max.ACol:=j;
        end;
      if StrToInt(Cells[j, i]) < Min.Value then
        begin
          Min.Value:=StrToInt(Cells[j, i]);
          Min.ARow:=i;
          Min.ACol:=j;
        end;
    end;
end;

Можете всё же тиснуть ваш вариант, попробуем ошибку найти. А пока скачайте мой вариант процедуры поиска мин. и макс. значений в таблице.
Маша, добавлено 12.12.10, 18:30:14 
В моем варианте все попроще конечно, так как я практически нуль в программировании.
procedure TForm1.Button1Click(Sender: TObject);
var
  i,j, m, k, l: integer;
begin
  m := 0;
  j := 0;
  for i := 0 to StringGrid1.ColCount - 1 do
  begin
  try
  k := 0 + StrToInt(StringGrid1.Cells[0, 1]);
  l := 0 + StrToInt(StringGrid1.Cells[11, 1]);
  begin
  if m < k
  then m := StrToInt(StringGrid1.Cells[i, 1]);
  end;
  begin
  if j < l
  then j:= StrToInt(StringGrid1.Cells[i, 1]); end;
  except
  end;
  end;
  Edit2.Text:=('' +IntToStr(m));
  Edit3.Text:=('' +IntToStr(j));
end;

Я тут ну ооочень много переменных взяла, боялась запутаться. Меня даже удивляет тот факт, что то, что я тут накрутила еще хоть как-то работает.
Автор, добавлено 12.12.10, 18:52:07 
Я сейчас опять в отъезде. Утром вернусь, разберусь. Первый взгляд - ну очень накручено. Для поиска нужно всего 4 переменные: i, j, min, max.
Автор, добавлено 13.12.10, 10:26:26 
Начнём с того, что ваша программа вообще ничего не ищет. Как-то работает - означает, что она способна скомпилироваться? Я вставил в приложение ваш "алгоритм", и он всегда ищет 2 числа - в первой и во второй ячейках. Если первое число больше второго, то показываются оба, а если меньше - то два раза первое. Честно, анализировать это не хочется, никакого поиска здесь нет, исправлять нечего, нужно писать программу заново.
 Это элементарно. У вас одномерная таблица, фактически поиск в одномерном массиве. Нужен один цикл. Номера чисел вам не нужны, значит, определяем 3 переменные:
1. переменную цикла i;
2. переменную содержащую мин. число min;
3. переменную, содержащую макс. число max.

procedure TForm1.Button1Click(Sender: TObject);
var
  i, min, max: integer;

Далее, как я уже писал выше, поиск начинается с того, что min и max присваивается значение первой же ячейки:

begin
  min:=StrToInt(StringGrid1.Cells[0, 1]);
  max:=min;

Далее, запускаем цикл, в котором значение каждой ячейки сравниваем с этими переменными:

  for i:=0 to StringGrid1.ColCount-1 do
    begin

      if StrToInt(StringGrid1.Cells[i, 1]) > max
        then max:=StrToInt(StringGrid1.Cells[i, 1]);

      if StrToInt(StringGrid1.Cells[i, 1]) < min
        then min:=StrToInt(StringGrid1.Cells[i, 1]);

    end;

Если число больше максимального max, то присваиваем max новое значение. То же самое для min - если число меньше его, меняем min.

Показываем числа, в вашем случае выводим в эдиты. Могу добавить, что цикл можно задавать не от 0 а от 1.

end;


Очень надеюсь, что я всё понятно растолковал. Но скажите на милость, зачем вам понадобился try/except ...
Маша, добавлено 13.12.10, 14:40:50 
Спасибо большое, разобралась.
try/except мне посоветовали взять потому, что до этого я просто напросто считала сумму содержимого ячеек.
Нурлан, добавлено 21.12.10, 06:27:01 
Скажите, а как сделать так.
У меня на форме есть Edit, CheckBox.
Как при установке CheckBox сделать активным поле Edit для того чтобы ввести данные?

Автор, добавлено 21.12.10, 08:57:21 
Ну очень просто же...

  Edit1.Enambled:=CheckBox1.Checked;
Александр, добавлено 1.04.11, 20:34:43 
Извините, я понимаю, что задаю немного глупый вопрос. Как переменной присвоить значение, введённое пользователем в строку (label)? Если не сложно ответьти на вопрос.
Автор, добавлено 2.04.11, 05:40:50 
Да, странный вопрос. Label - статичный объект, и пользователь в него ничего ввести не может. Можно вводить в компонент Edit. Если это число, то так его переписать в переменную:

X:=StrToFloat(Edit1.Text);

Если это не число, а буквы, то будет ошибка. Если я неправильно понял вопрос, уточните его.
Александр, добавлено 2.04.11, 11:08:31 
Спасибо большое, вы все верно поняли, я ошибся с lable, а как edit перевести в строку числовую?
Александр, добавлено 2.04.11, 12:11:51 
Ой, не числовую а буквенную.
Автор, добавлено 2.04.11, 15:47:20 
Edit.Text - это уже текст, поэтому переводить не нужно, так и присваивается S:=Edit.Text;
Александр, добавлено 2.04.11, 19:43:06 
Простите, а почему в переводе в числовую переменную выдаёт ошибку?
Автор, добавлено 2.04.11, 21:35:28 
Потому что я не телепат. Если бы я читал мысли, то знал бы какая ошибка и почему возникает. А так информации маловато для ответа. Может вместо точки запятую в дробях поставили... Или наоборот. Или ещё чего. Какой именно оператор вызывает ошибку?
Аноним, добавлено 2.04.11, 22:11:59 
Chislo:=StrToFloat(edit1.Text);
Александр, добавлено 2.04.11, 22:13:54 
chislo:integet
Автор, добавлено 2.04.11, 22:20:16 
Ну вот и ответ! StrToFloat - перевод в действительные числа (даже если это и целое число, результат будет с запятой). StrToInt - перевод в целые числа. Вам этот вариант подходит.
Александр, добавлено 2.04.11, 23:11:42 
Спасибо большое, весьма благодарен.
Аноним, добавлено 28.04.11, 09:10:13 
че не понятно написали???A:x:=5????
Антон, добавлено 4.12.11, 14:16:10 
Я написал программу по решению систем уравнений.
Из-за того что часто встречаются дробные корни (в виде бесконечной десятичной дроби) сделал поправку. Теперь программа по идее должна в случае дробного ответа писать дробь, но при попытке компилирования выдает ошибку.
Вот вид программы по переводу в дробь (в общем случае)
begin
  a := StrToFloat(Edit1.Text);
  b := StrToFloat(Edit2.Text);
  x := a/b;
  if x in Integer then
  Label2.Caption := FloatToStr(x);
  else
  Label2.Caption := FloatToStr(a)'/'FloatToStr(b);
end;

Основные ошибки:
 '(' expected but 'THEN' found //отсылает к сроке, содержащей then
 Operator not applicable for this operand time //вообсче бредовая ошибка, ибо отсылает к первой строке содержащей Label2 (курсор ставит после двойки)
Аноним, добавлено 4.12.11, 14:21:03 
Был еще и вот такой вариант:
 begin
  a := StrToFloat(Edit1.Text);
  b := StrToFloat(Edit2.Text);
  x := a/b;
  if (x in Integer) then
  begin
  Label2.Caption := FloatToStr(x);
  end;
  else
  begin
  Label2.Caption := FloatToStr(a)'/'FloatToStr(b);
  end;
end;

Но тут он в первой ошибке заменил 'THEN' на ')'
И стал требовать точку с запятой после begin.
(в предыдущем сообщении ошибка: вместо for this operand time должно быть for this operand type)
Автор, добавлено 4.12.11, 14:21:16 
У вас две ошибки.

1. При делении ВСЕГДА результат типа Real. То есть проверять его на принадлежность к целым числам бессмысленно.
2. Оператор in проверяет на принадлежность к множеству, а Integer в данном случае не множество а тип - тоже операция бессмысленная.

А чтобы в таких случаях не отсылало к then, можно попробовать условие в скобки заключать. Хотя в данном случае и не поэтому отсылает.
Антон, добавлено 4.12.11, 15:48:32 
Тогда почему к then отсылает то? И вообще как стоит писать данный алгоритм (чтобы программа выдавала обычную дробь), от чего отталкиваться?
Автор, добавлено 4.12.11, 16:15:46 
Как работает компилятор я не знаю, что там у него на уме. Но отсылает из-за ошибочности условного оператора, а также потому что условие в скобки не заключено. Если было бы заключено, отсылало бы к чему-то другому.

И выражайтесь точнее, а то приходится домысливать, что вам нужно. Вы хотите, если число целое, то чтобы было точно целое, без запятой, а если дробное - то с запятой. Так?

Так не бывает. Реально все величины на свете не точно целые. Можно только приблизительно оценить, насколько близко оно к целому. Это и выражает операция деления, в котором не бывает результата целого типа.

Вот и оценивайте результат с вам необходимой точностью. Вам в помощь функция Round, отбрасывающая хвост после запятой - округляющая в меньшую сторону. После смотрите, если число отличается от результата округления или числа на 1 большего на величину меньшую вашей заданной точности, то число целое. И равно либо результату округления, либо на 1 больше.
Антон, добавлено 4.12.11, 16:26:06 
Нннда, пардон, не совсем ясно написал... Мне нужно, чтобы в случае, если число не целое, т.е. после запятой стоят сплошняком нули, то программа выдает мне само число. Если же после запятой есть какие-либо числа, отличные от нуля, то программа выдает мне обычную (не десятичную) дробь типа 2/3.
Здесь мне в помощь (как я уже сообразил) оператор mod, но и сним возникли определенные трудности: в записи (C[1,1] mod delta)=0 он говорит, что данный оператор не применим к этому операнду.
Антон, добавлено 4.12.11, 16:27:24 
Курсор выставляет между = и 0
Дмитрий, добавлено 4.12.11, 16:38:44 
Как сделать так чтобы в операторе while после каждого цикла, значение числа x увеличивалось на определенное значение?
Автор, добавлено 4.12.11, 16:40:57 
У вас либо C[1, 1] либо delta либо оба они нецелого типа. Это же вам и говорит компилятор.
Автор, добавлено 4.12.11, 16:42:09 
Интересно, как если число нецелое, то будут после запятой нули? А другие числа природой запрещены?
Автор, добавлено 4.12.11, 16:43:06 
Дмитрий, операция суммирования тоже природой не запрещена.
Автор, добавлено 4.12.11, 16:44:25 
В общем, ребята, выражайте свои мысли точно. А то ничего не пойму, в чём проблема.
Автор, добавлено 4.12.11, 16:47:11 
Антон, итак, если у вас после запятой нули, то и проверяйте число на нули. Как? Переведите в строку.
Антон, добавлено 4.12.11, 16:51:42 
Спасибо, с этой проблемой я наконец-то разобрался.
Остался один вопрос: строка Label2.Caption := FloatToStr(a)'/'FloatToStr(b); в целом нормально выглядит, т.е. компилятор ее воспримет правильно? (я хочу этой строкой записать дробь вида a/b).
Автор, добавлено 4.12.11, 17:02:46 
Перед и после '/' плюсики.
Антон, добавлено 9.12.11, 19:00:54 
Скажите, а оператор mod применим тоько к целым числам (и делимое и делитель целые)? У меня похоже, что по этому отказывается воспринимать выражение a mod c (переменная с - тип Real).
Автор, добавлено 9.12.11, 19:11:23 
Мне не сложно ответить не вопрос. Но вам быстрее самому проверить чем задать вопрос и ждать ответа.

Ответ да.
Аноним, добавлено 6.01.12, 10:01:09 
У меня есть длинное математическое выражение с очень большим количеством переменных из таблицы StringGrid , и при вычислении формулы надо писать очень длинное выражение, можно ли записывать одну формулу в две строки?
Автор, добавлено 6.01.12, 13:54:18 
Нет, нельзя. Используйте промежуточные вычисления, для разных частей формулы. И не оставляйте название таблицы как StringGrid, а переименовывайте покороче, типа SG, например - тоже будет короче.
Александр, добавлено 1.05.12, 08:59:40 
Извините но так и не понял где открыть дополнительные мат функции, поиск виндовс ничего не дает, в хелпе тоже не понятно. вы сказали, что где то наверху
" Для использования этих функций (конечно они есть) нужно добавить в секцию uses (в са-а-амом верху) модуль Math. В нём куча функций. Берём и ищем поиском файл Math.pas. И открываем его в Delphi. "

разъясните пожалуйста
Автор, добавлено 1.05.12, 10:15:39 
Модуль Math существует! Для его использования нужно сослаться на него в списке uses. Этот список можно увидеть, посмотрев в самое начало любого модуля. Вот как он выглядит при открытии пустого проекта (при старте Delphi):

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs{, Math};

В фигурных скобках то, что нужно добавить. Можно открыть этот модуль и посмотреть какие там функции. Для этого на рабочем столе нужно найти кнопку "Пуск" и нажать на неё. Появится меню "Пуск", там, посмотрите, есть такая ссылка "поиск". Нажав на неё, вы вызовете окно "Поиск". С его помощью можно в том числе искать файлы по их имени. Вот, в соответствующее поле введите "Math.pas" - без кавычек, естественно. Не сразу, конечно, но файл будет найден, уверяю вас. Щёлкните по нему, и он откроется в Delphi, всё и увидите.
Александр, добавлено 1.05.12, 11:06:54 
понятно спасибо.

и еше вопрос: в делфи можно запустить не форму, а как в обычном паскале окно? просто вот я написал алгоритм, запускаю - появляется пустая форма.
Автор, добавлено 1.05.12, 11:28:25 
Вы наверное имеете в виду консольную программу. Это возможно. Но я никогда не делал таких программ, предпочитаю оконные приложения.
Александр, добавлено 1.05.12, 11:37:38 
Спасибо!
Ричи, добавлено 2.06.12, 11:46:17 
При описании условного оператора не помешал бы простой пример для наглядности и понимания.
Автор, добавлено 2.06.12, 11:58:50 
Да, пожалуй, добавлю для каждого оператора примеры.
Оставить комментарий:

Имя  

Текст комментария

  





Интернет-магазин электрооборудования