Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Моделирование заполнения жесткого диска 
:(
    Опции темы
zubikova
Дата 12.3.2010, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



Помогите составить программу, моделирующую заполнение гибкого магнитного диска.

Общий объем памяти на диске 360 Кбайт. Файлы имеют произвольную длину от 18 байт до 32 
Кбайт. В процессе работы файлы либо записываются на диск, либо удаляются с него.
В начале работы файлы записываются подряд друг за другом. После удаления файла на диске 
образуется свободный участок памяти, и вновь записываемый файл либо размещается на 
свободном участке, либо, если файл не вмещается в свободный участок, размещается после 
последнего записанного файла.
В случае, когда файл превосходит длину самого большого свободного участка, выдается 
аварийное сообщение. Требование на запись или удаление файла задается в командной строке, 
которая содержит имя файла, его длину в байтах, признак записи или удаления. Программа 
должна выдавать по запросу сведения о занятых и свободных участках памяти на диске.
Следует создать список занятых участков и список свободных участков памяти на 
диске.


PM MAIL   Вверх
world
Дата 15.3.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: 6
Всего: 12



Вроде написал, пользуйся.

Код

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
#include <list>
using namespace std;
typedef struct
{
    TCHAR Name[MAX_PATH];
    DWORD Size;
    DWORD StartLoc;
    DWORD EndLoc;
}MYFILE, *PMYFILE;
class Disk
{
private:
    list<MYFILE> cont;
    DWORD size;
    DWORD min;
    DWORD max;
    void Add(TCHAR* name, DWORD size);
    void Del(TCHAR* name);
    void Log();
    BOOL Start();
public:
    Disk(DWORD size, DWORD min, DWORD max);
};
Disk::Disk(DWORD size, DWORD min, DWORD max)
{
    this->size = size;
    this->min = min;
    this->max = max;
    BOOL b = TRUE;
    while(b)
    {
        b = Start();
    }
}
void Disk::Del(TCHAR* name)
{
    BOOL b = TRUE;
    if(name == NULL)
    {
        _tprintf(_T("ERROR! File name error!\n"));
        b = FALSE;
    }
    if(b)
    {
        b = FALSE;
        DWORD t = 0;
        DWORD x = _tcslen(name) + 1;
        TCHAR* str = new TCHAR[x];
        while (name[t] != NULL)
        {
            str[t] = _totupper(name[t]);
            t++;
        }
        str[x - 1] = 0;
        name = str;
        for(list<MYFILE>::iterator i = cont.begin(); i != cont.end(); i++)
        {
            if(!_tcscmp(name, i->Name))
            {
                cont.erase(i);
                b = TRUE;
                break;
            }
        }
        if(!b)
        {
            _tprintf(_T("File not found!\n"));
        }
    }
}

void Disk::Add(TCHAR* name, DWORD size)
{
    BOOL b = TRUE;
    DWORD k = 0;
    if(name == NULL)
    {
        _tprintf(_T("ERROR! File name error!\n"));    
        return;
    }
    if(size < min || size > max)
    {
        _tprintf(_T("ERROR! File size error!\n"));    
        return;
    }
    if(b)
    {
        b = FALSE;
        DWORD t = 0;
        DWORD x = _tcslen(name) + 1;
        TCHAR* str = new TCHAR[x];
        while (name[t] != NULL)
        {
            str[t] = _totupper(name[t]);
            t++;
        }
        str[x - 1] = 0;
        name = str;
        MYFILE tmp;
        _tcscpy(tmp.Name, name);
        tmp.Size = size;
        if(cont.empty())
        {
            tmp.StartLoc = 0;
            tmp.EndLoc = size;
            cont.push_front(tmp);
            b = TRUE;
        }
        for(list<MYFILE>::iterator i = cont.begin(); i != cont.end() && !b; i++)
        {
            b = FALSE;
            if(!_tcscmp(str, i->Name))
            {
                _tprintf(_T("ERROR! Such file already existed!\n"));
                b = TRUE;
                break;
            }
        }
        int xx = -1;
        for(list<MYFILE>::iterator i = cont.begin(); i != cont.end() && !b; i++, x++)
        {
            
            if(i == cont.begin())
            {
                if(i->StartLoc > size)
                {
                    tmp.StartLoc = 0;
                    tmp.EndLoc = size;
                    cont.insert(i, tmp);
                    b = TRUE;                    
                }
                continue;
            }
            list<MYFILE>::iterator prev = cont.begin();
            for(int j = 0; j < xx; j++)
            {
                prev++;
            }
            if(prev->EndLoc - i->StartLoc > size)
            {
                tmp.StartLoc = prev->EndLoc;
                tmp.EndLoc = tmp.StartLoc + size;
                cont.insert(i, tmp);
                b = TRUE;
            }
        }
        if(!b)
        {
            list<MYFILE>::iterator i = --cont.end();
            if(this->size - i->EndLoc > size)
            {
                tmp.StartLoc = i->EndLoc;
                tmp.EndLoc = tmp.StartLoc + size;
                cont.push_back(tmp);
                b = TRUE;
            }
        }
    }
    if(!b)
    {
        _tprintf(_T("ERROR! No such place!\n"));
    }
}
void Disk::Log()
{
    for(list<MYFILE>::iterator i = cont.begin(); i != cont.end(); i++)
    {
        _tprintf(_T("File %s bytes %i - %i\n"), i->Name, i->StartLoc, i->EndLoc - 1);
    }
    _tprintf(_T("\n"));
}
BOOL Disk::Start()
{
    TCHAR* cl = new TCHAR[MAX_PATH];
    _tprintf(_T("Command Line>"));
    _tscanf(_T("%s"), cl);
    DWORD t = 0;
    DWORD x = _tcslen(cl) + 1;
    TCHAR* str = new TCHAR[x];
    while (cl[t] != NULL)
    {
        str[t] = _totupper(cl[t]);
        t++;
    }
    str[x - 1] = 0;
    cl = str;
    if(!_tcscmp(cl, _T("EXIT")))
    {
        return FALSE;
    }
    else if(!_tcscmp(cl, _T("ADD")))
    {
        TCHAR* name = new TCHAR[MAX_PATH];
        DWORD* size = new DWORD;
        _tscanf(_T("%s%i"), name, size);
        Add(name, *size);
    }
    else if(!_tcscmp(cl, _T("DEL")))
    {
        TCHAR* name = new TCHAR[MAX_PATH];
        _tscanf(_T("%s"), name);
        Del(name);
    }
    else if(!_tcscmp(cl, _T("LOG")))
    {
        Log();
    }
    else
    {
        _tprintf(_T("Cannot recognize command\n"));
    }
    return TRUE;
}
int _tmain(int argc, _TCHAR* argv[])
{
    Disk* t = new Disk(360 * 1024, 18, 32 * 1024);
    return 0;
}


Это сообщение отредактировал(а) world - 15.3.2010, 22:07
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
zubikova
Дата 15.3.2010, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 12.3.2010

Репутация: нет
Всего: нет



"Command Line>" в каком формате прописывается?
PM MAIL   Вверх
world
Дата 15.3.2010, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 133
Регистрация: 2.10.2009
Где: Харьков

Репутация: 6
Всего: 12



Есть такой тип TCHAR объявленный в заголовочном файле "tchar.h" и, в зависимости от параметров, может быть как ANSI так и Unicode. Именно в этом формате прописывал все строки, в том числе и  Command Line>. Для приведения к этому типу используют макрос _Т(х) или _ТЕХТ(х)
----
Исправил ошибку в коде, теперь нельзя создать 2 файла с одним названием

Это сообщение отредактировал(а) world - 16.3.2010, 01:12
--------------------
Say what you mean, and mean what you say. Robert Wilson Cody
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0506 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.