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

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

Форум «Всё о Паскале» _ Задачи _ Помогите с Массивом в Паскале

Автор: Ganz 15.06.2008 19:02

Дан вещественный массив x(n). Найти элементы массива, значение которого наиболее близко к какому-нибудь целому числу.

В данной программе надо чтобы при запуске выводился на экран начальный массив из вещественных чисел(отрицательных и положительных) и после от туда выбирались элементы наиболее близкие какому нибудь целому числу .

Помогите плиз wink.gif

Автор: klem4 15.06.2008 21:56

Тебе нужно найти элемент массива X, для которого значение abs(x[i] - value) будем минимальным, где value - число которое ты вводишь

Автор: Ganz 15.06.2008 22:04

Цитата
Тебе нужно найти элемент массива X, для которого значение abs(x[i] - value) будем минимальным, где value - число которое ты вводишь

честное слово я в этом нуб и разбираться щас нет времени ,может кто программку напишет ?

Автор: Ganz 15.06.2008 23:13

Плизз помогите написать программу (если надо могу свои исходники выложить если помогут но они скорее всего не правильны...)

Автор: andriano 15.06.2008 23:21

Тогда ты ошибся(-лась) разделом.

Автор: Ganz 15.06.2008 23:32

Цитата
Тогда ты ошибся(-лась) разделом.

Всмысле ?
Он!

Автор: klem4 16.06.2008 0:10

Покажи что пробовал делать, и скажи с чем конкретно проблема, программа на 3 строчки ...

Автор: Ganz 16.06.2008 2:59

const
n=10;
var
x: array [1..n] of real;
i,k : integer;
min,res : real;
begin
for i:=1 to n do
begin
write('x[',i,']=');
readln (x[i]);
end;
min:=1;
for i:=1 to n do
begin
if frac(x[i]) >=0.5 then res:=1-frac(x[i])
else res:=1-(1-frac(x[i]));
if res< min then
begin
min:=res;
k:=i;
end;
end;
write('Rezultat: ',x[k]:0:3);
readln;
end.


Проблема в то что не выводиться массив с вещественными числами ,а я сам его вважу (а вот как сделать чтоб сам выводился незнаю )

Добавлено через 17 мин.
Есть еще какой-то способ без использование "frac" ,там как то вычитанием из вещественного масива целого ,для получения целой части ,вроде как-то так )))) Вот незнаю как mega_chok.gif

Автор: мисс_граффити 16.06.2008 4:22

Цитата
Проблема в то что не выводиться массив с вещественными числами ,а я сам его вважу (а вот как сделать чтоб сам выводился незнаю )

вводился или выводился?

Цитата
res:=1-(1-frac(x[i]));

а нельзя просто
Код
res:=frac(x[i]);

?

Автор: Ganz 16.06.2008 20:54

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

Машина случайным образом сама заполняет массив (причем заполняет массив вещественными числами как отрицательными так и положительными )

через Random

Добавлено через 11 мин.
Попробывал сделать так

Uses crt;
const
n=10;
var
x: array [1..n] of real;
i,k : integer;
min,res : real;
begin
clrscr;
randomize;
for i:=1 to n do
begin
x[i]:=random(999);
end;
min:=1;
for i:=1 to n do
begin
if frac(x[i]) >=0.5 then res:=frac(x[i])
else res:=1-(1-frac(x[i]));
if res> min then
begin
min:=res;
k:=i;
end;
end;
for i:=1 to n do
begin
write (x[i]:0:1 ,' ');
end;
write('Rezultat: ',x[k]:0:3);
readln;
end.



Результат получается таков ,что выводять целые числа =(( ,а нужны вещественые (положительные и отрицательные) .



2 695 562 910 134 940 115 370 251 261 Rezultat: 2.000




Автор: Ganz 16.06.2008 22:08

Вот еще повазился с прогой и получилось так :




Uses crt;
const
n=10;
var
x: array [1..n] of real;
i,k : integer;
min,res : real;
begin
clrscr;
randomize;
writeln ('Ishodnii massiv');
for i:=1 to n do
begin
x[i]:=random(99)+random ;
if random > 0.5 then x[i]:=-x[i];
end;
min:=1;
for i:=1 to n do
begin
if frac(x[i]) >=0.5 then res:=1-frac(x[i])
else res:=1-(1- frac(x[i]));
if res< min then
begin
min:=res;
k:=i;
end;
end;
for i:=1 to n do
begin
write (x[i]:0:2 ,' ');
end;
writeln;
writeln ('Rezultat: ',x[k]:0:3);
readln;
end.



Вот результат программы :


Ishodnii massiv
90.00 -23.67 66.71 98.17 -89.16 -12.07 48.47 -36.63 55.47 -14.76
Rezultat: -14.762



Вот теперь незнаю правильно ли это или нет ,подскажите? smile.gif



Автор: мисс_граффити 17.06.2008 6:20

Неправильно...
Смотри сам - наиболее близким к целому является 90.00
А у тебя в ответе совсем другое число.

Ошибка в том, что ты берешь остаток не по модулю, а со знаком.
попробуй так:

Код
uses crt;

const n=10;
var x: array [1..n] of real;
i,k : integer;
min,res : real;

begin
clrscr;
randomize;
writeln ('Ishodnii massiv');
for i:=1 to n do
  begin
  x[i]:=random(99)+random;
  if random > 0.5 then
    x[i]:=-x[i];
  end;

min:=1;
for i:=1 to n do
  begin
  if abs(frac(x[i]))>=0.5 then
    res:=1-abs(frac(x[i]))
  else
    res:=abs(frac(x[i]));
  if res<min then
    begin
    min:=res;
    k:=i;
    end;
  end;

for i:=1 to n do
  write (x[i]:0:3 ,' ');

writeln;
writeln ('Rezultat: ',x[k]:0:3);
readln;
end.

Автор: Ganz 17.06.2008 22:15

Спасибо ,только вот в результате целого числа не получаеться ((((((((((( там выбираються разные числа почему и с + и с - ....
Вторая часть программы не рабочая...
В чем может быть проблема ?

Автор: kosyak 18.06.2008 3:56

Что-то я тебя не понимаю... Вроде мисс_граффити все так сделала. Если хочешь чтоб выводилось близкое целое число то поставь так:

Код

writeln ('Rezultat: ',round(x[k]));

Автор: Ganz 18.06.2008 15:08

У меня работает нормально - 5 раз проверял (правда, на 20 числах) - всё правильно выводит... Не понимаю, где у меня проблема...

Автор: мисс_граффити 18.06.2008 16:52

если работает - какие проблемы?