|
Вопрос # 3 498/ вопрос решён / |
|
Здравствуйте, уважаемые эксперты! доброй ночи.
помогите пожалуйста найти ошибку
на входе:
компания_улица_марка бензина{92 or 95 or 98}_цена {1000<цена<3000}
=====пример
lukoil1 lenina 92 2351
sintez revoluc 98 1500
gazprom marshala 95 1689
uralgaz lenina1 92 2351
ural oktyabrya 95 1100
sibneft gukova 95 1100
rusgaz pervom 98 1500
gaz lena 92 2351
ВЫВОД
3 2 2
===== на выходе:
n92_n95_n98
где n92-кол-во заправок с мин ценой на 92
n95-....с ценой на 95
n98-...с ценой на 98
Приложение: Переключить в обычный режим- program Project2;
-
- {$APPTYPE CONSOLE}
-
- uses
- SysUtils,
- strUtils;
-
- var f1,f2:text;
- str,company,street,str1:string;
- k,k1,sort,cost,i,min92,min95,min98, n92,n95,n98:integer;
- begin
- n92:=0;
- n95:=0;n98:=0;
- assignFile(f1,'f1.txt');reset(f1);
- assignFile(f2,'f2.txt');rewrite(f2);
- while not eof(f1) do
- begin
- readln(f1,Str);
- k:=Pos(' ',Str);
- company:=Copy(Str,1,k-1);
- k1:=PosEx(' ',Str,k+1);
- street:=Copy(Str,k,k1-k);
- k:=k1;
- k1:=PosEx(' ',Str,k+1);
- sort:=StrToInt(Copy(Str,k,k1-k));
- k:=k1;
- k1:=length(Str);
- cost:=StrToInt(Copy(Str,k+1,k1-k));
-
- //----------------------
- begin
- if sort=92 then
- begin
-
- if cost<0 then min92:=cost;
- for i:=k+1 to k1-k do
- if cost<min92 then
- min92:=cost;
- end;
- if sort=min92 then inc(n92);
- end;
- //-----------------
- begin
- if sort=95 then
- begin
- for i:=k+1 to k1-k do
- if cost<0 then min95:=cost;
- for i:=k+1 to k1-k do
- if cost<min95 then
- min95:=cost;
- end;
- if sort=min95 then inc(n95);
- end;
- //--------------------
- begin
- if sort=98 then
- begin
- for i:=k+1 to k1-k do
- if cost<0 then min98:=cost;
- for i:=k+1 to k1-k do
- if cost<min98 then
- min98:=cost;
- end;
- if sort=min98 then inc(n98);
- end;
- end;
- str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
- writeln(f2,str1);
- close(f1);close(f2);
- readln;
- end.
-
Примечание #1 (6 декабря 2009, 09:58): На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N был проведен мониторинг цены бензина на различных АЗС.
Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять для каждого вида бензина, сколько АЗС продают его дешевле всего. На вход программе в первой строке подается число данных о стоимости бензина. В каждой из последующих N строк находится информация в следующем формате:
<Компания> <Улица> <Марка> <Цена>
где <Компания> – строка, состоящая не более, чем из 20 символов без пробелов, <Улица> – строка, состоящая не более, чем из 20 символов без пробелов, <Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках. <Компания> и <Улица>, <Улица> и <Марка>, а также <Марка> и <цена> разделены ровно одним пробелом. Пример входной строки:
Синойл Цветочная 95 2250
Программа должна выводить через пробел 3 числа – количество АЗС, продающих дешевле всего 92-й, 95-й и 98-й бензин соответственно. Если бензин какой-то марки нигде не продавался, то следует вывести 0. Пример выходных данных:
12 1 0
 |
Вопрос задал: I{ () T (статус: Посетитель)
Вопрос отправлен: 5 декабря 2009, 23:08
Состояние вопроса: решён, ответов: 2.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, I{ () T
Если я правильно понял задачу, то примерно так: вставьте перед циклом
min92:=3000;min95:=3000;min98:=3000;
а конец цикла замените на
if sort=92 then
begin
if cost=min92 then Inc(n92)
else if cost<min92 then
begin
min92:=cost;
n92:=1;
end;
end;
if sort=95 then
begin
if cost=min95 then Inc(n95)
else if cost<min95 then
begin
min95:=cost;
n95:=1;
end;
end;
if sort=98 then
begin
if cost=min98 then Inc(n98)
else if cost<min98 then
begin
min98:=cost;
n98:=1;
end;
end;
 |
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 6 декабря 2009, 10:42
Оценка за ответ: 5
|
Ответ #2. Отвечает эксперт: Жикльор
Здравствуйте, I{ () T!
Ваш код немного обработал, теперь он более менее понятен. Вот собственно и он:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
strUtils;
var f1,f2:text;
str,company,street,str1:string;
k,k1,sort,cost,n92,n95,n98:integer;
begin
n92:=5000;
n95:=5000;
n98:=5000;
assignFile(f1,'f1.txt');
reset(f1);
assignFile(f2,'f2.txt');
rewrite(f2);
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
company:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
street:=Copy(Str,k,k1-k);
k:=k1;
k1:=PosEx(' ',Str,k+1);
sort:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
cost:=StrToInt(Copy(Str,k+1,k1-k));
//----------------
if sort=92 then
begin
if (cost<n92) or (cost = 0) then
n92:=cost;
end;
//-----------------
if sort=95 then
begin
if (cost<n95) or (cost = 0) then
n95:=cost;
end;
//--------------------
if sort=98 then
begin
if (cost<n98) or (cost = 0) then
n98:=cost;
end;
end;
str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
writeln(f2,str1);
close(f1);
close(f2);
end.
Вам не нужно было делать циклы в проверках. Когда вы считали одну строку с файла, то присвоили на каждую переменную данные именно с этой строки. Потом просто проверьте предыдущую цену бензина и только что считанную. Цикл while not EOF(f1) проверит все цены и марки бензина.
 |
Ответ отправил: Жикльор (статус: 5-ый класс)
Время отправки: 6 декабря 2009, 11:24
Оценка за ответ: 5
Комментарий к оценке: спасибо))
|
Мини-форум вопроса
Всего сообщений: 48; последнее сообщение — 6 декабря 2009, 20:25; участников в обсуждении: 4.
Страницы: [« Предыдущая] [1] [2] [3]
|
I{ () T (статус: Посетитель), 6 декабря 2009, 19:55 [#41]:
2 паровоз. если не сложно не могли бы ваш код прислать? полностью. скорее всего тогда у меня ошибка где то
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 19:57 [#42]:
Я вцепился, потому что вы на меня нагружаете. Никакого дубляжа кода НЕТ!!! В каждой реплике говорите что я украл ваш код.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 19:59 [#43]:
Попробуйте методом CopyPaste:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
strUtils;
var f1,f2:text;
str,company,street,str1:string;
k,k1,sort,cost,min92,min95,min98, n92,n95,n98:integer;
begin
n92:=0;n95:=0;n98:=0;
min92:=3000;min95:=3000;min98:=3000;
assignFile(f1,'E:\f1.txt');reset(f1);
assignFile(f2,'E:\f2.txt');rewrite(f2);
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
company:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
street:=Copy(Str,k,k1-k);
k:=k1;
k1:=PosEx(' ',Str,k+1);
sort:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
cost:=StrToInt(Copy(Str,k+1,k1-k));
if sort=92 then
begin
if cost=min92 then Inc(n92)
else if cost
begin
min92:=cost;
n92:=1;
end;
end;
if sort=95 then
begin
if cost=min95 then Inc(n95)
else if cost
begin
min95:=cost;
n95:=1;
end;
end;
if sort=98 then
begin
if cost=min98 then Inc(n98)
else if cost
begin
min98:=cost;
n98:=1;
end;
end;
end;
str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
writeln(f2,str1);
close(f1);close(f2);
readln;
end.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 20:01 [#44]:
"В каждой реплике говорите что я украл ваш код"
Это неправда, где это я говорил? Это Вы все время говорите, что у меня ошибка, которую Вы исправили.
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 20:03 [#45]:
Ладно!)) Все, давайте успокоимся! Все мы получили баллы! Все на равных.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 20:06 [#46]:
Знаки неравенств были съедены:
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils,
strUtils;
var f1,f2:text;
str,company,street,str1:string;
k,k1,sort,cost,min92,min95,min98, n92,n95,n98:integer;
begin
n92:=0;n95:=0;n98:=0;
min92:=3000;min95:=3000;min98:=3000;
assignFile(f1,'E:\f1.txt');reset(f1);
assignFile(f2,'E:\f2.txt');rewrite(f2);
while not eof(f1) do
begin
readln(f1,Str);
k:=Pos(' ',Str);
company:=Copy(Str,1,k-1);
k1:=PosEx(' ',Str,k+1);
street:=Copy(Str,k,k1-k);
k:=k1;
k1:=PosEx(' ',Str,k+1);
sort:=StrToInt(Copy(Str,k,k1-k));
k:=k1;
k1:=length(Str);
cost:=StrToInt(Copy(Str,k+1,k1-k));
if sort=92 then
begin
if cost=min92 then Inc(n92)
else if cost<min92 then
begin
min92:=cost;
n92:=1;
end;
end;
if sort=95 then
begin
if cost=min95 then Inc(n95)
else if cost<min95 then
begin
min95:=cost;
n95:=1;
end;
end;
if sort=98 then
begin
if cost=min98 then Inc(n98)
else if cost<min98 then
begin
min98:=cost;
n98:=1;
end;
end;
end;
str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
writeln(f2,str1);
close(f1);close(f2);
readln;
end.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 20:17 [#47]:
ха! теперь работает этот код.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 20:25 [#48]:
Ну, тогда и закроем разлив бензина на троих.
|
31 января 2011, 19:36: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Страницы: [« Предыдущая] [1] [2] [3]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|