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

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

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

Автор: Desktop II 28.03.2006 21:39

Дано три страны. Напечатать списко стран в порядке спаданя
плотность населения, указать количесвто школ, больниць, ВУЗов которые
припадають на 1000 человек.

Как сделать условие что бы страны выводило в порядке спадание плотности населения ? И количесвто школ, больниць, ВУЗов которые припадають на 1000 человек?

Что я сделал.
<--->

Автор: FreeMan 28.03.2006 21:45

shkoly/nas*1000 - колво школ на 1000 населения

а насчёт плотности - отсортируй массив. плотность=nas/plosh

Автор: Desktop II 28.03.2006 22:25

Не совсем понял как в даном случае отсортировать массив....

Вот код но он работает:
<--->

Автор: мисс_граффити 29.03.2006 1:18

Цитата(Desktop II @ 28.03.2006 18:25) *
Не совсем понял как в даном случае отсортировать массив....
Вот код но он работает

мм?
так пугает работающий код?
если серьезно - глюк здесь.
for i:=1 to 3 do 
begin
max:=masv[i];
l:=i;
while j>=3 do
begin
if max<masv[j] then
begin
max:=masv[j];
l:=j;
end;
j:=j+1;
end;
masv[l]:=masv[i];
masv[i]:=max;
end;

тебе же надо сортировать по плотности?
вот и сравнивай плотности! то есть не masv[i], а masv[i].plot

Автор: Desktop II 29.03.2006 13:23

С сортировкой я уже разобрался. Но нде мне надо расположить нахождение площяди Plot:=nas/plosh; и в писать его в запись. Тоже самое с бальницами вузами и школами где мне расположить йх
mshk:=(shkoly/nas)*1000; mbol:=(bolnic/nas)*1000; mwuz:=(wuzy/nas)*1000; ???
writeln('Na 1000 chelovek shkol',b[i].mshk);
writeln('Na 1000 chelovek bolnic',b[i].mbol);
writeln('Na 1000 chelovek',b[i].mwuz);
<--->

Автор: мисс_граффити 29.03.2006 13:42

plot:=nas/plosh;readln(b[i].plot); 

сделай так, если хочешь хранить
b[i].plot:=b[i].nas/b[i].plosh; 


а вот эти переменные
procedure Input(var b : TBase);
var
plot: real;
nas:integer;
plosh:integer;

тебе вообще зачем?

Автор: Desktop II 29.03.2006 14:05

Я правильно понял сюда надо ставить нахождение плотности населения ?
И там же больницы вузы и школы на 1000 человек ?
Если так поставить b[i].plot:=b[i].nas/b[i].plosh; то пишет тип неверный ( Type mistmatch ).

procedure Input(var b : TBase);
var
i : byte;

begin
for i := 1 to n do begin
write('Vvedite nazv strani');readln(b[i].nazv);
write('Ploshad');readln(b[i].plosh);
write('Kolichestvo naseleniya');readln(b[i].nas);
write('Kolichestvo shkol');readln(b[i].shkoly);
write('Kolichestvo bolnic');readln(b[i].bol);
write('Kolichestvo WUZov');readln(b[i].wuzy);
b[i].plot:=b[i].nas/b[i].plosh;
writeln;
end;
end;

Автор: F.I.A.T. 29.03.2006 14:13

Цитата(Desktop II @ 29.03.2006 10:05)
Если так поставить b[i].plot:=b[i].nas/b[i].plosh; то пишет тип неверный ( Type mistmatch ).

Type Mismatch - это несоответствие типов. Кстати, совершенно правильно пишет: тип Byte не может хранить данные вещественного типа... Используй Trunc, если тебе достаточно целой части, или меняй тип поля plot на real...

Автор: Desktop II 29.03.2006 14:45

Вроде все работает только ответы минусовые, почему ?
Vivido posle sortirovki:
Nazvnie: StranaII
Ploshyad: 16960
Naselenie: -26368
Shkol: 4000
Bolnic: 5000
Wuzov: 100
Plotnost: -1.5547169811E+00
Na 1000 chelovek shkol-1.5169902913E+02
Na 1000 chelovek bolnic-1.8962378641E+02
Na 1000 chelovek-3.7924757282E+00
Nazvnie: StranaI
Ploshyad: 13568
Naselenie: -25536
Shkol: 2500
Bolnic: 4000
Wuzov: 1000
Plotnost: -1.8820754717E+00
Na 1000 chelovek shkol-9.7901002506E+01
Na 1000 chelovek bolnic-1.5664160401E+02
Na 1000 chelovek-3.9160401003E+01

uses crt;
const
n = 2;
type
TRec = record
nazv : string;
plosh,shkoly,bol,wuzy,nas:integer;
plot : real;

end;
TBase = array [1..n] of TRec;

procedure Input(var b : TBase);
var
i : byte;

begin
for i := 1 to n do begin
write('Vvedite nazv strani');readln(b[i].nazv);
write('Ploshad');readln(b[i].plosh);
write('Kolichestvo naseleniya');readln(b[i].nas);
write('Kolichestvo shkol');readln(b[i].shkoly);
write('Kolichestvo bolnic');readln(b[i].bol);
write('Kolichestvo WUZov');readln(b[i].wuzy);
b[i].plot:=b[i].nas/b[i].plosh;
b[i].mshk:=(b[i].shkoly/b[i].nas)*1000;
b[i].mbol:=(b[i].bolnic/b[i].nas)*1000;
b[i].mwuz:=(b[i].wuzy/b[i].nas)*1000;
writeln;
end;
end;

procedure Print(b : TBase);
var
i : byte;
begin
for i := 1 to n do begin
writeln('Nazvnie: ',b[i].nazv);
writeln('Ploshyad: ',b[i].plosh);
writeln('Naselenie: ',b[i].nas);
writeln('Shkol: ',b[i].shkoly);
writeln('Bolnic: ',b[i].bol);
writeln('Wuzov: ',b[i].wuzy);
writeln('Plotnost: ',b[i].plot);
writeln('Na 1000 chelovek shkol',b[i].mshk);
writeln('Na 1000 chelovek bolnic',b[i].mbol);
writeln('Na 1000 chelovek',b[i].mwuz);
end;
end;

procedure Sort(var b : TBase);
var
i : byte;
temp : TRec;
flag : boolean;
begin
repeat
flag := true;
for i := 1 to n - 1 do
if not (b[i].plot >= b[i+1].plot) then begin
temp := b[i];
b[i] := b[i + 1];
b[i + 1] := temp;
flag := false;
end;
until flag;
end;

var
base : TBase;
begin
clrscr;
writeln('Ввод данных : ');
Input(base);
clrscr;
writeln('Вывод до сортировки : ');
Print(base);
Sort(base);
writeln;
writeln('Вывод после соритровки : ');
Print(base);
readln;
end.

Автор: F.I.A.T. 29.03.2006 14:54

Цитата
Вроде все работает только ответы минусовые, почему ?
То-есть, нам предлагается телепатически определить, какие ты данные вводил? Или ты все-таки приведешь их САМ? Есть идея, что было введено "Население" больше 32767, произошло переполнение, результат ушел в минус.

Используй более емкий тип: LongInt, например.

Автор: Desktop II 29.03.2006 14:57

В первом площядь 600000
во втором площядь 1000000
в первом население было 32000000
во втором 80000000
население и площядь впринцепи не должно миняться.

------
Сделал LongINT стало все работать.

Nazvnie: Strana II
Ploshyad: 1000000
Naselenie: 80000000
Shkol: 2500
Bolnic: 4000
Wuzov: 1000
Plotnost: 8.0000000000E+01
Na 1000 chelovek shkol 3.1250000000E-02
Na 1000 chelovek bolnic 5.0000000000E-02
Na 1000 chelovek 1.2500000000E-02
Nazvnie: Strana I
Ploshyad: 600000
Naselenie: 32000000
Shkol: 4000
Bolnic: 5000
Wuzov: 100
Plotnost: 5.3333333333E+01
Na 1000 chelovek shkol 1.2500000000E-01
Na 1000 chelovek bolnic 1.5625000000E-01
Na 1000 chelovek 3.1250000000E-03

Большое всем спасибо !