Ссылки, списки, динамические структуры данных - PascalABC.NET
Формулировка задачи:
вот основная программа:
как теперь вывести все эти машины, но чтобы объём цилиндра был от большего к меньшему?
Решение задачи: «Ссылки, списки, динамические структуры данных»
textual
Листинг программы
program laba7_5; type mashina = record md: string; tx: record moshn: string; km: 1..200; massa: 1..200; vkyz: string; cil: 1..200; end; cena: real; end; const max_sz = 10; var // r: array[1..max_sz] of mashina; ix: array[1..max_sz] of integer; r: array[1..max_sz] of mashina := ( (md: 'model1'; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 5); cena: 1), (md: 'model2'; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 2); cena: 1), (md: 'model3'; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 7); cena: 1), (md: 'model4'; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 4); cena: 1), (md: 'model5'; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 2); cena: 1), (md: ''; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 1); cena: 1), (md: ''; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 1); cena: 1), (md: ''; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 1); cena: 1), (md: ''; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 1); cena: 1), (md: ''; tx: (moshn: ''; km: 1; massa: 1; vkyz: ''; cil: 1); cena: 1) ); r1: mashina; i, j, t, n, max: integer; begin n := 5; // будем считать,что ввели данные на 5 машин (* write('Введите кол-во машин: '); readln(n); writeln(); for i := 1 to n do begin writeln(); write('модель: '); readln(r[i].md); write('мощность: '); readln(r[i].tx.moshn); write('скорость: '); readln(r[i].tx.km); write('масса: '); readln(r[i].tx.massa); write('вид кузова: '); readln(r[i].tx.vkyz); write('объем цилиндра: '); readln(r[i].tx.cil); write('цена: '); readln(r[i].cena); end; *) for i := 1 to n do ix[i] := i; // индексный массив, чтобы не перетасовывать все время сами структуры // сортируем индексный массив так, чтобы при проходе по массиву данных по этим индексам данные были // упорядочены по значению определенного поля for i := 1 to n do for j := n downto i + 1 do if r[ix[j - 1]].tx.cil < r[ix[j]].tx.cil then begin t := ix[j];ix[j] := ix[j - 1];ix[j - 1] := t; // Swap(ix[j - 1], ix[j]); end; writeln('---------------------------------------------------------------------------------------'); writeln('| | ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ | |'); writeln('| модель |------------------------------------------------------------------| цена |'); writeln('| | мощность | скорость | масса | вид кузова | раб. цилиндра | (руб)|'); writeln('---------------------------------------------------------------------------------------'); for i := 1 to n do with r[ix[i]] do // и теперь работаем не напрямую с r[i], а через "прослойку" begin write('|', md:11, '|'); write(tx.moshn:10, '|'); write(tx.km:10, '|'); write(tx.massa:7, '|'); write(tx.vkyz:12, '|'); write(tx.cil:23, '|'); writeln(cena:6, '|'); writeln('---------------------------------------------------------------------------------------'); end; end.
Объяснение кода листинга программы
- Объявлен тип данных
mashina
, который представляет собой запись (record) с полями: md (модель), tx (технические характеристики), cena (цена). - Введен массив
r
типаmashina
размером 5, инициализированный некоторыми значениями. - Введен индексный массив
ix
размером 5, инициализированный значениями от 1 до 5. - Введен переменный массив
r1
типаmashina
. - Введены переменные
n
,i
,j
,t
,max
типаinteger
. - Введен цикл, который будет выполняться
n
раз, гдеn
- количество введенных пользователем машин. - В каждой итерации цикла пользователю предлагается ввести данные для каждой машины.
- После ввода данных, происходит сортировка индексного массива
ix
по убыванию значения поляcil
каждой машины. - Выводится отсортированный список машин с их техническими характеристиками и ценой.
- Каждая машина выводится в отдельной строке в формате:
модель | мощность | скорость | масса | вид кузова | объем цилиндра | цена |
.