Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] Помогите плииз с программой для Turbo Pascal (http://forum.oszone.net/showthread.php?t=185898)

dasha131 19-09-2010 17:57 1499192

Помогите плииз с программой для Turbo Pascal
 
Помогите пожалуйста с программкой для вычисления бесконечной нормы вектора х размерностью n

Hector 19-09-2010 18:37 1499215

Цитата:

Цитата dasha131
вычисления бесконечной нормы вектора х размерностью n »

а как это хоть делается? а то я не силен в геометрии

lxa85 19-09-2010 20:54 1499329

если я правильно понял, то норма вектора - это скаляр его длинны.
Вектор в данном случае - одномерный массив чисел.
Надо накапливать норму вектора и пересчитывать ее при поступлении нового значения iой размерности.
Т.е. сначала одномерное пространство - линия.
Двухмерное - если без "заморочек", то декартова плоскость.
Трехмерное - сводится к 2х мерному. Т.е. сначала считаем a+b, затем переходим в плоскость (a+b,c)
Так и получается, что надо при каждом поступлении новой величины снижать размерность. Можно кстати в одно, двумерной плоскости находиться, не залезая в 3d.

dasha131 20-09-2010 05:00 1499526

ВОт формула, [[x]]8=max(i) [x(i)]
8-так обозначила бесконечность
[[]]- норма
[]-модуль
тоесть бесконечный предел=максимальному значению x(i)

По теории все понятно, а вот с программой у меня напряг(

lxa85 20-09-2010 09:01 1499613

Формула ИМХО не верна, но ладно.
По программе - делай цикл до некоторого условия.
В цикле делай сравнение по максимальному отклонению от 0. Т.е. максимальный модуль числа.
Нарисуй блок, а ее либо я, либо другой участник переведет тебе в программу.

dasha131 20-09-2010 12:38 1499765

а как задать это сравнение?
по логике можно с начало сложить первое с первым число, потом первое со вторым, потом первое с третьим, первое с четвертым (при N=4) и выбрать наибольшую сумму (складывать естественно по модулю) Второе слагаемое как раз и будет этим макс числом
Но я не знаю как программу написать, да и выполняется ли условие задачи?
"для вычисления беск.нормы вектора" и "для нахождения модуля макс. элемента вектора" суть одна и та же, но все таки мне кажется нужно задействовать в программе формулу.

int main(void)
{
/* Initialized data */
static float b[4] = { 1.f,3.f,8.f,6.f };

/* Local variables */
extern float av01r_c(float *, int *);
static int n;
static float z__;

n = 4;
z__ = (float)av01r_c(b, &n);

printf("\n %12.4e \n", z__);
printf("\n %12.4e %12.4e %12.4e %12.4e \n",
b[0], b[1], b[2], b[3]);
return 0;
} /* main */
результат z=8

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

Цитата:

Цитата lxa85
Формула ИМХО не верна, но ладно. »

Я поискала в инете, нашла два сайта на которых была написана эта же формула, так что думаю можно ей доверится)
Хотя сомнения тоже были...

lxa85 23-09-2010 01:44 1502159

dasha131, приведенный пример конечно интересен, но не разу не понятен =(
Если брать воон ту формулу с модулем, которая вызывает подозрения, то задача сводится к нахождению максимального числа в потоке.
Т.е. первое приравниваем к текущему максимуму, затем в цикле сравниваем текущий текущий максимум с текущим числом. Тут простой if в цикле, без особых заморочек.
----
НО! Лично я бы предложил отказаться от этой формулы, либо заставил студента доказать ее правильность.
Я думаю скаляр длинны надо искать именно как скаляр длинны.
Пока для простоты и наглядности рассмотрим декартову систему координат.
Во что у нас разлагается вектор? Правильно, в более короткие вектора, коллинеарные (параллельные) осям координат. (взять тот же синус с косинусом в окружности единичного радиуса)
Синус и косинус, при неком угле 0<n<90 явно меньше единицы(1)

Вот теперь внимательно, попробую рассказать (нарисовать к сожалению сейчас не могу, чуть позже)

Как нам просчитать сферу? Сфера это 3х мерная фигура. 4х мерные фигуры брать не буду, их рисовать сложно :)
Значит вектор задан 3мя параметрами по осям координат.
Поступает первая величина x. Скаляр длинны очевидно равен модулю x т.е. |x|
Добавляем следующую координату - y. Уже плоскость и нам надо понизить кол-во степеней объекта. т.е. вернуться обратно к линиям. (мудренно по ходу сказал)
Проще Есть плоскость, нам надо ее свести к линии.
Поступила y. Что у нас получается? Получается прямоугольный треугольник, где по доказанному Пифагором l = sqrt (|x|^2 + |y|^2);
Отлично. Поступает координата z, что мы имеем?
Берем плоскость l(!) z на ней образуется прямоугольный треугольник, где катетами являются l, z.
Раскрывать подстановку я не вижу смысла, вроде бы как все и так понятно.
Т.е. сводить к одной, большой, большой формуле не надо. Надо считать скаляр длинны вектора по мере итерационно (по шагам) по мере поступления данных.
Далее можно наращивать кол-во изменений размерности 4, 5, 6d и т.д. Все вектора имеют прямой угол друг с другом, просто это в единой картине сложно рисуется :)

Решения задачи я вижу двумя способами:
Либо нахождение максимальной величины в потоке
Либо постепенное накопление нормы вектора (скаляра длинны)

dasha131 23-09-2010 13:27 1502459

Нет, тут точно правильная формула, я проверила
А как это сравнение на языке пасхаль записать вы могли бы показать?

lxa85 23-09-2010 14:20 1502485

dasha131, Уточни пожалуйста, что вы понимаете под словом норма.
Просто сейчас спросил у к.ф.м.н, зав. каф. Талапов В. В.(замечательная вещь конференция, иногда сидишь рядом с такими людьми, с которыми в другом месте встретиться просто не реально, т.е. мне бы и в голову не пришло, с кем я сижу) и мне доходчиво объяснили, что под словом "норма вектора" может подразумеваться много всего интересного. Тем более, если мы начинаем говорить про норму бесконечного норму вектора.
В принципе, в принципе, формула приведенная тобой так же имеет право на существование, но это несколько иное определение нормы вектора.
Норм и определения нормы, как выяснилось, так же много.
Т.е. можно назвать максимальное значение координаты n мерного пространства нормой вектора.

Обрамление условия с тебя.
Т.е. блок var, способ получения значений, способ их выдачи и т.д.

Vector - одномерный массив данных. Также называемый вектором.
Vector[i] - i'тый элемент вектора. Перебор задается в цикле (скорее всего в цикле for).
Если задана бесконечность, т.е. массив не "переборный", то текущее вводимое значение. (цикл while)
Max - текущее максимальное значение. Изначально приравнивается первому элементу массива, затем сравнивается с остальными.
Код:

if vector[i] > max then
max = vector[i] ;

На всякий случай, формула к более "каноническому" определению вектора
Код:

L = sqrt (X1^2 + X2^2 + ... + Xi^2+ ... + Xn^2)

dasha131 23-09-2010 15:16 1502539

Кое что исправила, сейчас скину
программа работает и выдает модуль максимального элемента.

program norma;
var
n:integer;
max:real;
i:integer;
a: Array [1..10] of real;
begin
read (n);
for i:=1 to n do
begin
read (a[i]);
end;
begin
for i:=1 to n do
begin
if (ABS(a[i])>max) then max:=a[i];
end;
write(max:4:2);
end;
end.

a: Array [1..10] of real;
незнала как обозначить в блоке описания переменных элемент "а", потом нашла в примерах такое её обозначение, звучит как
"Переменная а - массив действительных чисел из 10 элементов" а что это означает? что бы поменялось если я поставила там другие значения?

lxa85 23-09-2010 16:49 1502666

dasha131, обрамляй код тегом [code] [/code] - #
Цитата:

Цитата dasha131
Код:

program norma;
var
  n:integer;
  max:real;
  i:integer;
  a: Array [1..10] of real;
begin
  read (n); // я бы поставил readln это позволит безболезненно использовать Ентер как завершение ввода переменной
// Так же обрати внимание, что теоретически n может быть больше 10, и в заданный массив это не влезет. Верней влезет, //но будет произведена запись в неположенную ячейку памяти и повредить другую переменную.
//Проще сказать - это плохо. 
Ты можешь оставить как есть, ограничив диапазон вводимой переменной n
  for i:=1 to n do
  begin
    read (a[i]);
  end;
// я бы тебе на самом деле предложил бы объединить эти два цикла. И в процессе ввода массива отслеживать число по максимальному модулю.
// Ведь у тебя в обеих случаях используется цикл for i= 1 to x
 
  begin // эта операторная скобка лишняя
    for i:=1 to n do
    begin
// А вот тут у тебя может возникнуть ошибка, причем серьезная.
//Переменная max у тебя на момент начала выполнения цикла может содержать все что угодно.
//Тебе необходимо ее инициализировать, т.е. присвоить ей некое начальное значение.
//Обрати внимание, что ты работаешь с модулем числа. Это подскажет тебе выбор правильного значения :) 
      if (ABS(a[i])>max) then max:=a[i];
    end;
  write(max:4:2);
  end; // хвост от лишней операторной скобки
end.

»

Хорошо. Осталось тебе переписать код на цикл while, для обеспечения работы с бесконечным вектором.
Отказаться от явного задания n. Прокомментировать код.

Операторная скобка позволяет несколько операторов интерпретировать как один. Это необходимо в ряде конструкций, где предусмотрено выполнение оного оператора, а необходимо выполнить несколько. Например конструкция условия, цикла while.

Цитата:

Цитата dasha131
a: Array [1..10] of real;
незнала как обозначить в блоке описания переменных элемент "а", потом нашла в примерах такое её обозначение, звучит как "Переменная а - массив действительных чисел из 10 элементов" а что это означает? что бы поменялось если я поставила там другие значения? »

Обращаясь к переменной a ты обращаешься к массиву чисел. Т.к. ты указала тип real - это вещественные числа. Т.е. положительные, отрицательные, дробные. Т.е. все числа на числовой прямой, исключая мнимые (те, что с i)

Числа внутри скобок обозначают начальное и конечное значение индекса элемента (в последний момент я засомневался, но вроде так, другого тут быть не может)
Так же ты можешь задать двух, трех и так далее мерный массив. ЕМНИП они перечисляются через запятую [a1..a2, b1..b2, и т.д.]
Можно задать массив массивов, массив объектов и т.п.
Ну это чуть позже вы все пройдете и не в этом посте мне обо всем рассказывать :)

dasha131 23-09-2010 17:36 1502707

Спасибо большое что помогаете!
Вот я исправила замечания, завтра еще почитаю про "вайл" и попробую переделать под него:)
program norma;
var
n:integer;
max:real;
i:integer;
a: Array [1..500] of real;
begin
readln (n);
for i:=1 to n do
begin
read (a[i]);
end;
for i:=1 to n do
begin
max:= ABS(a[1]);
if (ABS(a[i])>max) then max:=a[i];
end;
write(max:4:2);
end.

lxa85 23-09-2010 17:44 1502715

dasha131, опять напутала, что ж такое то. :)
Код:

program norma;
var
  n:integer;
  max:real;
  i:integer;
  a: Array [1..500] of real;
begin
  readln (n);
  max=0;
  for i:=1 to n do
  begin
    read (a[i]);
    if (ABS(a[i])>max) then max:=a[i];
  end;

  write(max:4:2);
end.

Теперь переписывай в while, для бесконечного числа вводимых величин.
Естественно цикл должен как-то заканчиваться. Либо вводом определенного числа, либо через ентер. Т.е. продумай этот момент.

dasha131 26-09-2010 10:42 1504514

Что то с while возникли проблемы( даже нето чтобы проблемы, немогу представить как им воспользоваться в данной задаче.

dasha131 28-09-2010 09:37 1506244

Как можно выбрать максимальное значение из бесконечности???

lxa85 28-09-2010 11:41 1506357

Вроде бы так. Проверь.
Код:

var
a:char; // для организации посимвольного ввода
b:integer; //
flag:boolean;
max:integer;

begin
//инициализация переменных;
b:=0;
max:=0;
znak:=+1;
flag:=false;

repeat
//Вот тут у меня возникли сложности. Тебе надо будет найти, как организовать считывание символа из буффера клавиатуры. Примеры что мне попались в интернете, мне не понравились. Однако если сложные конструкции допустимы, то можно и позаимствовать.
 read (a); // КОМАНДА НЕ ВЕРНА!!! Ее надо заменить! Здесь стоит для обозначения действия.
 
  if ord(a) >= ord(0) and ord(a) >= ord(9) then begin //проверяем, что ввели цифру
    b:=b*10+znak*a; //"набираем" число
  end;

  if a="-" then znak:=-1; //если попался минус, то число должно быть отрицательным

  if a=" " then begin //символ разделителя чисел в ряде например  12 144 17
    if (ABS(b)>max) then max:=b; //Сравниваем с макисмальным
    znak:=+1; //готовим переменные к новому циклу
    b:=0;
  end; //if

  if ord(a)=13 //Enter ЕМНИП //выставляем флаг для окончания цикла
    then flag:=true;
until flag; 

end.

Можно конечно и на while переписать поменяв условие.
Так же желательно переписать использую конструкцию case <name> of
это даст более гибкие возможности для сравнения переменной с чем-либо.
ord - возвращает порядковый номер перечисляемого типа.
В качестве конечного символа можно использовать например букву, или иной отличный от знака числа и знака разделителя(лей) символ.

dasha131 01-10-2010 13:25 1508872

Вобщем вот окончательный вариант программы по моей задачи, большое спасибо за помощь =))
program norma;
var
n:integer;
max:real;
i:integer;
x:real;
begin
max:=0;
read (n);
for i:=1 to n do
begin
read (a);
if (ABS(a)>max) then max:=ABS(a);
end;

write(max:4:2);
end.

kiriluss 04-12-2010 14:06 1558131

Подскажите пожалуйста как решить задачу в Паскале.
Составить програму для нахождения значений компонентов вектора S={S1,..S6} где каждая расчитывается по формуле: Si=(Aj+Aj+1)/2, j=1,2..12, Aj может быть положительные и отрицательные значения


Время: 23:19.

Время: 23:19.
© OSzone.net 2001-