Всем привет. Попытался найти ответ на вопрос в поисковиках, но не нашёл, поэтому надеюсь на местных программистов Delphi. Дан код:
Code
{$APPTYPE CONSOLE}
uses SysUtils, Math;
procedure SqRoot(a, b, c: Real; var x1, x2: Real; var ok: Boolean);
var d: Real; begin ok := false; d := b*b - 4*a*c; if (d > 0) then begin x1 := (-b+sqrt(d)) / (2*a); x2 := (-b-sqrt(d)) / (2*a); writeln('x1 = ', x1); writeln('x2 = ', x2); ok := true; end else if (d = 0) then begin x1 := -b / (2*a); writeln('x = ', x1); ok := true; end else ok := false; end;
var a0, b0, c0, k1, k2: Real; rez: Boolean; begin read(a0, b0, c0); SqRoot(a0, b0, c0, k1, k2, rez); if (rez = false) then writeln('RESHENIYA NET!'); readln; // эта строка, наверное, просто так здесь... readln; // т.к. только эта строка срабатывает end.
Это причуда не Delphi, а языков программирования, в которых есть отдельно Read и отдельно ReadLn, и конкретно для режима консоли.
Quote (GameMix)
Почему не срабатывает readln в первом случае?
Что такое read и readln? Это процедуры чтения из файла/устройства ввода, которым по умолчанию считается консоль. При этом read считывает строку или её часть (либо какие-либо параметры, конечно), без символов перевода строки и возврата каретки (вводящихся клавишей enter), а readln считывает строку целиком, вместе с этими символами. Это свойственно только текстовым файлам и консоли. Однако, в консоли (с файлами всё нормально) выйти из режима ввода (открываемого процедурой read) можно только нажатием на enter, который автоматически переводит курсор на новую строку; но процедура read игнорирует эту клавишу и оставляет её код в буфере клавиатуры, из которого её можно считать следующей процедурой read, readln или функцией readkey (для TurboPascal). Поэтому для консоли рекомендую использовать readln(переменные) - визуальных отличий от read(параметры) нет (в любом случае идёт перевод строки), зато удаляется из буфера клавиатуры ненужный enter. Т.е. тебе нужно заменить read на readln и удалить один из readln'нов в конце программы - всё заработает.
Quote (GameMix)
Попытался найти ответ на вопрос в поисковиках
Сначала ищи ответ в справке Delphi/Pascal, документированные функции там подробно описаны, лишь бы знать названия этих функций. Вот, например:
Quote (Справка Delphi 7, функция Read)
... Read reads all characters up to, but not including, the next end-of-line marker or until Eof(F) becomes true; it does not skip to the next line after reading. ...
Однако, даже не имея файла справки, можно найти ответ на свой вопрос, банально проведя несколько "экспериментов": что будет, если сделать read...readln, что будет, если сделать readln...readln, что будет, если сделать read...readln...readln и так далее - при анализе результатов вывод о свойствах рассматриваемого предмета напрашивается сам собой.
Quote (n0ipr0ks)
Тебе это как-то мешает?
Конечно мешает - зачем писать лишний readln, при этом не имея понятия о его назначении?
TimKruz, да, что-то я поторопился с публикацией вопроса. Сегодня утром сам додумался. Различия read и readln я знаю. Но всё-равно спасибо за отклик и много букв Steel Standoff - 2D аркада. Мои статьи
Всем привет. Такой вопрос. Хочу сделать так чтобы при нажатии кнопки button открывалось окно загрузки картинки, и выбраннная мною картинка помещалась в обьект image на форме. Как это сделать и реально ли вообще?
================== Извиняюсь - уже разобрался:
begin if OpenDialog1.Execute then Image1.Picture.LoadFromFile(OpenDialog1.FileName); end; Спасибо пользователю TimCruz, за то что научил меня спокойствию, терпимости и вере в цели.
Сообщение отредактировал Feraset - Воскресенье, 16 Сентября 2012, 23:22
Лучше используй OpenPictureDialog. От простого OpenDialog он отличается функцией preview и готовым списком фильтров для поддерживаемых форматов картинок.
Лучше используй OpenPictureDialog. От простого OpenDialog он отличается функцией preview и готовым списком фильтров для поддерживаемых форматов картинок.
В нете слышал что OpenPicture очень корявый... Спасибо пользователю TimCruz, за то что научил меня спокойствию, терпимости и вере в цели.
проблема: вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести. Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная пробовал писать uses unit1, unit2 не помогло
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести. Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная пробовал писать uses unit1, unit2 не помогло
Неплохо бы еще привести части кода где это происходит, чтобы не играть в угадайку. C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
проблема: вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести. Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная пробовал писать uses unit1, unit2 не помогло
Quote (Archido)
Неплохо бы еще привести части кода где это происходит, чтобы не играть в угадайку.
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести. Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная
Во втором модуле (unit2) после части implementation пишешь uses unit1 (точно так же можно сделать в unit1 - uses unit2), и, таким образом, получаешь доступ к этому модулю. Однако, если переменная объявлена в разделе private или protected класса TForm1 - из другого модуля её будет не видно, объявляй в разделе public.
TimKruz, во помогло спасибо человек сразу понял без кода о чем речь идет
Добавлено (09.10.2012, 17:08) --------------------------------------------- нужен пример кода программы, которая считывает с одного файла значение двух переменных, суммирует их и выводит в другом файле. Без всяких процедур dephi, просто консольное приложение. Желательно с комментариями.
нужен пример кода программы, которая считывает с одного файла значение двух переменных, суммирует их и выводит в другом файле. Без всяких процедур dephi, просто консольное приложение. Желательно с комментариями.
111.txt: 156,12 222.txt: 168
Code
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;
var f1 : text; st : string; i, j: Integer; begin assign(f1, '111.txt'); {связать с файлом 111.txt файловую переменную f1 } reset (f1); { открыть файл для чтения } readln (f1, st); {читаем строку из файла f1 } i := StrToInt(Copy(st, 1, Pos(',', st)-1)); { первое число } j := StrToInt(Copy(st, Pos(',', st)+1, length (st))); { второе } writeln(i, ' + ', j, ' = ', i+j); { рисуем суму } close (f1); { закрыть файл для чтения}
assign(f1, '222.txt'); {связать с файлом 222.txt файловую переменную f1 } rewrite (f1); { создать новый файл с именем 222.txt } writeln ( f1, i+j); { записать суму в файл} close (f1); { закрыть файл для записи } Sleep(1000); end.
Сообщение отредактировал karuy - Среда, 10 Октября 2012, 10:26
Создай текстовый файл 111.тхт с двумя произвольными числами через запятую без лишних символов, если б ты посмотрел на код - увидел, что значения двух чисел подгружаются з заранее созданного файла 111.тхт, что и требуется заданием в посте # 233
Quote (Destroy)
нужен пример кода программы, которая считывает с одного файла значение двух переменных
Сообщение отредактировал karuy - Среда, 10 Октября 2012, 17:16
Создай текстовый файл 111.тхт с двумя произвольными числами через запятую без лишних символов, если б ты посмотрел на код - увидел, что значения двух чисел подгружаются з заранее созданного файла 111.тхт, что и требуется заданием в посте # 233
нет, всмысле, я создал эти файлы все как ты написал выше и выдает ошибку