• 전문가 요청 쿠폰 이벤트
*상*
Bronze개인
팔로워0 팔로우
소개
등록된 소개글이 없습니다.
전문분야 등록된 전문분야가 없습니다.
판매자 정보
학교정보
입력된 정보가 없습니다.
직장정보
입력된 정보가 없습니다.
자격증
  • 입력된 정보가 없습니다.
판매지수
전체자료 6
검색어 입력폼
  • [컴퓨터공학] OOP로 구현한 Binary Search Tree 및 Graphic으로 Tree출력
    [ Homework #3]"Binary Search Tree"공과대학 화학공학과0241255김 상우Program SpecificationHW #3는 수업시간에 학습한 Binary Structure를 바탕으로 하여, 그 structure에 노드를 삭제하는 함수와, PSlib을 이용하여 PS형식의 데이터를 출력하는 함수를 프로그래밍 하는것이 목적이다.How to compile and executeCOMPILER : MS Visual C++ 6.0About warning and special comment :int main(int argc, char* argv[]) // argc argv 체인지{Tree T;ifstream in;int l=1;for(l=1;ldata) == value) break;Ptmp= tmp; // 노드의 이동 전 parent를 저장시킨다 (Node terminal을 위해서)if( value < ((tmp)->data) ){ tmp = tmp->leftPtr; from=0;}else{ tmp= tmp->rightPtr; from=1;}}TreeNode *T; T=tmp; // tmp의 위치 기억 (찾아진 NODE값과 swap을 위해서)if( ( (tmp->rightPtr)==0 ) && ( (tmp->leftPtr)==0 ) ) // 현재 노드에 자식이 없으면, 현재 노드만 삭제 후 종료.{delete[] tmp; // 메모리에서 삭제if(!from) // 삭제할 노드가 parent의 left sub tree일때 : parent의 leftPtr = NULL 로 설정한다Ptmp->leftPtr = '';else // 삭제할 노드가 parent의 right sub tree일때 : parent의 rightPtr = NULL 로 설정한다Ptmp->rightPtr = '';return;}if(tmp->rightPtr==0) // 삭제될 노드가 자식노드를 가지고 있을때, 오른쪽 sub tree가 없을때 왼쪽 sub tree중 가장 큰값과 swap후 삭제{Ptmp=tmp; // 노드의 이동 전 parent를 저장시킨다 (Node terminal을 위해서)tmp= tmp->leftPtr; // 왼쪽노드로 이동. Binary Tree의 특성상 현재의 위치에서 오른쪽으로 이동할 수 있을떠까지 이동하면 왼쪽 sub tree중 가장 큰 값을 구할 수 있다int flag=0; // 왼쪽노드에 오른쪽 자식노드가 존재하는경우 : flag=1 , 존재하지 않으면 : flag=0while(1){if(tmp->rightPtr=='') break; //right ptr이 없을때 = 왼쪽 sub tree중 가장 큰 값이다flag=1;Ptmp=tmp; // 노드의 이동 전 parent를 저장시킨다 (Node terminal을 위해서)tmp=tmp->rightPtr; // 오른쪽 자식노드로 이동}T->data=tmp->data; // 삭제할 노드의 위치에 왼쪽 sub tree중 가장 큰 값을 대입if(!flag) // 왼쪽노드에 오른쪽 자식노드가 존재하지 않는경우 : Parent node의 오른쪽을 tmp의 rightPtr과 이어준다Ptmp->leftPtr='';else // 왼쪽느드에 오른쪽 자식노드가 존재하는경우 : Ptmp(가장 오른쪽자식노드의 parent)의 오른쪽을 Null로 terminate 한다Ptmp->rightPtr='';delete[] tmp; // 메모리에서 삭제}else // 삭제될 노드가 자식 노드를 가지고 있을 떠, 왼쪽 오른쪽 다 갖거나, 오른쪽하나만을 갖을때 오른쪽 sub tree중 가장 작은값과 swap후 삭제{Ptmp=tmp; // 노드의 이동 전 parent를 저장시킨다 (Node terminal을 위해서)tmp= tmp->rightPtr; // 오른쪽노드로 이동. Binary Tree의 특성상 현재의 위치에서 오른쪽으로 이동할 수 있을떠까지 이동하면 왼쪽 sub tree중 가장 작은 값을 구할 수 있다int flag=0; // 오른쪽노드에 왼쪽 자식 노드가 존재하는경우 : flag=1 , 존재하지 않으면 : flag=0while(1){if(tmp->leftPtr=='') break; // leftPtr이 없을때 = 오른쪽 sub tree중 가장 작은 값이다flag=1;Ptmp=tmp; // 노드의 이동 전 parent를 저장시킨다 (Node terminal을 위해서)tmp=tmp->leftPtr; // 왼쪽 자식노드로 이동}T->data=tmp->data; // 삭제할 노드의 위치에 오른쪽 sub tree중 가장 작은 값을 대입if(!flag) // 오른쪽노드에 왼쪽 자식노드가 존재하지 않는경우 : Parent node의 오른쪽을 Null 로 terminate 한다Ptmp->rightPtr='';else // 오른쪽느드에 왼쪽 자식노드가 존재하는경우 : Ptmp(가장 왼쪽자식노드의 parent)의 왼쪽을 Null로 terminate 한다Ptmp->leftPtr='';delete[] tmp; // 메모리에서 삭제}}2. 그래프 출력 알고리즘그래프 출력 알고리즘은, pre-order traversal을 응용하여 작성하였다. 먼저 root NODE의 데이터를 출력한 후, root에 대한 left를 출력하는데 이때 변수를 6개를 사용하여 각각 다음 출력할 노드의 포인터, 출력위치 X좌표, 출력위치 Y좌표, 상위노드의 X좌표, 상위노드의 Y좌표, X값의 너비 인데, 출력시 X값의 너비가 2보다 작아지면 데이터가 겹치게 되므로 에러메시지가 나오고 그 아래로는 출력되지 않도록 하였다.void prnTree(char* FN) // 노드 출력{TF=0; // 에러메시지 출력 flagstrcpy(OUTN,FN);OUT= FN; // 출력 파일 설정float SX= MX/2; float SY= YWID,XWID=SX/2; // SX = X의 시작점 X의 길이의 반. Y는 Y의 시작점 pre defined const Y의 Margine값 XWID는 X의 간격인데, 자식 노드로 내려갈수록 1/2 해준다char T[10]; itoa(rootPtr->data,T,10); // T는 출력할 data의 번호PRNL(rootPtr->leftPtr,SX- XWID,SY+YWID,SX,SY,XWID/2); // left : 선들을 출력한다PRNL(rootPtr->rightPtr,SX+ XWID,SY+YWID,SX,SY,XWID/2); // right : 선들을 출력한다OUT.DrawCircle(X(SX),Y(SY),8,0,1,0); // 빈 원을 그린다 (원 속의 선을 제거하기 위해)OUT.DrawCircle(X(SX),Y(SY),8,1,1,1); // 원을 그린다 (원 속에 선이 제거되어있다)OUT.DrawText(X(SX)-3,Y(SY)-3,T,11,0); // 원 속에 data를 출력PRNNODE(rootPtr->leftPtr,SX- XWID,SY+YWID,SX,SY,XWID/2); // left : 원과 데이터를 출력한다PRNNODE(rootPtr->rightPtr,SX+ XWID,SY+YWID,SX,SY,XWID/2); // right : 원과 데이터를 출력한다OUT.CloseFile(); // 파일을 닫는다}출력하는 함수의 메인 부분이다. PRNL 함수로 선을 면저 출력한 후 PRNNODE로 원과 데이터를 출력하여 선이 원 안으로 들어가지 않도록 하였다.void PRNL( TreeNode< NODETYPE > *ptr,float NX,float NY,float PX,float PY,float XWID) const // 선을 출력{if ( ptr != 0 ) // NULL이 아니면{if(XWID
    공학/기술| 2003.11.13| 8페이지| 2,000원| 조회(458)
    미리보기
  • [컴퓨터공학] VC 6.0으로 구현한 OOP기반의 Convex hull
    [ Homework #2]"CONVEX HULL"공과대학 화학공학과0241255김 상우Program Specification이번 HW#2는 C++의 강력한 OOP를 이용한 체계적인 구조를 갖는 데이터 형을 제작하여, Built-in 데이터 형이 아닌 새로 만든 데이터 형을 이용하여 프로그램을 구현하는 것이다. 프로그램의 목적은 "Convex Hull" 프로그램을 구현하는것인데, 사용된 알고리즘은 CCW (세 점의 방향성 판별), 두 점을 잇는 선분의 각도를 제는 알고리즘, 그리고 정렬에 사용된 선택 정렬, 마지막으로 과제의 MAIN-알고리즘인 Graham 알고리즘이 있다. 사용된 데이터-구조로는 Graham 알고리즘에서 사용된 스택이 있는데, 이는 배열을 이용하여 구현하였다.How to compile and executeCOMPILER : MS Visual C++ 6.0About warning and special comment : 특별히 warning message는 없다.USER MANUAL :실행 폴더에 input.txt 파일을 만든 후, input.txt에는 다음과 같은 형식으로 N개의 좌표에 대한 정보를 입력한다.NP1.x P1.yP2.x P2.y..PN.x PN.y출력 파일의 이름은 test.ps 이다. 파일에는 주어진 입력에 대한 convex hull과 좌표들이 visual하게 출력될 것이다.- 예제 입력 및 그에 대한 출력 -Algorithm and Data Structure1. 각도 계산 알고리즘각도 계산에는 arctan을 사용하였다. C++에서 arctan에 해당되는 함수인 atan은 한 선분의 x축의 변화량과, y 축의 변화량을 입력받으면 각도값을 리턴해주는 함수이다. 이 때 arctan의 주기가 Pi 이므로 2Pi 범위로 사상할 때는 같은 두 부분중 어떤 부분을 선택해야하는데, 다음과 같은 방법으로 선택한다.1사분면 : dx > 0 & dy > 0 -> 평행이동 x2사분면 : dx < 0 & dy > 0 -> Pi 만큼 평행이동3사분면 : dx < 0 & dy < 0 -> Pi 만큼 평행이동4사분면 : dx > 0 & dy < 0 -> 2Pi 만큼 평행이동Float angle(Float dx,Float dy) // atan함수를 이용해서 두 점사이의 거리차 ( dx, dy ) 가 주어졌을떠 두 점을 잇는 선분의 각도를 구하는 함수{if(dx==0 && dy==0) return 0; // 예외처리 거리차가 0 일때 0을 리턴if(dy==0) //또한 예외처리 (가로 방향일때 0 or Pi ){if(dx>0) return 0; // 0else return (float)M_PI; // Pi}if(dx==0) // 예외처리 (세로 방향일떠 Pi/2 or Pi*2/3 ){if(dy>0) return (float)M_PI_2; // Pi/2else return (float)M_PI_2*3; // Pi*2/3}if(dx>0) // 일반각에 대한 처리{if(dy >0)return (float)atan(dy/dx); //1사분면elsereturn (float)(atan(dy/dx)+2*M_PI); // 4사분면}else{return (float)(atan(dy/dx)+M_PI); // 2,3사분면}}2. CCW (세 점의 방향성 검사)CCW 알고리즘은 세 좌표에 대한 정보가 주어졌을 때, 차례대로 P1-> P2-> P3 의 방향이 시계방향(Clock-Wise) 인지 아니면 반시계방향(Counter Clock-Wise)인지 판별하는 알고리즘이다. 사람의 눈으로는 직관적으로 풀 수 있지만, 컴퓨터에는 그런 사고를 가질 수 없으므로 벡터의 외적을 이용하여 계산할 수 있다.- 벡터의 외적 : v1 x v2 의 크기와 방향-V1과 V2의 벡터의 외적값은 |V1 x V2| = |V1| |V2| Sin 이다. 방향은 오른손 법칙에 의해서 엄시손가락이 가리키는 방향(그림의 위 방향) 이 선택된다. 이와같이 기하학적으로 정의된 벡터의 외적을, 성분에 대해 수학적으로 정의한다면,| i j k |V1(V1x,V1y,V1z) x V2(V2x,V2y,V2z) = det |V1x V1y V1z ||V2x V2y V2z |= (V1y*V2z - V1z*V2y)i - (V1xV2z-V1zV2x)j + (V1x*V2y - V1y*V2x)k와 같다. 여기서 LCD화면을 X,Y로 잡고 Z축의 양의 음의 방향은 모니터 속으로, 양의 방향은 모니터 밖(모니터 -> 눈)으로의 방향이라고 하자. 이때 위에 시계방향, 반시계방향 그림에서 V1을 A->B 로가는 벡터로 잡고, V2는 A->C로 가는 벡터로 잡으면 V1 x V2는 LCD 화면 안으로 들어가는 방향이 된다. 즉 z축의 양의 방향이다. 또한 점 A,B,C는 xy평면상의 점이므로 Z성분이 모두 0이므로 z성분만 존재한다. 따라서 위의 수식에 성분을 대입해서 계산한 값(z 성분)이 음이면 반시계 양이면 시계방향이 된다.Int ccw(Point P1,Point P2,Point P3) // CCW - 세 점의 존재할때 점들의 방향성에 대한 검사{Float l;l=P1.X*P2.Y+ P2.X*P3.Y+ P3.X*P1.Y - (P2.X*P1.Y + P1.X*P3.Y + P3.X*P2.Y) ;if( l> 0.) return 1;return 0;}3. Graham Algorithm(Convex hull을 O(nlogn)의 시간복잡도로 구할 수 있는 현재까지 알려진 최적의 해법)이번 HW#2의 최종적인 목표인 Convex hull을 구하는 방법에 대한 해법은 Graham Algorithm을 사용하는 것이다. 이 Graham 알고리즘은 N개의 좌표가 주어졌을때 그 좌표들의 볼록 다각형을 구하는 방법이다.- 볼록 다각형 -Graham Algorithm은 다음과 같다Graham(){y좌표가 가장 작은 점 중 x가 가장 큰 점을 PS1로 잡는다;PS0를 기준으로 PS0와의 각도를 오름차순으로 모든 PS를 정렬한다;Push(PS1);Push(PS2);Push(PS3);for( i = 4 ; i
    공학/기술| 2003.11.13| 11페이지| 3,000원| 조회(1,257)
    미리보기
  • [화학공학] 고체의 진밀도 평가B괜찮아요
    화공 실험 예비 레포트Exp. 2 고체의 진밀도제출 일시 : 2003년 11월 13일실험 조 : 2조화학공학과0241255김 상우1. 실험 목적Gay-Lussac형 피크노미터를 사용하여 순수한 물로 공기를 치환하여 모래의 진밀도를 측정한다.2. 이론용어 정리밀도 - 단위부피당 물질의 질량. 즉, 질량/부피로, 밀도가 1보다 큰 경우 물에 가라앉고 1보다 작은 경우에는 물에 뜬다.단위 : g/㎤, ㎏/㎥물질에 따라 일정한 값을 가지므로 물질의 특성이 된다.그 값은 수치상 비중과 거의 일치한다(유효숫자는 5자리 이내). 물질 속의 원자나 분자 배열의 소밀도(疎密度), 합금이나 혼합물 속의 성분비(成分比) 등을 알아내는 데 이용된다. 넓은 뜻으로는 질량 이외의 각종 물리량의 단위부피당 크기, 단위넓이당 크기, 단위길이당 크기도 말하며, 각각 부피밀도 넓이밀도(또는 면밀도) 선밀도라고 한다. 엷은 판이나 막 모양의 물체, 또는 실 모양의 물체 등에서 질량의 면밀도 선밀도를 쓰는 경우가 많다. 인구밀도는 면밀도의 일종이다.(게이 뤼삭) 피크노미터 - 피크노미터는 보통 용량 10 100ml의 병으로서 온도계를 붙이는 갈아 맞춘 마개와 표선 및 갈아 맞춘 뚜껑이 있는 측관이 있다. 미리 깨끗하게 씻고 건조한 비중병의 무게(W)를 마개와 뚜껑을 빼고 검체를 가득 넣은 다음 규정온도보다 1 3 낮게 하고 거품이 남지 아니하도록 주의하여 마개를 닫는다. 이어 천천히 온도를 올려 온도계가 규정온도를 나타낼 때 표선보다 상부의 검체를 측관으로부터 제거하고 측관에 뚜껑을 한 다음 외부를 잘 닦고 무게(W1)를 단다. 다시 같은 비중병으로 증류수를 사용하여 위와 같이 조작하고 그 무게(W2)를 달아 다음 식에 따라 비중(d)을 구한다.W1 - Wd = ━━━━━━W2 - W(오스트왈드) 피크노미터 -오스트왈드 피크노미터는 용량 1 10ml로서 양단은 두꺼운 가는 관으로 되어 있으며 그 한쪽의 가는 관(A)에는 표선(C)이 있다. 이에 칭량할 때 화학천칭의 걸이에 거는 것과 같은 백금선(D)(또는 알루미늄선 등도 가능하다)을 붙인다. 미리 깨끗이 씻고 건조한 피크노미터의 무게(W)를 단 다음 규정온도보다 3 5 낮게 한 검체중에 표선이 없는 쪽의 가는 관(B)을 넣고 다른 쪽의 가는 관(A)에 고무관 또는 갈아 맞춘 가는 관을 꽂은 후 거품이 들어가지 않도록 주의하면서 검체를 표선 C의 위까지 천천히 빨아 올린다.규정온도로 유지한 수욕중에 피크노미터를 15분간 담근 후 가는 관(B) 끝에 여과지편을 대고 검체의 끝을 표선과 일치시킨 다음 수욕에서 꺼내어 외부를 잘 닦은 후 무게(W2)를 달고 다시 같은 피크노미터로서 증류수를 사용 하여 위와 같이 조작하여 그 무게(W2)를 달아 다음 식에 따라 비중(d)을 구한다.W1 - Wd = ━━━━━━W2 - W실험 이론비중병을 사용하여 질량을 측정하여 고체의 진밀도를 구할 수 있다.고체의진밀도= {고체의~질량} over {같은~부피의~액체의~질량} ` TIMES `액체의~비중p _{s} `=~ {(m _{ps} -m _{p} )p _{w}} over {(m _{psw} -m _{p} )-(m _{pw} -m _{p} )}ps = 고체의 진밀도 [g/cm3]mp = 고체의 질량 [g]mpw = 액체를 채운 비중병의 질량 [g]mps = 고체를 채운 비중병의 질량 [g]mpsw = 고체와 액체를 채운 비중병의 질량 [g]pw = 액체의 밀도 [g/cm3]3. 실험 장치 및 재료Gay-Lussac형 피크노 미터, 감압장치, 항온조, 정밀 천칭, 고체 시료(모래), 순수한 물, 밀봉 물질, 뷰렛, 건조 오븐, 압력계
    공학/기술| 2003.11.13| 5페이지| 1,000원| 조회(1,149)
    미리보기
  • [화학공학] 액체의 밀도
    화공 실험 예비 레포트Exp. 1 액체의 밀도제출 일시 : 2003년 11월 13일실험 조 : 2조화학공학과0241255김 상우1. 실험 목적Ostwald형 피크노미터를 사용하여 순수 액체와 혼합물의 밀도를 측정한다.2. 이론용어 정리밀도 - 단위부피당 물질의 질량. 즉, 질량/부피로, 밀도가 1보다 큰 경우 물에 가라앉고 1보다 작은 경우에는 물에 뜬다.단위 : g/㎤, ㎏/㎥물질에 따라 일정한 값을 가지므로 물질의 특성이 된다.그 값은 수치상 비중과 거의 일치한다(유효숫자는 5자리 이내). 물질 속의 원자나 분자 배열의 소밀도(疎密度), 합금이나 혼합물 속의 성분비(成分比) 등을 알아내는 데 이용된다. 넓은 뜻으로는 질량 이외의 각종 물리량의 단위부피당 크기, 단위넓이당 크기, 단위길이당 크기도 말하며, 각각 부피밀도 넓이밀도(또는 면밀도) 선밀도라고 한다. 엷은 판이나 막 모양의 물체, 또는 실 모양의 물체 등에서 질량의 면밀도 선밀도를 쓰는 경우가 많다. 인구밀도는 면밀도의 일종이다.(비중병) 피크노미터 - 피크노미터는 보통 용량 10 100ml의 병으로서 온도계를 붙이는 갈아 맞춘 마개와 표선 및 갈아 맞춘 뚜껑이 있는 측관이 있다. 미리 깨끗하게 씻고 건조한 비중병의 무게(W)를 마개와 뚜껑을 빼고 검체를 가득 넣은 다음 규정온도보다 1 3 낮게 하고 거품이 남지 아니하도록 주의하여 마개를 닫는다. 이어 천천히 온도를 올려 온도계가 규정온도를 나타낼 때 표선보다 상부의 검체를 측관으로부터 제거하고 측관에 뚜껑을 한 다음 외부를 잘 닦고 무게(W1)를 단다. 다시 같은 비중병으로 증류수를 사용하여 위와 같이 조작하고 그 무게(W2)를 달아 다음 식에 따라 비중(d)을 구한다.W1 - Wd = ━━━━━━W2 - W(오스트왈드) 피크노미터 -오스트왈드 피크노미터는 용량 1 10ml로서 양단은 두꺼운 가는 관으로 되어 있으며 그 한쪽의 가는 관(A)에는 표선(C)이 있다. 이에 칭량할 때 화학천칭의 걸이에 거는 것과 같은 백금선(D)(또는 알루미늄선 등도 가능하다)을 붙인다. 미리 깨끗이 씻고 건조한 피크노미터의 무게(W)를 단 다음 규정온도보다 3 5 낮게 한 검체중에 표선이 없는 쪽의 가는 관(B)을 넣고 다른 쪽의 가는 관(A)에 고무관 또는 갈아 맞춘 가는 관을 꽂은 후 거품이 들어가지 않도록 주의하면서 검체를 표선 C의 위까지 천천히 빨아 올린다.규정온도로 유지한 수욕중에 피크노미터를 15분간 담근 후 가는 관(B) 끝에 여과지편을 대고 검체의 끝을 표선과 일치시킨 다음 수욕에서 꺼내어 외부를 잘 닦은 후 무게(W2)를 달고 다시 같은 피크노미터로서 증류수를 사용 하여 위와 같이 조작하여 그 무게(W2)를 달아 다음 식에 따라 비중(d)을 구한다.W1 - Wd = ━━━━━━W2 - W공액 - 두 개의 점 또는 선, 또는 수가 서로 특수한 관계를 가지고 있어, 서로 전환하여도 그 성질의 논구상 변화가 없을 경우 그 둘의 관계.공액 용액 - "A, B 두 종의 액체를 혼합할 때 A는 B를, B는 A를 각기 조금밖에 녹이지 못하기 때문에 2층으로 나누어져 있는 경우가 있다. 이처럼 두 가지 액체가 각각 포화 용액으로 평형되게 공존할 때의 용액계실험 이론온도 T와 압력 P에서 부피가 V인 액체의 질량이 m 이면 밀도 p{T,P}는,p{T,P} = m/V와 같다. 이 때, 어떤 액체의 밀도 p{T,P}와 기준 액체의 밀도 pR{TR,PR} 의 비를 비중 또는 상대 밀도라 하는데 물을 기준 액체로 하여 오스트왈드형 피크로미터를 사용하여 시료의 밀도를 구한다. TR 은 기준 액체의 온도, PR은 기준 액체의 압력이고 1 atm,4 에서의 물의 최대 밀도는 999.973 Kg/m3 이다.빈 피크노미터의 질량을 mp, 순수한 물을 채웠을때의 질량을 mpw, 시료 액체를 채웠을 때 질량을 mps, 측정 온도에서 순수한 물의 밀도를 pw, 공기의 밀도를 pa라 하면 시료 액체의 밀도 ps 는 다음과 같다.
    공학/기술| 2003.11.13| 5페이지| 1,000원| 조회(863)
    미리보기
  • [컴퓨터공학] 쉘 스크립트를 이용한 게시판 작성
    [ 시스템 프로그래밍 과제 #2 ]쉘 스크립트를 이용한 게시판 작성화학공학과0241255김 상우쉘 스크립트란 쉘에서 사용할 수 있는 명령어들의 조합을 모아서 만든 배치파일이다. 리눅스에서는 여러 명령어들을 파이프, 리다이렉션, 필터 등으로 연결하여 원하는 결과를 얻어 낼 수 있다. 이런 방식으로 묶여진 명령어 조합이 반복적으로 사용된다면 이를 쉘 스크립트로, 즉 단일 명령으로 만들어 쉽게 사용할 수 있다.스크립트라고 하는 것은 인터프리터에 의해 해석,실행되는 프로그램을 말한다. 어떤 종류의 인터프리터를 사용하는 가에 따라서 어떤 스크립트인가에 대한 이름이 정해진다. 쉘 스크립트, Perl 스크립트, Tcl/Tk 스크립트 등의 이름에서 사용하는 인터프리터를 알 수 있다. 쉘 스크립트는 인터프리터로 쉘을 사용하는 스크립트를 가르킨다. 또한 어떠한 쉘을 사용하는 가에 따라서 bourne 쉘 스크립트, C 쉘 스크립트, Korn 쉘 스크립트, TC 쉘 스크립트 등으로 나뉜다.우리는 이러한 쉘 스크립트의 특성을 이용하여 linux 상에서의 게시판을 구현하여보았다. 이를 통해 더 나은 셸 명령어의 구사능력 및 논리적인 프로그래밍 스킬을 길러 linux상의 system programming의 기반을 닦을 수 있을 수 있을 거라고 생각된다.프로그램 설계1. YBBSYBBS는 bourne 셸 스크립트로 짜여진 linux상에서 작동되는 전자게시판이다. 공용 디렉토리 (/tmp/ybbs)에 게시판 DB를 저장하여 시스템 사용자들 간의 정보공유의 공간으로 활용할 수 있다. 구현된 기능으로는, 게시판 생성 및 삭제, 글 작성 및 삭제, 게시판 이동 및 조회 , 글 검색 및 조회, 도움말 기능이 있다. 약 300라인정도의 간단한 프로그램으로 간편하게 사용할 수 있는데,특히 Program Specification에 충실히 하여 프로그램을 구현하였다.2. 게시판의 계층 구조게시판의 구조는 위와 같다. 프로그램을 실행시키면 실제 게시판이 아닌 가상의 ROOT 게시판에 위치한다. ROOT에서보만을 저장하여 수정이 용이하도록 하였다.tag 파일에는 게시글에 대한 정보가 1줄의 ASCII코드로 기술되어있다. 이는 검색 시임시 파일 하나를 만든 후, tag파일들을 출력될 형태로 변환 시켜준 후 sort -nr 으로정렬하여 출력하는 아주 간단한 방법을 취할 수 있게 된다. 또한 게시물을 읽은 후조회수를 올릴때도 tag 파일은 1줄로 되어있어서 파일 전체를 읽고 새로 쓰는데 과부하가 걸리지 않는다.위는 게시판에 글이 저장된 폴더에서 tag파일들을 출력한 것이다. tag 파일은 |로 각각의 필드가 나누어져있다. 첫 번째 필드에는 글번호, 두 번째 필드에는 작성자, 세 번째필드는 작성일, 네 번째 필드는 조회수, 마지막 다섯 번째 필드는 제목이 저장되어 있다.5. .text 파일에는 게시글의 본문이 저장되어있다.text 파일에는 w입력을 받을때 본문만 저장하도록 설계하였다. 이 방법을 통해 text 파일은 입력받을때 tee 명령으로 입력 받은 후 아무 조작을 할 필요가 없이 간단하게구현할 수 있었다.위는 게시판에 저장되어진 text파일을 캡쳐한 스크린 샷이다. text 파일에는 본문 내용만 저장되어있다.구현 내용1. 실행 및 초기화 : 게시판을 실행 했을 때 ID를 입력받는다.while [ ! $USRID ]doprintf "YBBS ID:"read USRIDdoneID를 입력받는 루틴이다. Program Specification대로 ID가 입력되지 않은 경우 계속 입력받도록 while 문을 사용하였다. USRID는 사용자ID를 가르키는 변수이다.echo "$USRID 님 환영합니다!"CurrentDIR=`pwd`CurrentDIR은 현재의 경로를 저장시켜준다. 이 프로그램에서는 /tmp/ybbs 폴더로 이동하여 작업을 하므로, 프로그램을 마친 후 프로그램을 실행시킨 폴더로 돌아가기 위해서 현재의 폴더를 CurrentDIR에 저장시킨 후 종료 시에 이 디렉토리로 복귀시킨다.cd /tmpif [ ! -d "ybbs" ]thenmkdir ybbsficd ybbs/dev/null로 출력하여 에러메시지가 화면에 출력되지 않도록 한 것이다.3. Blist : 게시판의 목록 출력하기function Blist{NumOfDir=0 //게시판의 갯수echo ":: 게시판 목록 ::"for dir in * // /tmp/ybbs 내의 모든 파일, 디렉토리에 대하여doif [ -d "$dir" ] // dir이 디렉토리이면thenNumOfDir=`expr $NumOfDir + 1` // 게시판의 개수 += 1echo "$dir" // 게시판의 이름을 출력한다fidoneecho "$NumOfDir 개의 게시판이 존재합니다"}NumOfDir은 게시판의 개수를 출력하기 위한 변수이다. 그 아래에 있는 for문에서는 /tmp/ybbs 내의 모든 파일 및 디렉토리에 대해서 디렉토리인지 검사한 후 디렉토리이면 NumOfDir의 값을 1 증가시켜주고, 게시판의 이름을 출력한다. 여기서 expr 명령어는 변수값은 무조건 string 형만을 사용하는 shell에서 string 형의 값을 정수 값으로 변환한 후 연산을 하게 해주는 함수이다.4. Bdd : 게시판을 삭제한다elif [ $FN = "bdd" ] 2> /dev/nullthenif [ "$DATA" = "bdd" ] 2> /dev/null // 게시판 내에서 bdd 사용한 경우에thenDATA=$BOARD // DATA 즉, 삭제할 대상을 현재 디렉토리로 한다.fiif [ "$DATA" = "root" ] 2> /dev/null // root를 삭제할 수 없도록 하기위해서thenecho "게시판을 선택하십시오, root는 삭제할 수 없습니다."elsecd /tmp/ybbsBdd "$DATA" // $DATA를 삭제하도록 Bdd함수 호출한다fiBdd 함수를 호출하기 전에 if문 내에서 bdd 명령의 타입을 결정해준다. 왜냐하면 bdd는 bdd [게시판 이름] 또는 게시판 내에서 bdd 명령을 사용하여 그 게시판을 삭제하기 두가지로 쓰이기 때문에 위와같은 처리를 해주어야 한다. cut 명령에서o "$DATA 게시판이 존재하지 않습니다." // 존재하지 않으면fifi함수가 간단하여 새로운 function을 만들지 않고 main 함수 내에서 처리하였다. 4에서와 같은 이유로, DATA의 값을 지정해주지 않은 경우에는 에러처리를 해주었고, 또한 $DATA게시판이 존재하지 않는 경우에도 에러처리를 해주었다. 파란색으로 표시한 if에서는 선택한 게시판으로 이동하도록 하는 루틴인데, $DATA 디렉토리가 있으므로, cd $DATA 로 그 디렉토리로 이동 후, NOW, 즉 현재위치를 이동한 디렉토리로 바꾸어준다.6. Lt : 게시물 조회 및 검색elif [ $FN = "lt" ] 2> /dev/nullthenif [ $BOARD = "root" ] 2> /dev/null // 현재 게시판이 root 이면thenecho "게시판을 선택하십시오." // 에러처리를 해준다elseLt "$DATA"fi이제부터 본격적인 데이터 처리명령인 Lt, w, r 등을 다룬다. 이 함수들은 게시판을 선택한 후 그 게시판 내에서만 실행시켜주어야하므로, 현재 게시판이 root 인 경우에는 에러처리를 해주어야한다. 이어서 나올 함수인 w, r, dd또한 위와 같이 root에서는 실행되지 않도록 처리를 해 주었다.function Lt{// 게시판에 기본적으로 출력되는 틀을 출력한다.echo "--------------------------------------------------------------------------------"echo "번호 ID 작성일 조회수 내용"echo "--------------------------------------------------------------------------------"// 확장자가 tag 인 파일에서 tag를 추출한 후 Temp에 저장시킨다for docs in * // 모든 파일에 대해서doif [ `echo $docs|cut -d "." -f2` = "tag" ] // 확장자가 tag 이면thenBuf=`cat $docs 2 삭제echo "--------------------------------------------------------------------------------"}Lt 명령을 수행 후 게시물을 출력하는 알고리즘은 다음과 같다.확장자가 tag인 파일을 찾은 후 tag정보를 buf에 기록한다 -> buf를 Temp에 저장시킨다-> Temp를 역순차순으로 정렬한 후 List에 저장시킨다-> List중에서 조건에 맞는 결과물만 출력 형식에 맞추어서 출력한다여기서 첫번째 과정 중 tag 파일을 찾는 if [ `echo $docs|cut -d "." -f2` = "tag" ] 구문에서는 .을 구분자로 하여 두번째 필드인 확장자가 tag 이면 tag 파일이 되는 것이다. 두번째 과정인 buf를 Temp에 저장시키는 명령어인 echo $But >> Temp에서 >> 는 파일의 뒤에 이어서 $Buf를 붙이는 명령이다. 따라서 Temp에는 $Buf의 값들이 저장되게 된다. 세번째 과정인 Temp를 역순차순으로 정렬하는 방법은 Temp 에 pipe 사용하여 sort -nr 명령어를 사용하였는데, 여기서 -n 은 numerical 로 정렬하는 옵션이고, -r은 reversal하게 정렬하도록 하는 옵션이다. 마지막 과정인 결과물을 출력형식에 맞추어 출력하는 것은 printf 함수를 사용하였다. C에도 있는 같은 함수인 printf는 다양한 출력형식을 지정해줄 수 있는 강력한 함수인데, %-5s는 길이가 5인 string형 데이터를 왼쪽으로 정렬한다는 의미이다. 이와 같은 방식으로 조건을 지정해준 후 다음 줄에 echo를 호출하여 다음 줄로 개행시켰다. 마지막으로 결과물인 List를 more -15 명령어를 사용하여 화면이 넘어가는 경우 키 입력을 받도록 하였다. 여기서 -15는 15줄이 넘어가면 키 입력을 받는 옵션이다.7. W : 글을 입력한다.function W{Dnum=0 // 글 번호//글 번호를 지정하는 부분이다for Tags in *doif [ `echo $Tags|cut이다.
    공학/기술| 2003.11.13| 16페이지| 2,000원| 조회(1,781)
    미리보기
전체보기
받은후기 1
1개 리뷰 평점
  • A+최고예요
    0
  • A좋아요
    0
  • B괜찮아요
    1
  • C아쉬워요
    0
  • D별로예요
    0
전체보기
해캠 AI 챗봇과 대화하기
챗봇으로 간편하게 상담해보세요.
2026년 03월 25일 수요일
AI 챗봇
안녕하세요. 해피캠퍼스 AI 챗봇입니다. 무엇이 궁금하신가요?
8:25 오후
문서 초안을 생성해주는 EasyAI
안녕하세요 해피캠퍼스의 20년의 운영 노하우를 이용하여 당신만의 초안을 만들어주는 EasyAI 입니다.
저는 아래와 같이 작업을 도와드립니다.
- 주제만 입력하면 AI가 방대한 정보를 재가공하여, 최적의 목차와 내용을 자동으로 만들어 드립니다.
- 장문의 콘텐츠를 쉽고 빠르게 작성해 드립니다.
- 스토어에서 무료 이용권를 계정별로 1회 발급 받을 수 있습니다. 지금 바로 체험해 보세요!
이런 주제들을 입력해 보세요.
- 유아에게 적합한 문학작품의 기준과 특성
- 한국인의 가치관 중에서 정신적 가치관을 이루는 것들을 문화적 문법으로 정리하고, 현대한국사회에서 일어나는 사건과 사고를 비교하여 자신의 의견으로 기술하세요
- 작별인사 독후감