HELP !!!!! HELP

don-88888

Помогите пл3 написать лабу в делфи!
Задана последовательность X = (x1, x2, …, x10).
Сформировать из неё одномерный массив Y, состоящий только из целочисленных элементов, т.е. дробная часть которых равна нулю, массива Х. Если таковых не окажется, вывести фразу «Целочисленных элементов нет». Полученный массив напечатать в столбик.
X = {0.1, -4, 72, 23.1, 0.45, 3.8, -2.94, 3, 1.1, 12}.
Если можно то пл3 напишите в ответе готовую структуру, спасибо

juliuzz

Помогите пл3 написать лабу в делфи!
в моё время этот язык назывался паскаль :crazy:

Helga87

Полученный массив напечатать в столбик.
X = {0.1, -4, 72, 23.1, 0.45, 3.8, -2.94, 3, 1.1, 12}.
Если можно то пл3 напишите в ответе готовую структуру, спасибо
Y={
1
12
}

elenangel

 
 
{$APPTYPE Console}
uses
SysUtils;

var
x:array[1..10] of double;
y:array[1..10] of integer;
n,i:integer;
t:double;
begin
Writeln('Введите 10 чисел:');
for i := 1 to 10 do begin
Readln(t);
x[i] := t;
end;
n := 0;
for i := 1 to 10 do begin
if (x[i]-round(x[i]) = 0) then begin
inc(n);
y[n] := round(x[i]);
end;
end;
if n = 0 then begin
Writeln('Целочисленных элементов нет')
end else begin
for i := 1 to n do begin
Writeln(y[i]);
end;
end;
end.

lubanj

x:array[1..10] of double
if (x[i]-round(x[i]) = 0)
FAIL

elenangel

FAIL
для отрицательных что ли?

lubanj

неа. попробуй еще раз :)

elenangel

у меня конпелятора нету, я проверить не могу. скажи так в чем косяк.

lubanj

не. не. она скомпилится. и даже будет работать правильно. почти всегда :D

elenangel

на маш. эпсилон намекаешь?

lubanj

BINGO!

elenangel

мне кажется, нельзя с клавиатуры ввести такое double x, что double x не целое и при этом x-round(x) = 0
вернее можно, но оно станет целым сразу после преобразования из строки в число и записи переменную t.
то есть такое число невозможно будет отличить от целого с помощью типа double

lubanj

мне кажется, нельзя с клавиатуры ввести такое double x...
не вынуждай меня ставить компилятор....

elenangel

 
{$APPTYPE Console}
uses
SysUtils;

var
x:array[1..10] of double;
y:array[1..10] of integer;
n,i:integer;
t:double;
begin
Writeln('Введите 10 чисел:');
for i := 1 to 10 do begin
Readln(t);
x[i] := t;
end;
n := 0;
for i := 1 to 10 do begin
if (x[i]-round(x[i]) = 0) then begin
inc(n);
y[n] := round(x[i]);
end;
end;
if n = 0 then begin
Writeln('Целочисленных элементов нет')
end else begin
Writeln('Целые:');
for i := 1 to n do begin
Writeln(y[i]);
end;
Writeln('Исходный массив:');
for i := 1 to 10 do begin
Writeln(x[i]:0:40);
end;
end;
end.


yacht ~ $ ./proga
Введите 10 чисел:
1
2
3
4
5
6
7
8
9
9.000000000000001
Целые:
1
2
3
4
5
6
7
8
9
Исходный массив:
1.000000000000000
2.000000000000000
3.000000000000000
4.000000000000000
5.000000000000000
6.000000000000000
7.000000000000000
8.000000000000000
9.000000000000000
9.000000000000000
yacht ~ $ ./proga
Введите 10 чисел:
1
2
3
4
5
6
7
8
9
9.0000000000000001
Целые:
1
2
3
4
5
6
7
8
9
9
Исходный массив:
1.000000000000000
2.000000000000000
3.000000000000000
4.000000000000000
5.000000000000000
6.000000000000000
7.000000000000000
8.000000000000000
9.000000000000000
9.000000000000000

lubanj

не вынуждай меня ставить компилятор....
ты меня разозлил:
var
   x:array[1..10] of double;
   y:array[1..10] of integer;
   n,i:integer;
   t:double;
begin
   Writeln('Введите 10 чисел:');
   for i := 1 to 10 do begin
     Readln(t);
     if (t-round(t) = 0)
     then
     Writeln('ok')
     else Writeln('ne ok!');
   end;
   Readln(t);
end.
1.9999999999999999
ok! - в смысле целое, а это не так

elenangel

а ты это свое 1.9999999999999999 просто прочитай, а потом выведи на экран и посмотри.
P.S. по хорошему надо прочитать, а потом под дебагером посмотреть содержимое ячейки, потому что при выводе при преобразовании в строку тоже добавляются округления, видно в моем примере выше для 9.000000000000001

lubanj

Writeln(x[i]:0:40);
2.000..... выводит.
а ты к чему это спросил?

lubanj

P.S. по хорошему надо прочитать, а потом под дебагером посмотреть содержимое ячейки
ага. причем не через вотчес, а в бинарном виде
P.S эх, паскаль. школьные олимпиады, асм-контесты... ностальгия

elenangel

а ты к чему это спросил?
к тому что глюк с машинным эпсилон возникает еще в функциях ввода и с этим ничего поделать нельзя.
и x-round(x) тут не причем

lubanj

ок. но это все равно тебя не сильно оправдывает. настоящие программисты не должны так писать ;)
еще: число
9999999999999.999
распечатывается как целое, но fract(t) != 0

elenangel

а я типа специально написал как "ненастоящий", чтобы прокатило как будто блондинко прогу сама писала ;)

lubanj

а все равно не поверят :grin:
слишком разумная табуляция

elenangel

почти убедил, но
твое 99...9.999 распечатывается как целое конечно, но для него x-round(x) != 0.
если найдешь такое число, что x-round(x) = 0 (читай <маш.эпс но frac(x) > 0, то ты победил.

Serab

ok! - в смысле целое, а это не так
докажи :smirk:
А почему round? он вниз что ли округляет в делфи? Или там нету нормальной функции?

Serab

в моё время этот язык назывался паскаль :crazy:
object pascal называли делфи, нормально.

elenangel

round - потому, что в момент написания я не вспомнил как называется функция взятия дробной части.

iravik

настоящие программисты не должны так писать
прога написана на паскале, так что настоящим программистом тут и не пахнет :)

Helga87

прога написана на паскале, так что настоящим программистом тут и не пахнет
определение настоящего программиста в студию, пожалуйста.

zorin29


В прошлом, во времена золотой эры ЭВМ было легко отличать мальчика от мужа (иначе их называют "сосунки" и "настоящие мужчины", соответственно). Тогда настоящие мужчины были те, кто понимал в программировании, с сосунки - те, кто не понимал. Настоящий программист легко произносил такие фразы, как "DO 10 I = 1, 10" или "АВОСТ", а все остальные нечто вроде "ЭВМ слишком сложна для меня" и "Я не могу полагаться на ЭВМ - они слишком безличны".

lubanj

вообще говоря настоящий программист не сильно от языка-то и зависит...

kill-still

Как ты думаешь, что выведет
ShowMessage( inttostr( round(2.5) - round(1.5) ) )

?

lubanj

к этой задаче и к этому решению различие между математическим раундом и банковским раундом не имеют никакого значения

stm6692945

Если можно то пл3 напишите в ответе готовую структуру, спасибо

-4 72 3 12
НАДЕЮСЬ, ПОМОГ!
Оставить комментарий
Имя или ник:
Комментарий: