Одномер. и двумер. массивы(Pascal)

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
xxBOBAHxx
Сообщения: 8
Зарегистрирован: 19 окт 2008, 21:28

№1.Создать массив целых чисел R[1..N], содержащий серии чисел, разделенных нулями. Отсортировать массив по возрастанию сумм чисел в сериях.

Т.е. например дан массив
1 2 3 0 -1 2 3 0 6 7 3 0 3 3 3
данный массив нужно преобразовать по возрастанию сумм в сериях , чтоб получилось следующее:
-1 2 3 0 1 2 3 0 3 3 3 0 6 7 3


МОИ мысли по этой задаче:

uses crt;
const n=20;
var nach:array[1..n+1] of integer;
a,s, g:array[1..n] of integer;
i, j, h, k, c,gh, l :integer;
priz:boolean;
begin clrscr;
randomize;
for i:=1 to n do
begin a:=-5+random(10);
write(a, ' ');
end;
writeln;
i:=0; j:=0;
repeat
inc(j); s[j]:=0;
nach[j]:=i+1;
???????????
repeat
inc(i);
s[j]:=s[j]+a;
until (a=0) or (n=i);
writeln(s[j], '=б㬬* ', j);
until n=i;
k:=j;
gh:=j;
repeat dec(k);
priz:=true;
for j:=1 to k do
if s[j]>s[j+1] then begin
c:=s[j];
s[j]:=s[j+1];
s[j+1]:=c;
l:=nach[j];
nach[j]:=nach[j+1];
nach[j+1]:=l;
priz:=false;
end;
until priz;
writeln;
for h:=1 to gh do
write(nach[h],' ');
readkey;
end.

p.s. Там где стоит знак ? нужно дополнить.....ну я так думаю.....

№2. Построено N домов по M квартир в каждом доме. Сформировать матрицу А[N*M], где записать метраж каждой квартиры, в матрицу В записать число проживающих в каждой квартире. Создать массив С, где будет указано число квартир каждого дома, где на одного проживающего приходится менее 7 метров.


Свои мысли по поводу этой задачи выложу чуть позже.....
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

1)

Код: Выделить всё

const
  N=20; {макс. число элементов}
  MaxGN=N; {макс. количество групп}
  GN:integer=0; {кол-во групп}
type
  TR =array[1..N+1] of integer; {массив}
  TGroup = record {группа}
    pos:integer; {с какого элемента начинается группа}
    len:integer; {какой она длины}
    sum:longint; {ее сумма}
  end;
var
  R,R2: TR; {исходный и результир. массивы}
  G: array[1..MaxGN] of TGroup; {массив групп}
  Gi: TGroup; 
  i,j,k:integer;
  {заполнение массива сл. числами}
  procedure Init(var A:TR); 
  var
    i,EOG:integer;
  begin
    EOG:=random(N div 2)+1;
    for i:=1 to N do begin
      if i=EOG then begin
        A[i]:=0; EOG:=i+random(N div 2)+1;
      end else
        A[i]:=random(maxint)-maxint div 2;
    end;
    A[N+1]:=0;
  end;
  {вывод массива на экран}
  procedure Print(const A:TR; Header:string);
  var
    i:integer;
  begin
    writeln('*** ',Header,' ***');
    for i:= 1 to N do write(A[i],'; ');
    writeln;
  end;
  {упорядоченное добавление описания группы}
  procedure AddGroup(Grp:TGroup);
  var i:integer; B:TGroup;
  begin
    inc(GN);
    if GN=1 then begin
      G[GN]:=Grp;
    end else begin
      for i:=1 to GN do begin
        if G[i].sum>Grp.sum then begin
          B:=G[i];
          G[i]:=Grp;
          Grp:=B;
        end else if i=GN then G[i]:=Grp;
      end;
    end;
  end;



begin
  randomize;
  Init(R);
  Print(R,'Before sorting');
  {сканируем группы}
  Gi.pos:=1; Gi.Sum:=0; Gi.Len:=0;
  for i:=1 to N+1 do begin
    {накапливаем сумму и считаем длину группы}
    inc(Gi.len);
    inc(Gi.sum, R[i]);
    if R[i]=0 then begin {если обнаружен конец группы, то
    добавляем группу в массив, и начинаем новую группу}
      AddGroup(Gi);
      Gi.pos:=i+1; Gi.Sum:=0; Gi.Len:=0;
    end;
  end;

  {формируем новый массив, руководствуясь 
  упорядоченным списком групп}
  k:=0;
  for i:=1 to GN do for j:=1 to G[i].len do begin
    inc(k);
    R2[k]:=R[G[i].pos+j-1];
  end;

  {вывод результата}
  Print(R2,'After sorting');
  readln;
end.

Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

2)

Код: Выделить всё

const
  N = 5;
  M = 20;
type
  TArr = array[1..N,1..M] of integer;
var
  A:TArr;
  B:TArr;
  C:array[1..N] of integer;
  i,j:integer;
  {процедура вывода массива на экран}
  procedure PrintArr(X:TArr; width:byte; Header:string);
  var i,j:integer;
  begin
    writeln;
    write('*** ',Header,' ***');
    for i:=1 to N do begin
      writeln; write('House',i:4,' ');
      for j:=1 to M do write(X[i,j]:width);
    end;
    writeln;
  end;
  {процедура заполнения массива}
  procedure FillArr(var X:TArr; min,max:integer);
  var i,j:integer;
  begin
    for i:=1 to N do for j:=1 to M do X[i,j]:=min+random(max-min+1);
  end;
begin
  randomize;
  FillArr(A,20,70); {квартиры от 20 до 70 м.кв.}
  FillArr(B,1,5);     {от 1 до 5 человек на квартиру}
  PrintArr(A,3,'Square of flats');
  PrintArr(B,2,'Persons per flat');

  for i:=1 to N do begin
    C[i]:=0;
    for j:=1 to M do if A[i,j]/B[i,j]<7 then inc(C[i]);
  end;
  writeln;
  writeln('Number of flats where the square is less 7sq.m per person:');
  for i:=1 to N do begin
    writeln('House',i:4,' - ',C[i],' flat(s)');
  end;

  readln;
end.
Ответить