#include <stdio.h>
struct point {
int xpos;
int ypos;
};
int main(void) {
struct point p1 = {5, 6};
struct point *p = &p1;
printf("%d %d\n", (*p).xpos, (*p).ypos);
printf("%d %d\n", p->xpos, p->ypos);
return 0;
}
1-4 구조체 내부 포인터
문제설명
구조체 멤버로 포인터를 사용하는 구조를 이해하는 문제이다.
목표
구조체 안에 포인터 포함
포인터를 통한 접근
요구사항
struct point {
int xpos;
int ypos;
};
struct circle {
double radius;
struct point *center;
};
point 변수 (3,4) 생성
circle 변수 생성
중심 좌표 출력
출력예시
3 4
예상 답안
#include <stdio.h>
struct point {
int xpos;
int ypos;
};
struct circle {
double radius;
struct point *center;
};
int main(void) {
struct point p = {3,4};
struct circle c = {5.0, &p};
printf("%d %d\n", c.center->xpos, c.center->ypos);
return 0;
}
1-5 구조체 주소 개념
문제설명
구조체의 메모리 구조를 이해하는 문제이다.
목표
구조체 주소 이해
첫 번째 멤버 주소 관계 이해
요구사항
다음 코드를 작성하고 실행 결과를 관찰하시오.
struct point p = {10, 20};
printf("%p\n", &p);
printf("%p\n", &p.xpos);
OO 카페 키오스크 시스템은 고객이 카페 메뉴를 주문할 수 있도록 지원하는 시스템이다. 시스템은 카페에서 판매하는 메뉴 정보를 저장하고, 이를 바탕으로 메뉴 조회, 메뉴 선택, 주문 및 결제 기능을 제공한다. 카페 메뉴는 메뉴번호(menu_id), 메뉴명(name), 가격(price), 판매상태(status)를 관리한다. 판매상태는 판매중 또는 품절로 구분한다.
사용자는 키오스크 화면에서 메뉴 목록을 볼 수 있어야 하며, 메뉴명, 가격, 판매상태가 함께 표시되어야 한다. 품절인 메뉴는 선택할 수 없다. 사용자는 원하는 메뉴를 선택하고 수량을 입력하여 주문할 수 있어야 한다. 한 번의 주문에는 여러 개의 메뉴를 추가할 수 있다.주문이 완료되면 시스템은 주문번호(order_id), 주문한 메뉴 목록, 각 메뉴의 수량, 총 주문 금액을 저장해야 한다. 결제는 신용카드 또는 카카오페이 방식으로 진행할 수 있다. 시스템은 결제방식과 결제금액을 저장해야 한다. 결제가 완료되면 시스템은 주문번호, 주문한 메뉴명, 수량, 총 결제금액, 결제방식을 화면에 출력해야 한다.
콘솔 키오스크를 구현하기 위해 온라인 서점 도서구매 서비스로 요구사항 분석 및 설계과정을 먼저 이해합니다. 본 수업은 분석설계가 아닌 C 언어를 이해하고 프로그래밍을 목적으로 하므로, 분석, 설계 내용은 과정에 맞춰 단순화 하였습니다.
1 요구사항
OO 온라인 서점 시스템은 고객이 도서를 검색하고 주문할 수 있도록 지원하는 시스템이다. 시스템은 서점에서 판매하는 도서 정보를 저장하고, 이를 바탕으로 도서 조회, 도서 선택, 주문 및 결제 기능을 제공한다. 도서는 도서번호(book_id), 도서명(title), 가격(price), 재고상태(status)를 관리한다. 재고상태는 판매중 또는 품절로 구분한다. 사용자는 온라인 서점 화면에서 도서 목록을 볼 수 있어야 하며, 도서명, 가격, 재고상태가 함께 표시되어야 한다. 품절인 도서는 화면에 표시되더라도 선택할 수 없다. 사용자는 원하는 도서를 선택하고 수량을 입력하여 주문할 수 있어야 한다. 한 번의 주문에는 여러 권의 도서를 추가할 수 있다. 주문이 완료되면 시스템은 주문번호(order_id), 주문한 도서 목록, 각 도서의 수량, 총 주문 금액을 저장해야 한다. 결제는 신용카드 또는 계좌이체 방식으로 진행할 수 있다. 시스템은 결제방식과 결제금액을 저장해야 한다. 결제가 완료되면 시스템은 주문번호, 주문한 도서명, 수량, 총 결제금액, 결제방식을 화면에 출력해야 한다.
2. 기능 분석
목표 시스템에서 제공해야 할 기능을 정의하고, 기능이 사용할 데이타를 구체화 한다.
2.1. 기능 리스트
1. 도서관리
도서 등록 도서 정보 변경
도서 정보 조회(재고상태 확인 포함)
2. 주문관리
주문하기
주문 항목 추가
도서 선택
수량 입력
주문생성
총 금액 계산
결제하기
결제종류 선택하기
결제진행
결제 정보 저장
주문 결과 출력
2.2. 데이타 리스트
1. 도서정보
도서번호
도서명
가격
재고상태 (판매중, 품절)
2. 주문정보
주문번호
주문 항목 목록
총 주문 금액
주문상태
2-1. 주문정보 - 주문항목
도서번호
도서명
수량
항목 금액
4. 결제정보
결제방식(신용카드, 계좌이체)
결제금액
결제상태
3. 간략 설계
3.1 화면 메뉴 설계
=========================================
온라인 도서 시스템 메뉴
========================================
도서관리 주문관리
11. 도서등록 21. 주문하기
12. 도서정보 변경 22. 주문조회
13. 도서정보 조회
=========================================
3.2 모듈(파일) 설계
main.c - main() 함수를 가지고, 프로그램 시작시 book_store_ui.c의 run()을 실행한다.
book_store_ui.c 서점 시스템의 과 메인 메뉴를 display한다.
book_item.c - 판매하는 도서정보를 등록, 수정, 폐기, 조회할 수 있다.
order.c - book_item에서 등록된 도서정보를 선택하고, 선택을 마치면 결제하여 주문 처리한다. - 주문완료된 정보는 주문조회 할 수 있다.
요구사항을 보고 서로 관련된 데이타와 기능을 encapsulation하여 Entity 클래스를 도출하고, 클래스간의 연관관계를 정의하여 클래스 설계를 완성한다.
요구사항
OO 대학교 도서관 시스템은 학생들이 도서관 자원을 효과적으로 이용할 수 있도록, 시스템을 이용하는 사용자 정보와 도서관에서 소장하는 도서 정보를 관리하고 이를 기반으로 도서 검색, 대출, 반납, 연체 관리 기능을 제공한다.
도서관에서 소장하는 도서는 공통적으로 시스템에서 사용하는 도서의 고유 식별자, 제목, 저자, ISBN, 출판사, 출판연도, 장르 정보를 관리해야 한다. 도서는 형태에 따라 종이책(PaperBook) 과 전자책(EBook) 으로 구분된다. 종이책은 추가적으로 서가 위치(shelf location) 와 대출 가능한 복본 수(available copies) 를 관리해야 하며, 전자책은 파일 형식(file format), 파일 크기(file size), 동시 이용 가능 사용자 수(max simultaneous users) 를 관리해야 한다. 새로운 도서는 시스템에 등록하고, 등록된 도서는 수정, 삭제를 지원한다. 또한 등록된 도서는 키워드, 제목, 저자, 장르를 조건으로 검색할 수 있으며, 검색 결과에서는 제목, 저자, 출판사, 출판연도, 장르와 함께 도서 유형 정보를 보여준다.
도서관 시스템을 사용하는 학생은 학번, 이름, 이메일, 전화번호, 비밀번호, 전공, 선호 장르를 저장한다. 학생 정보는 신규 입력, 수정, 삭제(탈퇴)가 가능하며, 비밀번호 재설정은 현재 비밀번호를 확인한 후 수정할 수 있다.
도서를 대출하기 위해 사서는 사용자로부터 사용자 ID와 대출하려는 도서 정보를 전달받아 시스템에 사용자 ID와 도서 ID를 입력한다. 시스템은 누가(사용자 ID), 어떤 도서를(도서 ID), 언제 대출했는지를 저장한다. 대출 기한은 기본 2주(14일)이며, 한 사용자는 최대 5권까지 대출할 수 있다. 연체 중인 사용자는 새로운 도서를 대출할 수 없으며, 연체 도서를 반납한 이후에만 다시 대출할 수 있다. 종이책은 복사본 수가 남아 있을 때만 대출할 수 있고, 전자책은 동시 이용 가능 사용자 수를 초과하지 않는 범위에서 대출할 수 있다.
도서관 시스템은 매일 아침 연체 중인 사용자들에게 연체 상태 메일을 보낸다. 사용자가 대출한 도서를 사서에게 반납하면, 사서는 도서 정보를 확인하여 해당 사용자의 대출 상태를 반납 완료로 변경한다.
클래스 다이어그램
classDiagram
class Student {
-userId : String
-name : String
-email : String
-phone : String
-password : String
-major : String
-preferredGenre : String
+register()
+modify()
+delete()
+resetPassword(currentPw, newPw)
+hasOverdueLoans() bool
+canBorrow() bool
}
class Book {
#bookId : String
#title : String
#author : String
#isbn : String
#publisher : String
#publishedYear : int
#genre : String
+register()
+modify()
+delete()
+search()
}
class PaperBook {
-shelfLocation : String
-availableCopies : int
+isAvailable() bool
}
class EBook {
-fileFormat : String
-fileSizeMB : float
-maxSimultaneousUsers : int
+isAvailable() bool
}
class BookLoan {
-loanId : String
-loanDate : Date
-dueDate : Date
-returnDate : Date
-status : String
+borrow()
+returnBook()
+isOverdue() bool
+markReturned()
}
Book <|-- PaperBook
Book <|-- EBook
Student "1" <-- "0..5" BookLoan
Book "1" <-- "0..*" BookLoan
실습 1. 키오스크 도메인에서 엔티티 클래스 다이어그램 완성하기
요구사항
OO 카페 키오스크 시스템은 고객이 카페 메뉴를 빠르고 편리하게 주문할 수 있도록 지원하는 시스템이다. 이 시스템은 카페에서 판매하는 메뉴 정보를 기본 데이터로 관리하며, 이를 기반으로 메뉴 조회 및 검색, 메뉴 선택, 주문 생성, 결제 및 주문 내역 저장 기능을 제공한다.
카페에서 판매하는 메뉴는 공통적으로 시스템에서 사용하는 메뉴의 고유 식별자(Menu ID), 메뉴명, 가격, 메뉴 설명, 판매 상태(판매중, 품절) 정보를 관리해야 한다. 메뉴는 종류에 따라 커피류(CoffeeMenu)와 디저트류(DessertMenu)로 구분된다. 커피류 메뉴는 추가적으로 원두 종류(bean type), HOT 제공 가능 여부, ICE 제공 가능 여부 정보를 관리해야 한다. 디저트류 메뉴는 추가적으로 칼로리(calories)와 알레르기 정보(allergy information)를 관리해야 한다.
사용자는 키오스크 화면에서 메뉴 목록을 조회할 수 있어야 하며, 각 메뉴에 대해 메뉴명, 가격, 판매 상태가 표시되어야 한다. 품절 상태의 메뉴는 화면에 표시되더라도 선택이 불가능해야 한다. 또한 사용자는 메뉴명이나 키워드를 이용하여 메뉴를 검색할 수 있어야 하며, 검색 결과로는 메뉴명, 가격, 메뉴 종류(커피류/디저트류) 정보가 제공되어야 한다.
사용자가 주문을 진행하기 위해 메뉴를 선택하면, 시스템은 해당 메뉴의 상세 정보를 보여주고 사용자는 수량을 선택할 수 있어야 한다. 선택한 메뉴는 주문 항목으로 추가되며, 사용자는 여러 개의 메뉴를 하나의 주문에 포함시킬 수 있어야 한다. 사용자가 주문을 확정하면 시스템은 주문을 생성하고 관련 정보를 저장해야 한다. 저장해야 할 정보에는 주문번호(고유 식별자), 주문 항목 목록(메뉴 ID, 메뉴명, 수량, 항목별 금액), 총 주문 금액, 주문 생성 시간(주문 시각), 주문 상태(예: 주문접수)가 포함된다.
주문 생성 후 사용자는 결제를 진행해야 한다. 결제는 공통적으로 결제번호, 결제금액, 결제시간, 결제상태(결제완료, 결제실패), 결제방식을 관리해야 한다. 결제 방식은 신용카드(CreditCardPayment)와 카카오페이(KakaoPayPayment)를 지원한다. 신용카드 결제는 카드사(card company)와 카드번호(card number)를 관리해야 하며, 카카오페이 결제는 카카오 계정 ID를 관리해야 한다. 하나의 주문은 하나의 결제와 연결되며, 결제가 완료되면 주문 상태는 “결제완료”로 변경된다.
주문이 정상적으로 생성되고 결제가 완료되면 키오스크는 사용자에게 주문번호와 함께 주문 내역(메뉴명, 수량, 총액, 결제방식)을 화면에 표시해야 한다. .
도서관 도메인에서 Book클래스의 클래스 속성을 정의하는 예이다. Book 클래스는 BookLoan 클래스와는 다르게 상속구조를 사용한다. 즉, Book 클래스에서 PaperBook과 EBook 클래스가 상속된다. 각각의 클래스는 각각의 특징에 맞게 속성들을 정의하고, 특별히 Book 클래스에서는 클래스 수준의 book_list 속성이 정의되어, 생성된 Book 클래스와 PaperBook/EBook 클래스의 인스턴스들을 book_list 속성에 저장한다.
2라인 클래스 수준의 속성 생성: 클래스 수준의 속성으로 _book_list를 리스트 타입으로 정의하였다.
10라인 리스트에 인스턴스 대입: 클래스 인스턴스 생성시, 즉 생성자 __init__()에서 self 인스턴스가 만들어지면 _book_list.append(self)로 __book_list에 해당 인스턴스를 append 한다.
13라인부터 Book 클래스의 _book_list의 인스턴스를 도서목록으로 출력하는 메소드
14 ~18라인: 목록의 title을 출력한다.
20라인 for book in Book._book_list:
_book_list의 항목 하나하나를 book 변수에 대입하여, 대입된 인스턴스 type(PaperBook or EBook)에 맞게 추가정보를 생성한다. (다형성 작동)
20~27라인: _book_list에는 PaperBook, EBook 모든 인스턴스가 들어가 있다. 해서 Book의 공통정보인 id, 제목, 저자, ISBN은 공통으로 출력하고, PaperBook과 EBook 고유의 정보는 추가정보로 묶어서 출력한다. 20-27라인 코드가 Book 타입별로 추가정보를 하나의 변수로 생성하는 부분이다.