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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.12.2016, 17:00   #1
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию Упростить решение Pascal: После каждого ингридента написано его количество, которое нужно добавлять в определенный момент времени, время для каждой части приготовления

Здравствуйте.
Имеется задача такого рода:файл input содержит строку типа: (((sugar 100 egg 3)5 butter 100 nut 200)4 (milk 200 cacao 50 sugar 100)3 )20
После каждого ингридента написано его количество, которое нужно добавлять в определенный момент времени, время для каждой части приготовления указано после скобки.
файл output должен получить следующее:
32 - общее время приготовления
cacao 50 - общее количество каждого элемента
milk 200
nut 200
egg 3
butter 100
sugar 200

Ограничения: длина рецепта не более 1000, количество ингридиентов не более 100, время приготовления для каждой отдельной части не больше 100, кол-во каждого продукта - числа не более 1000.

Задачу я и сам решил, только вот мое решение кажется мне не самым рациональным и излишне замудренным, если кому не лень - подскажите что можно упростить и улучшить. Заранее спасибо!

Код:
program someprog;

type rectext = array[1..1000] of char;
type ing = array [1..100] of string;
type count = array [1..100] of integer; 

var fin, fout: text;
    time, ntime, len, i, j, ci, x, z, pip: integer;
    mytext: rectext;
    ingr:  ing; gm: count;
    s, cit: string;
    flag: boolean;
    

begin

{Преобразование данных из входного файла}
assign(fin, 'recipein.txt');
reset(fin);
len:= 0;
time:= 0;
while not eof(fin) do
	begin
	len:= len + 1;
	read(fin, mytext[len]);
	if mytext[len] = ')' then // нахождение общего времени
		begin
		read(fin, ntime);
		time:= time + ntime;
		end;
	end;
close(fin);

{Обработка данных}
x:= 1;
z:= 1;
i:= 1;
while i <= len do
	begin
	s:= '';
	cit:= '';
	if (123 > ord(mytext[i])) and (ord(mytext[i]) > 96) then
		begin 
		repeat
		s:= s + mytext[i];
		i:= i+1;
		flag:= false;
		for j:= 1 to x do
			if ingr[j] = s then 
				begin				
				flag:= True;
				break; 
				end;
		until mytext[i] = ' ';
		i:= i+1;
		repeat 
		cit:= cit + mytext[i];
		i:= i+1;
		until (mytext[i] = ' ') or (mytext[i] = ')');
		val(cit, ci, pip);
		if not flag then //если элемент еще не был описан
			begin
			ingr[x]:= s;
			gm[z]:= ci;
			x:= x + 1;
			z:= z + 1;
			end
		else //если элемент уже есть в списке
			begin
			gm[j]:= gm[j] + ci;
			end;
		end;
	i:= i+1;
	end;

{Запись результата в выходной файл}
assign(fout, 'recipe.txt');
rewrite(fout);
writeln(fout, 'Time: ', time, ' min.');
for i:= 1 to x-1 do
	writeln(fout, ingr[i], ' ', gm[i]); 
close(fout);

writeln('Programm is over!');
readln;
end.

Последний раз редактировалось nobody_nohead; 13.12.2016 в 17:58.
nobody_nohead вне форума Ответить с цитированием
Старый 13.12.2016, 17:14   #2
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

5 + 4 + 3 + 20 разве не 32? Числа после закрывающейся скобкой нужно сложить?
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 13.12.2016, 17:17   #3
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Plague Посмотреть сообщение
5 + 4 + 3 + 20 разве не 32? Числа перед закрывающейся скобкой нужно сложить?
Все верно, 32 - я так и написал. Если число указано после закрывающей скобки, а не ингридиента - то это число означает время именно для этой части рецепта. Т.е общее время - сумма всех этих чисел. Там с нахождением времени у меня вроде все впорядке, наврядле что-то проще можно придумать. Куда больше волнует именно обработка самих ингридиентов и их значений. Т.к длина рецепта может быть более 255, пришлось считывать информацию посимвольно и закидывать в массив. Не уверен, что это лучший вариант...
nobody_nohead вне форума Ответить с цитированием
Старый 13.12.2016, 17:54   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а куда butter делся, почему не вижу его в вашем примере в разделе output ?


Цитата:
Сообщение от nobody_nohead Посмотреть сообщение
Т.к длина рецепта может быть более 255
кстати, это ещё от компилятора(версии) Pascal зависит.
примерно с 1995 года компиляторы Pascal в качестве строки понимают AnsiString, она не ограничена 255 символами.
это раз.

а во-вторых, массив of char вполне допустим, что Вас смущает?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.12.2016, 17:56   #5
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а куда butter делся, почему не вижу его в вашем примере в разделе output ?



кстати, это ещё от компилятора(версии) Pascal зависит.
примерно с 1995 года компиляторы Pascal в качестве строки понимают AnsiString, она не ограничена 255 символами.
это раз.

а во-вторых, массив of char вполне допустим, что Вас смущает?
Меня ничего не смущает, просто это олимпиадная задача, и я так думаю что на олимпиадах лучшим решением будет являтся самое простое и самое короткое (впрочем, не только на олимпиадах). Потому и спрашиваю, можно ли как-то упростить эту задачу.
p.s: там просто вместо butter случайно bread написал, сейчас исправлю.
nobody_nohead вне форума Ответить с цитированием
Старый 13.12.2016, 18:04   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,531
По умолчанию

если это олимпиадная задача с автоматической проверкой по контрольной базе, то скорее всего она не пройдет контроль.
ПРИМЕР на котором ее засыпят:
( sug 2 (((sugar 100 egg 3)5 butter 100 nut 200)4 (milk 200 cacao 50 sugar 100)3 )20 ) 2
да я знаю что в словаре английского языка вряд ли найдется слово sug, но составителя контроля люди вредные.
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.12.2016, 19:09   #7
nobody_nohead
Пользователь
 
Регистрация: 30.11.2016
Сообщений: 22
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
если это олимпиадная задача с автоматической проверкой по контрольной базе, то скорее всего она не пройдет контроль.
ПРИМЕР на котором ее засыпят:
( sug 2 (((sugar 100 egg 3)5 butter 100 nut 200)4 (milk 200 cacao 50 sugar 100)3 )20 ) 2
да я знаю что в словаре английского языка вряд ли найдется слово sug, но составителя контроля люди вредные.
Будьте добры, объясните почему вариант с sug должен вывести исключение?
nobody_nohead вне форума Ответить с цитированием
Старый 14.12.2016, 09:23   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,531
По умолчанию

Цитата:
Будьте добры, объясните почему вариант с sug должен вывести исключение?
я разве сказал про исключение?
я сказал что результат полученный приведенной программой будет отличаться от контрольных результатов.
Да даже и от твоего результата, полученного вручную (путем "ручного" выписывания ингредиентов). потому что вручную ты не делаешь в точности так как написано в программе.
могу для подсказки сказать что в этом списке(полученным программным путем) вряд ли найдется sugar.

P.S. исправление этой "ошибки" кстати приведет (или должно привести) к тому что программа станет работать немного быстрее.
конечно при заданных ограничениях на входные данные это будут микросекунды, но тем не менее факт остается фактом.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.12.2016 в 10:38.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
нужно в одном листе все время вставлять определенный шаблон документа, который после редактируется (это справка о зарплате пенсионерам) бухарик Microsoft Office Excel 11 05.12.2016 12:39
Передача данных в определенный момент (квант) времени по таймеру eugenerock Общие вопросы Delphi 0 10.06.2015 12:40
Pascal Для каждого символа текста указать его относительную частоту появления в тексте student___ Помощь студентам 52 02.05.2013 18:12
Для каждого аi найти ki количество его повторов последовательности. Yakov112 Общие вопросы C/C++ 2 06.10.2012 23:18
посчитать значение по каждой статье за определенный период для каждого листа Graver Microsoft Office Excel 5 04.12.2009 01:31