//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include<cstdlib>
#include <cstring>
/*
Microsoft visual studio 2015 에서 실행했습니다~~
*/
#pragma warning ( disable : 4996 )
#define MAX_MEMORY 3
using namespace std;
void saveMemory(int data);
bool checkFullMemory();
bool checkFrozen();
void makeRun();
void printMemory();
void Selectminimum();
void writeRunFile();
void lastDataClear();
void printRun();
int memory[MAX_MEMORY];
bool written[MAX_MEMORY];
bool frozen[MAX_MEMORY];
int lastData = 0;
int cnt_partition = 0;
int minIndex;
void main() {
ifstream file;
int i = 0;
int buf = 0;
file.open("data.txt");
if (!file.is_open()) {
cout << "파일 열기 실패!" << endl;
}
memset(memory, 0, MAX_MEMORY);
memset(written, false, MAX_MEMORY);
memset(frozen, false, MAX_MEMORY);
while (!file.eof()) {
file >> buf;
cout << "Input data = " << buf << endl;
saveMemory(buf); //메모리가 비어있으면 data를 메모리에 저장
if (!checkFullMemory()) {
continue;
}
makeRun();
//printRun();
}
file.close();
for (i = 0; i < MAX_MEMORY - 1; i++) {
lastDataClear();
}
printRun();
}
//비어있는 메모리에 입력값 저장
void saveMemory(int data) {
int i = 0;
for (i = 0; i < MAX_MEMORY; i++) {
if (written[i] == false) {
memory[i] = data;
written[i] = true;
break;
}
}
}
//메모리 상태 체크
bool checkFullMemory() {
//메모리에 데이터가 다 들어가 있으면 true, 없으면 false
int i = 0;
int cnt = 0;
for (i = 0; i < MAX_MEMORY; i++) {
if (written[i] == true) {
cnt++;
}
}
if (cnt != MAX_MEMORY) {
return false;
}
else {
return true;
}
}
//빙결상태 체크
bool checkFrozen() {
// 전체 빙결상태이면 true, 아니면 false
int i = 0;
int cnt = 0;
for (i = 0; i < MAX_MEMORY; i++) {
if (frozen[i] == true) {
cnt++;
}
}
if (cnt != MAX_MEMORY) {
return false;
}
else {
return true;
}
}
//런만들기
void makeRun() {
int i;
Selectminimum();
if (checkFrozen()) {
cout << "!!!!!!!!!!!!!!전체 빙결(분할 완료)!!!!!!!!!!!!!!!!!" << endl;
cnt_partition++;
lastData = 0;
for (i = 0; i < MAX_MEMORY; i++) {
frozen[i] = false;
}
Selectminimum();
}
writeRunFile();
}
//조건에 맞는 미니멈값 찾기
void Selectminimum() {
int i=0;
minIndex = 0;
//프로즌상태가 아니고, 라스트데이터보다 값이 크며, 현재 비교대상 메모리보다 작을 때 mindIndex 교체
for (i = 0; i < MAX_MEMORY; i++) {
if ((memory[i] < lastData)) {
frozen[i] = true;
}
}
//비교 대상 찾기 (프로즌 상태가 아닌 수)
i = 0;
while(i < MAX_MEMORY) {
if (frozen[i] != true) {
minIndex = i;
break;
}
i++;
}
//비교하면서 조건에 맞는 인덱스 찾기
for (i=0; i < MAX_MEMORY; i++) {
if ((frozen[i] == false) && (memory[i] > lastData) && (memory[minIndex] >= memory[i])) {
minIndex = i;
}
}
printMemory();
}
//파일에 런 쓰기입력
void writeRunFile() {
char file_name[20];
ofstream outfile;
//파일이름 설정
itoa(cnt_partition + 1, file_name, 10);
strcat(file_name, "_partition.txt");
outfile.open(file_name, ios::app);
//outfile << memory[minIndex] << " ";
outfile << " " << memory[minIndex];
lastData = memory[minIndex];
outfile.close();
written[minIndex] = false;
}
//현재 메모리에 들어가있는 값 출력
void printMemory() {
int i;
cout << "\n//////////////////////////////////////////////" << endl;
for (i = 0; i < MAX_MEMORY; i++) {
if (frozen[i] == true) {
cout << "(";
}
cout << memory[i];
if (frozen[i] == true) {
cout << ") ";
} else {
cout << " ";
}
}
cout << "\n//////////////////////////////////////////////" << endl;
}
//런파일들을 화면에 출력
void printRun() {
int i;
ifstream file;
int buf;
char file_name[20];
cout << "\n----------------------------------------------" << endl;
for (i = 0; i <= cnt_partition; i++) {
cout << i + 1 << "번 분할////" << endl;
memset(file_name, 0, sizeof(file_name));
itoa(i + 1, file_name, 10);
strcat(file_name, "_partition.txt");
file.open(file_name);
while (!file.eof()) {
file >> buf;
cout << buf << " ";
}
file.close();
cout << "\n////////////////////////////////////////" << endl;
}
cout << "\n----------------------------------------------" << endl;
}
//마지막 남은 데이터 처리
void lastDataClear() {
int i = 0;
while (i < MAX_MEMORY) {
if (written[i] == true) {
minIndex = i;
break;
}
i++;
}
for (i = 0; i < MAX_MEMORY; i++) {
if ((written[i] == true) && (memory[minIndex] > memory[i])) {
minIndex = i;
}
}
writeRunFile();
}
'공부 > C & C++' 카테고리의 다른 글
(과제) 해쉬 테이블 구현 (0) | 2016.06.23 |
---|---|
(과제) 트랜잭션 파일 구현하기 (0) | 2016.06.23 |
for문 안 int 선언 (2) | 2016.04.16 |
(함수, C++) 입력 버퍼 비우기 [cin.ignore()] (0) | 2016.04.16 |
(함수) 메모리 값 바꾸기, 초기화 [memset] (0) | 2016.04.14 |