IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Роза ветров, Задача на одномерный массив
barlog
сообщение 26.10.2006 21:19
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


В строке данных записаны 30 чисел от 1 до 8, показывающих, в каком направлении дул ветер в соответствующий день месяца (1-северный, 2-северо-восточный, 3-восточный, 4-юго-воточный, 5 южный, 6-юго-западный, 7-западный, 8-северо-западный).
Вывести на экран ”розу ветров” - многоугольник, вершинами которого лежат на 8-лучах, выходящих из общего центра с равным углами, расстояния от вершины до этого центра пропорционально дней месяца, в который дул соответствующий ветер.

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

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

Хотел сдать в таком виде, но преподаватель сказал, что не полностью выполняется условия поставленной задачи. И она, по-моему, очень уж громоздкая. Помогите, пожалуйста. Т.е 30 раз нужно будет ввести числа от 1 до 8 и уж, потом на этом основании строиться график. Чтобы узнать в какой день, что дуло нужно, чтобы ещё и на лучах насечки были с соответствующим днём?
Если так то по-моему сложновато! Помогите товарищи. Заранее спасибо. Почти ни разу не оставался без ответа и помощи на вашем форуме.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
klem4
сообщение 26.10.2006 21:37
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
30 раз нужно будет ввести


Ну ввод уж точно из файла нужно сделать smile.gif Интересная задача, когда тебе сдавать ?


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
barlog
сообщение 26.10.2006 21:40
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Без файла никак нельзя? Просто там 40 с лишним задач на массивы, и парочка из них в виде зачётных. Вот "Роза ветров одна из них". Ну через недели две надеюсь. Я ещё по строкам кроссворд не сдал. Сможете помочь?! По "розе ветров".
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2006 22:44
Сообщение #4


Гость






Ну, вот что-то такое:
(это без оптимизации, можно еще "причесать" код программы, добавить пару функций, код будет выглядеть гораздо красивее)

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
сообщение 26.10.2006 23:07
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


volvo ты просто молодец. Именно такой ввод нужен. А как можно будет узнавать когда и в каком направлении дул ветер? Что насечки с надписями выводить или что. Плиз допомогите. Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.10.2006 23:43
Сообщение #6


Гость






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

Направление совпадает с реальным - вверх: север, вниз - юг, и т. д... Можно выводить названия направлений в том же виде, в котором они описаны: "N", "S", "E", ... Если это тебе поможет - сделаю...
 К началу страницы 
+ Ответить 
barlog
сообщение 27.10.2006 8:38
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


"в каком направлении дул ветер в соответствующий день месяца"-в условии задачи.
Я вроде бы когда показывал тот первый вариант который выложил здесь, мне что-то про дни преподаватель говорил. Ну просто если несложно или возможно помоги. В любом случае покажу два варианта. Спасибо.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2006 8:53
Сообщение #8


Гость






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

В общем, с такими постановками задач и требованиями - разбирайся сам... dry.gif
 К началу страницы 
+ Ответить 
barlog
сообщение 27.10.2006 19:38
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Да ты прав. Извини. Всё понял. Спасибо за помощь. Именно так и надо было как ты сделал. Ещё раз огромное спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.10.2006 19:42
Сообщение #10


Гость






Есть немного доработанная версия у меня на сайте... Можешь забрать оттуда:
Роза ветров
 К началу страницы 
+ Ответить 
barlog
сообщение 10.12.2006 17:30
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Извините, но это снова я.
Посмотрев твой вариант 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 направлений и т.д
Т.е нужна универсальная программа. Помогите разобраться пожалуйстаю! Спасибо за помощь!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
barlog
сообщение 11.12.2006 20:17
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 27
Пол: Мужской
Реальное имя: г

Репутация: -  0  +


Volvo ПОМОГИ РАЗОБРАТЬСЯ ПОЖАЛУЙСТА С ЗАДАЧЕЙ.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 16:22
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"