Экспертная система 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, 01:05 [#1]:

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

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

2 Паровоз
на выходе ошибочные данные выводит.
=====пример
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
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Жикльор

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

Я сделал, чтобы он искал дешевый бензин каждой марки. А уже зная цену дешевого бензина, можно и сказать сколько заправок продают его.

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

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

2 Жикльор
вы неправильно поняли условие.
по ващему sourse`sy он находит БЕЗОШИБОЧНО 3 самые низкие цены. а надо чтобы он нашел кол-во повторяющихся САМЫХ НИЗКИХ ЦЕН. в вопросе пример ввода и вывода к нему есть.
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Жикльор

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

Сейчас сделаю подсчет...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

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

Жестко извиняюсь...
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

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

Вот код:
program Project2;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils,
  strUtils;
 
var f1,f2:text;
  str,company,street,str1:string;
  k,k1,sort,cost,n92,n95,n98,c92,c95,c98: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
      begin
        n92:=cost;
        c92:=0;
        end;
      if cost = n92 then
      c92:=c92+1;
    end;
 //-----------------
    if sort=95 then
    begin
      if (cost<n95) or (cost = 0) then
      begin
        n95:=cost;
        c95:=0;
        end;
      if cost = n95 then
      c95:=c95+1;
    end;
//--------------------
    if sort=98 then
    begin
      if (cost<n98) or (cost = 0) then
        begin
        n98:=cost;
        c98:=0;
        end;
      if cost = n98 then
      c98:=c98+1;
    end;
end;
str1:=intToStr(n92)+' '+intToStr(n95)+' '+intToStr(n98);
writeln(f2,str1);
str1:=intToStr(c92)+' '+intToStr(c95)+' '+intToStr(c98);
writeln(f2,str1);
close(f1);
close(f2);
end.
В первой строке цена дешевого бензина, а в второй количество станций с этой ценой.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
I{ () T

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

Жикльор:
ОГРОМНОЕ СПАСИБО!!!!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
I{ () T

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

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

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

"Жикльор:
ОГРОМНОЕ СПАСИБО!!!!"

Вообще то код Жикльора был написан раньше в моем ответе.
I{ () T

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

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

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

А где же мои 5 баллов за такую работу?

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

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

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

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

Но это кратковременная программа. Вы создали документ в котором указали все исходные данные, а программа - это просто обработчик этих данных. Вы ее когда запустите, то она сразу же завершится, то есть загружать потоки она не будет. Ну а если вы все равно хотите узнать сколько она потребует памяти, то я думаю можно использовать Диспетчер задач Windows. В исходном коде добавьте строку readln в конце для задержки программы. Тогда вызываете Диспетчер и в процессах находите вашу программу, а справа в колонке пишется объем используемый программой.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
Жикльор

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

Там же пишется и загрузка ЦП, но она будет равна 0.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
I{ () T

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

вот например. http://acmp.ru/index.asp?main=task&id_task=232
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Паровоз

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

"ваш вариант нерабочий"

Чем же он нерабочий?
I{ () T

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

"Чем же он нерабочий?"
выдает неверные данные на выходе
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
Жикльор

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

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

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

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

Страницы: [1] [2] [3] [Следующая »]

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

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 12:01
Выполнено за 0.05 сек.