Войти

Показать полную графическую версию : [решено] Помогите плииз с программой для Turbo Pascal


dasha131
19-09-2010, 17:57
Помогите пожалуйста с программкой для вычисления бесконечной нормы вектора х размерностью n

Hector
19-09-2010, 18:37
вычисления бесконечной нормы вектора х размерностью n »
а как это хоть делается? а то я не силен в геометрии

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

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

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

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

dasha131
20-09-2010, 12:38
а как задать это сравнение?
по логике можно с начало сложить первое с первым число, потом первое со вторым, потом первое с третьим, первое с четвертым (при 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
23-09-2010, 01:44
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
Нет, тут точно правильная формула, я проверила
А как это сравнение на языке пасхаль записать вы могли бы показать?

lxa85
23-09-2010, 14:20
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
Кое что исправила, сейчас скину
программа работает и выдает модуль максимального элемента.

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
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.

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

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

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

dasha131
23-09-2010, 17:36
Спасибо большое что помогаете!
Вот я исправила замечания, завтра еще почитаю про "вайл" и попробую переделать под него:)
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
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
Что то с while возникли проблемы( даже нето чтобы проблемы, немогу представить как им воспользоваться в данной задаче.

dasha131
28-09-2010, 09:37
Как можно выбрать максимальное значение из бесконечности???

lxa85
28-09-2010, 11:41
Вроде бы так. Проверь.
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
Вобщем вот окончательный вариант программы по моей задачи, большое спасибо за помощь =))
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
Подскажите пожалуйста как решить задачу в Паскале.
Составить програму для нахождения значений компонентов вектора S={S1,..S6} где каждая расчитывается по формуле: Si=(Aj+Aj+1)/2, j=1,2..12, Aj может быть положительные и отрицательные значения




© OSzone.net 2001-2012