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

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

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

Автор: mr.voland 16.12.2007 20:04

Не могу не как решить задачу через while сделал, а надо через for.
Сама задача звучит так

Код
Около стены наклонно стоит палка длинной x метров. Один ее конец находится на растоянии y метров от стены. Определить значения угла между палкой и полом для значений y, изменяющегося от 2 до 3 метров с шагом h.

Искал поиском, нашел такую же задачу, но тема закрыта и задача не решена.
Если надо то могу выложить свое решение через while, но думаю оно мало поможет.
Заранее благодарен.

Автор: Client 16.12.2007 20:08

покажи как с WHILE'ом сделал, там подправим.

Автор: mr.voland 16.12.2007 20:13

Код

program lab6_v4;
uses CRT;
var  x,h:real;
     a,y:real;
     arccos:real;
Begin
CLRSCR;
write ('Введите длину палки  '); read(x);
write ('Введите шаг'); read(h);
y:=2;
while y<=3 do
begin
arccos:=arctan(sqrt(1-sqr(y/x))/(y/x));
writeln('Значение угла',arccos:8:2,'  при y=',y);
y:=y+h;
end;
repeat Until KeyPressed;
end.


p.s. Есть мысль что через for надо делать по формуле n:=(3-2)/h+1
h-Это шаг
и тогда получается что for i:=1 to n do
А вот какого типа должны быть переменные?

Автор: Client 16.12.2007 20:24

если шаг больше 0.1, то можно так:

 for i:=20 to 30 do bein
arccos:=arctan(sqrt(1-sqr(y/x))/(y/x));
writeln('Значение угла',arccos:8:2,' при y=',y);
y:=y+i*h
end;

Автор: andriano 16.12.2007 20:34

Client, что-то мне кажется, y := i*h;

Автор: Client 16.12.2007 20:46

uses crt;
var
y,sd,x,h:real;
i:integer;
begin
clrscr;
y:=2;
writeln('Введите х');
readln(x);
write(' Введите шаг');
readln(h);
while y<=3 do begin
sd:=arctan((1-sqr(y/x))*(y/x));
writeln(' ugol = ',sd:0:5);
y:=y+h
end;
writeln;
writeln;
y:=2;
for i:=0 to 10 do begin
y:=i*h+2;
if y<=3 then begin
sd:=arctan((1-sqr(y/x))*(y/x));
writeln(' ugol = ',sd:0:5)
end
end;
readkey
end.

Для сравнения привел 2 цикла

Автор: volvo 16.12.2007 20:46

Цитата
если шаг больше 0.1
А если 0.09 - тогда что?

Неужели нельзя сделать общий случай?

const
start_y = 2;
finish_y = 3;
var
i, step: integer;
...
write ('Введите длину палки '); readln(x);
write ('Введите шаг '); readln(h);

step := trunc((finish_y - start_y) / h);
for i := 0 to step do begin
y := start_y + i * h;
arccos:=arctan(sqrt(1-sqr(y/x))/(y/x));
writeln('Значение угла', arccos:8:2, ' при y=', y);
end;

?