|
Вопрос # 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, 01:05 [#1]:
Не очень понятный вопрос, ошибки нету, если и есть, то семантическая, такую сложно найти. Можете более подробно описать вашу проблему?
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
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 (статус: Посетитель), 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 (статус: Посетитель), 6 декабря 2009, 11:56 [#8]:
Жикльор:
ОГРОМНОЕ СПАСИБО!!!!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 14:22 [#9]:
а как узнать, сколько программа кушает оперативы, т.е. на сколько она эффективна?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 14:56 [#10]:
"Жикльор:
ОГРОМНОЕ СПАСИБО!!!!"
Вообще то код Жикльора был написан раньше в моем ответе.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 15:20 [#11]:
2 паровоз.
ваш вариант нерабочий
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 15:37 [#12]:
А где же мои 5 баллов за такую работу?
Учитывая то, что сейчас компьютеры очень мощные для таких задач, могу сказать что оно вам не нужно.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 15:43 [#13]:
и все же. как можно определить. вот например будет ограничение на память, по условию задания. как определить?
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 15:50 [#14]:
Но это кратковременная программа. Вы создали документ в котором указали все исходные данные, а программа - это просто обработчик этих данных. Вы ее когда запустите, то она сразу же завершится, то есть загружать потоки она не будет. Ну а если вы все равно хотите узнать сколько она потребует памяти, то я думаю можно использовать Диспетчер задач Windows. В исходном коде добавьте строку readln в конце для задержки программы. Тогда вызываете Диспетчер и в процессах находите вашу программу, а справа в колонке пишется объем используемый программой.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 15:53 [#15]:
Там же пишется и загрузка ЦП, но она будет равна 0.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
Паровоз (статус: 10-ый класс), 6 декабря 2009, 16:03 [#17]:
"ваш вариант нерабочий"
Чем же он нерабочий?
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 16:13 [#18]:
"Чем же он нерабочий?"
выдает неверные данные на выходе
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
|
Жикльор (статус: 5-ый класс), 6 декабря 2009, 16:15 [#19]:
Это же оно и есть.
Если бы строители строили дома так, как программисты пишут программы, то первый же дятел уничтожил бы цивилизацию.
|
|
I{ () T (статус: Посетитель), 6 декабря 2009, 16:19 [#20]:
проверить пробовали? нули выдает!!!
у меня нет мании величия...Великие люди этим не страдают)))
.......лень порождает ненависть к жизни......
|
Страницы: [1] [2] [3] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|