Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
RezoneR
#1

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

24.09.2013, 19:28. Просмотров 759. Ответов 3
Метки нет (Все метки)

Здравствуйте. Получил следующее задание:

Для каждой поступающей программы выделяется один из свободных участков памяти. Таким образом, размер поступающей программы не должен превышать размера блока максимального объема. Если все блоки заняты, то программа ожидает первого освободившегося. Если имеется несколько свободных, то программа загружается в блок, наименее подходящий по размеру.
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++
В зависимости от времени года &quot;весна&quot;, &quot;лето&quot;, &quot;осень&quot;, &quot;зима&quot; определить погоду &quot;тепло&quot;, &quot;жарко&quot;, &quot;холодно&quot;, &quot;очень холодно&quot;. Я так...

трудности с пониманием синтаксиса на примере реализации паттерна "стратегия" - C++
#include &lt;iostream&gt; #include &lt;string&gt; // Иерархия классов, определяющая алгоритмы сжатия файлов class Compression { ...

Стратегия "получение ресурса есть инициализация" - C++
Здорова! Тут вообщем новую концепцию ООП вычитал &quot;получение ресурса есть инициализация&quot; Вообщем считается когда используешь исключения,...

Реализовать абстрактный класс "Список" стеком/очередью - C++
Доброго времени суток, форумчане! Нужно реализовать абстрактный класс &quot; Список &quot; и выполнить две его реализации: - стеком - очередью ...

Как сделать так, чтобы введенное с клавиатуры слово "helllo" в памяти сохранялось в виде "Hello". - C++
Здравствуйте. Подскажите пожалауйста как сделать чтоб согда я вводу с клавиатуры helllo, в памяти оставалось &quot;Hello&quot;. Данные типа...

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

3
coloc
погромист
411 / 247 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
24.09.2013, 19:30 #2
ДЛЯ ТОГО ЧТОБЫ ВЫРУБИТЬ КАПС НАДО НАЖАТЬ КНОПКУ Caps Lock
0
RezoneR
24.09.2013, 19:48 #3
Копировал название заголовка с задания, извиняюсь
Gorev
135 / 132 / 17
Регистрация: 08.12.2009
Сообщений: 565
Записей в блоге: 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]);
            }
        }
    }
}
0
29.11.2013, 01:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.11.2013, 01:37
Привет! Вот еще темы с ответами:

Создать класс "Вентилятор" содержащий в себе классы: "Двигатель", "Контроллер", "Пульт управления" - C++
Помогите с кодом написания задачи, не понимаю как написать классы в классе. Нужно создать класс &quot;вентилятор&quot; содержащий в себе классы:...

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Создать абстрактный класс "Издание" и производные классы "Книга", "Статья", "Электронный ресурс" - C++
1. Создать абстрактный класс Издание с методами, позволяющими вывести на экран информацию об издании, а также определить является ли данное...

Определить тип данных "Запись", имеющий поля "Фамилия", "Пол", "Зарплата" - C++
определить тип данных запись имеющий поля фамилия пол зарплата. определить массив из 10 записей. в программе ввести в массив данные и...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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