June is Combung

포켓몬 본문

C/구조체

포켓몬

june__Park 2021. 3. 29. 16:57
#include <stdio.h>
#include <time.h>  // time()
#include <stdlib.h> // srand(), rand()
typedef struct Pokemon {
	char name[40];
	int lv; 
	int hp;
	int ap;
} POK;

// TODO : 풀이, 구조체와 함수/배열/포인터
void quiz01(){
	POK p1, p2, p3, p4;

	// Pokemon 구조체 변수 4개 만들기 
	//  (+ 4칸짜리 배열1개도 가능)

	// scanf_s() 로 포켓몬 4마리의 이름, 레벨 입력 받기. 
	//   체력(hp) : 레벨의 100배 
	//   공격력(ap) : 레벨의 10배 (+ rand() 를 사용하여 20% 확률로 15배)

	srand(time(NULL));

	printf("이름 : ");
	scanf_s("%s", p1.name, sizeof(p1.name));
	printf("%s의 레벨 : ", p1.name); 
	scanf_s("%d", &p1.lv);
	p1.hp = p1.lv * 100;
	p1.ap = p1.lv * (rand() % 10 < 2 ? 15 : 10);

	printf("이름 : ");
	scanf_s("%s", p2.name, sizeof(p2.name));
	printf("%s의 레벨 : ", p2.name); 
	scanf_s("%d", &p2.lv);
	p2.hp = p2.lv * 100;
	p2.ap = p2.lv * (rand() % 10 < 2 ? 15 : 10);

	printf("이름 : ");
	scanf_s("%s", p3.name, sizeof(p3.name));
	printf("%s의 레벨 : ", p3.name); 
	scanf_s("%d", &p3.lv);
	p3.hp = p3.lv * 100;
	p3.ap = p3.lv * (rand() % 10 < 2 ? 15 : 10);

	printf("이름 : ");
	scanf_s("%s", p4.name, sizeof(p4.name));
	printf("%s의 레벨 : ", p4.name); 
	scanf_s("%d", &p4.lv);
	p4.hp = p4.lv * 100;
	p4.ap = p4.lv * (rand() % 10 < 2 ? 15 : 10);
	
	// printf() 로 모든 정보 출력 
	printf("%s LV.%d  HP.%d  AP.%d \n", p1.name, p1.lv, p1.hp, p1.ap);
	printf("%s LV.%d  HP.%d  AP.%d \n", p2.name, p2.lv, p2.hp, p2.ap);
	printf("%s LV.%d  HP.%d  AP.%d \n", p3.name, p3.lv, p3.hp, p3.ap);
	printf("%s LV.%d  HP.%d  AP.%d \n", p4.name, p4.lv, p4.hp, p4.ap);

	// (+ 가장 레벨이 높은 포켓몬의 이름과 레벨 출력)
	POK max = p1;
	if(max.lv < p2.lv){
		max = p2;
	}
	if(max.lv < p3.lv){
		max = p3;
	}
	if(max.lv < p4.lv){
		max = p4;
	}
	printf("최대 레벨 : %d \n", max.lv);
	printf("최대 레벨 포켓몬 : %s \n", max.name);

}

void quiz01_arr(){
	POK p[4];
	int i;
	for(i = 0; i < 4; ++i){
		printf("이름 : ");
		scanf_s("%s", p[i].name, sizeof(p[i].name));
		printf("%s의 레벨 : ", p[i].name); 
		scanf_s("%d", &p[i].lv);
		p[i].hp = p[i].lv * 100;
		p[i].ap = p[i].lv * (rand() % 10 < 2 ? 15 : 10);
	}

	for(i = 0; i < 4; ++i){
		printf("%s LV.%d  HP.%d  AP.%d \n", p[i].name, p[i].lv, p[i].hp, p[i].ap);
	}

	POK max = p[0];
	for(i = 1; i < 4; ++i){
		if(max.lv < p[i].lv){
			max = p[i];
		}
	}
	printf("최대 레벨 : %d \n", max.lv);
	printf("최대 레벨 포켓몬 : %s \n", max.name);
}

/*
	1. print_info()
	 인자 : 포켓몬 1개 
	 하는 일 : 해당 포켓몬의 모든 정보 printf()
	 리턴 : X

	2. input_info()
	 인자 : X
	 하는 일 : 포켓몬 구조체 변수 선언 및 scanf_s() 로 입력받아서 정보 저장
	 리턴 : 포켓몬 구조체
*/
void print_info(POK p){
	printf("이름 : %s \n", p.name);
	printf("LV : %d \n", p.lv);
	printf("체력 : %d \n", p.hp);
	printf("공격력 : %d \n", p.ap);
}
POK input_info(){
	POK p;
	printf("이름 : ");
	scanf_s("%s", p.name, sizeof(p.name));
	printf("%s의 레벨 : ", p.name); 
	scanf_s("%d", &p.lv);
	printf("%s의 체력 : ", p.name); 
	scanf_s("%d", &p.hp);
	printf("%s의 공격력 : ", p.name); 
	scanf_s("%d", &p.ap);
	return p;
}
/*
	구조체변수명.필드명 : 직접 접근 연산자
	구조체주소->필드명 : 간접 접근 연산자
	 (*주소).필드명
	 주소->필드명 
*/

/*
	level_up()
	인자 : ?????
	하는 일 : 인자로 들어온 포켓몬의 레벨을 1 증가 
	리턴 : X 
*/
void level_up(POK*p){
	//++(*p).lv;
	++p->lv;
}
void quiz02(){
	POK p1 = input_info();
	//POK p2 = input_info();

	print_info(p1);
	//print_info(p2);

	level_up(&p1);
	print_info(p1);
}


typedef struct node {
	int data;
	struct node* next;
}N;
void ex01(){
	N n1 = {10, NULL}, n2 = {20, NULL}, n3 = {30}, n4 = {40};

	n1.next = &n2;
	n2.next = &n3;
	n3.next = &n4;

	printf("n1의 주소 : %u,  n1.next : %u \n", &n1, n1.next);
	printf("n2의 주소 : %u,  n2.next : %u \n", &n2, n2.next);
	printf("n3의 주소 : %u,  n3.next : %u \n", &n3, n3.next);
	printf("n4의 주소 : %u,  n4.next : %u \n", &n4, n4.next);


	N* tmp = &n1;
	// tmp 를 사용하여 4개 노드의 모든 data를 printf() 
	while(tmp){ // tmp != NULL
		printf("%d \n", tmp->data);
		tmp = tmp->next;
	}
}

void main(){
	//quiz01_arr();
	//quiz02();
	ex01();
}

'C > 구조체' 카테고리의 다른 글

괄호예제 & 포켓몬2  (0) 2021.03.29
도서관리1  (0) 2021.03.29
구조체 기본  (0) 2021.03.29
Comments