구조체의 기본과 이어지는 내용입니다
https://chlduswns99.tistory.com/13
구조체와 함수
1) call-by-value로 구조체를 호출할 경우, 구조체가 메모리에 복사하게 되므로 return후 변경 값이 유지되지 않는다.
struct card{
int pips;
char suit;
}c1={5,'d'}
.
.
.
.
assign_values(c1);
printf("%d %c", c1.pips, c1.suit);
.
.
.
.
void assign_values(struct card c){
c.pips=1;
c.suit='c';
}
// 출력물: 5 'd'
2) call-by-reference 방식으로 구조체의 주소를 전달하면 해결할 수 있다.
struct card{
int pips;
char suit;
}c1={5,'d'}
.
.
.
.
assign_values(c1);
printf("%d %c", c1.pips, c1.suit);
.
.
.
.
void assign_values(struct card *c){
c->pips=1;
c->suit='c';
}
// 출력물: 1 'c'
예제 코드 분석
#include <stdio.h>
struct card{
int pips;
char suit;
}c1={1,'d'};
void assign_values(struct card *c_ptr, int p, char s){
c_ptr -> pips = p;
c_ptr -> suit = s;
}
void extract_values(struct card *c_ptr, int *p_ptr, char *s_ptr){
*p_ptr = c_ptr -> pips;
*s_ptr = c_ptr -> suit;
}
void prn_values(struct card *c_ptr) {
int p;
char s;
char *suit_name;
extract_values(c_ptr, &p, &s);
switch(s) {
case 'c' :
suit_name = "clubs"; break;
case 'd' :
suit_name = "diamonds"; break;
case 'h' :
suit_name = "hearts"; break;
case 's' :
suit_name = "spades"; break;
default :
suit_name = "error";
}
printf("card: %d of %s \n", p, suit_name);
}
int main(void) {
int i;
struct card deck[52];
for( i = 0; i < 13; i++) {
assign_values(deck + i, i + 1, 'c' );
assign_values(deck + i + 13, i + 1, 'd' );
assign_values(deck + i + 26, i + 1, 'h' );
assign_values(deck + i + 39, i + 1, 's' );
}
for( i = 0; i < 13; i++){ /* print out the hearts */
prn_values(deck + i + 26);
}
return 0;
}
//출력물
/*
card: 1 of hearts
card: 2 of hearts
card: 3 of hearts
card: 4 of hearts
card: 5 of hearts
card: 6 of hearts
card: 7 of hearts
card: 8 of hearts
card: 9 of hearts
card: 10 of hearts
card: 11 of hearts
card: 12 of hearts
card: 13 of hearts
*/
위 코드는 트럼프 카드를 만들어 생성된 카드들 중에서 Heart를 출력하는 코드이다.
기본적인 작동 원리는 카드는 52장이기 때문에 struct deck[52]를 통해 52장의 카드를 만들어준다. 각 구조체는 1장의 카드와 같다. 그 후 카드에 데이터를 집어넣는 assign_values를 통해 카드에 데이터를 입력한다.
하트를 출력하는 것이 목적이니 prn_values 함수를 통해 출력해줄 것인데 prn_values 함수 안에서 카드 데이터 값을 추출하는 함수인 extract_values 함수를 통해 해당 카드의 데이터 값을 추출해주고 prn_values 함수에서 만들어준 변수에 추출한 데이터 값을 집어넣고 switch 함수를 이용해 출력문을 만든다.
assign_values 함수
구조체에 데이터를 입력하는 함수이다.
assign_values 함수를 보면 인자 값이 (struct card *c_ptr, int p, char s)이다.
struct card *c_ptr: card형 구조체의 포인터
int p: card형 구조체의 pips 멤버에 집어넣을 데이터
char s: card형 구조체의 suit 멤버에 집어넣을 데이터
만들어준 구조체의 원본 값을 변경해야 하므로 call-by-reference를 이용해주어야 한다. 그러므로 포인터를 사용했다.
extract_values 함수
카드 값의 데이터를 추출하는 함수이다.
인자: (struct card *c_ptr, int *p_ptr, char*s_ptr)
struct card *c_ptr: card형 구조체의 포인터
int *p_ptr: 추출할 pips 값. 원본을 변경해야 하기 때문에 포인터를 이용했다.
char*s_ptr: 추출할 suit 값. 원본을 변경해야 하기 때문에 포인터를 이용했다.
주소참조를 이용했기 때문에 인자로 입력받은 int값과 char값은 함수를 빠져나가도 변경되어있다.
prn_values 함수
변수 p, s를 생성해준 후 extract_values의 인자로 넣어서 값을 받아온다. case 문을 통해 변수 s를 대조해서 suit_name을 각각 모양 이름으로 지정해주고 출력해준다.
main 함수
struce card deck[52]을 통해 총 52장의 카드를 만든다. 각 카드는 하나의 구조체와 같다.
assign_values함수의 첫번째 인자는 포인터로 값을 받는다. 그러므로 deck+i+13 는 &deck[i+13]과 같은 의미를 갖는다.
배열은 배열의 이름이 시작 주소이고 +1씩 증가하기 때문에!!
assign_values 함수를 호출함으로서 모든 카드에 데이터 값을 입력했다.
그럼 이제 for문을 통해 prn_values함수를 호출해 52장의 카드 중 모양이 하트인 카드를 출력해주면 된다!
'알고리즘' 카테고리의 다른 글
[알고리즘] 단순 연결리스트 - 방문 연산, 탐색 연산, 합병 연산 (1) | 2023.10.25 |
---|---|
[알고리즘] 배열의 응용: 다항식 덧셈 프로그램 분석1 (0) | 2023.10.25 |
[알고리즘] 연결 리스트의 개념 및 기본 (단순연결리스트의 삽입연산, 삭제연산) (0) | 2023.10.22 |
[알고리즘] 배열의 응용: 다항식 덧셈 프로그램 분석2 (2) | 2023.10.21 |
[알고리즘] 구조체의 기본 (0) | 2023.10.17 |