Большой Воронежский Форум
» Программирование>Помогите ребят....написать программу на Delphi
SerK=13= 13:30 20.10.2007
Очень нужна помощь......програмка не сложная, но решить не могу, мож кто чо подскажет: Нужно написать програмку что б она выводила все пифагоровы числа, не превышающие 20.

program Pifagor;

{$APPTYPE CONSOLE}

uses
Windows;

var
z,x,y,m,n: real;
i, j, k : Integer;
begin

setconsolecp(1251);
setconsoleoutputcp(1251);

for I := 1 to 20-2 do
for J := I+1 to 20-1 do
for K := J+1 to 20 do
begin
//Проверка условия -До этого момента все правильно
А дальше помогите.....

if (x*x)+(y*y)=(z*z) then
begin
x:=sqr(m)-sqr(n);
y:=2*m*n;
z:=sqr(m)+sqr(n);
if (y<=20) and (x<=20) and (z<=20) then
begin
writeln('x=',x:5:2);
writeln('y=',y:5:2);
writeln('z=',z:5:2)
end
else
exit;

end;
end;
readln;
end.



Пифагоровы числа-это те которые удовлетворяют условию, X(квадрат)+Y(квадрат)=Z(квадрат)

Любая примитивная пифагорова тройка однозначно представляется в виде ( M(квадрат)-N(квадрат), 2MN, M(квадрат)+N(квадрат)) для некоторых натуральных, взаимно простых m > n, имеющих разную чётность. Наоборот, любая такая пара задаёт примитивную пифагорову тройку.



ПОМОГИТЕ!!! Пожалуйста!
Snusmumrik 17:41 20.10.2007
Народ продолжает поступать в институты... Снова запахло сессией))).
подсказки:
if (x*x)+(y*y)=(z*z) then замени-таки х*х на sqr(x), и далее по тексту.

for I := 1 to 20-2 do
for J := I+1 to 20-1 do
for K := J+1 to 20 do
а 20-2 посчитать один раз слабо? это должен делать комп при каждом запуске цикла? смысла, правда, в этих форах не уловил, но в прогу особо и не вчитывался.... Если хочешь все значения перебрать-подумай, может стоит какнибудь оптимизировать процесс? т.е. перебирать не все, а наиболее приемлимые числа.
лесоруб 17:43 20.10.2007
фэкаэнщик?
SerK=13= 20:17 20.10.2007
Snusmumrik, спасибо!
лесоруб, пачему так решил?
Andrei_K 21:15 24.10.2007
нагородил много лишнего, вот что нужно оставить:

program Pifagor;
{$APPTYPE CONSOLE}
uses
Windows;
var
x, y, z : Integer;

begin
setconsolecp(1251);
setconsoleoutputcp(1251);
for x := 1 to 20-2 do
for y := x+1 to 20-1 do
for z := y+1 to 20 do
if sqr(x)+sqr(y)=sqr(z) then writeln('x=',x,' y=',y,' z=',z);
readln;
end.
mikе 21:40 24.10.2007

Сообщение от :
20-2

Сообщение от :
20-1

убило.
а чё уж сразу ручками не выводить нужные числа, нахъ тут чё-та программировать?
X0R 22:27 24.10.2007
mikе
Для наглядности
Andrei_K 22:35 24.10.2007
mikе, ну вдруг понадобится вместо 20 другое значение подставлять
вообще по хорошему в подобных случаях желательно делать примерно так:
...
const max=20;
...
for x := 1 to max-2 do
for y := x+1 to max-1 do
for z := y+1 to max do
...

сам всегда так старался делать и другим советую


Сообщение от Snusmumrik:
а 20-2 посчитать один раз слабо? это должен делать комп при каждом запуске цикла?

компилятор однозначные выражения вычисляет ещё на этапе компиляции и подставляет конечный результат в код, так что так что такие выражения, сделанные для наглядности никак не скажутся на быстродействии проги, если вдруг это будет критично
Snusmumrik 22:49 24.10.2007

Сообщение от Andrei_K:
компилятор однозначные выражения вычисляет ещё на этапе компиляции и подставляет конечный результат в код, так что так что такие выражения, сделанные для наглядности никак не скажутся на быстродействии проги, если вдруг это будет критично

и то правда..
mikе 23:30 24.10.2007

Сообщение от Andrei_K:
компилятор однозначные выражения вычисляет ещё на этапе компиляции и подставляет конечный результат в код, так что так что такие выражения, сделанные для наглядности никак не скажутся на быстродействии проги, если вдруг это будет критично

ды это понятно, но нужно ведь придерживаццо некой идиологии написание мало-мальски нормального кода. а то будем писать: 100-50+2*(30/6). ясен-красен, что на работоспособность это не повлияет. но читать такой код ни разу неудобно.
Вверх