사용한 개발 툴 : fedora core10 vi편집기
2009년 6월 4일

프로그램 작동 순서

a. 프로그램을 실행시키면 "mysh %% " 프롬프트가 출력된다.

b. 사용자로부터 명령어를 입력받고, 공백문자 “ ” 를 토큰으로 입력받은 명령을 명령어와 옵션으로 분리해낸다.

c. 자식 프로세스를 생성하고 명령어의 처리를 넘긴다.

- 자식 프로세스는 명령어가 실행될 절대경로를 설정하고 명령어와 합쳐 실행 가능 하도록 한다.

d. 부모 프로세스는 자식 프로세스가 명령어를 실행하고 종료되면 다시 프롬프트를 출력하여 다음 명령을 대기한다.


int main(int argc, char *argv[], char *envp[])
{
char cmd[80]; // variable to using input data from user
char *vecl[10]; // variable to using factor for function execve();
setbuf(stdout, NULL); 
printf("mysh %% ");
while(fgets(cmd, 80, stdin)!=NULL){
int i=0;
cmd[strlen(cmd)-1]='\0';
memset(vecl, 0x00, sizeof(vecl)); 
char *token; // divide input data string
token=strtok(cmd, " ");
while(token){ 
vecl[i]=token; 
token=strtok(NULL, " ");
i++;
}

if(fork()==0){
char path[100]="/bin/"; // concatenate path and vecl[0] variables to using command
strcat(path, vecl[0]); 
execve(path, vecl, envp);
exit(0);
}
wait(NULL);
printf("mysh %% ");
}
return 0;
}




Posted by 검지발가락♡
사용한 개발 툴 : fedora core10 vi편집기
2009년 4월 9일

문제] 프로그램3.4는 레코드를 입력 순서대로 저장하는데, 이 프로그램을 수정해서 각 레코드가 레코드 번호 위치에 저장되도록 하라. 프로그램은 다음 조건을 만족시킨다.

(1) 전체 레코드 수는 100 으로 하고, 초기화시에 전체 레코드의 used 필드를 0으로 한다.

(2) 추가되는 레코드 번호는 사용자로부터 입력받는다.

즉, add_record() 함수에서 (레코드 번호, 이름, 주소)를 입력받는다.

(3) 각 레코드는 파일의 레코드 번호 위치에 저장된다.

즉, 레코드1은 파일의 첫 번째에 저장되고, 레코드5는 파일의 다섯 번째에 저장된다.

(4) garb_collect() 함수는 더 이상 필요없으므로 제거한다.

<파일 생성>

if ((fd = open(DB_FILE, O_RDWR|O_CREAT, 0644)) < 0) {

printf("file (%s) creation failed\n", DB_FILE);
exit(0);//파일 생성
recode_init(fd);

}

else if ((fd = open(DB_FILE, O_RDWR, 0644)) < 0) {

printf("file (%s) file write failed\n", DB_FILE);
exit(0);// 파일이 있는 경우 쓰기;

}

void recode_init(int fd)//전체 레코드 만들기 
{

int i =0;
lseek(fd, 0L, SEEK_SET);
for(i=0; i<RECORD; i++){ //레코드 100개 생성
mb.used =0; // 초기화
write(fd, &mb, sizeof mb);

}

void add_record(int fd) {

int recno,i;
char cho; // y/n 여부 저장
get_no:
printf("recode no : ");
fscanf(stdin,"%d", &recno );
__fpurge(stdin);
if(recno<1 || recno>RECORD){ //예외처리 

error_message(); 
printf("(1~100)\n\n\n" );
goto get_no;

}

lseek(fd, 0L, SEEK_SET);
while(read(fd, &mb, sizeof mb)> 0){

i++;
if(recno == mb.used){

printf("%3d 레코드에는 이미 정보가 있습니다.\n", recno);
printf("덮어 쓰시겠습니까(y/n)?");
fscanf(stdin, "%c", &cho);
__fpurge(stdin);
if(cho == 'n'|| cho == 'N' ){ 

goto get_no; 

}

}



mb.used = recno; 
recno--; 
lseek(fd, recno*(sizeof mb), SEEK_SET);
get_name:
printf("name : ");
fgets(mb.name, LEN_NAME, stdin);
if(strlen(mb.name)>LEN_NAME){//예외처리

error_message(); 
__fpurge(stdin);
goto get_name;



mb.name[strlen(mb.name)-1] = '\0'; 
printf("address : ");
fgets(mb.address, LEN_ADDRESS, stdin);
mb.address[strlen(mb.address)-1] = '\0';
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}

void del_record(int fd) {

int recno;
printf("record no ");
fscanf(stdin, "%d", &recno);
recno--;
__fpurge(stdin);
lseek(fd, recno*(sizeof mb), SEEK_SET);
if (read(fd, &mb, sizeof mb) <= 0) {

printf("no such record\n");
return;

}
mb.used = 0;
lseek(fd, recno*(sizeof mb), SEEK_SET);
write(fd, &mb, sizeof mb);

}


Posted by 검지발가락♡
2009년 5월 20일
사용한 개발 툴 : Microsoft Visual Studio2005
특징 : 파일읽기, 구조체 사용

<RIP>

void modified_table(Rpt *send, Rpt *recv){

int i;
tmp.name=send->name; 
//send가 보낸 라우팅 테이블의 값을 임시 라우팅 테이블에 옮긴다. 이 과정에서 hop의 값은 1증가시켜서 옮긴다.
for(i=0; i<7; i++){

tmp.dest[i]=send->dest[i];
tmp.hop[i]=send->hop[i]+1;
tmp.next[i]=send->name;// 문제 


//복사된 임시 라우팅 테이블값과 비교하여 임시 라우팅 테이블의 hop값이 더 효과적일 경우 recv의 라우팅 테이블 값을 수정

for(i=0; i<7; i++){

if(recv->hop[i]>tmp.hop[i]){
recv->hop[i]=tmp.hop[i];
recv->next[i]=tmp.next[i];

}

//임시 라우팅 테이블에 값이 중첩되면서 실제 hop의 값이 16을 넘을 수 있다. 그렇게 될 경우 next의 값을 삭제시키면 이는 곧 도달불가를 의미한다.
//주어진 테이블에서는 발생하지 않지만 일종의 예외처리라고 할 수 있다.

if(recv->hop[i]>MAX_HOP) recv->next[i]=' '; 

}



<OSPF>

for(test=0; test<10; test++){

mincost.cost=A.cost[0];
mincost.idx=0; 

for(i=0; i<A.idx; i++){

if(A.cost[i]<mincost.cost){
mincost.idx=i;
mincost.cost=A.cost[i];
//printf("%d %d\n", mincost.idx, mincost.cost); 
}


if(A.node[mincost.idx]>=60){ 
pre_router=A.node[mincost.idx]; 

if(A.node[mincost.idx]<60){

At.network[At.idx]=A.node[mincost.idx];
At.cost[At.idx]=A.cost[mincost.idx];
At.nextrouter[At.idx]=pre_router;
//printf("%d %d\n", At.network[At.idx], At.cost[At.idx]);
At.idx++;

//printf("%d %d\n", A.node[mincost.idx], A.cost[mincost.idx]);
if(A.node[mincost.idx]==10) A.idx=update_Rt(a, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==20) A.idx=update_Rt(b, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==30) A.idx=update_Rt(c, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==40) A.idx=update_Rt(d, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==50) A.idx=update_Rt(e, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==65) A.idx=update_Rt(A, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==66) A.idx=update_Rt(B, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==67) A.idx=update_Rt(C, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==68) A.idx=update_Rt(D, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==69) A.idx=update_Rt(E, &A, mincost.idx, A.idx); 
if(A.node[mincost.idx]==70) A.idx=update_Rt(F, &A, mincost.idx, A.idx);

int update_Rt(Rt ref, Rt *modified, int idx, int Rtidx){

int i;
int tmp_idx=idx;
int tmp_Rtidx=Rtidx; 

for(i=0; i<Rtidx-idx-1; i++){

tmp.node[i]=modified->node[tmp_idx+1];
tmp.cost[i]=modified->cost[tmp_idx+1];
tmp_idx++;

}

tmp.idx=i;
tmp.idx=idx;
for(i=0; i<ref.idx; i++){

if(ref.node[i]!=modified->name){

modified->node[tmp_idx]=ref.node[i];
modified->cost[tmp_idx]=ref.cost[i];
tmp_idx++;

}



for(i=0; i<tmp.idx;i++){

modified->node[tmp_idx]=tmp.node[i];
modified->cost[tmp_idx]=tmp.cost[i];
tmp_idx++;


return tmp_idx;

}


Posted by 검지발가락♡

사용한 개발 툴 : Microsoft Visual Studio 2005

2009년 4월 7일

거의 독학 수준이었던 MFC ㅍ0ㅍ

1.1. 움직이는 로직에 대한 설명.

1.1.1. 툴바의 곡선 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_nType가 곡선 ID_DrawCurve 이므로 if문 실행 한다.CreatePen()함수의 pen의 style을 설정하는데 PS_SOLID는 실선을 의미하고, 1은 펜의 굵기, m_colLine 은 선의 색깔을 지정한다. 선그리기를 할때에는 MoveTo() 함수와 LineTo() 함수가 필요하다.

1.1.2. 툴바의 곡선 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_nType가 곡선 ID_DrawLine 이므로 if문 실행 한다.CreatePen()함수의 pen의 style을 설정하는데 PS_SOLID는 실선을 의미하고, 1은 펜의 굵기, m_colLineXor 은 선의 색깔을 지정한다. 선그리기를 할때에는 MoveTo() 함수와 LineTo() 함수가 필요하다.

1.1.3. 툴바의 사각형 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawRectangle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 사각형을 그려준다.

1.1.4. 툴바의 사각형 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawRectangle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 사각형을 그려준다. Rectangle(int x1, int y1, int x2, int y2)

1.1.5. 툴바의 원 버튼을 누르고 마우스를 움직이면 OnMouseMove() 함수가 실행되고 if 문에서 m_Type가 곡선 ID_DrawCircle 이므로 실행한다. 여기서도 Create()함수가 실행된다. 투명 브러쉬를 선택하고 R2_XORPEN 모드로 해준다. 그리고 원을 그려준다. Ellipse()

1.1.6. WM_MOUSEMOVE에서 사각형을 그려주며, WM_LBUTTONUP에서 사각형의 내부 색을 채워준다.

1.1.7. CColorDialog를 이용해 선택한 색은 GetColor()를 이용해 얻을 수 있다.

1.1.8. m_LineColorXor은 직전 도형의 모양 뿐만 아니라 m_LineColor의 Xor 연산 결과가 저장 되어 있어야 한다.

1.1.9. 메뉴바에 있는 색상에서 예를 들어 선색-> 빨강을 누르면 OnColorLineRed() 함수가 실행되어 선색이 빨강이 된다. 도형->빨강을 누르면 OnFillRed() 함수가 실행되어 도형의 안이 채워진다.


// CPainter1View 메시지 처리기
void CPainter1View::OnChangeTool(UINT nID) {

m_nType = (int)GetCurrentMessage()->wParam; //툴바의 항목 리턴

void CPainter1View::OnUpdateChageTool(CCmdUI* pCmdUI){

pCmdUI->SetCheck(m_nType == (int)pCmdUI->m_nID);

}

void CPainter1View::OnCPen() {

CColorDialog dig;
if(dig.DoModal()==IDOK){
m_colLine = dig.GetColor();
m_colLineXor = (RGB(GetRValue(m_colLine)^255, GetGValue(m_colLine)^255, GetBValue(m_colLine)^255));
}

}

void CPainter1View::OnUpdatePaintred(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
m_colLine = (RGB(255,0,0));
m_colLineXor = (RGB(225, 0, 0));

}

void CPainter1View::OnPainter(){

CColorDialog dig;
if(dig.DoModal()==IDOK)
m_colFill = dig.GetColor();

}

void CPainter1View::OnLButtonDown(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default
m_pntOld = point;
m_pntCur = point;
SetCapture();
CView::OnLButtonDown(nFlags, point);

}

void CPainter1View::OnLButtonUp(UINT nFlags, CPoint point){

// TODO: Add your message handler code here and/or call default
ReleaseCapture();
CClientDC dc(this);
CBrush brush, *pOldBrush;
if(m_nType == ID_DrawRectangle){

brush.CreateSolidBrush(m_colFill);
pOldBrush = (CBrush *)dc.SelectObject(brush);
dc.Rectangle(m_pntOld.x, m_pntOld.y, point.x, point.y);

} else if(m_nType == ID_DrawCircle) {
brush.CreateSolidBrush(m_colFill);
pOldBrush = (CBrush *)dc.SelectObject(brush);
dc.Ellipse(m_pntOld.x, m_pntOld.y, point.x, point.y);

CView::OnLButtonUp(nFlags, point);

}

void CPainter1View::OnMouseMove(UINT nFlags, CPoint point) {

// TODO: Add your message handler code here and/or call default
//왼쪽 버튼 누른 상태
if(nFlags & MK_LBUTTON) {
CClientDC dc(this);
CPen pen, *pOldPen;
CBrush brush, *pOldBrush;

if(m_nType == ID_DrawCurve){

pen.CreatePen(PS_SOLID, 1, m_colLine);
pOldPen = (CPen *)dc.SelectObject(&pen);
dc.MoveTo(m_pntOld.x, m_pntOld.y);
dc.LineTo(point.x,point.y);
m_pntOld = point;
dc.SelectObject(pOldPen);

  } else if(m_nType==ID_DrawLine){

pen.CreatePen(PS_SOLID, 1, m_colLineXor); 
dc.SelectObject(GetStockObject(NULL_BRUSH));
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.MoveTo(m_pntOld.x, m_pntOld.y);
d
c.LineTo(m_pntCur.x, m_pntCur.y); 
dc.MoveTo(m_pntOld.x, m_pntOld.y);
d
c.LineTo(point.x, point.y); 
dc.SelectObject(pOldPen);

else if(m_nType == ID_DrawRectangle) {

pen.CreatePen(PS_SOLID, 1, m_colLineXor); 
dc.SelectObject(GetStockObject(NULL_BRUSH)); 
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.Rectangle(m_pntOld.x, m_pntOld.y, point.x, point.y); 
dc.SelectObject(pOldPen);

else if(m_nType == ID_DrawCircle) {

//펜생성
pen.CreatePen(PS_SOLID,1,m_colLineXor);
dc.SelectObject(GetStockObject(NULL_BRUSH)); 
dc.SetROP2(R2_XORPEN); 
pOldPen = (CPen *)dc.SelectObject(&pen); 
dc.Ellipse(m_pntOld.x, m_pntOld.y, m_pntCur.x, m_pntCur.y);
dc.Ellipse(m_pntOld.x, m_pntOld.y, point.x, point.y); 
dc.SelectObject(pOldPen);

}

m_pntCur = point; 

  }

CView::OnMouseMove(nFlags, point);

}

void CPainter1View::OnInitialUpdate(){

CView::OnInitialUpdate();

}

void CPainter1View::OnPaint(){

CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CView::OnPaint() for painting messages

}

 

 

void CPainter1View::OnUpdatePaintgreen(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_colLine==RGB(0,255,0));

}

void CPainter1View::OnUpdatePaintblue(CCmdUI *pCmdUI) {

// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_colLine == RGB(0,0,255));

}


 

 


mfc.zip

Posted by 검지발가락♡

사용한 개발 툴 : JAVA, eclipse, MYSQL, Tomcat5.0
특징 : java bean


1. 프로그램 소개

본 프로그램은 은행관리 프로그램으로서 일반적으로 계좌에 관련된 입금, 출금, 이체, 계좌 작업내역 조회 등을 하고, 은행원을 관리하는 관리인은 은행원 정보를 삽입, 삭제 등을 하는 프로그램이다.

2. 클래스

 

 

3. 데이터베이스 구조

MySQL에서 운영되는 한신은행 데이터베이스 HSbank는 다음의 테이블로 구성된다.

banker(bankerType:varchar(20), bno:int, bname:varchar(20), ID:varchar(20), password:varchar(20), dateHired:date, branch:varchar(20) )

-bankerType : 은행에 소속된 은행원은 정규직과 비정규직으로 나뉨.
-bno : 은행원 개개인은 고유한 번호를 가진다. 맨 첫 자리 1은 정규직을 나타내고, 2은 비정규직을 나타냄.
-bname : 은행원의 이름.
-ID , password : 은행원을 생성할 때 사용자로부터 입력 받은 ID, password.
-dateHired : 은행으로부터 고용된 날짜.
-branch : 근무장소.

 

account(accType, accno:int, owner:varchar(20), password:int, dateOpened:date, balance:int)

-accType : 개설한 계좌는 보통계좌와 저축계좌로 나뉨.
-accno : 개설된 계좌는 고유한 계좌번호를 가짐.
-owner, password : 계좌를 개설한 고객의 이름과 password. 
-dateOpened : 계좌를 개설한 날짜
-balance : 현재 계좌에 남아 있는 금액

 

transaction(transType:char(10),accno:int, customer:varchar(20), dateTrans:date, timeTrans:time, accnoTransfer:int, bno:int, amount:int, balance:int)

-transType : 작업내역에는 입금, 출금, 이체입금, 이체출금으로 타입이 나뉨.
-accno, customer : 이체의 주체가 되는 계좌의 번호와 이름.
-dateTrans, timeTrans : 이체가 실행된 날짜와 시간.
-bno : 이체의 대상이 되는 계좌의 번호.
-amount, balance : 이체 금액과 accno의 잔고

 

nextSerial(serialType:varchar(20), serial:int)

- 정규직, 비정규직, 보통계좌, 저축계좌의 각각에 대한 고유번호를 가지기 위한 각각의 마지막 번호.




pink(2).zip

Posted by 검지발가락♡