Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2020, 20:00   #1
tara-ta-ta
Пользователь
 
Регистрация: 25.10.2019
Сообщений: 36
По умолчанию Сгенерировать случайным образом объём занимаемой памяти Z є [16;256]. В массиве RAM.MEMORY найти блок памяти (значение) RAM.MEMORI[i], который является свободным

Сразу мой код:

Код:
uses CRT;

type
  RAM = record
    memory: integer;
    status: byte;
    time: byte;
    count: byte;
  end;

var
  i: integer;
  MyRAM: array [1..100] of RAM;
  z: array [1..100] of integer;

begin
  for i:=1 to 100 do begin
    z[i]:= 16 + random(261);
    write(z[i]:5);
  end; writeln;
  writeln('Исходная загруженность оперативной памяти');
  for i := 1 to 100 do
  begin
    MyRAM[i].memory := 64 + random(961);
    MyRAM[i].status := random(2);
    if MyRAM[i].status = 0 then if MyRam[i].memory<=Z[i] then textcolor (red) else textcolor (green);
    write(MyRAM[i].memory:5);
  end;
 
end.
Задание звучит так: Сгенерировать случайным образом объём занимаемой памяти Z є [16;256]. В массиве RAM.MEMORY найти блок памяти (значение) RAM.MEMORI[i], который является свободным, т.е. для него значение в массиве RAM.STATUS[i]=0, и для которого второй раз выполняется условие: RAM.MEMORI[i] ≤ Z. Для занятого блока памяти изменить статус (RAM.STATUS[i]=1).

Вроде бы как в правильном направлении иду. Но чет туплю, как сделать так, чтобы проверить, что условие выполняется второй раз?
tara-ta-ta вне форума Ответить с цитированием
Старый 08.05.2020, 05:56   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Код:
uses CRT;

const
  RAMBlockCount = 100;

type
  RAM = record
    memory: array [1..RAMBlockCount] of integer;
    status: array [1..RAMBlockCount] of byte;
    time: array [1..RAMBlockCount] of byte;
    count: array [1..RAMBlockCount] of byte;
  end;

var
  i, z: integer;
  MyRAM: RAM;

begin
  clrscr;
  randomize;
  textcolor(lightgray);
  writeln('Исходная загруженность оперативной памяти');
  for i := 1 to RAMBlockCount do
  begin
    MyRAM.memory[i] := 64 + random(961);
    MyRAM.status[i] := random(2);
    MyRAM.time[i] := 1 + random(49);
    MyRAM.count[i] := 1 + random(10);
    if MyRAM.status[i] = 1 then
      textcolor(red)
    else
      textcolor(green);
    write(MyRAM.memory[i]:5);
  end;
  z := 16 + random(241);
  writeln('');
  textcolor(lightgray);
  writeln('z = ', z);
  for i := 1 to RAMBlockCount do
    if (MyRAM.status[i] = 0) and (MyRAM.memory[i] >= z) then
    begin
      MyRAM.status[i] := 1;
      break;
    end;
  textcolor(lightgray);
  writeln('Загруженность оперативной памяти после');
  for i := 1 to RAMBlockCount do
  begin
    if MyRAM.status[i] = 1 then
      textcolor(red)
    else
      textcolor(green);
    write(MyRAM.memory[i]:5);
  end;
end.
1) Изменил описание записи RAM, опираясь на описание из предыдущей темы.
2) По-моему тут ошибка в формулировке. Не "второй раз выполняется", а "выполняется второе условие".
3) Я считаю, что проверять нужно MyRAM.memory[i] >= z, то есть блок памяти не меньше, чем сохраняемый объем z.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.05.2020, 10:14   #3
tara-ta-ta
Пользователь
 
Регистрация: 25.10.2019
Сообщений: 36
По умолчанию

BDA, А не подскажете как сделать вот так: "Занимаемый блок памяти выделить контрастным цветом, в скобках указать оставшийся свободным объём блока."

Я делаю условие, но выводит на всех блоках оставшийся объём, а нужно только на занятых..

Последний раз редактировалось tara-ta-ta; 08.05.2020 в 10:46.
tara-ta-ta вне форума Ответить с цитированием
Старый 08.05.2020, 14:50   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Код:
uses CRT;

const
    RAMBlockCount = 100;

type
  RAM = record
    memory: array [1..RAMBlockCount] of integer;
    status: array [1..RAMBlockCount] of byte;
    time: array [1..RAMBlockCount] of byte;
    count: array [1..RAMBlockCount] of byte;
  end;

var
  i, z, saved_block: integer;
  MyRAM: RAM;

begin
  clrscr;
  randomize;
  textcolor(lightgray);
  writeln('Исходная загруженность оперативной памяти');
  for i := 1 to RAMBlockCount do
  begin
    MyRAM.memory[i] := 64 + random(961);
    MyRAM.status[i] := random(2);
    if MyRAM.status[i] = 1 then
    begin
      MyRAM.time[i] := 1 + random(49);
      MyRAM.count[i] := 1 + random(10);
    end;
    if MyRAM.status[i] = 1 then
      textcolor(red)
    else
      textcolor(green);
    write(MyRAM.memory[i]:8);
  end;
  z := 16 + random(241);
  saved_block := -1;
  writeln('');
  textcolor(lightgray);
  writeln('z = ', z);
  for i := 1 to RAMBlockCount do
    if (MyRAM.status[i] = 0) and (MyRAM.memory[i] >= z) then
    begin
      MyRAM.status[i] := 1;
      saved_block := i;
      break;
    end;
  textcolor(lightgray);
  writeln('Загруженность оперативной памяти после');
  for i := 1 to RAMBlockCount do
  begin
    if MyRAM.status[i] = 1 then
      textcolor(red)
    else
      textcolor(green);
    if i = saved_block then
    begin
      textcolor(magenta);
      write(MyRAM.memory[i]:8, ' (', (MyRAM.memory[i] - z):5, ')');
    end else
      write(MyRAM.memory[i]:8);
  end;
end.
1) Сделал заполнение time и count только для занятых блоков.
2) Добавил вывод в скобках свободного места, но это "костыль", так как текущая реализация записи RAM поддерживает только выделение блока памяти целиком.

Вывод карты памяти с возможностью просмотра информации о любом блоке:
Код:
uses CRT;

const
    RAMbc = 100; (* RAM block count *)
    SLbc = 40; (* Screen Line block count *)

type
  RAM = record
    memory: array [1..RAMbc] of integer;
    status: array [1..RAMbc] of byte;
    time: array [1..RAMbc] of byte;
    count: array [1..RAMbc] of byte;
  end;

var
  i, z, saved_block: integer;
  cursor: integer;
  ch: integer;
  MyRAM: RAM;

begin
  randomize;
  cursor := 1;

  for i := 1 to RAMbc do
  begin
    MyRAM.memory[i] := 64 + random(961);
    MyRAM.status[i] := random(2);
    if MyRAM.status[i] = 1 then
    begin
      MyRAM.time[i] := 1 + random(49);
      MyRAM.count[i] := 1 + random(10);
    end;
  end;

  repeat
    clrscr;
    textcolor(black);
    for i := 1 to RAMbc do
    begin
      if MyRAM.status[i] = 1 then
        textbackground(red)
      else
        textbackground(green);
      if i = cursor then
        write('##')
      else
        write('  ');
    end;
    textbackground(black);
    textcolor(lightgray);
    writeln('');
    writeln(cursor, ' блок памяти');
    writeln('Объем блока: ', MyRAM.memory[cursor]);
    if MyRAM.status[cursor] = 1 then
    begin
      writeln('Статус блока: занят');
      writeln('Время нахождения в памяти: ', MyRAM.time[cursor]);
      writeln('Количество обращений: ', MyRAM.count[cursor]);
    end else
      writeln('Статус блока: свободен');

    ch := ord(readkey);
    if ch = 0 then
    begin
      ch := ord(readkey);
      case ch of
        72: if cursor - SLbc < 1 then
          cursor := RAMbc - (RAMbc - cursor) mod SLbc
        else
          cursor := cursor - SLbc;
        75: cursor := (cursor - 2 + RAMbc) mod RAMbc + 1;
        77: cursor := cursor mod RAMbc + 1;
        80: if cursor + SLbc > RAMbc then
          cursor := (cursor - 1) mod SLbc + 1
        else
          cursor := cursor + SLbc;
      end;
    end;
  until ch = 27;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 08.05.2020 в 16:14.
BDA вне форума Ответить с цитированием
Старый 09.05.2020, 18:34   #5
tara-ta-ta
Пользователь
 
Регистрация: 25.10.2019
Сообщений: 36
По умолчанию

BDA, смотри, как сделать так, чтобы синим цветом выделялись только те блоки, которые изменились, и чтобы только для них скобки писались? Сейчас в ней красятся все значения, которые <=z.

Код:
uses CRT;
const
  n = 100;
type
  RAM = record
    memory: array [1..n] of integer;
    status: array [1..n] of byte;
    time: array [1..n] of byte;
    count: array [1..n] of byte;
  end;
var
  i, z, a: integer;
  MyRAM: RAM;
begin
  TEXTCOLOR(WHITE);
  writeln('Исходная загруженность оперативной памяти');
  for i := 1 to n do
  begin
    MyRAM.memory[i] := 64 + random(961);
    MyRAM.status[i] := random(2);
    MyRAM.time[i] := 1 + random(49);
    MyRAM.count[i] := 1 + random(10);
    if MyRAM.status[i] = 1 then
      textcolor(red)
    else
      textcolor(green);
    write(MyRAM.memory[i]:5);
  end;
  writeln;
  TEXTCOLOR(WHITE);
  writeln('Массив STATUS');
  for i := 1 to 100 do
  begin
    if MyRAM.status[i] = 1 then textcolor(red) else textcolor(green);
    write( MyRAM.status[i]:5);
  end;
  writeln;
  z := 16 + random(241);
  writeln('');
  TEXTCOLOR(WHITE);
  writeln('z = ', z);
  writeln;
  for i := 1 to n do
    if (MyRAM.status[i] = 0) then 
      if (MyRAM.memory[i] <= z) then 
        if (MyRAM.memory[i] <= z) then begin
          MyRAM.status[i] := 1;
        end; 
  TEXTCOLOR(WHITE);
  writeln('Загруженность оперативной памяти после');
  for i := 1 to n do
  begin
    if myram.status[i]=0 then textcolor(green) else
    if myram.memory[i]<=z then textcolor(lightcyan) else textcolor(red);
    write(MyRAM.memory[i]:5); 
    if MyRAM.status[i] = 1 then 
    begin
      a := MyRAM.memory[i] - z;
      if a < 0 then a := 0;
      write('(', a, ')'); end;
  end;
  TEXTCOLOR(WHITE);
end.
tara-ta-ta вне форума Ответить с цитированием
Старый 09.05.2020, 19:44   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,429
По умолчанию

Во-первых, повторюсь, проверять нужно MyRAM.memory[i] >= z, иначе сохраняемый объем z не поместится в блоке памяти. Во-вторых, в 4 сообщении есть код, который подсвечивает только что сохраненный блок и свободное место в нем. Обойтись без дополнительной переменной saved_block нельзя. Ну или можно считать блоки, у которых status = 1, а time = 0, только что изменившимися. Еще раз повторюсь, что текущий способ хранения описания памяти не подразумевает выделение части блока памяти, а только весь блок целиком. Ну и в текущей постановке задачи измениться может только один блок памяти (в который сохранен объем z), либо ни одного (если все блоки уже заняты).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сгенерировать случайным образом массив целых чисел из n элементов. ANN4 Паскаль, Turbo Pascal, PascalABC.NET 3 17.10.2015 07:42
Задача - найти объём памяти, который требуется для хранения изображения Александр95 Помощь студентам 5 13.10.2011 20:17
Кольцевая очередь на массиве в статической памяти с элементами в динамической памяти ]tach[ Общие вопросы C/C++ 1 19.01.2011 13:16
Максимальный размер занимаемой памяти Alex Cones Общие вопросы Delphi 8 06.05.2009 22:37
Освобождение памяти занимаемой объектом Oburec Общие вопросы Delphi 10 16.04.2009 10:54