Вторник, 28 Мая 2024, 07:52

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Delphi:Вопрос-Ответ
GameMixДата: Пятница, 14 Сентября 2012, 19:38 | Сообщение # 221
старожил
Сейчас нет на сайте
Всем привет. Попытался найти ответ на вопрос в поисковиках, но не нашёл, поэтому надеюсь на местных программистов 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.

Почему не срабатывает readln в первом случае? smile


Steel Standoff - 2D аркада.
Мои статьи
n0ipr0ksДата: Пятница, 14 Сентября 2012, 19:55 | Сообщение # 222
частый гость
Сейчас нет на сайте
Quote
Почему не срабатывает readln в первом случае? smile

Это какая-то причуда Delphi, я её никогда не понимал. Иногда срабатывает одна строка, а иногда только вторая. Тебе это как-то мешает? smile
TimKruzДата: Пятница, 14 Сентября 2012, 21:28 | Сообщение # 223
старожил
Сейчас нет на сайте
Quote (n0ipr0ks)
Это какая-то причуда Delphi

Это причуда не 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 и так далее - при анализе результатов вывод о свойствах рассматриваемого предмета напрашивается сам собой. smile

Quote (n0ipr0ks)
Тебе это как-то мешает?

Конечно мешает - зачем писать лишний readln, при этом не имея понятия о его назначении?


GameMixДата: Суббота, 15 Сентября 2012, 05:40 | Сообщение # 224
старожил
Сейчас нет на сайте
TimKruz, да, что-то я поторопился с публикацией вопроса. Сегодня утром сам додумался. Различия read и readln я знаю. Но всё-равно спасибо за отклик и много букв smile

Steel Standoff - 2D аркада.
Мои статьи
FerasetДата: Воскресенье, 16 Сентября 2012, 22:31 | Сообщение # 225
Издание игр
Сейчас нет на сайте
Всем привет. Такой вопрос. Хочу сделать так чтобы при нажатии кнопки button открывалось окно загрузки картинки, и выбраннная мною картинка помещалась в обьект image на форме. Как это сделать и реально ли вообще? angry

==================
Извиняюсь - уже разобрался:

begin
if OpenDialog1.Execute then
Image1.Picture.LoadFromFile(OpenDialog1.FileName);
end;


Спасибо пользователю TimCruz, за то что научил меня спокойствию, терпимости и вере в цели.



Сообщение отредактировал Feraset - Воскресенье, 16 Сентября 2012, 23:22
TimKruzДата: Вторник, 18 Сентября 2012, 13:02 | Сообщение # 226
старожил
Сейчас нет на сайте
Quote (Feraset)
Извиняюсь - уже разобрался:

Лучше используй OpenPictureDialog. От простого OpenDialog он отличается функцией preview и готовым списком фильтров для поддерживаемых форматов картинок.


FerasetДата: Вторник, 18 Сентября 2012, 14:25 | Сообщение # 227
Издание игр
Сейчас нет на сайте
Quote (TimKruz)
Лучше используй OpenPictureDialog. От простого OpenDialog он отличается функцией preview и готовым списком фильтров для поддерживаемых форматов картинок.

В нете слышал что OpenPicture очень корявый...


Спасибо пользователю TimCruz, за то что научил меня спокойствию, терпимости и вере в цели.

DestroyДата: Пятница, 28 Сентября 2012, 17:37 | Сообщение # 228
постоянный участник
Сейчас нет на сайте
проблема:
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести.
Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная
пробовал писать uses unit1, unit2 не помогло
ArchidoДата: Пятница, 28 Сентября 2012, 17:55 | Сообщение # 229
Сэнсэй
Сейчас нет на сайте
Quote (Destroy)
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести. Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная пробовал писать uses unit1, unit2 не помогло

Неплохо бы еще привести части кода где это происходит, чтобы не играть в угадайку.


C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
anton-garДата: Пятница, 28 Сентября 2012, 18:28 | Сообщение # 230
WEBmaster
Сейчас нет на сайте
Quote (Destroy)
проблема:
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести.
Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная
пробовал писать uses unit1, unit2 не помогло

Quote (Archido)

Неплохо бы еще привести части кода где это происходит, чтобы не играть в угадайку.

+1


daunДата: Пятница, 28 Сентября 2012, 20:12 | Сообщение # 231
постоянный участник
Сейчас нет на сайте
TimKruzДата: Пятница, 28 Сентября 2012, 20:20 | Сообщение # 232
старожил
Сейчас нет на сайте
Quote (Destroy)
вот например я в первой форме в строку вбиваю значение, а во второй форме это значение должен вывести.
Так он в не находит переменные других формах и так где надо вывести он пишет что неизвестная переменная

Во втором модуле (unit2) после части implementation пишешь uses unit1 (точно так же можно сделать в unit1 - uses unit2), и, таким образом, получаешь доступ к этому модулю. Однако, если переменная объявлена в разделе private или protected класса TForm1 - из другого модуля её будет не видно, объявляй в разделе public.


DestroyДата: Вторник, 09 Октября 2012, 17:08 | Сообщение # 233
постоянный участник
Сейчас нет на сайте
TimKruz, во помогло спасибо
человек сразу понял без кода о чем речь идет

Добавлено (09.10.2012, 17:08)
---------------------------------------------
нужен пример кода программы, которая считывает с одного файла значение двух переменных, суммирует их и выводит в другом файле. Без всяких процедур dephi, просто консольное приложение. Желательно с комментариями.

karuyДата: Среда, 10 Октября 2012, 10:25 | Сообщение # 234
заслуженный участник
Сейчас нет на сайте
Quote (Destroy)
нужен пример кода программы, которая считывает с одного файла значение двух переменных, суммирует их и выводит в другом файле. Без всяких процедур 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
DestroyДата: Среда, 10 Октября 2012, 16:09 | Сообщение # 235
постоянный участник
Сейчас нет на сайте

выдает такую ошибку
karuyДата: Среда, 10 Октября 2012, 16:37 | Сообщение # 236
заслуженный участник
Сейчас нет на сайте
Создай текстовый файл 111.тхт с двумя произвольными числами через запятую без лишних символов, если б ты посмотрел на код - увидел, что значения двух чисел подгружаются з заранее созданного файла 111.тхт, что и требуется заданием в посте # 233
Quote (Destroy)
нужен пример кода программы, которая считывает с одного файла значение двух переменных


Сообщение отредактировал karuy - Среда, 10 Октября 2012, 17:16
DestroyДата: Среда, 10 Октября 2012, 17:17 | Сообщение # 237
постоянный участник
Сейчас нет на сайте
Quote (karuy)
Создай текстовый файл 111.тхт с двумя произвольными числами через запятую без лишних символов, если б ты посмотрел на код - увидел, что значения двух чисел подгружаются з заранее созданного файла 111.тхт, что и требуется заданием в посте # 233

нет, всмысле, я создал эти файлы все как ты написал выше и выдает ошибку
karuyДата: Среда, 10 Октября 2012, 17:22 | Сообщение # 238
заслуженный участник
Сейчас нет на сайте
Где лежит файл 111.тхт? Вместе с екзешником?
DestroyДата: Среда, 10 Октября 2012, 17:28 | Сообщение # 239
постоянный участник
Сейчас нет на сайте
да вместе, при попытке открыть ехешник пишет завершение задачи
karuyДата: Среда, 10 Октября 2012, 17:35 | Сообщение # 240
заслуженный участник
Сейчас нет на сайте
На какой строке выскакивает сообщения? Бросай исходник (папку с ним, вместе с текстовыми файлами) - посмотрю.
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг