Small Grey Outline Pointer 구조체
본문 바로가기
Dev./C++

구조체

by sso. 2022. 4. 4.

[구조체]
공통 요소(멤버 변수)로 구조화(구체화) 시켜 놓은 것

후에 이러한 구조체의 개념은 객체 지향 프로그래밍에서는 class 개념으로 확장되어 사용된다

배열:여러개의 같은 자료형을 하나로 묶는 것

구조체:서로 다른 자료형들을 하나로 묶는 것

[목적]
반복되는 공통 요소를 쉽게 관리 하기 위해서


[구조체 선언]
struct 구조체 이름
{
자료형 멤버변수명,
};

typedef struct 구조체이름
{

자료형 멤버변수명,

}구조체별명;


[선언시 주의사항] 
-함수 밖에서 선언해야 한다
-선언 시 멤버 변수에 초기값을 넣을 수 없다

 

 

 

[구조체 사용]

struct 구조체이름 변수명;
구조체이름.멤버변수명=값;

struct 구조체이름 변수명={값,....};

typedef 을 선언했다면 아래와 같이 사용한다
구조체별명 변수명;

#include <stdio.h>



struct Animal {
	char name[200];
	int age;
	char feed[200];

};

void main() {
	struct Animal dog = { "Max", 10, "개껌" }; //name, age, feed 초기화
	printf("%s %d %s", dog.name, dog.age, dog.feed);
}

Max 10 개껌

 

 

strcpy 활용하여 풀기

#include <stdio.h>
#include <string.h>



struct Animal {
	char name[200];
	int age;
	char feed[200];

};

void main() {
	struct Animal dog;
	strcpy_s(dog.name,sizeof(dog.name),"max");
	dog.age = 20;
	strcpy_s(dog.feed, sizeof(dog.feed), "개껌");

	//struct Animal dog = { "Max", 10, "개껌" }; //name, age, feed 초기화
	printf("%s %d %s", dog.name, dog.age, dog.feed);
}

max 20 개껌

 

 


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

struct person
{
	char name[30];
	int age;
};



void ex1901() {
	struct person boy, girl; //구조체 변수 선언

	printf("소년의 이름을 입력해주세요: ");
	gets(boy.name); //이름을 입력 받아서 할당하기
	printf("소녀의 이름을 입력해주세요: ");
	gets(girl.name);
	

	printf("나이를 띄어 쓰기로 입력해주세요: ");
	scanf_s("%d %d", &boy.age, &girl.age);  //나이 입력 받아서 할당하기

	//멤버 변수에 접근할때는 .연산자(도트연산자)사용한다
	printf("소년의 이름은 %s 나이는 %d세\n", boy.name, boy.age);
	printf("소녀의 이름은 %s 나이는 %d세\n", girl.name, girl.age);
}


void main() {

	ex1901();
}

 

소년의 이름을 입력해주세요: 영훈
소녀의 이름을 입력해주세요: 소영
나이를 띄어 쓰기로 입력해주세요: 12 14
소년의 이름은 영훈 나이는 12세
소녀의 이름은 소영 나이는 14세

 

 

위와 같이 구조체 변수를 선언하면 boy와 girl은 각각 name, age를 멤버변수로 가지는 구조체변수로서

각자 필요한 메모리 공간을 할당받게 된다. 할당된 변수들에 대해서는 각각 초기화를 비롯한 접근이 가능

 

 


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

//구조체

struct student {
	int number;
	char name[10];
	double grade;
};


void main() {
	struct student s; //구조체 변수 선언 => s
	{
		s.number = 20150001; 
		strcpy(s.name, "홍 길 동"); //홍길동이라는 문자열을 s.name으로 복사
		s.grade = 4.5;
		printf("학번: %d\n", s.number);
		printf("이름: %s\n", s.name);
		printf("점수: %.1f\n", s.grade);

	};


}

학번: 20150001
이름: 홍 길 동
점수: 4.5

 

 

 

위의 문제를 입력받는 것으로 바꿔서 풀기

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

//구조체

struct student {
	int number;
	char name[10];
	double grade;
};


void ex01() {
	struct student s; //구조체 변수 선언 => s
	

	printf("학번을 입력하세요: ");
	scanf_s("%d", &s.number);

	printf("이름을 입력하세요: ");
	scanf("%s", s.name); //배열이기 때문에 &가 필요없다
    

	printf("학점을 입력하세요: ");
	scanf_s("%lf", &s.grade); 
	//scanf() 함수로 double형 실수를 입력받을 때는 반드시 '%lf' 서식 지정자를 사용해야 정확히 나온다



	printf("학번: %d\n", s.number);
	printf("이름: %s\n", s.name);
	printf("학점: %.1f\n", s.grade);

	
}



	void main() {
		ex01();
	}

 

학번을 입력하세요: 220404001
이름을 입력하세요: 홍길동
학점을 입력하세요: 3.9
학번: 220404001
이름: 홍길동
학점: 3.9

 

 

scanf("%s", s.name);

문자열 입력 받을 때 &(앰퍼센드)가 필요없는 이유

=> 배열은 그자체로 포인터의 의미를 갖고있다

해당 배열의 '주소 자체' 를 뜻하므로 주소를 가르키는 &(앰퍼센드)가 필요없다

 

엔터키를 누르면 엔터키 값 까지 인식해서 gets()를 두번 연속해서 썼는데

scanf("%s", s.name); 이렇게 수정하니까 한번 입력해도 입력한 대로 정확히 나온다

 

double형 실수의 입력

double형 실수를 입력받을 때는 printf() 함수에서처럼 '%f'를 사용하면 안 됩니다.

scanf() 함수로 double형 실수를 입력받을 때는 

반드시 '%lf' 서식 지정자를 사용해야 정확한 값으로 입력받을 수 있습니다.

 

 

 


 

 

두 좌표 사이의 거리 구하기

 

#include <stdio.h>
#include <math.h>

//구조체

struct point
{
	int x;
	int y;
};


void ex02() {

	struct point p1, p2;
	int xDiff, yDiff; //x좌표의 차이점, y 좌표의 차이점
	double distance;


	printf("1번 점의 좌표를 입력하세요: ");
	scanf_s("%d %d", &p1.x, &p1.y);

	printf("2번 점의 좌표를 입력하세요: ");
	scanf_s("%d %d", &p2.x, &p2.y);

	xDiff = p1.x - p2.x;
	yDiff = p1.y - p2.y;

	distance = sqrt(xDiff * xDiff + yDiff * yDiff);
	//두점 사이의 거리를 구하는 공식
	printf("두 점 사이의 거리는 %f 입니다.\n", distance);

}



	void main() {

		ex02();
	}

 

 

1번 점의 좌표를 입력하세요: 4 5
2번 점의 좌표를 입력하세요: 10 29
두 점 사이의 거리는 24.738634 입니다.

728x90

댓글