IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Работа с потоком
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


В поток записана последовательность целых чисел. Найти минимум и максимум и поменять их местами, не используя дополнительных потоков.

Начала я с того, что попыталась сосчитать первое число, чтоб было с чем сравнивать...
Проблема в том, что если в файле одно число - то оно фиксируется и выводиться (в компонент Memo) как надо, но если больше - приложение вылетает с ошибкой " '1-е число из файла' is not a valid integer value"..
структура файла:
11
22
56
...
и т.д

Объясните, как исправить, чтоб отработало без ошибок?

procedure TForm1.Convert;
var
i, j, k: Word;
c: Char;
l,numb,min,max: Integer;
str:string;
f: Boolean;
S: TStream; // переменная потокового типа
begin
S := TFileStream.Create(FName, fmOpenReadWrite);
//загружаем в поток типа FileStream содержимое файла FName
//тело алгоритма
with S do
begin
Position := 0; // установка указателя потока в начало
i := 0;
k := Size; // в k - размер потока в байтах
Read(c,1);
j:=1;
while (c<>#10)and(i<=k-1) do
begin
inc(i);
inc(j);
str:=str+c;
read(c,1);
end;
min:=StrToInt(str);

memo1.Lines.Add(IntToStr(min));
end
end;




Сообщение отредактировано: 18192123 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Лень запускать Дельфи smile.gif , я сделал эмуляцию работы с потоком при помощи строки на FPC:

uses sysutils;
const
s: string =
// '72'#13#10'21543'#13#10'57'#13#10'19'#13#10'14'#13#10'84'; (* 1 *)
'72'#13#10'14'#13#10'57'#13#10'19'#13#10'8874'#13#10'84'; (* 2 *)
var
pos_min, pos_max: integer;
i, j, min, max, delta: integer;
st: string;

begin
writeln(s);
(* // 1
pos_max := 5; max := 21543;
pos_min := 20; min := 14;
*)
// 2
pos_min := 5; min := 14;
pos_max := 17; max := 8874;

delta := length(inttostr(max)) - length(inttostr(min));

if pos_max < pos_min then begin // Первый случай

i := pos_max + length(inttostr(min));
while i < pos_min do begin
s[i] := s[i + delta]; inc(i);
end;

st := inttostr(min);
for i := 1 to length(st) do begin
s[pos_max + i - 1] := st[i]
end;
st := inttostr(max);
for i := 1 to length(st) do begin
s[pos_min - delta + i - 1] := st[i]
end;
end

else begin // Второй случай

i := pos_max + length(inttostr(min)) - 1;
while i - delta > pos_min do begin
s[i] := s[i - delta]; dec(i);
end;

st := inttostr(min);
for i := 1 to length(st) do begin
s[pos_max + delta + i - 1] := st[i]
end;
st := inttostr(max);
for i := 1 to length(st) do begin
s[pos_min + i - 1] := st[i]
end;

end;

writeln('final = ', s);

end.


Вот что программа выводит:
Цитата(Консоль)

Running "g:\programs\pascal\__potok.exe"
72
21543
57
19
14
84
final = 72
14
57
19
21543
84

Running "g:\programs\pascal\__potok.exe"
72
14
57
19
8874
84
final = 72
8874
57
19
14
84
(сначала - первый случай (pos_max < pos_min), потом - второй... Вроде ничего лишнего в строке-результате нет)... В принципе, можно пошаманить и сделать все без двух веток if/else, но так как есть - более понятен алгоритм, поэтому я оставил без "шаманства".
 К началу страницы 
+ Ответить 

Сообщений в этой теме
18192123   Работа с потоком   24.04.2008 18:05
volvo   Вот так: while (c<>#13)and(i<=k-1) do // …   24.04.2008 20:03
18192123   Вот так: [code=pas]while (c<>#13)and(i<=…   24.04.2008 20:53
volvo   Во-первых, вот тут: Почему увеличиваешь на 1? Надо…   24.04.2008 21:25
18192123   А вообще, я бы сделал так: Спасибо за объяснени…   24.04.2008 22:14
18192123   Добавила нахождение позиций максимального и минима…   24.04.2008 23:48
18192123   И даже то, что дописала про нахождение позиций не …   25.04.2008 2:09
18192123   Вот что я добавила:перезаписала на место максималь…   25.04.2008 2:31
18192123   Вот код для предыдущего сообщения.. procedure TF…   27.04.2008 16:30
volvo   А почему они не должны игнорироваться? Ты что, где…   27.04.2008 16:42
18192123   Если минимальное и максимальное числа состоят из …   27.04.2008 17:03
volvo   Угу... Только следить за тем, чтобы копирование шл…   27.04.2008 17:11
18192123   ...то проще копировать символы "назад" …   27.04.2008 17:18
18192123   Вот моя попытка разобрать случай, если кол-во цифр…   27.04.2008 19:13
18192123   Пожалуста, объясните, как избавиться от лишних циф…   27.04.2008 21:17
volvo   Лень запускать Дельфи :) , я сделал эмуляцию рабо…   27.04.2008 22:35
18192123   Снова я что-то напутала...Результаты работы прилож…   27.04.2008 23:34
volvo   ... delta := length(inttostr(max)) - length(intt…   28.04.2008 0:05
18192123   Что я делаю не так? :) Всё так)) Спасибо больш…   28.04.2008 0:36


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 1.05.2024 18:08
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name