Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2009, 02:14   #1
Foxx
Форумчанин
 
Регистрация: 23.07.2009
Сообщений: 181
По умолчанию Определение ближайшего элемента массива к числу

Всех приветствую. Ниже приведена программа. В ней есть некоторая недоработка. Первая четверть массива состоит из чисел 6 -6 6 4 4 -2 . Задаем с=5. Нужно найти значение элемента, по модулю близкое к заданному числу С=5. Естественно здесь будет числа 6 -6 6 4 4. Но проблема в том, что когда он находит их, идет повторение.
Код:
Program Lab4;
type vect=array [1..50] of integer;
var n, a, b, vr,mn,nmn,i,j,k,c,q:integer; p: real;
    D:vect;
BEGIN
                   d[1]:=6; d[2]:=-6; d[3]:=6; d[4]:=4; d[5]:=4;
                   d[6]:=-2; d[7]:=4; d[8]:=-3; d[9]:=6; d[10]:=5;
                   d[11]:=-2; d[12]:=-3; d[13]:=0; d[14]:=-1; d[15]:=1;
                   d[16]:=2; d[17]:=-3; d[18]:=6; d[19]:=-6; d[20]:=5;
                   d[21]:=-7; d[22]:=5; d[23]:=4; d[24]:=-6;
                   n:=24; a:=-10; b:=6;
  writeln('Часть 1':20);
  writeln('Полученный массив');
  for i:=1 to n do write(d[i]:3,' ');
  writeln;
{____________________________________________________________________}
  writeln('Часть 2':20);
  writeln('Первая четверть');
  for i:=1 to round(n/4) do write(d[i]:3,' ');
  writeln;
  write ('Введите число C='); readln(q);
  mn:=maxint;
     i:=1;
     while i<=n div 4 do
      begin
        if abs(abs(d[i])-abs(q)) < mn then
         begin
          mn:=abs(abs(d[i])-abs(q));
          nmn:=d[i];
         end;
        i:=i+1;
      end;
  writeln('Значение элемента, по модулю самое близкое к заданному числу C=',q,' равно: ');
     i:=1;
     while i<=n div 4 do
      begin
       if abs(abs(d[i])-abs(q))=mn then
        begin
         write(d[i],' его номер ');
         j:=1;
         while j<=n div 4 do
          begin
            if d[j]=d[i] then  write(j,'; ');
            j:=j+1;
           end;
           writeln;
        end;
       i:=i+1;
      end;
  writeln;
 readln;
 End.
Результат такой:
6 его номер 1; 3;
-6 его номер 2;
6 его номер 1; 3;
4 его номер 4; 5;
4 его номер 4; 5;

А хотелось бы такой:
6 его номер 1; 3;
-6 его номер 2;
4 его номер 4; 5;

Заранее благодарен. Желательно использовать цикл while.

Последний раз редактировалось Foxx; 14.11.2009 в 02:19.
Foxx вне форума Ответить с цитированием
Старый 14.11.2009, 06:27   #2
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Думаю,что проще всего если мы нашли первый раз увеличьте значение на 1 или занулять ( хотя если С=0,то возникнут проблемы..)просто сделай так,чтобы его больше не нашли))))(смех злодея)

Код:
while i<=n div 4 do
      begin
       if abs(abs(d[i])-abs(q))=mn then
        begin
         temp:=d[i];
         d[i]:=d[i]+1;
         write(temp,' его номер ');
         j:=1;
         while j<=n div 4 do
          begin
            if d[j]=temp then  write(j,'; ');
            d[j]=d[j]+1;
            j:=j+1;
           end;
           writeln;
        end;
       i:=i+1;
      end;
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 14.11.2009, 08:42   #3
Foxx
Форумчанин
 
Регистрация: 23.07.2009
Сообщений: 181
По умолчанию

Вот результат:
Введите число C=5
Значение элемента, по модулю самое близкое к заданному числу C=5 равно:
6 его номер 3;

первую 6 , -6 и 4 он не учел.

Последний раз редактировалось Foxx; 14.11.2009 в 08:54.
Foxx вне форума Ответить с цитированием
Старый 14.11.2009, 09:45   #4
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Запустил делфи...могу предложить такой вариант,без координальной переделки всего кода,хотя там много лишних переменных,но это не моё дело)..
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
type vect=array [1..50] of integer;
var n, a, b, vr,mn,nmn,i,j,k,c,q:integer; p: real;
    D:vect;

begin
  { TODO -oUser -cConsole Main : Insert code here }
   d[1]:=6; d[2]:=-6; d[3]:=6; d[4]:=4; d[5]:=4;
                   d[6]:=-2; d[7]:=4; d[8]:=-3; d[9]:=6; d[10]:=5;
                   d[11]:=-2; d[12]:=-3; d[13]:=0; d[14]:=-1; d[15]:=1;
                   d[16]:=2; d[17]:=-3; d[18]:=6; d[19]:=-6; d[20]:=5;
                   d[21]:=-7; d[22]:=5; d[23]:=4; d[24]:=-6;
                   n:=24; a:=-10; b:=6;
  writeln('Часть 1':20);
  writeln('Полученный массив');
  for i:=1 to n do write(d[i]:3,' ');
  writeln;
{____________________________________________________________________}
  writeln('Часть 2':20);
  writeln('Первая четверть');
  for i:=1 to round(n/4) do write(d[i]:3,' ');
  writeln;
  write ('Введите число C='); readln(q);
  mn:=maxint;
     i:=1;
     while i<=n div 4 do
      begin
        if abs(abs(d[i])-abs(q)) < mn then
         begin
          mn:=abs(abs(d[i])-abs(q));
          nmn:=d[i];
         end;
        i:=i+1;
      end;
  writeln('Значение элемента, по модулю самое близкое к заданному числу C=',q,' равно: ');
     i:=1;
     while i<=n div 4 do
      begin
       if abs(abs(d[i])-abs(q))=mn then
        begin
         write(d[i],' его номер ');
         j:=1;
         while j<=n div 4 do
          begin
            if d[j]=d[i] then
             Begin 
              write(j,'; ');
              d[j]:=d[j]+q;
              end;
            j:=j+1;
           end;
           writeln;
        end;
       i:=i+1;
      end;
  writeln;
 readln;

end.
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Старый 14.11.2009, 15:06   #5
Foxx
Форумчанин
 
Регистрация: 23.07.2009
Сообщений: 181
По умолчанию

Да это часть программы. Спасибо.
Результат

Часть 1
Полученный массив
6 -6 6 4 4 -2 4 -3 6 5 -2 -3 0 -1 1 2 -3 6 -6 5 -7 5 4 -6
Часть 2
Первая четверть
6 -6 6 4 4 -2
Введите число C=5
Значение элемента, по модулю самое близкое к заданному числу C=5 равно:
6 его номер 1;
-6 его номер 2;
6 его номер 3;
4 его номер 4;
4 его номер 5;

А можно сделать чтобы было так:
6 его номер 1; 3;
-6 его номер 2;
4 его номер 4; 5;
То есть он нашел число, сразу выдал его номера. Затем другое число и опять его номера. Чтобы сразу.
Foxx вне форума Ответить с цитированием
Старый 14.11.2009, 16:06   #6
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Так..ну вот я дописал твою програмку...заранее прошу прощения за стиль написания,уже 4 года ничего не писал на делфи,всё забыл.Так что не стреляйте в пианиста,если б задача была на С))..Ну смысл такой,как только мы выписали все номера элемента,значение заносим в массив res.Долго вспоминал синтаксис написания функций...функция proverka возвращает истину,если в массиве res значение элемента,которое мы передали не встречается и ложь,если мы уже выписывали номера этого значения.Надеюсь Вам это поможет...)
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type vect=array [1..50] of integer;
var n, a, b, vr,mn,nmn,temp,i,j,k,c,q:integer;  p: real;
    D:vect;res:array[1..10] of integer;
function proverka(x:integer):boolean;
var flag:boolean;i:integer;
begin
flag:=true;
for i:=1 to 10 do
  begin
      if res[i]=x then
        flag:=false;
  end;
  result:=flag;
end;
begin
  { TODO -oUser -cConsole Main : Insert code here }
   d[1]:=6; d[2]:=-6; d[3]:=6; d[4]:=4; d[5]:=4;
                   d[6]:=-2; d[7]:=4; d[8]:=-3; d[9]:=6; d[10]:=5;
                   d[11]:=-2; d[12]:=-3; d[13]:=0; d[14]:=-1; d[15]:=1;
                   d[16]:=2; d[17]:=-3; d[18]:=6; d[19]:=-6; d[20]:=5;
                   d[21]:=-7; d[22]:=5; d[23]:=4; d[24]:=-6;
                   n:=24; a:=-10; b:=6;
  writeln('Часть 1':20);
  writeln('Полученный массив');
  for i:=1 to n do write(d[i]:3,' ');
  writeln;
{____________________________________________________________________}
  writeln('Часть 2':20);
  writeln('Первая четверть');
  for i:=1 to round(n/4) do write(d[i]:3,' ');
  writeln;
  write ('Введите число C='); readln(q);
  mn:=maxint;
     i:=1;
     while i<=n div 4 do
      begin
        if abs(abs(d[i])-abs(q)) < mn then
         begin
          mn:=abs(abs(d[i])-abs(q));
          nmn:=d[i];
         end;
        i:=i+1;
      end;
  writeln('Значение элемента, по модулю самое близкое к заданному числу C=',q,' равно: ');
     i:=1;temp:=1;
    while i<=n div 4 do
      begin
       if ((abs(abs(d[i])-abs(q))=mn) and (proverka(d[i])=true)) then
        begin
         write(d[i],' его номер ');
         j:=1;
         while j<=n div 4 do
          begin
            if d[j]=d[i] then  write(j,'; ');
            j:=j+1;
           end;
           writeln;
        end;
       res[temp]:=d[i];
       temp:=temp+1;
       i:=i+1;
      end;

  writeln;
 readln;

end.
Не давай организму поблажки, каждый день тренируй его в шашки..

Последний раз редактировалось Скарам; 14.11.2009 в 16:10.
Скарам вне форума Ответить с цитированием
Старый 14.11.2009, 16:28   #7
Foxx
Форумчанин
 
Регистрация: 23.07.2009
Сообщений: 181
По умолчанию

Скарам
Все работает. То что надо. Огромное спасибо.
Foxx вне форума Ответить с цитированием
Старый 14.11.2009, 16:41   #8
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Цитата:
Сообщение от Foxx Посмотреть сообщение
Скарам
Все работает. То что надо. Огромное спасибо.
Тогда с тебе положительный отзыв,жми на весы под моей авой)))
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PHP: использование элемента массива как массива Sudia Помощь студентам 1 20.02.2009 20:48
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21
определение центрального элемента Jenka156 Общие вопросы C/C++ 3 24.12.2008 17:01
Удаление элемента массива chiffa Общие вопросы Delphi 1 03.01.2008 19:24
Двумерные массивы. Формирование одномерного массива из сумм строк матрицы, кратных числу k (в С++) Fimogen Помощь студентам 3 19.11.2007 07:30