Помощь - Поиск - Пользователи - Календарь
Полная версия: Роза ветров
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
barlog
В строке данных записаны 30 чисел от 1 до 8, показывающих, в каком направлении дул ветер в соответствующий день месяца (1-северный, 2-северо-восточный, 3-восточный, 4-юго-воточный, 5 южный, 6-юго-западный, 7-западный, 8-северо-западный).
Вывести на экран ”розу ветров” - многоугольник, вершинами которого лежат на 8-лучах, выходящих из общего центра с равным углами, расстояния от вершины до этого центра пропорционально дней месяца, в который дул соответствующий ветер.

Нашёл программу примера ”розы ветров”.

Вот она... (Показать/Скрыть)

Хотел сдать в таком виде, но преподаватель сказал, что не полностью выполняется условия поставленной задачи. И она, по-моему, очень уж громоздкая. Помогите, пожалуйста. Т.е 30 раз нужно будет ввести числа от 1 до 8 и уж, потом на этом основании строиться график. Чтобы узнать в какой день, что дуло нужно, чтобы ещё и на лучах насечки были с соответствующим днём?
Если так то по-моему сложновато! Помогите товарищи. Заранее спасибо. Почти ни разу не оставался без ответа и помощи на вашем форуме.
klem4
Цитата
30 раз нужно будет ввести


Ну ввод уж точно из файла нужно сделать smile.gif Интересная задача, когда тебе сдавать ?
barlog
Без файла никак нельзя? Просто там 40 с лишним задач на массивы, и парочка из них в виде зачётных. Вот "Роза ветров одна из них". Ну через недели две надеюсь. Я ещё по строкам кроссворд не сдал. Сможете помочь?! По "розе ветров".
volvo
Ну, вот что-то такое:
(это без оптимизации, можно еще "причесать" код программы, добавить пару функций, код будет выглядеть гораздо красивее)

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.


Проверял вот с такими данными (вводишь в одну строку, жмешь Enter):
Цитата
1 2 3 4 5 6 7 8 1 2 2 2 2 3 4 5 5 4 2 6 5 5 3 4 7 1 1 2 3 4

Результат - (отработал, правда в FPC, но и TP дает точно такую же картинку, проверил) в аттаче:
barlog
volvo ты просто молодец. Именно такой ввод нужен. А как можно будет узнавать когда и в каком направлении дул ветер? Что насечки с надписями выводить или что. Плиз допомогите. Спасибо.
volvo
Цитата
А как можно будет узнавать когда и в каком направлении дул ветер?
А об этом, извини, в задании ничего не сказано. "Роза ветров" строится не для того, чтобы сказать, когда дул ветер на восток, а когда - на запад. Строится она с другой целью: узнать, куда ветра дуют чаще. Поэтому никакой информации о том, "когда ..." в "розе ветров" не содержится...

Направление совпадает с реальным - вверх: север, вниз - юг, и т. д... Можно выводить названия направлений в том же виде, в котором они описаны: "N", "S", "E", ... Если это тебе поможет - сделаю...
barlog
"в каком направлении дул ветер в соответствующий день месяца"-в условии задачи.
Я вроде бы когда показывал тот первый вариант который выложил здесь, мне что-то про дни преподаватель говорил. Ну просто если несложно или возможно помоги. В любом случае покажу два варианта. Спасибо.
volvo
В задании про другое:
Цитата
В строке данных записаны 30 чисел от 1 до 8, показывающих, в каком направлении дул ветер в соответствующий день месяца
... Чувствуешь разницу? Это - данные... Они нигде не сохраняются. Ты их ввел, и ВСЁ, программа про них забыла. Ибо дальше:
Цитата
Вывести на экран ”розу ветров”
- они не нужны... Нужно только количество дней, в которые дул соответствующий ветер...

В общем, с такими постановками задач и требованиями - разбирайся сам... dry.gif
barlog
Да ты прав. Извини. Всё понял. Спасибо за помощь. Именно так и надо было как ты сделал. Ещё раз огромное спасибо!
volvo
Есть немного доработанная версия у меня на сайте... Можешь забрать оттуда:
Роза ветров
barlog
Извините, но это снова я.
Посмотрев твой вариант 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.


Сказали что мол нельзя изменить количество направлений длая розы ветров. Т.е на 16 направлений и т.д
Т.е нужна универсальная программа. Помогите разобраться пожалуйстаю! Спасибо за помощь!
barlog
Volvo ПОМОГИ РАЗОБРАТЬСЯ ПОЖАЛУЙСТА С ЗАДАЧЕЙ.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.