Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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

Приложение:
  1. program Project2;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6. SysUtils,
  7. strUtils;
  8.  
  9. var f1,f2:text;
  10. str,company,street,str1:string;
  11. k,k1,sort,cost,i,min92,min95,min98, n92,n95,n98:integer;
  12. begin
  13. n92:=0;
  14. n95:=0;n98:=0;
  15. assignFile(f1,'f1.txt');reset(f1);
  16. assignFile(f2,'f2.txt');rewrite(f2);
  17. while not eof(f1) do
  18. begin
  19. readln(f1,Str);
  20. k:=Pos(' ',Str);
  21. company:=Copy(Str,1,k-1);
  22. k1:=PosEx(' ',Str,k+1);
  23. street:=Copy(Str,k,k1-k);
  24. k:=k1;
  25. k1:=PosEx(' ',Str,k+1);
  26. sort:=StrToInt(Copy(Str,k,k1-k));
  27. k:=k1;
  28. k1:=length(Str);
  29. cost:=StrToInt(Copy(Str,k+1,k1-k));
  30.  
  31. //----------------------
  32. begin
  33. if sort=92 then
  34. begin
  35.  
  36. if cost<0 then min92:=cost;
  37. for i:=k+1 to k1-k do
  38. if cost<min92 then
  39. min92:=cost;
  40. end;
  41. if sort=min92 then inc(n92);
  42. end;
  43. //-----------------
  44. begin
  45. if sort=95 then
  46. begin
  47. for i:=k+1 to k1-k do
  48. if cost<0 then min95:=cost;
  49. for i:=k+1 to k1-k do
  50. if cost<min95 then
  51. min95:=cost;
  52. end;
  53. if sort=min95 then inc(n95);
  54. end;
  55. //--------------------
  56. begin
  57. if sort=98 then
  58. begin
  59. for i:=k+1 to k1-k do
  60. if cost<0 then min98:=cost;
  61. for i:=k+1 to k1-k do
  62. if cost<min98 then
  63. min98:=cost;
  64. end;
  65. if sort=min98 then inc(n98);
  66. end;
  67. end;
  68. str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
  69. writeln(f2,str1);
  70. close(f1);close(f2);
  71. readln;
  72. end.
  73.  


Примечание #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 Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: 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

I{ () T (статус: Посетитель), 6 декабря 2009, 16:51 [#25]:

извиняюсь.
проверял изначально нули выдавало
проверил еще раз. все работает.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

I{ () T (статус: Посетитель), 6 декабря 2009, 16:52 [#26]:

да мне не жаль баллов. спасибо обоим за помощь
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Жикльор

Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:52 [#27]:

Цитата (Паровоз):

"Чем же он нерабочий?" "выдает неверные данные на выходе"

Что Вы за ерунду говорите - у нас с Жикльором один и тот же код.


И ошибка у вас заключается в присвоении счетчику единицы, а нужно нуль. Из-за этого у вас количество станций увеличивается на единицу -> вывод: неправильно решено задание.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
I{ () T

I{ () T (статус: Посетитель), 6 декабря 2009, 16:56 [#28]:

2 паровоз
изначально ваш код некорректен был.
изменили бы входные данные для разнообразия.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Паровоз

Паровоз (статус: 10-ый класс), 6 декабря 2009, 17:42 [#29]:

To Жикльо:
"А почему ты так сильно ухватился за эту тему?"

Не надо мне хамить и показывать свое невежество. Первоначальный минимум устанавливается выше максимальной цены и при первом же проходе счетчик сбрасывается в единицу. Пошевелите немного мозгами.
Паровоз

Паровоз (статус: 10-ый класс), 6 декабря 2009, 17:44 [#30]:

P.S.
"автор вопроса может и не знать, как ..."

А вот для этого и существут минифорум.
unl0K

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

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

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] [Следующая »]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 00:00
Выполнено за 0.04 сек.