Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2019, 01:21   #1
sashakor22
 
Регистрация: 17.08.2018
Сообщений: 4
По умолчанию Олимпиадная задача "Минимум из трёх". Runtime error 205.

Минимум из трёх

В каждой из N строк входного файла записано по три объекта одного из трёх типов: целые числа, вещественные числа или строки, состоящие из заглавных латинских букв и цифр. Объекты разделены знаком табуляции.

Определите минимальный из трёх объектов в каждой строке и запишите его в выходной файл. Выводить объект нужно точно так же, как он дан во входных данных.

В первом тесте N = 30. Оценка за этот тест: 30 баллов. За каждое неправильно определенный минимум оценка снижается на 3 балла, однако не может стать меньше нуля. Проверка осуществляется в режиме on-line (результат виден сразу).

Во втором тесте N = 7000. Оценка за этот тест: 70 баллов. За каждый неправильно определенный минимум оценка снижается на 3 балла, однако не может стать меньше нуля. Во время тура проверяется, что сданный файл содержит 7000 строк. Проверка правильности ответа осуществляется в режиме on-line (результат виден после окончания тура).
Примеры
Входные данные Результат
AB 12 AC1 12
1 2 3 1
7.5 36.6 0.001 0.001
--------------------------------------------------

Задание состоит из нескольких частей: файл b0 (3 строки из примера) с ответом для проверки - ответ верный, b1 (30 строк) - программа работает, получил 18 баллов из 30, b2 (7000 строк и добавились отрицательные числа) - программа обрабатывает только 3022 строки и в консоль выводит ошибку:
Код:
Runtime error 205 at $0000000000408D5E
$0000000000408D5E
$000000000040018C

Код:
var
f,f1:text;
x,min,str:string;
rez,i,sum,err:integer;
m,poz:real;
begin
	assign(f,'b_input.txt');
	assign(f1,'b_output.txt');
	reset(f);
	rewrite(f1);
	while not eof(f) do 
	begin
		readln(f,x);
		rez:=32000;
		poz:=3200000000000000000;
		sum:=0;
		str:='';
		min:='';
		m:=0;
		for i:=1 to length(x) do
		begin
			if (x[i]='	') or (i=length(x)) then 
			begin
				if i=length(x) then
				begin
					sum:=sum+ord(x[i]);
					str:=str+x[i];
				end;
				val(str,m,err);
				if err=0 then 
				begin
					if poz>m then
					begin
						poz:=m;
						min:=str;
					end;
				end;
				if (err<>0) and (rez>sum) then 
				begin
					rez:=sum;
					min:=str;
				end;
			err:=0;
			sum:=0;
			str:='';
			m:=0;
			end
			else begin
				sum:=sum+ord(x[i]);
				str:=str+x[i];
			end;
		end;
		writeln(f1,min);
	end;
	close(f);
	close(f1);
end.
компилятор: free pascal 3.0.4
Вложения
Тип файла: txt b1.txt (1.2 Кб, 124 просмотров)
Тип файла: zip b2_txt.zip (187.6 Кб, 8 просмотров)

Последний раз редактировалось sashakor22; 27.01.2019 в 11:07. Причина: более удобочитаемый вид, ответ на другом форуме
sashakor22 вне форума Ответить с цитированием
Старый 27.01.2019, 06:37   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Замените real на extended - тогда проработает на представленном файле. Но я бы лучше решал задачу только через сравнение строк.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 27.01.2019, 10:53   #3
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Половина подвохов в тестах оимпиадных задач - это разрядность..
Black Fregat вне форума Ответить с цитированием
Старый 27.01.2019, 11:10   #4
sashakor22
 
Регистрация: 17.08.2018
Сообщений: 4
По умолчанию

Всем спасибо, проблема решена на другом форуме:
http://www.cyberforum.ru/free-pascal/thread2394863.html
Спасибо модератору Cyborg Drone.

Цитата:
- Ошиблись с типом переменных. Не всё из файла может поместиться в real или integer, откуда, собственно, и ошибка.
- Используете "волшебные числа", мало того, что это костыль, так ещё и неправильно Вы эти числа используете.
- Если выводить нужно в том виде, в котором это было во входном файле, то про целые числа можно (и нужно) смело забыть, и использовать только вещественные.

Какие-то несколько усложнённые у Вас преобразования... Я бы так написал:
Код:
var
  f, g: text;
  s: string;
  i, k, err, e, imin: integer;
  st: array[1..3] of string[255]; //судя по файлу, можно string[20]
  num: array[1..3] of extended; //extended, а никакой не real, и даже не double
 
begin
  assign(f, 'b_input.txt');
  reset(f);
  assign(g, 'b_output.txt');
  rewrite(g);
  while not eof(f) do
    begin
      readln(f, s);
      s += #9;
      e := 0;
      for i := 1 to 3 do st[i] := '';
      k := 1;
      for i := 1 to length(s) do
        if s[i] <> #9 then
          st[k] += s[i]
        else
          begin
            val(st[k], num[k], err);
            e += err;
            inc(k)
          end;
      imin := 1;
      if e = 0 then
        begin
          for i := 2 to 3 do
            if num[imin] > num[i] then imin := i
        end
      else
        begin
          for i := 2 to 3 do
            if st[imin] > st[i] then imin := i
        end;
      writeln(g, st[imin])
    end;
  close(f);
  close(g)
end.
sashakor22 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
runtime error shalgan Помощь студентам 5 23.11.2013 13:02
Runtime error (test 1) Nikita++ Помощь студентам 1 30.11.2010 19:53
Runtime error oban11 Помощь студентам 4 16.11.2010 22:47
Runtime Error ultrasfan Общие вопросы C/C++ 3 12.10.2010 16:16
Runtime Error RoS Qt и кроссплатформенное программирование С/С++ 7 06.09.2010 16:44