В строке данных записаны 30 чисел от 1 до 8, показывающих, в каком направлении дул ветер в соответствующий день месяца (1-северный, 2-северо-восточный, 3-восточный, 4-юго-воточный, 5 южный, 6-юго-западный, 7-западный, 8-северо-западный).
Вывести на экран ”розу ветров” - многоугольник, вершинами которого лежат на 8-лучах, выходящих из общего центра с равным углами, расстояния от вершины до этого центра пропорционально дней месяца, в который дул соответствующий ветер.
Нашёл программу примера ”розы ветров”.
Без файла никак нельзя? Просто там 40 с лишним задач на массивы, и парочка из них в виде зачётных. Вот "Роза ветров одна из них". Ну через недели две надеюсь. Я ещё по строкам кроссворд не сдал. Сможете помочь?! По "розе ветров".
Ну, вот что-то такое:
(это без оптимизации, можно еще "причесать" код программы, добавить пару функций, код будет выглядеть гораздо красивее)
uses graph;
type
Dir = (
N, NE, E, SE, S, SW, W, NW
);
arrType = array[Dir] of integer;
procedure read_data(var arr: arrType);
var
i, X: integer;
ix: Dir;
begin
for ix := low(Dir) to
high(Dir) do arr[ix] := 0;
for i := 1 to 30 do begin
read(X);
inc(arr[Dir(pred(X))]);
end;
readln;
end;
procedure line_polar(phi_st, r_st, phi_fn, r_fn: real);
const mult = 25;
begin
line(
(getmaxx div 2) + trunc(mult * r_st*cos(phi_st)),
(getmaxy div 2) - trunc(mult * r_st*sin(phi_st)),
(getmaxx div 2) + trunc(mult * r_fn*cos(phi_fn)),
(getmaxy div 2) - trunc(mult * r_fn*sin(phi_fn))
);
end;
var
arr: arrType;
i, j, start, finish, amount: integer;
gDriver, gMode, errCode: integer;
begin
read_data(arr);
initgraph(gDriver, gMode, '');
errCode := graphresult;
if errCode <> grOk then begin
writeln('error: ', grapherrormsg(errCode));
readln; halt(100);
end;
start := ord(low(Dir));
finish := ord(high(dir));
amount := finish - start + 1;
for i := 1 to 2 do begin
j := arr[Dir(start)];
move(arr[Dir(start + 1)], arr[Dir(start)], (amount - 1) * sizeof(j));
arr[Dir(finish)] := j;
end;
for i := start to finish do begin
setcolor(white);
line_polar(0, 0, i * (360 div amount) * (Pi / 180), 10);
if i = finish then j := start else j := i + 1;
setcolor(red);
line_polar(i * (360 div amount) * (Pi / 180), arr[Dir(i)],
j * (360 div amount) * (Pi / 180), arr[Dir(j)])
end;
readln;
closegraph;
end.
volvo ты просто молодец. Именно такой ввод нужен. А как можно будет узнавать когда и в каком направлении дул ветер? Что насечки с надписями выводить или что. Плиз допомогите. Спасибо.
"в каком направлении дул ветер в соответствующий день месяца"-в условии задачи.
Я вроде бы когда показывал тот первый вариант который выложил здесь, мне что-то про дни преподаватель говорил. Ну просто если несложно или возможно помоги. В любом случае покажу два варианта. Спасибо.
В задании про другое:
Да ты прав. Извини. Всё понял. Спасибо за помощь. Именно так и надо было как ты сделал. Ещё раз огромное спасибо!
Есть немного доработанная версия у меня на сайте... Можешь забрать оттуда:
http://volvo1971.nm.ru/home/tasks.htm#wind_rose
Извините, но это снова я.
Посмотрев твой вариант volvo сдал вот такой вот вариант.
uses graph,crt;
type
Dir = (E,NE,N,NW,W,SW,S,SE);
arrType = array[Dir] of integer;
const
titles: array[Dir] of string = ('E','NE','N','NW','W','SW','S','SE');
start = ord(low(Dir));
finish = ord(high(dir));
amount = finish - start + 1;
sector = (360 div amount) * (Pi / 180);
{--------------------------------------------------}
function read_data(var arr:arrType):integer;
var
i,X,max:integer;
ix:Dir;
begin
for ix:=low(Dir) to
high(Dir) do arr[ix]:=0;
for i:=1 to 30 do begin
read(X);
if X <= 3 then X:=4-X else X:=12 - X;
inc(arr[Dir(pred(X))]);
end;
max:=0;
for ix:=low(Dir) to high(Dir) do
if arr[ix]>max then max:=arr[ix];
read_data:=max;
readln;
end;
{--------------------------------------------------}
var center_x, center_y:integer;
const mult=20;
{--------------------------------------------------}
function get_x(r,phi:real):integer;
begin
get_x:=center_x + trunc(mult * r * cos(phi));
end;
{--------------------------------------------------}
function get_y(r,phi:real):integer;
begin
get_y:=center_y - trunc(mult * r * sin(phi));
end;
{--------------------------------------------------}
procedure line_polar(phi_st,r_st,phi_fn,r_fn:real);
begin
line(
get_x(r_st,phi_st), get_y(r_st,phi_st),
get_x(r_fn,phi_fn), get_y(r_fn,phi_fn)
);
end;
{--------------------------------------------------}
procedure text_polar(phi,r:real; const T:string);
begin
outtextxy(get_x(r,phi), get_y(r,phi),T);
end;
{--------------------------------------------------}
procedure circle_polar(phi,r:real;radius:integer);
begin
circle(get_x(r,phi), get_y(r,phi), mult*radius);
end;
{--------------------------------------------------}
var
arr:arrType;
i,j,max_val,gdriver,gmode:integer;
begin
ClrScr;
GotoXY(2,2); Writeln('N=1');
GotoXY(2,3); Writeln('NE=2');
GotoXY(2,4); Writeln('E=3');
GotoXY(2,5); Writeln('SE=4');
GotoXY(2,6); Writeln('S=5');
GotoXY(2,7); Writeln('SW=6');
GotoXY(2,8); Writeln('W=7');
GotoXY(2,9); Writeln('NW=8');
max_val := read_data(arr);
initgraph(gDriver, gMode, 'd:\bp\bgi');
center_x := getmaxx div 2;
center_y := getmaxy div 2;
for i := start to finish do begin
setcolor(white);
line_polar(0, 0, i * sector, 10);
text_polar(i * sector, 11, titles[Dir(i)]);
if i = finish then j := start else j := i + 1;
setcolor(red);
line_polar(i * sector, arr[Dir(i)], j * sector, arr[Dir(j)])
end;
setcolor(darkgray);
for i := 1 to max_val do
circle_polar(0, 0, i);
readln;
closegraph;
end.
Volvo ПОМОГИ РАЗОБРАТЬСЯ ПОЖАЛУЙСТА С ЗАДАЧЕЙ.