Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий"

Здравствуйте. Получил следующее задание:Для каждой поступающей программы выделяется один из свободных участков памяти. Таким образом, размер поступающей программы не должен превышать размера блока максимального объема. Если все блоки заняты, то программа ожидает первого освободившегося. Если имеется несколько свободных, то программа загружается в блок, наименее подходящий по размеру. 1. Исходные данные:общий объем памяти; размер блока; поток заявок на размещения в памяти (номер заявки, объем требуемой памяти, время поступления, продолжительность обработки заявки). составил программу, текст программы приведен ниже. Не получается реализовать расстановку файлов по приоритету (приоритет поступающей программы так же вводится с клавиатуры). Выдает ошибку при условии, что блок и программа имеют равный объем памяти. Помогите исправить данные неточности.
#include <iostream>
#include<conio.h>
#include <clocale> 
#define max 25
 
void main()
{
    setlocale(LC_CTYPE,"Russian");
    
    int frag[max],b[max],f[max],i,l,j,nb,nf,pr,prx,pri[max],temp,highest=0;
    static int bf[max],ff[max];
 
 printf("\nМОДЕЛЬ РАСПРЕДЕЛЕНИЯ ПАМЯТИ РАЗДЕЛАМИ ПЕРЕМЕННОГО РАЗМЕРА\nС ОБЩЕЙ ОЧЕРЕДЬЮ СО СТРАТЕГИЕЙ НАИМЕНЕЕ ПОДХОДЯЩИЙ");
 printf("\n Введите число блоков: ");
 scanf("%d",&nb);
 printf("\n Введите число файлов: ");
 scanf("%d",&nf);
 
 printf("\n Введите размер блоков :\n");
 for(i=1;i <= nb;i++) {printf("Блок %d:",i);scanf("%d",&b[i]);}
 printf("Введите размер файлов :\n");
 for(i=1;i <= nf;i++) {printf("Файл %d:",i);scanf("%d",&f[i]);}
 printf("\n Введите приоритет файла: ");
 for(i=1;i <= nf;i++) {printf("Файл %d:",i);scanf("%d",&pri[i]);}
 
 for(i = 1;i <= nf;i++)
 {
  for(j = 1;j <= nb;j++)
   {
    if(bf[j]!=1) 
    {
        temp=b[j]-f[i];
        if(temp>=0)
        if(highest < temp)
    {
     ff[i]=j;
     highest = temp;
    }
  }
  }
  frag[i]=highest;
  bf[ff[i]]=1;
  highest=0;
 }
 printf("\nНомер файла:\tРазмер файла:\tНомер блока:\tРазмер блока:\tФрагмент");
 for(i=0;i < nf;i++)
 printf("\n%d\t\t%d\t\t%d\t\t%d\t\t%d",i+1,f[i],ff[i],b[ff[i]],frag[i]);
 getch();
}
}
вот попробовал расставить файлы по приоритету следующим образом:
#include <iostream>
#include<conio.h>
#include <clocale> 
#define max 25
 
void main()
{
    setlocale(LC_CTYPE,"Russian");
    
    int frag[max],b[max],f[max],i,j,nb,nf,pr,prx,pri[max],temp,highest=0;
    static int bf[max],ff[max];
 
 printf("\nМОДЕЛЬ РАСПРЕДЕЛЕНИЯ ПАМЯТИ РАЗДЕЛАМИ ПЕРЕМЕННОГО РАЗМЕРА\nС ОБЩЕЙ ОЧЕРЕДЬЮ СО СТРАТЕГИЕЙ НАИМЕНЕЕ ПОДХОДЯЩИЙ");
 printf("\n Введите число блоков: ");
 scanf("%d",&nb);
 printf("\n Введите число файлов: ");
 scanf("%d",&nf);
 
 printf("\n Введите размер блоков :\n");
 for(i=0;i < nb;i++) {printf("Блок %d:",i);scanf("%d",&b[i]);}
 printf("Введите размер файлов :\n");
 for(i=0;i < nf;i++) {printf("Файл %d:",i);scanf("%d",&f[i]);}
 printf("\n Введите приоритет файла: ");
 for(i=0;i < nf;i++) {printf("Файл %d:",i);scanf("%d",&pri[i]);}
 
             for(int k = 1;k <= nf; k++)
        {
                for(i=0;i < nf - k; i++)
                {
                        if( pri[i] > pri[i + 1] )
                        {
                                pr = pri[i];
                                pri[i] = pri[i + 1];
                                pri[i + 1] = pr;
                                prx = f[i];
                                f[i] = f[i + 1];
                                f[i + 1] = prx;
                        }
 
                }
                printf("\n Расставленные файлы по приоритету на выполнение: ");
                        for ( i= 0; i < nf; i++)
        {
               printf("\nРазмер файла:\tПриоритет файла: ");
               printf("\n%d\t\t%d",f[i],pri[i]);
                        }
 
 
 for(i = 0;i < nf;i++)
 {
  for(j=1;j<=nb;j++)
   {
    if(bf[j]!=1) 
int temp=b[j]-f[i];
    if(highest < temp)
    {
     ff[i]=j;
     highest = temp;
    }
  }
  frag[i]=highest;
  bf[ff[i]]=1;
  highest=0;
 }
 printf("\nНомер файла:\tРазмер файла:\tНомер блока:\tРазмер блока:\tФрагмент");
 for(i=0;I < nf;i++)
 printf("\n%d\t\t%d\t\t%d\t\t%d\t\t%d",i,f[i],ff[i],b[ff[i]],frag[i]);
 getch();
}
}
но из-за этого в основном коде программы творится жуткий кавардак.
3 ответа

ДЛЯ ТОГО ЧТОБЫ ВЫРУБИТЬ КАПС НАДО НАЖАТЬ КНОПКУ Caps Lock


Копировал название заголовка с задания, извиняюсь


Код, только на C#; Для работы нужно будет добавить кнопку и 4 метки.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
 
namespace WindowsFormsApplication3
{
    struct progr  
    {
        public int num;
        public int size;
        public int time;
        public int dur;
        public bool done;
        public bool line;
        public bool inmem;
    }
    public partial class Form1 : Form
    {
        int[] mem = new int[100];
        int[] turn = new int[100];
        int  t = -1, v = 0, free = 0, cm = 0, done = 0, ln = 0, sepnum;
        progr[] a = new progr[100];
 
        public Form1()
        {
            InitializeComponent();
            int memsize = 0, blocksize = 0, i = 0;;
            for (i = 0; i < 100; i++) mem[i] = -1;
            for (i = 0; i < 100; i++) turn[i] = -1;
            string line;
            string path = "C:\\Borland\\input.txt";    //   Корень диска C:
            //  Сначала надо определить поток ввода
            StreamReader sr = new StreamReader(path, Encoding.GetEncoding(1251));
            i = 0;
            memsize = Convert.ToInt32(sr.ReadLine());
            blocksize = Convert.ToInt32(sr.ReadLine());
            sepnum = ((int)memsize / blocksize);
 
            while ((line = sr.ReadLine()) != null)
            {
                string[] spr = line.Split(' ');
                a[v].num = Convert.ToInt32(spr[0]);
                a[v].size = Convert.ToInt32(spr[1]);
                a[v].time = Convert.ToInt32(spr[2]);
                a[v].dur = Convert.ToInt32(spr[3]);
                a[v].done = false;
                a[v].line = false;
                a[v].inmem = false;
                v++;
            }
            free = sepnum;
            //  По окончания работы поток ввода надо закрыть
            sr.Close();
            for (i = 0; i < v; i++)   
                    label1.Text += a[i].num + " " + a[i].size + " " + a[i].time + " " + a[i].dur + " ";
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            button1.Text = "Далее";
            int j = 0;
            t++;
            label3.Text = "";
            label4.Text = "";
            for (int i = 0; i < v; i++)
            {
                if ((free == 0) & (sepnum < v) & (a[i].done != true) & (a[i].inmem == false)&(a[i].time == t))
                {
                    a[i].time++;
                    label4.Text += a[i].num + "";
                }
                if ((a[i].time == t) & (free != 0) & (a[i].done != true))
                {
                    j = -1;
                    while (j != sepnum)
                    {
                        j++;
                        if (mem[j] == -1)
                        {
                            mem[j] = a[i].num;
                            break;
                        }
                    }
                    a[i].inmem = true;
                    free--;
                    cm++;
                }
                if ((a[i].dur + a[i].time) == t)
                {
                    a[i].done = true;
                    a[i].inmem = false;
                    for (j = 0; j < sepnum; j++)
                        if (a[i].num == mem[j]) mem[j] = -1;
                    free++;
                    done++;
                    cm--;
                }
            }
            if (done == v) button1.Visible = false;
            label2.Text = Convert.ToString(t);
            for (int i = 0; i < sepnum; i++)
            {
                if (mem[i] == -1) label3.Text += "+";
                else
                    label3.Text += Convert.ToString(mem[i]);
            }
        }
    }
}