В своем первом repeat until
, вы readln
ING в полукокса. Первый символ появится в n
, а оставшаяся часть символов будет пропущена полностью до тех пор, пока не будет прочитана новая строка. В этой точке ваш указатель на файл будет на 2
на второй строке данных.
Поскольку ваш тест для n=' '
того ReadLn снова будет выполнено, на этот раз доставка 2
в n
и толкая файл-указатель на 1
на третьей линии.
Когда в конце концов достигнут конец файла, символ Control-Z «читается» из файла. Это тот персонаж, которого вы видите. Так как это не Пространство, цикл продолжается навсегда.
Измените readln
на read
и один персонаж будет прочтён. (тогда это работает, и вы можете перейти к следующей проблеме ...)
Помните, readln
читает до тех пор, пока не прочитает новую строку. Read
читает в переменной - если это символ, он читает один символ. Если это строка, она читает строку, но не новую строку.
Program thefinalp;
Uses SysUtils;
Var
f:Text;
m,d:Integer;
n:string;
n2:string;
c:String[1];
a,e:array of integer;//dynamic array//
LowArr:Integer;
HighArr:Integer;
ArrayLen:Integer;
i:Integer;
ch : char;
function readinteger : string;
var
st : string;
begin
st := '';
// read up to first digit
repeat
read(f,ch);
write(ch);
until ch in ['0'..'9'];
//accumulate digits
repeat
st := st + ch;
read(f,ch);
write(ch);
until not (ch in ['0'..'9']);
readinteger := st;
end;
begin
Assign(f,'q21366050.txt');
Reset(f);
// read first integer
n:= readinteger;
// read second integer
n2:= readinteger;
m := StrToInt(n); //puts a string into an integer//
setlength(a,m);
LowArr:=Low(a);
HighArr:=High(a);
ArrayLen:=Length(a);
setlength(e,m);
LowArr:=Low(e);
HighArr:=High(e);
ArrayLen:=Length(e);
for i:= LowArr to HighArr do
begin
// read first integer
n:= readinteger;
// read second integer
n2:= readinteger;
a[i]:=StrToInt(n); //puts a string into an integer//
e[i]:=StrToInt(n2); //puts a string into an integer//
End;
Writeln;
writeln('Results');
for i:= LowArr to HighArr do
writeln(inttostr(i),'=',inttostr(a[i]),',',inttostr(e[i]));
// pause to read results
Readln;
End.
К сожалению, это немного трудно понять, как раз именно то, что вы хотите сделать. Эта процедура будет читать первую строку, а затем положить оставшиеся строки в [?] И e [?].
Используя дескриптивные переменные, вы должны выполнить часть документации, чтобы вы могли следить за тем, что происходит. Поскольку я действительно не знаю, мне нужно сделать предположения и сделать несколько вещей, чтобы заполнить пробелы.
Рассматривая основную процедуру, сначала вы назначаете имя файла (я использовал q21366050.txt
для моего удобства) и откройте файл с помощью reset
.
Следующее задание состоит в том, чтобы прочитать первое число из файла. Теперь вы указали только однозначные числа, но легко настроить процедуру, чтобы справиться с последовательностью.
n:=readinteger;
присваивает результат функции readinteger
к строкеn
readinteger
работает следующим образом: сначала очистить строку st
, которая является «локальной переменным» - доступно только для этой процедуры. Затем продолжайте читать символы до ch
до тех пор, пока символ не будет находиться в диапазоне '0' .. '9' - поэтому он проскакивает, пока не прочитает цифру. Затем он добавляет цифру, считываемую в строку st
, и продолжает читать символы и накапливает их до тех пор, пока не будет найден найденный символ не цифра. (Этот символ, если он нам понадобится, находится в ch
). Затем мы назначаем накопленную строку цифр на результат функции.
Следовательно, n
получит первые string
цифр в файле; следующий символ был прочитан, и мы знаем, что это не цифра (иначе оно было бы добавлено к возвращаемой строке).
Затем мы повторяем процесс с n2
. Все остальные символов перед затем следующей цифрой пропускается, последовательность цифр возвращается и следующий символ помещается в ch
Затем мы присваиваем resullt преобразования строки n
в целое число в m
. Вы не описали, для чего может использоваться другой номер, поэтому он есть, но не используется.
Настройте два массива, a
и e
.
Затем используйте ту же процедуру, чтобы читать следующее целое число. Не имеет значения, что есть CRLF символов - мы переходим к следующему числовому и возвращаем его. и повторите это для второго числа в строке.
Преобразуйте два числа и поместите их в соответствующие их массивы.
Сделайте это m
раз.
аконец, написать новую строку дисплея, затем другая отчетность Results
, а затем повторить m
раз написать строку, содержащую номер итерации i
и значение двух массивов, a
и e
, все как целые числа преобразуются к -strings и с =
и ,
символами, чтобы показать, что мы не просто повторяем данные, считываемые с ввода.
Наконец, дождитесь ввода с клавиатуры (поскольку readln
не имеет явного файла), который держит программу открытой, пока мы не увидим результаты.
Теперь - номинально, конечно же, вы должны также закрыть файл перед завершением ...
Вы должны отступать правильно. Делает ваш код намного легче читать. – CodesInChaos
Хорошо, спасибо, я исправляю это. –
Включите подсказки и предупреждения компилятора. Обратите внимание на то, что они говорят вам. Затем используйте отладчик, чтобы выполнить код, чтобы выяснить, что происходит. Как только вы это сделаете, если вы не можете решить проблему, вы, по крайней мере, сможете ее лучше описать и сузить. –