웹_프론트_백엔드/단과

[단과_C] 2020.02.21

shine94 2020. 2. 22. 08:49

1. 포인터(저장공간을 가리키고 있는 주소값)
    포인터 변수 : 주소값을 담고 있는 저장공간
    변수 : 값을 담고 있는 저장공간
    
    포인터 상수 : 주소값을 담고 있고 수정이 불가능한 저장공간
    상수 : 값을 담고 있고 수정이 불가능한 저장공간

 

예시) 과자를 주는 방법에는 크게 두가지로 구분 가능하다

        ① 직접주기

        ∴ 직접 과자를 얻는 것은 변수에 직접 접근하는 것에 해당한다

 

        ② 간접적으로 과자가 있는 위치를 가르쳐 주기

        ∴ 쪽지에 과자의 위치를 적어서 건네준다면 우리는 이 쪽지를 포인터라고
           생각할 수 있다 실체(변수)인 과자의 위치를 가리키고 있기 때문이다
           즉, 쪽지에 적힌 위치를 보고 과자를 가져오는 것은 포인터를
           사용해서 변수에 접근하는 것에 해당한다

 


2. *
1) 산술 연산자

 : 곱하기, 앞 뒤 모두 항이 존재해야 한다

   예) a * b

    

2) 포인터 연산자

 : 자료형 뒤에서 사용해야 한다

   예) 자료형*

 

3) 참조 연산자

 : 자료형이 없고 포인터 앞에서 사용해야 한다

   예) *포인터명

 


3. 배열
 : 저장공간이 나열되어 있는 것

1) 변수를 여러 개 선언하면 이름도 여러 개이다.
    관리하기 힘들기 때문에 여러 칸 배열을 한 번만 선언한다.
    이름은 하나이지만 인덱스라는 각 방의 번호로 값에
    접근하기 때문에 관리하기 쉽다.


2) 규칙성이 없는 값에 규칙성을 부여하기 위해서 사용한다.

 



4. 배열의 선언
    자료형 배열명[길이] = {값1, ...... };
    자료형 배열명[] = {값1, ...... };
    자료형 배열명[길이] = {값1, };
    자료형 배열명[길이];


5. 오늘 실습코드

1) megabox.c

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

void main() {
	//메가 박스
	const char* title = "★MEGA BOX★";
	const char* menu = "①예매하기\n②구매하기\n③쿠폰등록\n④나가기\n";
	const char* book_menu = "①겨울왕국2(09:00)\n②포드v페라리(13:00)\n③[청소년 관람 불가]남산의 부장들(23:00)\n④홈 화면으로\n";
	const char* food_menu = "①팝콘(₩7000)\n②콜라(₩3000)\n③[청소년 구매 불가]맥주(₩4000)\n④홈 화면으로\n";
	const char* errMsg = "다시 시도해주세요.";
	const char* name = "";

	int choice = 0;

	int money = 100000000;

	//상품 가격
	int t_price = 12000;
	int p_price = 7000;
	int c_price = 3000;
	int b_price = 4000;

	int age = 0;

	//사용자가 선택한 상품의 가격을 담아줄 변수
	int price = 0;

	//회사 쿠폰
	int coupon = 0;

	//사용자가 입력한 쿠폰
	int myCoupon = 0;

	//쿠폰 등록 유무 검사 Flag
	int coupon_check = 0;

	//이전 쿠폰 번호 저장할 변수
	int temp = 0;

	//사용자가 팝콘을 구매하는지 검사할 Flag
	int popcorn_check = 0;

	//기준점을 시간(변수)으로 설정하는 코드
	srand(time(NULL));

	//100000 ~ 999999
	//0 ~ 899999 + 100000
	//난수 : rand()
	coupon = rand() % 900000 + 100000;

	while (1) {
		//이전에 팝콘을 구매한 표시가 남아있지 않도록 하기 위해
		//매 반복마다 0으로 초기화 해준다
		//만약 초기화하지 않는다면 다음 로직에 문제 발생
		popcorn_check = 0;

		/*테스터 영역*/
		printf("%d\n", coupon);

		printf("%s\n%s", title, menu);
		scanf_s("%d", &choice);

		if (choice == 4) { break; }

		switch (choice) {
		//예매하기 영역
		case 1:
			//변수의 재사용
			//1. 메모리 효율성 증가
			//2. 가독성이 떨어진다.
			printf("%s", book_menu);
			scanf_s("%d", &choice);
			//Nested switch(중첩 스위치문)
			switch (choice) {
			//겨울왕국2(09:00)
			case 1:
				//사용자가 선택한 영화 관련 메시지를 name에 담아준다
				//하단에서 일괄처리를 할 때 사용자가 선택한 영화가 필요하기 때문!
				name = "겨울왕국2(09:00) 예매";
				break;
			//포드v페라리(13:00)
			case 2:
				name = "포드v페라리(13:00) 예매";
				break;
			//남산의 부장들(23:00)
			case 3:
				//나이 입력 후 19세 미만이면 실패처리
				printf("[청소년 관람 불가 영화입니다]\n나이 : ");
				scanf_s("%d", &age);

				name = "남산의 부장들(23:00) 예매";
				//만약 if문에 들어간다면 하단의 결제영역까지 가지 못한다.
				//따라서 미성년자가 아닐 경우에는 if문에 들어가지 않기 때문에
				//결제 영역까지 정상적으로 내려간다.
				if (age < 20) {
					printf("%s 실패 / 미성년자\n", name);
					continue;
				}
				break;
			//홈 화면으로 이동
			case 4:
				//continue를 사용하는 이유
				//밑의 코드를 실행하지 않고 다음 반복으로 스킵
				//다음 반복에는 홈 화면부터 나오기 때문!!
				continue;
			//그 외 영역
			default:
				printf("%s\n", errMsg);
				continue;
			}
			//사용자가 정상적으로 선택했다면 올 수 있는 영역
			//모든 영화표 가격은 동일하기 때문에 이 영역에서
			//price에 영화표 가격을 담아준다.
			price = t_price;
			break;
		//구매하기 영역
		case 2:
			printf("%s", food_menu);
			scanf_s("%d", &choice);

			switch (choice) {
			//팝콘(₩7000)
			case 1:
				//사용자가 팝콘을 선택했다면 popcorn_check를 1로 변경
				popcorn_check = 1;
				name = "팝콘 구매";
				//영화표와 다르게 상품은 가격이 모두 다르다.
				//따라서 사용자가 선택한 상품 관련 메시지 뿐만 아니라
				//가격도 각각 담아준다.
				price = p_price;
				break;
			//콜라(₩3000)
			case 2:
				name = "콜라 구매";
				price = c_price;
				break;
			//맥주(₩4000)
			case 3:
				printf("[청소년 구매 불가 음식입니다]\n나이 : ");
				scanf_s("%d", &age);

				name = "맥주 구매";

				if (age < 20) {
					printf("%s 실패 / 미성년자\n", name);
					continue;
				}

				price = b_price;
				break;
			//홈 화면으로 이동
			case 4:
				continue;
			//그 외 영역
			default:
				printf("%s\n", errMsg);
				continue;
			}

			break;
		//쿠폰등록 영역
		case 3:
			//6자리 쿠폰
			//팝콘 무료 쿠폰
			//랜덤한 쿠폰번호 생성 > 사용자가 입력한 쿠폰번호와 비교
			//같으면 팝콘 구매시 무료.
			//이미 쿠폰이 있을 때 쿠폰 등록 불가능
			//쿠폰 사용시 랜덤한 쿠폰번호 다시 생성

			//사용자가 쿠폰을 이미 등록했다면 coupon_check에
			//1이라는 값이 들어가 있다. 따라서 1은 !(not)을 만나 0이 되고
			//이미 등록한 사람은 if문 안으로 들어갈 수 없다.
			//따라서 쿠폰을 소지하지 않은 사용자만 쿠폰을 등록할 수 있다
			if (!coupon_check) {
				printf("쿠폰 번호 : ");
				scanf_s("%d", &myCoupon);

				//사용자가 입력한 쿠폰번호와 회사 쿠폰을 비교하여
				//일치하면 coupon_check를 1로 변경해준다.
				if (coupon == myCoupon) {
					//Flag
					coupon_check = 1;
					printf("팝콘 무료 쿠폰 등록 성공!\n");
				}
				else {
					printf("잘못된 쿠폰번호입니다.\n");
				}
			}
			else {
				printf("이미 등록하셨습니다.\n");
			}
			continue;
		//그 외 영역
		default:
			printf("%s\n", errMsg);
			continue;
		}
		//쿠폰 검사

		//사용자가 쿠폰을 소지하고 있는지 && 팝콘을 구매하려고 하는지
		//둘 다 참이면 들어간다.
		if (coupon_check && popcorn_check) {
			//쿠폰이 자동으로 사용됬으므로 
			//coupon_check를 다시 0으로 초기화
			coupon_check = 0;

			//팝콘의 가격을 0으로 초기화
			price = 0;

			//사용된 쿠폰번호를 temp에 저장
			temp = coupon;
			do {
				//새로운 쿠폰번호를 만들어준다.
				coupon = rand() % 900000 + 100000;
				printf("들어옴\n%d", coupon);
				//이전 쿠폰번호와 중복되지 않을 때까지 무한 반복
				//즉, 중복되지 않으면 탈출
			} while (temp == coupon);
		}

		//잔액부족 검사
		//위에서 사용자가 선택한 상품에 대한 정보가
		//name과 price에 담겨서 내려오기 때문에
		//일괄처리가 가능하다.
		if (money - price < 0) {
			printf("%s 실패 / 잔액 부족\n", name);
		}
		else {
			money -= price;
			printf("%s 성공 / 현재 잔액 : %d원\n", name, money);
		}
	}

}


2) randomTest.c

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

void main() {
	srand(time(NULL));

	for (int i = 0; i < 100; i++) {
		printf("%d\n", rand() % 90000 + 10000);
	}
}

'웹_프론트_백엔드 > 단과' 카테고리의 다른 글

[단과_C] 2020.02.24  (0) 2020.02.25
[단과_JAVA] 2020.02.24  (0) 2020.02.25
[단과_JAVA] 2020.02.21  (0) 2020.02.22
[단과_C] 2020.02.20  (0) 2020.02.21
[단과_JAVA] 2020.02.20  (0) 2020.02.20