Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

задача на Pascal [WinXP]


Drow ©   (2005-09-11 13:40:00) 

Уважаемые мастера,прощу помощи с написанием программы из курсовой...вот:
Заменить каждый элемент массива средним арифметичекским всех предшествующих ему элементов.Число элементов N>=100.Итоговый массив записываеться в файл с контролем на экране монитора.Исходный массив сформировать из случайныйх действительныйх чисел и хранить на МД.
Буду очень благодарен если хотя бы укажете примерный алгоритм решения.


Zeqfreed   (2005-09-11 17:18:00) [1]

Zeqfreed ©   (11.09.05 17:14) [12]
NUM_COUNT - 1следует заменить на NUM_COUNT


Zeqfreed   (2005-09-11 17:14:00) [2]

program evalarr;

{$APPTYPE CONSOLE}

const
NUM_COUNT = 10;

type
TSingleArray = array[1..NUM_COUNT - 1] of Single;

var
MyArr : TSingleArray;

procedure SaveArrayToFile(const Filename : String; const Src : TSingleArray);
var
i : Integer;
f : TextFile;
begin
AssignFile(f, Filename);
Rewrite(f);

for i := Low(TSingleArray) to High(TSingleArray) do begin
 WriteLn(f, Src[i]:3:3);
end;

CloseFile(f);
end;

function EvalArray(const Src : TSingleArray) : TSingleArray;
var
i : Integer;
q : Single;
begin
q := 0;

Result[Low(TSingleArray)] := Src[Low(TSingleArray)];
for i := Low(TSingleArray) + 1 to High(TSingleArray) do begin
 q := q + Src[i - 1];
 Result[i] := (q / (i - 1));
end;
end;

function GenerateArray(const MinVal, MaxVal : Integer) : TSingleArray;
var
i : Integer;
begin
Randomize();
for i := Low(TSingleArray) to High(TSingleArray) do begin
 Result[i] := Random(MaxVal - MinVal) + MinVal;
end;
end;

begin
WriteLn('Welcome!');
MyArr := GenerateArray(1, 6);
WriteLn('Array was generated');
SaveArrayToFile('source array.txt', MyArr);
WriteLn('Generated array saved');
SaveArrayToFile('destination array.txt', EvalArray(MyArr));
WriteLn('Array was evaluated and saved');
WriteLn('Thank you for using this example!');
ReadLn;
end.


Вот тебе ещё вариант, вроде работает как надо.. :)


Drow   (2005-09-11 17:07:00) [3]

спасибо,сейчас попробую...


begin...end   (2005-09-11 16:56:00) [4]

> Drow   (11.09.05 16:16) [9]

type
 TRealArray = array [1..100] of Real;

procedure P(var A: TRealArray; Count: Integer);
var
 I: Integer;
 Sum, Temp: Real;
begin
 if (Count > 0) and (Count <= High(A)) then
 begin
   Sum := 0;
   Temp := A[1];
   for I := 2 to Count do
   begin
     Sum := Sum + Temp;
     Temp := A[I];
     A[I] := Sum / (I - 1)
   end
 end
end.

Писал прямо здесь, мог ошибиться.


Drow   (2005-09-11 16:16:00) [5]

2begin...end
нет,сам элемент не считаеться.
первый без изменеий,второй получаеться равен первому,третий сумме 1+2 /2 и т.д.


begin...end   (2005-09-11 16:07:00) [6]

> Drow   (11.09.05 16:05) [7]

Тогда, получается, задание было сформулировано не совсем верно: каждый элемент массива нужно заменить на среднее арифметическое предшествующих элементов и самого этого элемента (т.е. текущий элемент тоже нужно учитывать при вычислении среднего). Так?


Drow   (2005-09-11 16:05:00) [7]

2begin...end
первый элемент полученного массива будет равен первому элементу исходного массива.


begin...end   (2005-09-11 15:56:00) [8]

> Drow   (11.09.05 13:40)

> Заменить каждый элемент массива средним арифметичекским
> всех предшествующих ему элементов.

А чему тогда должен быть равен первый элемент полученного массива?


Drow   (2005-09-11 15:39:00) [9]

program z1n1;
uses crt;
type
tarr=array[1..100] of single;
var
mass:Tarr;
n,j,k:integer;
function Sr(var x:Tarr;size,p:integer):single;
var
i:integer;
s:single;
begin
s:=0;
for i:=1 to p do
s:= s+x[i];
s:=s/(p);
Sr:=s;
end;
begin
clrscr;
writeln('ISHODNIY MASSIV :');
for k:=1 to 100 do begin
mass[k]:=random(100)+1;
write(' * ',mass[k]:3:0);
end;
writeln;
writeln('POLUCHENIY MASSIV :');
for j:=n downto 2 do
mass[j] :=Sr(mass,n,j-1);
for k:=1 to 100 do begin
write('  ',mass[k]:3:1);
end;
readln;
end.
вот написал,но почему то исходный и полученный массив одинаковые...помогите найти ошибку...


Наиль   (2005-09-11 14:16:00) [10]

Среднее значение редко бывает целым.
Значит массив должен быть Real или, в крайнем случае, Extended.
Алгоритм я придумывал на лету. Так что тебе придётся его проверить (ручка+бумага=GOOD).


Drow   (2005-09-11 14:04:00) [11]

to Наиль
а какого типа тогда должен быть массив A[i]?
я делаю его типа Real.вот такой код:

program z1n1;
var
i,:integer;
A:array[1..10] of real;
begin
for i:=1 to 10 do begin
A[i]:=random(11);
write('*',A[i]);
end;
for i:=2 to 10 do begin
A[i]:=a[i-1]+a[i];
end;
for i:=2 to 10 do begin
A[i]:=a[i-1]/(i-1);
end;
writeln;
for i:=1 to 10 do begin
writeln('#',A[i]);
end;
readln;
end.


Наиль   (2005-09-11 13:47:00) [12]

Два цикла:
1: a[i]:=a[i-1]+a[i]; i=2..N
2: a[i]:=a[i-1]/(i-1); i=2..N


Virgo_Style   (2005-09-11 13:45:00) [13]

Drow   (11.09.05 13:40)
примерный алгоритм решения.


1. Заполнить массив случайными числами
2. Записать его на МД (магнитный диск?)
3. Посчитать средние значения
4. Записать в файл и вывести на экран.

п. 1 и 2, а также 3 и 4 могут быть объединены.
Средние значения можно писать в новый массив или слегка извратиться, используя один и тот же массив:

Mid(n) = (Sum(A0..An)/n) = (Mid(n-1)*(n-1)+An)/n, если не путаю.


Наверх

Титульная страница Поиск, карта сайта Написать письмо