Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
RezoneR
Сообщений: n/a
24.09.2013, 19:28     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий" #1
Здравствуйте. Получил следующее задание:

Для каждой поступающей программы выделяется один из свободных участков памяти. Таким образом, размер поступающей программы не должен превышать размера блока максимального объема. Если все блоки заняты, то программа ожидает первого освободившегося. Если имеется несколько свободных, то программа загружается в блок, наименее подходящий по размеру.
1. Исходные данные:общий объем памяти; размер блока; поток заявок на размещения в памяти (номер заявки, объем требуемой памяти, время поступления, продолжительность обработки заявки).

составил программу, текст программы приведен ниже. Не получается реализовать расстановку файлов по приоритету (приоритет поступающей программы так же вводится с клавиатуры). Выдает ошибку при условии, что блок и программа имеют равный объем памяти. Помогите исправить данные неточности.


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#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();
}
}
Добавлено через 2 минуты
вот попробовал расставить файлы по приоритету следующим образом:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#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();
}
}
но из-за этого в основном коде программы творится жуткий кавардак.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 19:28     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий"
Посмотрите здесь:

C++ Программа "Динамическая модель солнечной системы"
C++ Модель "стек" используя вектор
C++ что значит "поставить контроль памяти"? (в динамическом массиве)
C++ напишите программу! тема "динамическое распределение памяти"!
C++ Реализовать абстрактный класс "Список" стеком/очередью
Стратегия "получение ресурса есть инициализация" C++
Поиск значения в памяти приложения ("Нет" читам!) C++
C++ Можно ли получить адрес памяти где хранится буква "a"
C++ Класс "ArrayList", похоже на проблему с выделением памяти
Модель "Экосистема леса". Игра C++
Как сделать так, чтобы введенное с клавиатуры слово "helllo" в памяти сохранялось в виде "Hello". C++
C++ трудности с пониманием синтаксиса на примере реализации паттерна "стратегия"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
24.09.2013, 19:30     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий" #2
ДЛЯ ТОГО ЧТОБЫ ВЫРУБИТЬ КАПС НАДО НАЖАТЬ КНОПКУ Caps Lock
RezoneR
Сообщений: n/a
24.09.2013, 19:48     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий" #3
Копировал название заголовка с задания, извиняюсь
Gorev
 Аватар для Gorev
132 / 129 / 15
Регистрация: 08.12.2009
Сообщений: 545
Записей в блоге: 3
29.11.2013, 01:37     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий" #4
Код, только на C#;
Для работы нужно будет добавить кнопку и 4 метки.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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]);
            }
        }
    }
}
Yandex
Объявления
29.11.2013, 01:37     Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий"
Ответ Создать тему
Опции темы

Текущее время: 13:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru