|
Вопрос # 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] [Следующая »]
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:26 [#21]:
Не проверял. Сейчас посмотрю.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:35 [#22]:
Все там отлично работает. Имя образа Project2.exe, имя пользователя Ghaiklor, ЦП - 00, Память - 1216 Кб.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 16:43 [#23]:
"Чем же он нерабочий?" "выдает неверные данные на выходе"
Что Вы за ерунду говорите - у нас с Жикльором один и тот же код.
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:48 [#24]:
А почему ты так сильно ухватился за эту тему? Ты очень сильно хочешь 5 баллов? Ну раз не рабочий, значит не рабочий, что здесь не понять?
Вы только кусок измененного кода дали, а автор вопроса может и не знать, как правильно объявить в разделах. Поэтому он не справился с вашим куском и он не пошел. А я привел целый код и притом не такой же как у вас.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 16:51 [#25]:
извиняюсь.
проверял изначально нули выдавало
проверил еще раз. все работает.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 16:52 [#26]:
да мне не жаль баллов. спасибо обоим за помощь
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:52 [#27]:
Цитата (Паровоз):
"Чем же он нерабочий?" "выдает неверные данные на выходе"
Что Вы за ерунду говорите - у нас с Жикльором один и тот же код.
И ошибка у вас заключается в присвоении счетчику единицы, а нужно нуль. Из-за этого у вас количество станций увеличивается на единицу -> вывод: неправильно решено задание.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 16:56 [#28]:
2 паровоз
изначально ваш код некорректен был.
изменили бы входные данные для разнообразия.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 17:42 [#29]:
To Жикльо:
"А почему ты так сильно ухватился за эту тему?"
Не надо мне хамить и показывать свое невежество. Первоначальный минимум устанавливается выше максимальной цены и при первом же проходе счетчик сбрасывается в единицу. Пошевелите немного мозгами.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 17:44 [#30]:
P.S.
"автор вопроса может и не знать, как ..."
А вот для этого и существут минифорум.
|
|
unl0K (статус: Посетитель), 6 декабря 2009, 18:11 [#31]:
Да и вообще, правила для чего?
Дублировать код нельзя, а я замечаю это уже не первый раз.
Администрация даже не наказывает...
--
https://expert.delphi-int.ru/help/rules/
Относись к людям так, как хотел бы, чтобы они к тебе относились!
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 18:47 [#32]:
Это не дубляж кода! Я исправил его ошибку, тем более в автора вопроса этот код не пошел, поэтому я скинул свою идею.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 18:54 [#33]:
To Жикльор:
Не фантазируйте. Никакой ошибки у меня нет.
В примере автора вопрса от 6 декабря 2.09, 11:22 мой код показвает те же данные, что и написанная вами позже программа. А автор вопроса просто ввел всех в заблуждение.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 19:14 [#34]:
"я скинул свою идею"
Вся Ваша идея заключалась в том, что у меня счетчик сразу устанавливался в 1, а Вы сначала его обнуляли и потом увеличивали на единицу, т.е. одно действие заменили двумя.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 19:15 [#35]:
2 паровоз.
вы сами ввели себя в заблуждение. и прежде чем отвечать проверили бы работоспособность программы на примере ввода других данных. по данным, которые предоставил я она работает исправно, но при других полную чушь выдает
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 19:33 [#36]:
Вот Ваши данные:
lukoil1 lenina 92 2350
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 2359
ВЫВОД
1 2 2
Что в ответе неправильно?
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 19:38 [#37]:
lukoil1 lenina 92 2359
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 2353
это введите.
он выведет 3 2 2
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 19:40 [#38]:
Но нужно подставить и другие... Если она 1 раз заработал, то это еще не означает то, что она рабочая. Я проверял ее 6 раз с разными данными и вариантами. И почему вы так вцепились в этот вопрос?? Их еще будет очень много впереди...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 19:50 [#39]:
To I{ () T :
Что-то Вы тоже фантазируете, у меня она выводит
1 2 2
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 19:51 [#40]:
"И почему вы так вцепились в этот вопрос"
Так это Вы вцепились, а не я.
|
Страницы: [« Предыдущая] [1] [2] [3] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|