ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.
#ifndef H_DVR
#define H_DVR
#include <sys/types.h>
#include <stdio.h>
#define START_DATE "20030601" // »ùÇõ¥ÀÌÅÍ »ý¼ºÀ» À§ÇÑ ½ÃÀÛ³¯Â¥
#define END_DATE "20040630" // »ùÇõ¥ÀÌÅÍ »ý¼ºÀ» À§ÇÑ Á¾·á³¯Â¥
#define NUM_ATM 5 // ATMÀÇ ´ñ¼ö
#define NUM_RECORD 1000 // ATMº° ÇÏ·ç Æò±Õ ·¹ÄÚµå ±â·Ï·®
#define EVENT_TIME 86400 / NUM_RECORD // À̺¥Æ®°¡ ¹ß»ýÇÏ´Â Æò±Õ ½Ã°£ °£°Ý
#define DATA_DIR "LOG_FILES" // ÆÄÀϵéÀÌ ÀúÀåµÇ´Â µð·ºÅ丮¸í
#define S_atmID 2 + 1
#define S_date 8 + 1
#define S_time 6 + 1
#define S_name 22 + 1
#define S_account 15 + 1
#define S_outPrice 15 + 1
#define S_fileName 18 + 1 // »ý¼ºÇÏ´Â ÆÄÀÏ¸í±æÀÌ, ATMnn_yyyymmdd.dat Æ÷¸ËÀÌ´Ù
class Record { // ÆÄÀÏ¿¡ ±â·ÏÇÒ µ¥ÀÌÅÍ ´ÜÀ§Å¬·¡½º
public:
char time[S_time]; // ÀÎÃâÀÌ ÀÏ¾î³ ½Ã°¢, hhmmss Æ÷¸Ë
char account[S_account]; // °èÁ¹øÈ£
char outPrice[S_outPrice]; // ÀÎÃâ±Ý¾×
char name[S_name]; // ³ìÈµÈ ÆÄÀÏ À̸§
};
class AtmRecord { // ATMÀ¸·ÎºÎÅÍ Àü¼ÛµÇ¾î ¿À´Â µ¥ÀÌÅÍ Å¬·¡½º
public:
char atmID[S_atmID]; // ATM ¹øÈ£
char date[S_date]; // ÀÎÃâÀÌ ÀÏ¾î³ ³¯Â¥, yyyymmdd Æ÷¸Ë
Record rec;
};
class Query { // °Ë»ö¿¡ ÇÊ¿äÇÑ µ¥ÀÌÅÍ Å¬·¡½º
public:
char startATM[S_atmID];
char endATM[S_atmID];
char startDate[S_date];
char endDate[S_date];
char startTime[S_time];
char endTime[S_time];
char account[S_account];
char outPrice[S_outPrice];
};
class ATM { // ATM ´ÜÀ§·Î ÆÄÀÏÀ» ¿¾î³õ°í »ç¿ëÇϱâ À§ÇÑ Å¬·¡½º
public:
ATM(void);
FILE* fp;
char fileDate[S_date];
};
class DVR { // ATMÀ¸·Î ¿À´Â µ¥ÀÌÅ͸¦ ÀúÀåÇÏ°í °Ë»öÇϴ Ŭ·¡½º
private:
ATM atm[NUM_ATM];
public:
int allClose(void);
int insert(AtmRecord& record);
int search(Query& query);
};
#endif
#include <iostream> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include <unistd.h> #include "dvr.h" #define S_Record sizeof(Record) using namespace std; ATM :: ATM(void) { fp = NULL; memset(fileDate, 0x00, S_date); } int DVR :: allClose(void) { // ¿¾î³õ°í ¾²°í ÀÖ´Â ¸ðµç ±â·ÏÆÄÀϵéÀ» ´Ý´Â´Ù int i; for (i = 0; i < NUM_ATM; i++) { if (atm[i].fp) { if (fclose(atm[i].fp)) { return(-1); } else { atm[i].fp = NULL; } } } return(0); } // ATMÀ¸·ÎºÎÅÍ Àü¼ÛµÈ µ¥ÀÌÅ͸¦ ÇØ´ç ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. ¿À¹öÇìµå °¨¼Ò¸¦ À§ÇÏ¿© // ÀÌ¹Ì ¿¾î³õ°í ÀÖ´Â °°Àº ÆÄÀÏÀÌ¸é ¹Ù·Î Ãß°¡ÇÏ°í »õ ÆÄÀÏÀÌ¸é ¿¾ÆÄÀÏ ´Ý°í »õ·Î ¸¸µç´Ù. // ½ÇÁ¦ Àû¿ë½Ã¿£ °Ë»ö°ú ¾²±â¸¦ µ¿½Ã¿¡ ÇØ¾ßÇÔÀ» °¨¾ÈÇØ¾ß ÇÑ´Ù int DVR :: insert(AtmRecord& record) { char fileName[S_fileName]; int num = atoi(record.atmID); if (memcmp(atm[num].fileDate, record.date, S_date)) { // ÀÛ¾÷ÁßÀÎ ÆÄÀϰú ´Ù¸£¸é if (atm[num].fp != NULL) fclose(atm[num].fp); // ¿¸° ¿¾ ÆÄÀÏÀº ´Ý´Â´Ù sprintf(fileName, "%s/ATM%s_%s.dat", DATA_DIR, record.atmID, record.date); if ((atm[num].fp = fopen(fileName, "a")) == NULL) return(-1); memcpy(atm[num].fileDate, record.date, S_date); } if (fwrite(&record.rec, 1, S_Record, atm[num].fp) < 1) return(-1); return(0); } int DVR :: search(Query& query) { // °Ë»öÄõ¸®¸¦ ³¯¸®°í °á°ú¸¦ º¸¿©ÁØ´Ù FILE* fp; char* buff; struct stat file; struct timeval firstTime, secondTime; Record* rec; char fileName[S_fileName]; unsigned long int numRecord = 0; int num, year, month, day, tmp_month, tmp_day, time, index, method; int startATM = atoi(query.startATM); int endATM = atoi(query.endATM); int s_year = atoi(strndupa(query.startDate, 4)); int s_month = atoi(strndupa(query.startDate + 4, 2)); int s_day = atoi(strndupa(query.startDate + 6, 2)); int e_year = atoi(strndupa(query.endDate, 4)); int e_month = atoi(strndupa(query.endDate + 4, 2)); int e_day = atoi(strndupa(query.endDate + 6, 2)); if ((query.account[0] == '\0') && (query.outPrice[0] == '\0')) { // ½Ã°£°Ë»ö¸¸ ÇÒ °æ¿ì method = 0; } else if (query.account[0] && query.outPrice[0]) { // °èÁ¤ && ±Ý¾× °Ë»öÀÎ °æ¿ì method = 1; } else { // °èÁ¤ || ±Ý¾× °Ë»öÀÎ °æ¿ì method = -1; } gettimeofday(&firstTime, NULL); for (year = s_year; year <= e_year; year++ ) { tmp_month = (e_year > year)? 12 : e_month; for (month = s_month; month <= tmp_month; month++) { tmp_day = ((e_year > year) || (e_month > month))? 30 : e_day; for (day = s_day; day <= tmp_day; day++) { for (num = startATM; num <= endATM; num++) { sprintf(fileName, "%s/ATM%02d_%04d%02d%02d.dat", DATA_DIR, num, year, month, day); stat(fileName, &file); buff = new char[file.st_size]; // ½ÇÁ¦ »óȲ¿¡¼± ATMÀÇ Äõ¸®¸¦ ó¸®ÇÏ´Â ¿ÍÁß¿¡µµ °Ë»ö½Ã ¹®Á¦°¡ ¾ø´ÂÁö »ìÆìº¼ ÇÊ¿äÀÖÀ½ // ¶§¹®¿¡ ¿©±â¼µµ atm[i].fp ¸¦ »ç¿ëÇÏÁö ¾Ê°í µû·Î »ç¿ëÇÔ if ((fp = fopen(fileName, "r")) == NULL) return(-1); if (fread(buff, 1, file.st_size, fp) < 1) return(-1); index = 0; // °Ë»ö ½ÃÀÛ ½Ã°¢±îÁö Æ÷ÀÎÅÍ À̵¿ while ((index < file.st_size) && (memcmp(buff + index, query.startTime, S_time) < 0)) { index += S_Record; numRecord++; } // °Ë»ö Á¾·á ½Ã°¢±îÁö À̵¿Çϸç ã´Â´Ù do { numRecord++; rec = (Record*) ((char*) buff + index); switch (method) { case 1: if (!(memcmp(rec->account, query.account, S_account) || memcmp(rec->outPrice, query.outPrice, S_outPrice))) { printf("ATM%02d, %04d%02d%02d%s, %s, %s, %s\n", num, year, month, day, rec->time, rec->account, rec->outPrice, rec->name); } break; case 0: printf("ATM%02d, %04d%02d%02d%s, %s, %s, %s\n", num, year, month, day, rec->time, rec->account, rec->outPrice, rec->name); break; case -1: if (!(memcmp(rec->account, query.account, S_account) && memcmp(rec->outPrice, query.outPrice, S_outPrice))) { printf("ATM%02d, %04d%02d%02d%s, %s, %s, %s\n", num, year, month, day, rec->time, rec->account, rec->outPrice, rec->name); } break; } index += S_Record; } while ((index < file.st_size) && (memcmp(buff + index, query.endTime, S_time) <= 0)); fclose(fp); delete[] buff; } } s_day = 1; } s_month = 1; } gettimeofday(&secondTime, NULL); cout << endl << "°Ë»öÇÑ ·¹ÄÚµå ¼ö : " << numRecord << endl; cout << "°Ë»öÇÑ ½Ã°£ : " << (secondTime.tv_sec - firstTime.tv_sec) + (float)(secondTime.tv_usec - firstTime.tv_usec) / 1000000 << "ÃÊ" << endl; }
/*
* Ŭ·¡½º ´ÜÀ§·Î ÆÄÀÏ¿¡ µ¥ÀÌÅ͸¦ ±â·ÏÇÏ°í °¢ ¸â¹öº°·Î °Ë»öÀ» ÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥ *
by SaNha 2004. 04.
1. ÆÄÀÏ, µð·ºÅ丮 Á¤Ã¥
1) ÆÄÀϵéÀ» ÀúÀåÇÏ´Â µð·ºÅ丮¸¦ Çϳª¸¸ µÎ°í ÆÄÀϸíÀ» 'ATM¸í+³¯Â¥' ½ÄÀ¸·Î ÇÏ´Â ¹æ¹ý
ex) ATM01_20040423.dat
2) ATM¸í º°·Î µû·Î µð·ºÅ丮¸¦ µÎ°í ÇÏÀ§¿¡ '³¯Â¥' ÀÇ ÆÄÀÏÀ» µÎ´Â ¹æ¹ý
ex) µå¶óÀ̹ö¸í\Data\ATM01\20040423.dat
3) ¿©±â¿¡¼´Â ¿¹Á¦·Î 1¹ø ¹æ¹ýÀ» ÀÌ¿ëÇϸç ATMÀº 5´ë, ÇÏ·ç¿¡ °¢ ATMº°·Î õ°³ÀÇ ·¹Äڵ尡 ÀúÀåµÈ°ÍÀ¸·Î °¡Á¤ÇÑ´Ù
2. ÇÏ·ç¿¡ ÀúÀåµÇ´Â ÆÄÀÏÀÇ Å©±â´Â ¾ó¸¶ ¾È µÉ°ÍÀ¸·Î ¿¹»óµÊÀ¸·Î °¢ ³¯Â¥´ÜÀ§·Î ¸Þ¸ð¸®¿¡ ¿Ã¸° »óÅ¿¡¼ °Ë»ö
3. °Ë»ö½ÃÀÇ ³¯Â¥¹üÀ§¸¦ ±â¹ÝÀ¸·Î ¼øÂ÷ÀûÀ¸·Î ³¯Â¥¿Í ÀÏÄ¡ÇÏ´Â À̸§ÀÇ ÆÄÀÏÀ» Çϳª¾¿ ·ÎµùÇÏ¸ç °Ë»ö
4. ATM¿¡¼ÀÇ Àü¼Ûµ¥ÀÌÅÍÁß nameÀº ·¹ÄÚµùµÈ ÆÄÀÏÀ̸§Àΰ¡? DVRÀº À̺¥Æ®½Ã µû·Î ÆÄÀÏÀ» ·¹ÄÚµùÇϴ°ÍÀÌ ¾Æ´Ï¶ó
24½Ã°£ °è¼Ó ·¹ÄÚµùÁßÀΰÍÀÌ ¾Æ´Ñ°¡? ±×·¸´Ù¸é name°ªÀº ·¹ÄÚµùÆÄÀϸí+À妽º °³³äÀ» °¡Á®¾ß ÇÒ °ÍÀÌ´Ù.
¿©±â¼´Â "ATM¹øÈ£_³ìÈµÈ ³¯Â¥_ÃÊ.rec" Æ÷¸ËÀ» »ç¿ëÇÑ´Ù (ÃÊ´Â ÇÏ·ç 86400Ãʸ¦ ±âÁØ)
5. ½Ã°¢ Çʵå´Â Áõ°¡ÀϰÍÀ̹ǷΠÁ¤·ÄµÈ ۰ªÀ¸·Î »ç¿ëÀÌ °¡´ÉÇÏ´Ù
6. ·¹Äڵ尡 °íÁ¤Å©±â°¡ ¾Æ´Ï¶ó¸é °¢ ·¹ÄÚµåÀÇ ½ÃÀÛ À妽º¸¸ µû·Î ÀúÀåÇÏ´Â ÆÄÀÏÀ» µÎ¸é µÇ¸ç °Ë»ö½Ã¿£
¹®ÀÚ¿(strcmp)°Ë»öÀ» ÀÌ¿ëÇÏ´øÁö °¢ ÇʵåÀÇ ½ÃÀÛ À妽ºµµ ÀúÀåÇØ µÎ°í memcmp¸¦ ÀÌ¿ëÇØµµ µÉ°ÍÀÌ´Ù
*/
#include <iostream>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
#include "dvr.h"
using namespace std;
/* »ùÇà µ¥ÀÌÅ͸¦ »ý¼ºÇÏ´Â ¸Þ¼Òµå, ÆíÀÇ»ó ¸ðµç ´ÞÀº 30ÀÏ·Î °è»êÇÑ´Ù */
/* ½ÇÁ¦ ATM¿¡¼ ¹ß»ýµÇ´Â µ¥ÀÌÅÍ ¹× Àü¼Û°úÁ¤°ú À¯»çÇÏ°Ô µ¥ÀÌÅ͸¦ »ý¼º, Ãß°¡ÇÑ´Ù */
int makeRecord(DVR& dvr) {
AtmRecord atmRec;
long int seed;
char startDate[] = START_DATE;
char endDate[] = END_DATE;
int s_year = atoi(strndupa(startDate, 4));
int s_month = atoi(strndupa(startDate + 4, 2));
int s_day = atoi(strndupa(startDate + 6, 2));
int e_year = atoi(strndupa(endDate, 4));
int e_month = atoi(strndupa(endDate + 4, 2));
int e_day = atoi(strndupa(endDate + 6, 2));
int num, year, month, day, tmp_month, tmp_day, second, i;
div_t hour, min;
cout << "Å×½ºÆ®¿ë µ¥ÀÌÅ͸¦ »ý¼ºÇϰí ÀÖ½À´Ï´Ù. Àá½Ã¸¸ ±â´Ù·ÁÁֽʽÿÀ..." << endl << endl;
if (access(DATA_DIR, F_OK)) mkdir(DATA_DIR, 0755);
srandom(time(NULL));
for (year = s_year; year <= e_year; year++ ) {
tmp_month = (e_year > year)? 12 : e_month;
for (month = s_month; month <= tmp_month; month++) {
tmp_day = ((e_year > year) || (e_month > month))? 30 : e_day;
for (day = s_day; day <= tmp_day; day++) {
// À̺¥Æ® ½Ã°£°£°ÝÀ» ·¹ÄÚµå¼ö·Î ³ª´³À¸¹Ç·Î 235959 ¸¦ ³ÑÁö ¾Êµµ·Ï -1ºÎÅÍ ½ÃÀÛ
second = -1;
for (num = 0; num < NUM_ATM; num++) {
for (i = 0; i < NUM_RECORD; i++) {
memset(&atmRec, 0x00, sizeof(AtmRecord));
seed = random();
second += EVENT_TIME;
hour = div(second, 3600);
min = div(hour.rem, 60);
sprintf(atmRec.atmID, "%02d", num);
sprintf(atmRec.date, "%04d%02d%02d", year, month, day);
sprintf(atmRec.rec.time, "%02d%02d%02d", hour.quot, min.quot, min.rem);
sprintf(atmRec.rec.account, "%d-%02d-%010ld", min.rem % 2, min.rem, seed + min.quot);
sprintf(atmRec.rec.outPrice, "%ld", seed);
sprintf(atmRec.rec.name, "%02d_%s_%05d.rec", num, atmRec.date, second);
if (dvr.insert(atmRec) < 0) return(-1);
}
}
}
s_day = 1;
}
s_month = 1;
}
}
/* ÀÚ·á°Ë»öÀ» ÇÏ´Â Æû ¸Þ¼Òµå */
int insertQuery(DVR& dvr) {
Query query;
bool gettingData;
char key;
while (true) {
memset(&query, 0x00, sizeof(Query));
gettingData = true;
while (gettingData) {
cout << endl << "<ÀÔ·ÂÇÒ Ç׸ñÀ» ¼±ÅÃÇÏ¿© ÁÖ¼¼¿ä. 1, 3¹ø Çʼö>" << endl << endl;
cout << "1. °Ë»ö ½ÃÀÛ ATM ID : " << query.startATM << endl;
cout << "2. °Ë»ö Á¾·á ATM ID : " << query.endATM << endl;
cout << "3. °Ë»ö ½ÃÀÛ ³¯Â¥ (YYYYMMDD) : " << query.startDate << endl;
cout << "4. °Ë»ö ½ÃÀÛ ½Ã°¢ (HHMMSS) : " << query.startTime << endl;
cout << "5. °Ë»ö Á¾·á ³¯Â¥ (YYYYMMDD) : " << query.endDate << endl;
cout << "6. °Ë»ö Á¾·á ½Ã°¢ (HHMMSS) : " << query.endTime << endl;
cout << "7. °èÁ¹øÈ£ : " << query.account << endl;
cout << "8. ÀÎÃâ±Ý¾× : " << query.outPrice << endl << endl;
cout << "9. °Ë»ö" << endl;
cout << "0. Á¾·á" << endl << endl;
cin >> key;
switch (key) {
case '1':
cout << "°Ë»ö ½ÃÀÛ ATM ID¸¦ ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä (0 - " << NUM_ATM - 1 << ") : ";
cin >> query.startATM;
strcpy(query.endATM, query.startATM);
break;
case '2':
if (query.startATM[0]) {
cout << "°Ë»ö Á¾·á ATM ID¸¦ ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä (" << query.startATM << " - " << NUM_ATM - 1<< ") : ";
cin >> query.endATM;
} else {
cout << "°Ë»ö ½ÃÀÛ ATM ID¸¦ ¸ÕÀú ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä";
}
break;
case '3':
cout << "°Ë»ö ½ÃÀÛ ³¯Â¥¸¦ ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä (" << START_DATE << " - " << END_DATE << ") : ";
cin >> query.startDate;
strcpy(query.endDate, query.startDate);
strcpy(query.startTime, "000000");
strcpy(query.endTime, "235959");
break;
case '4':
cout << "°Ë»ö ½ÃÀÛ ½Ã°¢À» ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä : ";
cin >> query.startTime;
break;
case '5':
if (query.startDate[0]) {
cout << "°Ë»ö Á¾·á ³¯Â¥¸¦ ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä (" << query.startDate << " - " << END_DATE ") : ";
cin >> query.endDate;
} else {
cout << "°Ë»ö ½ÃÀÛ ³¯Â¥¸¦ ¸ÕÀú ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä";
}
break;
case '6':
cout << "°Ë»ö Á¾·á ½Ã°¢À» ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä : ";
cin >> query.endTime;
break;
case '7':
cout << "°Ë»öÇϰíÀÚ ÇÏ´Â °èÁ¹øÈ£¸¦ ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä : ";
cin >> query.account;
break;
case '8':
cout << "°Ë»öÇϰíÀÚ ÇÏ´Â ÀÎÃâ±Ý¾×À» ÀÔ·ÂÇÏ¿© ÁÖ¼¼¿ä : ";
// ½ÇÁ¦ ÇÁ·Î±×·¥¿¡¼± ¹üÀ§·Î °Ë»öÇÒ ¼ö ÀÖ°ÔÇϴ°ÍÀÌ ÁÁÀ»°Í °°À½
cin >> query.outPrice;
break;
case '9':
gettingData = false;
break;
case '0':
return(0);
break;
default:
cout << "À߸øÀÔ·ÂÇϼ̽À´Ï´Ù!" << endl;
break;
}
}
cout << "°Ë»öÀ» Çϰí ÀÖ½À´Ï´Ù. Àá½Ã¸¸ ±â´Ù·ÁÁֽʽÿÀ." << endl << endl;
if (dvr.search(query) < 0) return(-1);
}
}
int main(int argc, char** argv) {
DVR dvr;
// Å×½ºÆ®¿ë ÆÄÀϵéÀ» »ý¼ºÇÑ´Ù.
// ÆÄÀÏÀÌ Á¸Àç½Ã¿£ Ãß°¡µÇ¹Ç·Î »õ µ¥ÀÌÅͰ¡ ÇÊ¿äÇÒ¶© »èÁ¦¸¦ ÇÏ´øÁö
// ±âÁ¸ µ¥ÀÌÅ͸¸ ÀÖÀ¸¸é µÉ¶© ÀÌ ºÎºÐÀ» ÁÖ¼®Ã³¸®ÇÑ´Ù
if (makeRecord(dvr) < 0) {
cout << "ÆÄÀÏ»ý¼º½Ã ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù : " << strerror(errno) << endl;
return(EXIT_FAILURE);
} else if (dvr.allClose() < 0) {
cout << "¸¶Áö¸· ³¯Â¥ÀÇ ÆÄÀϵéÀ» ´Ý´ÂÁß ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù : " << strerror(errno) << endl;
return(EXIT_FAILURE);
} else if (insertQuery(dvr) < 0) { // ÀÚ·á °Ë»öÀ» ÇÑ´Ù
cout << "ÀÚ·á°Ë»ö½Ã ¿À·ù°¡ ¹ß»ýÇÏ¿´½À´Ï´Ù : " << strerror(errno) << endl;
return(EXIT_FAILURE);
}
return(EXIT_SUCCESS);
}
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|