Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Задача на записи

Автор: sintanial 15.05.2008 13:52

Простите за беспокойство но у меня проблема, которую не могу решить.
И так нам в универе тему Record почти не объясняли, так как учитель заболел. И за месяц у нас была только одна пара( и то замещали) на которой другой учитель написал две задачки на доске как пример и все- одним словом тему нам не объясняли. А по практике уже требуют что бы я сдал задачку. Помогите пожалуйста с задачей

Вот собственно и она:
Даны сведения о расходе топлива на автобазах города :№ автобазы, количество израсходованного топлива, количество автомашин на базе. Подсчитать средний расход топлива на одну автомашину на каждой базу и в целом городе. Результат оформить в виде таблицы.

Пожалуйста можете помочь решить задачку и растолковать тупому =), что бы следующую задачу сам смог бы решить =)

З.ы. Вроде по форуму искал но похожей задачки не нашел. Лазил в FAQ и нашел только это http://forum.pascal.net.ru/index.php?showtopic=9198, почитал , но пока что мало что понял.

Автор: compiler 15.05.2008 19:25

у меня получилось как-то так:



type
data = ^node;
node = record
number, gas, num : integer;
next : data;
end;

procedure init(var p: data);
var
p_new, tail: data;
i, n : integer;
begin
tail := nil;
write('Введите количество баз: '); readln(n);
for i:=1 to n do begin
writeln('База# ', i);
new(p_new);
p_new^.next := nil;
p_new^.number := i;
write('Введите количество израсходованного топлива: '); readln(p_new^.gas);
write('Введите количество автомашин на базе: '); readln(p_new^.num);

if tail = nil then p := p_new else tail^.next := p_new;
tail := p_new;

writeln;
end;
writeln;
end; { init }

procedure free(var p: data);
var p_old: data;
begin
while p <> nil do begin
p_old := p;
p := p^.next;
dispose(p_old);
end;
end; { free }

procedure print(p: data);
function my_div(const k,l : longint):real;
begin
if l<>0 then my_div:= k/l else my_div:=0;
end; { my_div }
var
sum_gas, sum_num : longint;
begin
sum_num:=0;
sum_gas:=0;
if p<>nil then writeln(' # ', 'машин', ' исп. ', ' средн.');
while p <> nil do begin
sum_num:= sum_num+ p^.num;
sum_gas:= sum_gas+ p^.gas;
writeln(p^.number:3, p^.num:5, p^.gas:5, my_div(p^.gas, p^.num):7:2);
p := p^.next;
end;
writeln;
writeln('Средний разход: ', my_div(sum_gas,sum_num):7:2);
end; { print }

var list : data;

begin
init(list);
print(list);
free(list);
end.

таблицу украшай сам как знаешь)

Автор: kosyak 15.05.2008 19:35

Ну вот структура твоей записи, на сколько я понял:

Код

const n=100;            {Пусть будет 100 баз в городе}

Type
    TAutoBase=record        {Запись одной автобазы}
        nuber: integer;    {Номер автобазы}
        topl: real;        {Кол-во израсходованного топлива на всю базу, как я понял}
        AutoNum: integer    {Кол-во машин}
        SrednRash: real;    {Средний расход топлива на этой базе}
    end;
    
    AutoBases: array [1..n] of TAutoBase;    {Массив баз в городе}


compiler, я думаю если sintanial не понимает записи, то врятли он понимает динамические переменные... Наверно лучше пока без них обойтись

Автор: volvo 15.05.2008 19:40

Цитата
const n=100;
...
А у него в городе 102 базы... Ну, вот такой мегаполис... И все? Меняем исходники?

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

Цитата
если sintanial не понимает записи, то врятли он понимает динамические переменные
Чем раньше он начнет работать с динамикой, тем лучше.

Автор: sintanial 15.05.2008 19:40

Спасибо вам большое добрые люди. Щаз буду разбираться =). Если что готовьтесь буду задавать вопросы =)
ЕЩЕ РАЗ ОГРОМНОЕ СПАСИБО

Добавлено через 17 мин.
Че то я вообще почти не че не понимаю =) . Что ето означает data = ^node; ? А именно значок ^ - она везде но не могу понять для чего =) Вот щас читаю в FAQ http://forum.pascal.net.ru/index.php?showtopic=2706 однако мало что доходит =) .
Что дает функция nil ? ?

Автор: dream-x 15.05.2008 20:00

Ну я тут попроще сделал нежели compiler, но все равно работает.
Вот код:

Program sclad;
Type
Baza = record
AvtoBaz:string[20];
Avto:integer;
Toplivo:integer;
end;
Var
r:real;
i,n:integer;
Gorod:string[20];
tbl:array[1..25] of Baza;
Begin
Writeln('Город:');
Read(gorod);
Writeln('Число автобаз');
read(n);
For i:=1 to N do
With tbl[i] do
Begin
Writeln('название автобазы');
Read(AvtoBaz);
Writeln('количество машин');
Read(Avto);
Writeln('количество топлива');
Read(Toplivo);
end;
Writeln('*****************************************');
writeln('* ',gorod,' *');
Writeln('*****************************************');
For i:=1 to N do
With tbl[i] do
Begin
Writeln('*',i,'*',AvtoBaz,'*',Avto,'*',Toplivo,'*');
end;
Writeln('*****************************************');
Writeln('Средний расход топлива на 1 машину составляет');
For i:=1 to n do
With tbl[i] do
writeln(avtobaz,' = ', toplivo/avto);

Writeln('Средний расход топлива по городу');
r:=0;
For i:=1 to n do
With tbl[i] do
r:=toplivo+r;
Writeln('расход=',r);
End.


Автор: sintanial 15.05.2008 20:05

dream-x . Спасибо большое это понятнее намного.
Люди спасибо за проделанный труд , мне аж стыдно что отнял у вас время =)

Автор: renesko1 15.05.2008 21:19


type
data = ^node; // ип data это указатель на тип записи node (точнее на ячейку памяти где лежит node)
node = record
number, gas, num : integer;
next : data; // тож самое
end;
...
var
p_new, tail: data; // указатели на на тип записи node
i, n : integer;


Представь вагоны smile.gif : сцепка это указатель (next : data;) на следующий вагон.
Мы знаем как попасть на 1 вагон. Что бы перейти во 2 вагон нпм надо взять из первого вагона указатель
на следующий и перейти на него. В 3 : сделать это 2 раза(поасть в 1 вагон из НЕГО в 2 из 2 в 3).

while p <> nil do begin//пока указатель p ссылается на что то (пока не конец состава)
действия с записью на которую ссылается указатель допустим writeln()(разбмваем стекла или чиним скамейки)
p := p^.next ;// переходим к следующей записи(переход в след. вагон)
end ;


Точнее мы работаем с памятью где запись лежит те с записью.
Здесь могут быть некие не точности с формулировкой и понятиями : память и запись, но в целом
динамические структуры мощьный инструмент с которым удобно работать.
Лично я когда читал про них представлял их так, может тебе это поможет, после поймешь, что они есть добро.
ps
Глупый пример, но перенос сложных вещей на простые примеры помагает моему мозгу не рухнуть в рутину.

Автор: kosyak 15.05.2008 21:47

Цитата(volvo @ 15.05.2008 16:40) *

А у него в городе 102 базы... Ну, вот такой мегаполис... И все? Меняем исходники?

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

Чем раньше он начнет работать с динамикой, тем лучше.


Согласен, я бы тоже с динамикой сделал... но не надо запрыгивать вперед, если еще не знаешь основ... Кстати, я оказался прав, он не понял твой код

Автор: compiler 15.05.2008 22:13

Цитата(kosyak @ 15.05.2008 17:47) *
Согласен, я бы тоже с динамикой сделал... но не надо запрыгивать вперед, если еще не знаешь основ... Кстати, я оказался прав, он не понял твой код
первое, не надо отождествлять меня и volvo, ты к кому обращаешься?
второе, а если бы он знал списки? что тогда? это точно такие основы как и записи, имхо.
а потом если не разбирать неизвестный код, то некогда ничего не понять, опять имхо.
но это еще не все - этот код может понадобится другим, желающим учится.

Автор: kosyak 15.05.2008 22:32

Цитата(compiler @ 15.05.2008 19:13) *

первое, не надо отождествлять меня и volvo, ты к кому обращаешься?
второе, а если бы он знал списки? что тогда? это точно такие основы как и записи, имхо.
а потом если не разбирать неизвестный код, то некогда ничего не понять, опять имхо.
но это еще не все - этот код может понадобится другим, желающим учится.


Извини, ошибся...
Я просто не знаю способов создать список не используя записи... и вроде везде проходят сначала записи, а потом и динамические структуры(ИМХО)

Автор: compiler 15.05.2008 23:43

Цитата(kosyak @ 15.05.2008 18:32) *
и вроде везде проходят сначала записи, а потом и динамические структуры(ИМХО)
я не знаю как "везде", я никогда специально задачи на структуры не решал, а с динамическими массивами познакомился довольно рано...

Автор: kosyak 15.05.2008 23:45

Цитата(compiler @ 15.05.2008 20:43) *

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


И ты их без записей делал?

Автор: compiler 16.05.2008 0:14

Цитата(kosyak @ 15.05.2008 19:45) *
И ты их без записей делал?
сначала, мне было достаточно готовых модулей, а потом я открыл для себя FPC, где всё уже реализовано... знание записей пришло как-то само)