“ 바 다 바 다 ”- 기능 점수 산출 -목 차1. 시스템 정의2. 요구사항2.1 기능적 요구사항2.2 주요 구성 개체3. 프로젝트 요약3.1 개요3.2 시스템 구성도 및 FP 측정범위4. Internal Logical File (ILF)4.1 ILF 정의4.2 ILF 복잡도5. 트랜잭션 기능 식별 및 복잡도 계산5.1 ILF에 대한 처리 프로세스 정의5.2 외부 입력(EI) 트랜잭션5.3 외부 출력(EO) 트랜잭션6. 초기 FP(UFP) 산출6.1 ILF의 초기 FP 산출6.2 EI의 초기 FP 산출6.3 EO의 초기 FP 산출6.4 초기 Function Point 합계7. 최종 Function Point7.1 조정 인자 값 산출7.2 최종 FP 산출8. 결론1. 시스템 정의본 시스템의 명칭은 바다바다라 한다. 바다바다는 P2P 방식을 이용한 음악파일 공유 소프트웨어이다. P2P 방식이란 Peer-to-Peer Network 방식의 약자로서, 기존의 공급자, 소비자 네트워크 방식의 개념에서 벗어나 개개인의 일반 Client들이 Client와 Server의 역할을 동시에 수행을 하는 다중 Server의 형태를 띤 Network 방식이다. P2P방식은 크게 두 가지로 분류되는데, 그 기준은 각 클라이언트들의 중재자 역할을 하는 메인 서버의 존재유무이다. 각각의 클라이언트 정보를 관리하는 메인 서버를 가지고 있는 방식을 Centralized 방식이라 하고, 클라이언트들이 서버의 도움 없이 서로의 정보를 주고받는 방식을 Decentralized방식이라 한다. 본 시스템은 P2P방식 중 메인 서버를 운용하는 Centralized방식을 채택한다.2. 요구사항2.1 기능적 요구사항2.1.1 서버(관리자)(1) 사용자에 대한 정보를 유지관리 한다.(2) 클라이언트에 대한 접속 정보를 유지한다.(3) 클라이언트의 공유파일에 대한 정보를 유지해야 한다.2.1.2 클라이언트(클라이언트)(1) 서버에 등록 및 접속할 수 있다.(2) 찾고자 하는 음악 파일의 정보를 서버에게 전달한일을 검색2.2.2 음악파일 정보 : 등록된 모든 음악 파일에 대한 정보2.2.3 다른 클라이언트들의 정보(Other Clients' Information) : 파일 전송을 요청할 클라이언트에대한 기본정보2.2.4 관리자(서버) : 사용자의 검색 요청에 응답하고, 그 결과를 전달2.2.5 클라이언트의 파일 정보 : 각각의 클라이언트들에 대한 모든 파일 정보를 소유2.2.6 사용자 정보 : 각각의 사용자들에 대한 접속 및 상태정보3. 프로젝트 요약3.1 개요프로젝트명바다바다프로젝트 개요음악 파일 전송을 목적으로 하는 P2P시스템 구축프로젝트 타입신규 개발 프로젝트프로젝트 주무부서프로젝트 범위 및FP 측정 범위측정범위프로젝트 전체측정대상자체 개발 부분FP 분석 참여자1. 분석가 : 임상현2. 분석가 : 임경묵3. 분석가 : 이광철4. 조정자 : 홍장의참고 사항3.2 시스템 구성도 및 FP 측정범위프로젝트 명바다바다시스템 구성도인터페이스 정의사항참고 사항4. Internal Logical File (ILF)4.1 ILF 정의관련 기능명파일/개체명파일타입필드명필드타입비고사용자(Client)ClientILFC_addressDET_1C_port_numberDET_2C_idDET_3C_passwordDET_4C_download_file_dirDET_5File_InfoSubFileRETC_file_directoryDET_6C_file_namesDET_7C_file_typesDET_8OtherClient_InfoILF&RETC_clients_ipDET_9C_clients_portDET_10C_clients_FILE_INFODET_11C_clients_idDET_12관리자(Server)ServerILFS_addressDET_1S_port_numberDET_2File_InfoSubFileRETS_file_namesDET_3S_file_typesDET_4User_InfoILF&RETS_user_ipDET_5S_user_portDET_6S_user_FILE_INFODET_7S_usServerconnection_Request_To_Clientconnection_Respond_To_Clientconnection_Close_With_Serverconnection_Close_With_Clientfile_Request_To_Other_Clientsfile_Respond_To_Other_Clientssend_File_Information_To_Serverrequest_Search_File_Name_To_ServerServerconnection_Respond_From_Userupdate_All_File_Informationscan_File_Name_In_Itselfrespond_Search_File_Name_To_Clientupdate_Connection_Of_All_User5.2 외부 입력(EI) 트랜잭션5.2.1 정의ILF 파일명처리프로세스명데이터 요소 타입참고 파일Clientconnection_Request_To_Server5 DETs of Clientconnection_Request_To_Client4 DETs of Clientconnection_Respond_To_Client.connection_Close_With_Server.connection_Close_With_Client.file_Request_To_Other_Clients4 DETs of Clientfile_Respond_To_Other_Clients3 DETs of Clientsend_File_Information_To_Server3 DETs of Clientrequest_Search_File_Name_To_Server4 DETs of ServerServerconnection_Respond_From_User.update_All_File_Information7 DETs of Serverscan_File_Name_In_Itself2 DETs of Serverrespond_Search_File_Name_To_Client7 DETs of Serverupdate_Connection_Of_e_With_Server00하connection_Close_With_Client00하file_Request_To_Other_Clients41하file_Respond_To_Other_Clients30하send_File_Information_To_Server30하request_Search_File_Name_To_Server40하connection_Respond_From_User00하update_All_File_Information71하scan_File_Name_In_Itself20하respond_Search_File_Name_To_Client71하update_Connection_Of_All_User71하5.3 외부 출력(EO) 트랜잭션5.3.1 정의파일명처리프로세스명데이터 요소 타입참고 파일Clientprint_Request_Result4 DETs of clientprint_Download_Status4 DETs of clientprint_Upload_Status4 DETs of client5.3.2 외부 출력 복잡도구분처리프로세스 명#DET#RET/#FTR복잡도EIconnection_Request_To_Server41하connection_Request_To_Client41하connection_Respond_To_Client41하6. 초기 FP(UFP) 산출6.1 ILF의 초기 FP 산출구분파일/개체명#DET#RET복잡도기능수준가중치ILFClient122하7Server92하7초기 Function Point 소계 : 146.2 EI의 초기 FP 산출구분처리 프로세스명#DET#RET복잡도기능수준가중치EIconnection_Request_To_Server50하3connection_Request_To_Client41하3connection_Respond_To_Client00하3connection_Close_With_Server00하3connection_Close_With_Client00하3file_Request_To_Other_Clients41하3file_Respond_T20하3respond_Search_File_Name_To_Client71하3update_Connection_Of_All_User71하3초기 Function Point 소계 : 426.3 EO의 초기 FP 산출구분처리 프로세스명#DET#RET복잡도기능수준가중치EOconnection_Request_To_Server41하4connection_Request_To_Client41하4connection_Respond_To_Client41하4초기 Function Point 소계 : 126.4 초기 Function Point 합계ILF + EI + EO = UFP (Unadjusted Function Point)14 + 42 + 12 = 68 (초기 FP)7. 조정인자 결정7.1 조정 인가 값 산출번호시스템 특성평가 배점비 고1데이터 통신52분산 데이터 처리53성능34비중 높게 사용되는 자원15트랜잭션 처리율06온라인 데이터 입력07단물 사용자 효과48온라인 갱신39복잡한 처리210재사용성111설치의 용이성112운영의 용이성013다중 사이트014변경의 지원성0TDI25※ VAF = (TDI × 0.01) + 0.65 = (25 × 0.01) + 0.65 = 0.97.2 최종 FP 산출UAFVAFAFP680.961.28. 결론기능 점수는 소프트웨어의 규모를 효율적으로 산출해 내는 방법이라 한다. 이 방법을 이용하여 여러 종류의 소프트웨어 규모를 측정할 수 있는데, "DB-oriented Software"를 측정하기 가장 적당하다고 알려져 있다.하지만 우리가 만들고자 하는 소프트웨어인 P2P 음악 공유 프로그램에 이 방법을 적용하기에는 여러 가지 어려움이 있었다. 특히 ILF를 산출해내는 과정에서 각각의 필드와 그에 맞는 프로세스를 추출하기가 생각보다 쉽지 않았다. 그래서 프로그램의 흐름을 나타내는 가상의 시나리오를 만들어 해당하는 요소들을 뽑아 내었고, 최종의 기능점수를 얻을 수 있었다.이렇게 산출해 낸 기능점수가 초기에 생각한 점수보다 낮게 나와, 소프트웨어 규모가 작은 감6
제출일 : 2002년 9월 11일Object Oriented Programming꿈의 공학, 객체지향 시스템객체지향 언어의세계소프트웨어 위기돌파구, 객체지향학과 : 전기·전자·컴퓨터학부전공 : 컴퓨터전공학년 : 2학년학번 : 1998021045성명 : 임상현꿈의 공학, 객체 지향 시스템 - 1꿈의 공학, 객체 지향 시스템 - 1꿈의 공학, 객체 지향 시스템From "PC Advance 1992년 4월호"객체지향 프로그래밍70년대의 구조적 프로그래밍은 하드웨어의 발달에 균형을 맞춰주지 못하면서 생산성의 감소를 가져온다. 이에 따라 새로운 패러다임을 요구하게 되었고 여기에서 객체지향의 개념이 도입되기 시작했다. 모든 시작이 그러하듯 아직 통일된 개념으로는 자리잡지 못하였으나 점차 통일되면서 모든 분야에서 중심연구 과제가 되고 있다. 따라서 객체지향의 개념을 정립하고 여러 특징들에 대해 요약하겠다.기존의 프로그래밍에서는 데이터 구조와 프로시져가 각각 별개의 것으로 정의된다. 따라서 하나의 데이터 구조가 변경된다면 관련된 모든 프로시져를 바꿔야하는 비효율성이 생기게 된다. 이 같은 문제를 해결하기 위해 데이터 구조와 프로시져를 함께 생각하는 객체라는 사용하게 되었다. 이때 객체내의 데이터 변수를 에트리뷰트, 프로시져를 메소드라 부른다.선언된 객체들이 메소드를 실행하기 위해서 메시지를 받게 된다. 메시지는 어떠한 메소드를 실행할 것인가를 결정하는 셀렉터와 인자들로 구성된다. 예를 든다면 '5+6'에서 '5'라는 객체에 '+6' 이라는 메시지를 전달하는 것이다. 여기서 '+'는 덧셈 셀렉터이고 '6'은 인자가 되겠다. 이와 같은 방법으로 동작을 가능토록 하는 내부적인 면(메소드)과 객체에 대한 동작을 일으키는 외부적인 면(메시지)을 철저히 분리하여, 객체 상호 종속성을 줄이게 되었다.그러나 주지하다시피 기본 개념이 모든 객체지향 언어에서 통일되고 있는 것은 아니다. 메시지 전달면에서 일반적인 객체 지향 언어는 해당 메시지를 전달받은 객체에서 메시지의 내의 셀렉터를 키(K 알 필요가 없어져 새로운 클래스의 생성을 쉽게 할 수 있다. 「SIMULA」에서는 는 상위 클래스의 메소드 정의 내에 하위 클래스의 수행위치를 지정하는 방법인 Inner로써 세분화하고, 「Flavors」에서는 데몬(daemon)과 WRAPPER라는 개념을 통해서 메소드를 세분화한다.결국 이와 같은 특징을 이용한 객체지향 프로그래밍은 내부와 외부를 분리함으로써 소프트웨어 진화를 쉽게 하며, 또한 클래스 상속을 통해서 소프트웨어의 재사용성을 높일 수 있는 것이다.객체지향 시스템 및 응용「SIMULA-67」라는 시뮬레이션 언어를 개발하면서 처음 객체라는 개념을 사용하기 시작했다. 이 「SIMULA-67」 은 전체 프로그램을 여러 객체들의 집합이라 정의하고 있다. 또한 객체들의 공통적인 구조를 구성할 수 있는 클래스 개념을 도입하여 사용하고 있다. 이후 「SIMULA-67」 은 여러 응용분야에서 사용할 수 있는 언어로 발전하였는데 「SmallTalk-72」, 「SmallTalk-80」이 그것이다. 이 두 언어는 OOP의 개념을 통일성이 있게 사용함으로써 OOP 개념의 기본으로 확립하였다. 이러한 시스템에서 객체란 한 구성원의 특성과 상태변화를 나타내는 기본 단위라고 정의하고 있다.이러한 객체들을 근본적인 세 가지 의미로 본다면 캡슐화, 추상화, 클래스형이라 할 수 있다. 그리고 상속은 정보를 특수화와 일반화의 두 원칙에 따라 표현하고 조직화하는 방법이다. 그러나 객체, 클래스 및 상속의 개념이 상호 종속적이기 때문에 이 세 개념을 한 언어에 동시에 구현할 때 문제점이 발생할 수 있다는 주장이 있다. 즉, 셋 중 하나의 개념을 발전시킬 때 그 개념과 종속관계를 갖는 다른 개념이 영향을 받게 되어 개념의 변형이나 상태 변화에 대한 제약을 갖게 된다. 이 문제를 해결하기 위해서는 클래스를 대신하는 원형(Prototype)과, 상속을 대치한 위임(Delegation)이라는 개념이 필요하다고 말한다. 이처럼 OOP에서 캡슐화와 자료 추상화 개념에 대해서는 큰 이견이 없으나,적화에 어렵고, 비용이 많이 든다.지금까지 살펴본 데이터베이스 분야에 이어서 소프트웨어 공학을 살펴보도록 하겠다. 소프트웨어 공학에서는 1960년대 소프트웨어의 복잡성 문제로 수요가 공급을 따라가지 못하는 등 소프트웨어 위기를 맞게 된다. 이러한 상황을 극복하기 위해 소프트웨어에 공학적인 생산원칙을 도입하여 규격화, 생산성, 정확도를 높이려는 접근이 시작되었는데 이것은 본격적인 소프트웨어 공학의 태동이라 하겠다.이를 실현하기 위해 연구되었던 구조적 기법은 소프트웨어의 재사용성, 모듈화, 유지보수에 효율적이지 못한 단점이 있었다. 이 한계를 넘기 위한 방법이 바로 객체 지향적 방법론이다.이러한 방법론에 설계와 코딩간의 강한 연관관계, 재사용성, 모듈화, 캡슐화에 대한 강조가 합쳐져서 객체지향 시스템의 구조를 이루고 있다. 이것들 중 객체 지향의 설계를 보면 첫째, 객체와 클래스를 인식하고 정의한다(클래스 정의 집합). 둘째, 클래스들간의 관계를 구성한다. 셋째, 틀을 클래스들의 계층구조로 형성한다. 넷째, 재사용 가능한 클래스 라이브러리와 응용 틀을 제작한다.이와 같은 방법으로 설계된 객체 지향 설계는 여러 가지 장점을 가지는데 첫째, 객체지향 프로그래밍 언어의 장점을 최대한 발휘할 수 있게 한다. 둘째, 적은 양의 코드, 그리고 좀 더 재사용성이 뛰어난 코드를 생산한다. 셋째, 변화에 탄력적인 시스템을 생성한다. 넷째, 모듈화를 통해 시스템 개발 팀에게 좋은 이익을 제공한다. 마지막으로 시스템 분석자나 설계자뿐만이 아니라 최종 사용자에게도 좀 더 직관적으로 이해될 수 있다.컴퓨터의 사용의 확대로 컴퓨터 전문지식이 없는 사람에게 부담 없는 인터페이스와 전문가들에게는 생산성 향상을 가져오는 인터페이스가 필요하게 되었다.꿈의 공학, 객체 지향 시스템 - 4결국 이와 같은 현상은 여러 대학에서 연구의 시발로 1984년애플사의 매킨토시라는 저가격의 편리한 각종 사용자 인터페이스를 갖춘 컴퓨터의 출현으로 본격화되었다. 이후 마우스, 아이콘 등 사용자에게 친숙한 인터페이스 기본 자료에 대해서는 +, -, *, / 의 연산자를 사용할 수 있지만, 객체간에는 직접 지원하지 않는다. 하지만 개념적으로 객체간에 이런 연산을 정의할 수 있어야만 진정한 의미의 데이터 추상화를 지원하는 것이 된다. 따라서 C++에서는 기본적인 수형 들에 저장된 내장 연산자의 의미를 변경하여 자신이 정의하는 클래스의 객체들이 이용할 수 있게 하는 연산자 중복(Operator Overloading)을 지원한다. 이와 같이 연산자가 중복된 후에도 이들 사이의 우선 순위 관계는 원래 연산자들간의 우선 순위와 관계와 일치한다.특히 기본 수형에서 지원하는 연산간의 자동적인 수형 변환(Type Conversion), 출력 방법("cout < a") 등이 객체간에서도 활용되도록 클래스를 정의하는 사람이 명시해주어야 한다.마지막으로 객체 지향 프로그래밍을 가능하게 하는 상속(Inheritance)을 어떻게 C++에서 파생클래스를 이용하여 지원하는 지와 동적 바인딩 지원을 위한 가상함수, 다중상속은 다음과 같다.객체지향 언어의 세계 - 2이미 정의된 클래스에게 상태와 행위를 물려받아 새로운 속성을 추가·변경해서 새로운 클래스를 생성하거나 여러 클래스의 공통적인 속성을 모아서 하나의 상위클래스를 정의함으로써 중복 정의를 피할 수 있게 해주는 것을 상속이라 한다. 여기서 물려준(상속해준) 클래스를 베이스 클래스라 하고, 물려받은 클래스는 파생클래스라 하는데 파생클래스는 베이스 클래스의 모든 'Member'와 'Member함수'를 private, public 및 protected 영역으로 상속하게 된다. 또한 상속된 클래스를 다른 클래스의 베이스 클래스로 이용할 수도 있다. 따라서 클래스들의 계층구조(Tree)를 이루게 된다.또한 위와 같은 단일 상속만을 지원하는 경우 코드의 중복이나, 클래스 변경시 유연하지 못하기 때문에 다중 상속을 지원하며, 컴파일시에 정확한 타입이 알려지지 않은 객체의 'Member'함수를 실행시 동적으로 선택해 주는 기능인 가상함수도 지원한다.2. Sm를 가지고 클래스 인스턴스들을 관리한다. 특히 SmallTalk-80 시스템에서는 모든 클래스들이 자기 고유의 메타클래스의 인스턴스이다. 따라서 일대일 대응 관계를 가지고 있기 때문에 둘을 함께 기술할 수 있고, 이 들간 계층구조가 존재한다.SmallTalk-80 시스템이 제공하는 많은 클래스는 계층구조를 이루며 각 클래스들은 각각의 프로토콜을 가진다. 객체 검사 프로토콜, 객체 비교 프로토콜, 객체 복사 프로토콜, 객체의 일부분 접근 프로토콜, 오류처리 프로토콜 등이 클래스간의 프로토콜이라 하겠다.지금까지 살펴본 SmallTalk-80은 단순히 하나의 언어가 아닌 복잡한 프로그래밍 환경이다. 즉 코딩, 디버깅을 위한 GUI를 제공한다. 특히 윈도우와 비슷한 View 사용하여 마우스를 이용한 텍스트 및 메뉴선택이 가능하도록 되어있다. 또 기존의 클래스는 Browser를 통해 찾아 수정이 가능하고 새로운 클래스는 클래스 카테고리를 선택하고 편집함으로써 시스템에 더해질 수 있다.3. CLOS기존의 객체 지향 접근들 중 유용한 점만 채택하여 응용 프로그래밍 개발에 적합한 인터페이스와 확장성 있는 프로토콜을 가진 CLOS가 생겨났다. 또한 제한적인 쓰이던(AI 연구) 분야에서 탈피하여 범용 언어 기반을 다졌다. 이러한 CLOS는 클래스(사용자 정의), Generic 함수, 클래스 상속, 객체 생성 등의 여러 가지 객체 지향적 특성을 포함하고 있다.클래스는 자료구조와 그에 따른 작용으로 볼 수 있는데 사용자가 직접 정의할 수도 있고, 존재하는 클래스로부터 새로운 클래스를 생성할 수도 있다. 존재하는 클래스로부터 상속한 경우 자료구조와 작용을 그대로 상속한다.Generic 함수는 사용자가 프로그램 내부의 상세한 내용을 모르고도 객체에 대한 작용을 수행할 수 있도록 해주는 기법이다. 이 Generic 함수의 작용은 전통적인 Message Passing 개념에서 탈피하여 일반적인 함수 호출형식과 같다. 프로그래머는 일반함수와 Generic 함수를 구분하도록 프로그램의 인터페다.
문제임의의 NFA를 테이블로 입력하여 DFA로 변환하여 출력하는 프로그램 작성하는 것으로 입력 State 개수에는 제한이 없어야 하며 입력 알파벳은 두 개 이상으로 한다.이를 구현하기 위해서 Reachable Set을 이용해야 하는데 Reachable Set을 프로그램으로 구현하는 것이 이번 과제라 할 수 있다.개략 알고리즘NFA는 Char *를 사용하여 Current State 1개와 Next State 2개 가지도록 cNode class 생성부분집합 형태로 나오는 DFA는 1 각 집합을 연속적으로 Concatenation 한 후, Sort와 Reduction을 함 2 임시 저장 공간인 cTable 클래스를 참조하여 중복되는지 여부를 판단. 3 중복되면 사용하지 않고 중복되지 않는다면 cTable내에 Queue 에 저장 (Queue 안의 내용이 없어질 때까지 반복)위 내용을 예로 들어 설명하면Q01OutputA{A, B}{B, C}0B{C}{A}0C{A}{B, C}1¹Initial State A를 생성하여 Queue와 임시공간인 char *Table에 저장한다.²Queue에서 A를 꺼내 edge 0, 1일 때를 조사하여 Queue에 추가한다. (Queue에서 하나삭제)frontfrontrear↓↓↓¹0²1²2int *data (Queue)012¹A²AB²BCchar *table[10]; (부분집합 형태로 저장)³Queue에서 값 하나를 꺼내 NFA를 참조하여 edge가 0,1 때를 조사하고 그 결과를 Concatenation , Sorting, Reduction 하고 char *table과 중복하지를 검사하여 이상이 없으면 저장한다.frontrear↓↓¹0²1²2³3³4int *data (Queue)01234¹A²AB²BC³ABC³ACchar *table[10]; (부분집합 형태로 저장)⁴Queue 내용이 없어질 때까지 위처럼 반복하면 원하는 모든 부분 집합이 얻어진다.#include #include #include #include const int FALSE=0;const int TRUE=1;const int MaxSize=15;class cNode {int output;char CuState;char *NxState0;char *NxState1;public:cNode();~cNode();int setOutput(int num);int setCuState(char cu);void setNxState(char *nx1, char *nx2);int getOutput() { return output; }char getCuState() { return CuState; }char* getNxState0() { return NxState0; }char* getNxState1() { return NxState1; }};cNode::cNode() {NxState0=new char[10];NxState1=new char[10];if (!NxState0 || !NxState1)cout < "Memory allocation error" < endl;}cNode::~cNode() {delete NxState0;delete NxState1;}int cNode::setOutput(int num) {if(num==0 || num==1) {output=num;return TRUE;}cout < "Invaild number ... Input 0 or 1" < endl;return FALSE;}int cNode::setCuState(char alpha) {if (!isalpha(alpha)) {cout < "Invaild current state ... Input Aphabet " < endl;return FALSE;}CuState=toupper(alpha);return TRUE;}void cNode::setNxState(char *nx0, char *nx1) {strcpy(NxState0,nx0);strcpy(NxState1,nx1);}class cTable {int state;int front, rear;int *data;char *table[10];public:cTable();~cTable();int add(char *str);int del();char *getStr(int state) { return table[state]; }};cTable::cTable() {front=0, rear=0;state=0;data=new int[MaxSize];}cTable::~cTable() {delete data;}int cTable::add(char *str) {for (int comp=0 ; comp
제 1 조{Question: {Infix→ {Prefix조장 : 임상현 - 1998021045조장 : 김수환 - 1998021020조장 : 임희수 - 1998021015조장 : 오연주 - 2000035179조장 : 나정엽 - *************2년 11월 13일 수요일. Question{{1프로그램에서 산술식을 입력받아 정확한 코드를 만들어 낼 때 사용되는 표기방법에는 후위 표기법(Postfix notation), 중위 표기법(Infix notation), 전위 표기법(Prefix notation)이 있다. 각각은 연산자와 피연산자의 위치에 따라 결정되는데, 후위 표기법은 로 표기하고 중위 표기법은 로 표기하며 전위 표기법은 로 표기한다. 그리고 이들 사이에는 전환하다. 이러한 표기법 전환 가운데 Infix → Prefix 전환하는 프로그램을 설계 및 작성하라.. Algorithm. 연산시 입력받은 산술식은 Expression class의 내부변수 char *vExpr 에 저장하였다.. 변환 과정에서 발견되는 연산자(+,-,/,×)는 "stack.h" 에 Stack 형태로 저장하였다.. 기타 연산자 우선순위를 반환하는 int Priority(char alpha); 함수를 정의하여 사용하였다.※ Infix→Prefix AlgorithmInput String is : A*(B+C)/D-G{Input StringA*(B+C)/D-GPointer⑫⑪⑩87654321{PrefixStack1은 피연산자→ Prefix 삽입G#2는 연산자→ Stack 삽입G-#3은 피연산자→ Prefix 삽입DG-#4는 연산자→ Stack 삽입DG/-#※ 이때 이미 Stack 에 연산자가 있으므로 그 연산자 즉 -와 우선순위를비교하여 Stack 이 높으면 면 Pop() 하고 , 그렇지 않을 경우는 그냥Stack 에 삽입한다.5는 피연산자→ Stack 삽입DG)/-#※ 여기서 ) 는 무조건 Stack 넣는다.6는 괄호이므로→ Stack 삽입DG)/-#7은 피연산자→ Prefix 삽입CDG)/-#8은 연산자→ Stack 삽입CDG+)/-#9은 피연산자→ Prefix 삽입BCDG+)/-#⑩는 (→ Stack POPBCDG+)/-#9는 (→ Stack POP+BCDG/-#⑪은 연산자→ Stack 삽입+BCDG*/-#※ 이때 Stack 의 Top에도 연산자가 있으면 우선순위를 비교하여 Stack이높으면 Pop()하고 그렇지 않을 경우는 그냥 Stack 에 삽입한다.⑫은 피연산자→ Prefix 삽입A+BCDG*/-#Stack 나머지 Pop-/*A+BCDG#. Program Source{{2#include #include #include #include "stack.h" // 4Page에 추가함class Expression {int vExprLen;char *vExpr; // 입력 산술식을 저장하도록 문자열 변수 선언public:Expression();Expression(char *exp);~Expression() { delete[] vExpr; }char pGetExpr(); // 입력식의 끝부터 하나씩 읽어오는 Member Functionchar* pShwExpr() { return vExpr; } // vExpr 에 입력된 내용을 한꺼번에 반납하는 Member Function};Expression::Expression(char *exp) { // 입력식을 Class생성시 초기화하도록 인수로 사용함vExprLen=strlen(exp);vExpr=new char[vExprLen+1];if (!vExpr)cout < "Memory allocation error. (in Expression class)" < endl;strcpy(vExpr, exp); // 인수로 넘어온 입력식을 vExpr(내부변수)에 저장}char Expression::pGetExpr() {vExprLen--;if (vExprLen==-1)return NULL;return vExpr[vExprLen]; // 현재 산술식의 가장 끝에 위치한 문자를 반환함 (Prefix 는 입력식을 역으로 판독)}int Priority(char alpha); // 연산자 우선순위를 반환함int isOperator(char token); // 현재 입력식 포인터가 가르치는 값이 연산자인지를 확인함void Prefix(Expression &expr); // Prefix 로 변환하는 함수선언void main() {char *str;cout < "Enter the infix expression : ";cin >> str;Expression expr(str); // 입력받은 값을 Expression Class 저장함Prefix(expr); // 전위연산을 위한 함수 호출}int Priority(char alpha) {// 연산자 우선순위를 반환함int result=0;switch(alpha) {case '+': {{3result=1; break;case '-':result=1; break;case '*':result=2; break;case '/':result=2; break;}return result;}int isOperator(char token) { // 산술식 연산자인가를 확인하는 함수return (token=='+' || token=='-' || token=='*' || token=='/');}void Prefix(Expression &expr) { // 실제적인 Prefix 구현 부분Stack
Question[ 1 / 8 ]Context-free Grammar 중에는A -> ax와 같은 형태로 나타낼 수 있는 Simple grammar 가 있다. 이러한 Simple grammar를 입력한 후 String을 입력하였을 때 Parsing 결과를 보여주는 프로그램 작성한다.AlgorithmSimple-Grammar는 Sgrammar class의 멤버 char *vGrammar[MaxSize]에 저장.입력 String 은 InputString class의 멤버 char *mvInStr에 저장. (InputString class를 Queue로 이용하기 위해 처음 나타내는 vFstPos(priVate First Postion) 와 마지막을 나타내는 vLstPos를 선언.Derivation 과정에서 입력 String 과 문법을 비교할 때 나오는 임시 String들은 CompareStk class 의 char *bufStr에 저장.(Stack)이렇게 Sgrammar·InputStirng·CompareStk Class 의 세가지 클래스를 사용하였으며, 자료구조는 Stack, Queue를 사용.Stack, Queue 는 다음과 같이 구현 (Stack의 top과 Queue 의 front 에 끝을 나타내는 '#' 삽입)CompareStkInputStringif (Stk=='#'&&Input=='#')(Parsing 성공)#x_nx_3x_2x_1y_1y_2y_3y_n#↑↑else if (Stk==Input)(같으면 버리고)1#x_nx_3x_2x_1y_1y_2y_3y_n#↑↑2#x_nx_3x_2x_1y_1y_2y_3y_n#↑↑else (Stk!=Input)(다르면 Grammar 찾고)#x_nx_3x_2x_1y_1y_2y_3y_n#↑↑이 상태도를 다음과 같은 Grammar 와 String 가지고 적용해 보면Simple GrammarInput StringG:S->aABA->bBA->cB->aAB->cabcacStackQueuemain()#Sabcac#(S, a)S a (문법에서 검색)S aAB에서 aAB를 Stack 추가#BAaabcac#(a, a)a=a (삭제)#BAbcac#(A, b)A b (문법에서 검색)A bB에서 bB를 Stack에 추가#BBbbcac#(b, b)b=b (삭제)#BBcac#(B, c)B c (문법에서 검색)B c에서 c를 Stack에 추가#Bccac#(c, c)c=c (삭제)#Bac#(B, a)B a (문법에서 검색)B aA에서 aA를 Stack에 추가#Aaac#(a, a)a=a (삭제)#Ac#(A, c)A c (문법에서 검색)A c에서 c를 Stack에 추가#cc#(c, c)c=c (삭제)##(#, #)#=# (Parsing Success)Program Source[ 2 / 8 ]#include // 기본 입출력 해더파일, 'cout '을 사용한다.#include // 문자열을 입력할 때 gets() 함수를 사용한다.#include // 입력한 값이 대문자, 소문자인지 구분하기 위해 isupper(), islower() 함수 사용한다.#include // 문자열의 길이 strlen(), 문자열 복사 strcpy(), 문자열 비교 strcmp() 함수를 사용한다.const int failure=0; // 함수가 반환될 때 반환값으로 사용한다.const int success=1; // 함수가 반환될 때 반환값을 사용한다.const int MaxSize=10; // 배열 크기를 지정한다.class Sgrammar {int mvGraPos; // Grammar를 저장할 때 2차원 배열에서 몇 개의 Grammar 가 저장되었는지 카운트한다.char *vGrammar[MaxSize]; // Grammar를 2차원 배열로 저장한다.public:Sgrammar() { mvGraPos=0; } // 생성할 때 카운트를 0으로 초기화 한다.int setGra(char *string, int size); // Grammar를 저장한다.char *srcGra(char Rside, char Lside); // Parsing 과정에서 비교하는 두 값을 인자로 해서 해당하는 Grammar가 있는 확인한다.void shwGra(); // 현재 Grammar 의 입력된 내용을 출력한다.};int Sgrammar::setGra(char *str, int size) {if (!str) { // 입력한 내용이 없을 경우 오류를 출력한다.cout < " - Error : No string. Try againn";return failure;}if (!isupper(str[0])) { // 왼쪽편 첫 번째가 대문자가 아니면 오류를 훌력한다.cout < " - Error : First letter need a capital lettern";return failure;}if (str[1]!='-'|| str[2]!='>') { // 첫 번째 문자 다음에 화살표 모양이 오지 않으면 오류를 출력한다.cout < " - Error : Input Form is always 'S->aBC'n";return failure;}if (isupper(str[3])) { // 오른쪽 편 첫 번째 문자가 소문자가 아니면 오류를 출력한다.cout < " - Error : First symbol in right side should have a small lettern";return failure;}for (int chk=4 ; chk