PDA

Просмотр полной версии : Сортировка массива



Philin
21.02.2007, 07:21
Помогите плз. Я что-то не могу разобраться как сделать чтобы кол-во элементов массива вводилось с клавиатуры а не заранее определялось константой. А точнее не понял как обявить переменныу n до объявления массива. А вообще если кто может помочь то задача следующая:
Вводится с клавиатуры кол-во элементов массива, затем вводиться сам массив, затем его нужно отсортировать по возрастанию. Но отсортировать нужно не созданием ещё одного массива или как-то подругому а надо просматривать массив с n-ого элемента находить самое большое, затем запоминать значение n-ого элмента в какую-то переменную, потом найденный максимум ставить на место n а то что было на n(тобиш то что в новой переменной) ставить на место максимума. Заранее спаибо.

Nem
21.02.2007, 10:36
Просто при объявлении массива указываешь какое-то максимально кол-во элементов, например max_kol. Потом просто вводишь n с клавиатуры и заполняешь элементы массива от 1 до n. То же самое с сортировкой и выводом. Вот пример:
const max_kol=100;
type mas:array[1..max_kol] of integer;
var a:mas;
n:integer;

procedure zapol(var a:mas; n:integer);
{заполение элементов массива с 1 до n}
var i:integer;
begin
randomize;
for i:=1 to n do a[i]:=random(50)-20;
end;

procedure out(a:mas; n:integer);
{процедура выводжа массива на экран}
var i:integer;
begin
for i:=1 to n do write(a[i]:3);
writeln;
end;

procedure sort(var a:mas; n:integer);
{сортировка массива};
begin
{То, что ты описал похоже на сортировку подсчётом.
Её алгоритм можно найти в интрнете.
Опять же нужно сортировать элементы от 1 до n}
end;

begin
readln(n); {n - количесвто элементов массива}
zapol(a,n);
out(a,n);
sort(a,n);
end.

Philin
21.02.2007, 15:59
Спасиб всё сделал всё работает, я просто раньше не пользовался а точнее и не занл про procedure(); а щас почитал фаронова во всём разобрался. Всё вообще шикарно. Только у меня там массив вводится с клавы а не рандомом и вывод на экран уже отсортированного. Но эт я всё сделал.

Philin
22.02.2007, 10:32
А ещё никто не подскажет программку вот такую:

программа на яве мнеб её на паскале ну или хотябы смысл того что она делает, а то я что-то не понял что мне надо сделать

Нахождение корня нелинейного уравнения методом бисекции

class Bisection{

static double f(double x){

return x*x*x — 3*x*x +3; // Или что-то другое

}

public static void main(String!] args){

double a = 0.0, b = 1,5, с, y, eps = le-8;

do{

с = 0.5 *(a + b); у = f(с);

if (Math.abs(y) < eps) break;

if (f (а) * у < 0.0) b = с;

else а * с;


} while (Math, abs (b-a) >= eps);

System.out.println("x = " +c+ ", f(" +c+ ") = " +y) ;

}

}

Хыиуду
22.02.2007, 10:51
Метод бисекции, он же метод деления отрезка пополам, он же метод дихотомии. Суть простая: если функция f имеет единственный корень на промежутке (a,b), то на одном из концов этого промежутка функция положительна, а на другом отрицательна. Следовательно, если знак функции в середине промежутка совпадает со знаком функции в начале, то корень где-то во второй половине промежутка, а если не совпадает - то в первой.
Так что
repeat
c:=(a+b)/2;
if f(a)*f(c)>0 then a:=c else b:=c
until abs(a-b)<eps;
где eps - порог точности поиска (обычно берут где-то 0.001)