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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2018, 11:22   #1
chika007
Новичок
Джуниор
 
Регистрация: 06.05.2018
Сообщений: 2
По умолчанию Страничное распределение памяти C++

Прошу помочь! Мне необходимо написать программу для страничного распределения памяти. Есть код, но на языке C. Помогите исправить на C++.

# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# define N 3
# define M 20

int k=0;

int process[N]; //ОП

struct stable //таблица страниц
{
int number;//номер страницы
int presence;//признак присутсвия
int modify;//признак модификации
table[M];
}

void check(FILE*f) //проверка на открытие файла
{
if(f==NULL)
{
printf("can't open file");
getchar();
getchar();
exit(1);
}

int checkfree() //проверка на свободную память
{
int i;
for(i=0;i<N;i++)
{
if(process[i]==0) //предположим что "0" является показателем незанятой памяти

{
return i;
}
}
return -1;
}

void saveprocess(FILE*f, int i) //сохрание в памяти и внешней памяти
{
scanf("%d", &process[i]);
f=fopen("process.txt","ab");
check(f);
fwrite(&process[i], sizeof(process[i]), 1, f);
fclose(f);
}

void savetable(int i) //сохранение таблицы
{
table[k].number=i; //вирт. адресс
table[k].presence=1;
table[k].modify=0;
k++; // К-ой таблице соотвествует К процесс
}

int addprocess(FILE*f) //добавление нового процесса
{
int i = checkfree();
puts("введите новые данные\n");
if (i!=-1) //если существует свободная память
{
saveprocess(f, i);
savetable(i);
}
if (i==-1) //если таковой нет
{
int j,x;
for(j=0;j<M;j++)
{
if(table[j].presence==1) //находим первый попавшийся процесс находящийся в ОП
{
if(table[j].modify==1) //проверяем были ли изменения в процессе
{
table[j].modify=0; //если были то меняем данные на диске
f=fopen("process.txt","rb+");
check(f);
for(x=0;x<j;x++)
{
fseek(f, sizeof(process[x]), 1);
}
fwrite(&process[table[j].number], sizeof(process[table[j].number]),
1, f);
fclose(f);
table[j].presence=0; //после изменений можем добавить новый процесс на место старого
saveprocess(f, table[j].number);
savetable(table[j].number);
return 0;
}
else //если изменений не было, то просто добавляем новый процесс
{
table[j].presence=0;
saveprocess(f, table[j].number);
savetable(table[j].number);
return 0;
}
}
}
}
}

int out_and_edit(int i) //вывод и изменение
{
int y;
printf("%d",process[table[i].number]); // то его номер является вирт.
puts("\nЖелаете изменить процесс?\n1-да\n2-нет\n");
scanf("%d",&y);
if(y==1)
{
puts("введите новые данные\n");
scanf("%d", &process[table[i].number]);
table[i].modify=1;
}
else
{
return 0;
}
}

void download_in_memory(int j, int x, int z, FILE*f)//считывание процесса с диска
{
table[j].presence=0; //после изменений можем добавить желаемый процесс на место старого
f=fopen("process.txt","rb");
check(f);
for(x=0;x<z;x++)
{
fseek(f, sizeof(process[x]), 1);
}
fread(&process[table[j].number], sizeof(process[table[j].number]), 1, f);
fclose(f);
table[z].presence=1;
}

int view_and_editprocess(FILE*f) //просмотр и редактирование
{
int z,j,x;
puts("введите номер процесса, который вы хотите просмотерть\nВнимание! Нумерация начинается с 0!\n");
scanf("%d",&z);
f=fopen("process.txt","rb+");
check(f);
for(x=0;x<z;x++) //проверка на существование процесса
{
fseek(f, sizeof(process[x]), 1);
if(!feof(f))
{
puts("такого процесса нет");
fclose(f);
return 0;
}
}
fclose(f);
if(table[z].presence==1) //если процесс находится в оп
{
out_and_edit(z);
}
else //если нет, то программа обработки страничного прерывания загружает его в оп
{
for(j=0;j<M;j++)
{
if(table[j].presence==1) //находим первый попавшийся процесс находящийся в ОП
{
if(table[j].modify==1) //проверяем были ли изменения в процессе
{
table[j].modify=0; //если были то меняем данные на диске
f=fopen("process.txt","rb+");
check(f);
for(x=0;x<j;x++)
{
fseek(f, sizeof(process[x]), 1);
}
fwrite(&process[table[j].number], sizeof(process[table[j].number]), 1, f);

fclose(f);
download_in_memory(j, x, z, f);
out_and_edit(z);
return 0;
}
else //если изменений не было, то просто добавляем процесс, который хотим просмотреть

{
download_in_memory(j, x, z, f);
out_and_edit(z);
return 0;
}
}
}
}
}

void view(FILE*f) //вывод файла с процессами
{
int vprocess;
f=fopen("process.txt","rb");
check(f);
fread(&vprocess, sizeof(vprocess), 1, f);
if(!feof(f))
{
while(!feof(f))
{
printf("%d ", vprocess);
fread(&vprocess, sizeof(vprocess), 1, f);
}
}
else
{
printf("Отсутствуют какие-либо записи в файле.\n\n");
}
fclose(f);
}

void viewop() //вывод процессов, находящихся в ОП
{
int i;
for (i=0;i<N;i++)
{
printf("%d ",process[i]);
}
}


int main()
{
FILE*f;
f=fopen("process.txt","wb");
int a;
while(1)
{
printf("\n---------MENU---------\n\nвведите число '1-5', каждая цифра соотвествует командам '1-5'.\n1. показать весь файл с процессами.\n2. добавить процесс.\n3. посмотреть и изменить процесс.\n4. показать процессы в ОП.\n5. Выход.\n\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
view(f);
break;
}
case 2:
{
addprocess(f);
break;
}
case 3:
{
view_and_editprocess(f);
break;
}
case 4:
{
viewop();
break;
}
case 5:
{
return(0);
}
case 6:
{
viewtable();
break;
}
}
getchar();
getchar();
system("cls");
}
return 0;
return 0;
}
chika007 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Распределение памяти. Динамическое выделение памяти с++ Tolian92 Помощь студентам 8 14.05.2012 21:44
Распределение в памяти в СИ marsh123 Общие вопросы C/C++ 1 17.11.2011 16:35
сегментно-страничное распределение Angel of death Помощь студентам 1 25.06.2010 10:24
Страничное распределение памяти Angel of death Помощь студентам 1 22.06.2010 10:35
(BC 3.1) Распределение памяти! Lawliet32 Помощь студентам 8 28.12.2009 23:49