• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Последовательность вещественных чисел

iron-mik

Ученик
Регистрация
20 Ноя 2010
Сообщения
9
Реакции
0
Баллы
0
Последовательность вещественных чисел

Помогите пожалуйста решить задачу:

Вводится последовательность вещественных чисел, оканчивающаяся нулём, и состоящая более чем из одного ненулевого элемента. Определить, номер числа, по абсолютной величине самого близкого к своему номеру. Если таких чисел несколько - вывести все номера этих эелементов.

Я её могу сделать, если бы не нужно было выводить все номера всех таких элементов. Пробовал через строки но там у меня такая муть получается... :(
Заранее очень благодарен!
 
Язык, черт побери, какой?!!!
Ох, извините - ну сил уже нет задавать этот вопрос каждому второму обратившемуся! Ну неужели непонятно, что нужно прежде всего язык программирования указать?
 
Ой извиняюсь, Delphi...
 
Алгоритм:
Определяете массив с числом элементов заведомо большим, чем количество чисел в последовательности.
Заполняете массив значениями путем ввода последовательности чисел, причем признаком окончания ввода является 0.
Находите наименьшую разницу между абсолютным значением элемента массива и его номером
Выводите все элементы массива, для которых эта разница действительна.
 
Alex меня немного опередил с алгоритмом, но всё же приведу свои соображения:

1. Вводите массив искомых НОМЕРОВ, например, Num.
2. Пусть N - количество элементов, обладающих указанным свойством.
3. Начинаете с того, что вычисляете Min=|a1-1|, где a1 - первый введенный элемент, N:=1 и Num[N]:=1.
4. Если последующие разности превышают Min и встретился еще элемент с номером i, у которого значение разности равно Min, то N увеличиваете на 1 и Num[N]:=i и т.д. до конца.
5. Если встретился i-тый элемент ai, у которого значение модуля разности с его номером меньше Min, то Min:=|ai-i|, N:=1, Num[N]:=i и далее п.4.
6. В конце вывести массив Num от i=1 до N.
 
Если бы всё было так просто... :) В том то и дело, что неизвестно сколько элементов будет в последовательности. И я не могу использовать массив и т.п.- Запрещено Преподом!
Я вот как уже сказал, пробовал использовать строки вместо массива, но там я окончательно запутался переводя из строк в числа и т.д.
 
Если бы всё было так просто... :) В том то и дело, что неизвестно сколько элементов будет в последовательности. И я не могу использовать массив и т.п.- Запрещено Преподом!
Я вот как уже сказал, пробовал использовать строки вместо массива, но там я окончательно запутался переводя из строк в числа и т.д.
Уж эти мне преподы!
Значит, массив нельзя? Но, может быть, можно файл? Тогда сбрасывайте номера в файл, а при изменении значения Min очищайте его командой rewrite. Или тоже нельзя?
 
А каким образом хранить последовательность в памяти, случаем, препод вам не объяснял? Куда вы числа должны сохранять, чтобы обработку сделать? В стек? Или в файл? Если в файл - способ выше описан.
 
Уж эти мне преподы!
Значит, массив нельзя? Но, может быть, можно файл? Тогда сбрасывайте номера в файл, а при изменении значения Min очищайте его командой rewrite. Или тоже нельзя?

Эмм...Такого еще не знаю, не изучали еще -1 курс :) Насчёт этого не было конечно запретов, но скорее всего он естественно не разрешит. Хотя меня это заинтересовало, не подскажите где можно найти инфу на эту тему? Или если можете объясните пожалуйста по-подробнее.
 
А каким образом хранить последовательность в памяти, случаем, препод вам не объяснял? Куда вы числа должны сохранять, чтобы обработку сделать? В стек? Или в файл? Если в файл - способ выше описан.

Нет не говорил :) Это уже моя проблема)
 
На #9
Справка среды разработки Delphi в полной мере удовлетворит ваше любопытство
На #10
Не вижу повода для улыбок, как бы вам не пришлось при сдаче лабы погрустить. Улыбаться нам нужно, глядя на ваши вопросы.
 
Не вижу повода для улыбок, как бы вам не пришлось при сдаче лабы погрустить. Улыбаться нам нужно, глядя на ваши вопросы.

Полностью с вами согласен. Тут не до улыбок. Но и унывать я не собераюсь- бывает мучаешься с этой задачей день, два, а то и неделю, но в конце- концов ответ приходит. Уверен вы и сами понимаете.
 
Если не поняли - не заморачивайтесь, возможно, вам пока рано это знать. Реализуйте через работу с файлами.

Для начала, определите в разделе переменных файловую переменную F командой F: TextFile;
В основном модуле свяжите переменную F с текстовым файлом в корневом каталоге диска C командой AssignFile(F,'имя_файла');
Откройте файл по перезаписи командой rewrite(F);
В цикле с постусловием начинайте вводить значения, параллельно записывая их в файл командой writeln(F,имя_переменной);
В цикле условием для выхода должно быть выражение имя_переменной=0
Затем, как предлагал выше Vladimir_S, организуйте чтение значений из файла и поиск минимальной разницы.
В конце не забудьте закрыть файл командой CloseFile(F); и при необходимости удалить его с диска командой erase(F); или DeleteFile(имя_файла);

З.Ы. имя_переменной, естественно, это латинский идентификатор для текущего значения элемента последовательности :)
 
Последнее редактирование:
Alex, только, мне помнится, в отличие от Паскаля, в Delphi команды имеют вид AssignFile и CloseFile, остальные, включая Append, такие же, как и в Паскале. Во всяком случае, когда я (сто лет назад) чего-то в Delphi творил, то в моей версии (Delphi 5, если не ошибаюсь), было так.
А еще есть одна идиотская идея - нельзя ли в дельфийской форме в процессе работы программы очищать и повторно заполнять строку при появлении нового значения Min? Это бы решило проблему даже без файла.
 
Vladimir_S к сожалению формы в Делфи тоже пока не используем. Это вроде у нас как раз следующая тема.
С файлом я тоже ничего не понимаю. :(
Но вот со строками я кое-что набросал, посмотрите пожалуйста:

Код:
var
  
  i,Nmin:integer;
  minRaz:real;

  
   s,c:string;
   Raz:real;
   el:real;
begin

 
  i:=1;
  writeln('Vvedite elementi');
  readln(el);

  minRaz:=abs(el-i);
  

  str(minRaz:1:0,c);
  s:=s+c;

  repeat
    i:=i+1;
    readln(el);

    Raz:=abs(el-i);
    str(Raz:1:0,c);
    s:=s+c;

    if (abs(el-i)<minRaz) and (el<>0) then
      begin
        minRaz:=abs(el-i);

      end;

  until el=0;

  str(minRaz:1:0,c);
  for i:=1 to length(s) do
    if s[i]=c then writeln('i=',i);

  writeln('minRaz=',minRaz:3:2);
    readln;
end.
Но есть 1 проблема: как сказано в задании числа вещественные, а если вводить числа с целой частью программа будет работать не верно, так как когда я добавляю в строку разницу- она добаляется без целой части, иначе у меня не получилось...
 
Так... Ну кое-что проясняется.
Уважаемый Iron-mik, давайте всё же будем называть вещи своими именами. Судя по Вашему коду, к изучению Delphi вы еще даже и не приступали, а язык, на котором написана программа, называется Паскаль. Так бы и сказали - нужна программа на Паскале, так нет - Delphi! Позже Вы узнаете, что Паскаль входит в Delphi как составная часть, но при этом существенно преобразуется - например, исчезают экранные ввод и вывод, изменяется сама структура программ и т.п.
Ну если Паскаль, то уже легче. Подумаю.
 
нельзя ли в дельфийской форме в процессе работы программы очищать и повторно заполнять строку при появлении нового значения Min?
Можно, для этого нужно просто изменить свойство Caption в TLabel, Text в TEdit или Line в TMemo в зависимости от используемого компонента, и, естественно, применять преобразование типа FloatToStr(MIN).

Владимир, не исключено, что нужно консольное приложение, а там листинг во многом совпадает с Pascal-евским.
 
Ну вот вариант с файлом:

Код:
var
  f:TEXT;
  i:integer;
  el,Raz,minRaz:real;
begin
  Assign(f,'C:\tt_tt');
  ReWrite(f);
  i:=1;
  writeln('Vvedite elementi:');
  Write(i:3,'  ');
  readln(el);

  minRaz:=abs(el-i);
  WriteLn(f,i);

  repeat
    i:=i+1;
    Write(i:3,'  ');
    readln(el);

    Raz:=abs(el-i);

    if (Raz<minRaz) and (el<>0) then
      begin
        minRaz:=Raz;
        ReWrite(f);
        WriteLn(f,i);
      end
    else
    if (Raz=minRaz) and (el<>0) then
      WriteLn(f,i);

  until el=0;

  Close(f);
  ReSet(f);
  WriteLn;
  Writeln('Nomera:');
  Repeat
   ReadLn(f,i);
   Write(i:3,' ');
  Until EoF(f);
  Close(f);
  Erase(f);
  writeln;

  writeln('minRaz=',minRaz:3:2);
  readln;
end.

А со строками - нет, не получается.
 
Да, всё отлично работает! Попробую сдать... Спосибо вам большое Vladimir, и вам Alex!
Жалею только что раньше не обращался к вам за помощью... :)
 
Назад
Сверху