환급미션 27일째....
소프트웨어 베이직 - c언어의 기초 - 16. 구조체
구조체를 활용, 자신만의 자료형을 만드는 방법 & 예제
* 구조체
여러 개의 변수를 묶어 하나의 객체를 표현
배열과 비슷한가?
성질이 다르다. 배열의 경우 동일한 특성을 가지는 변수를 일렬로 나열
구조체는
객체를 표현하고자 할 때 사용
여러 개의 변수를 묶어 하나의 객체라는 특성들을 표현하는 목적으로 사용
게임에서 캐릭터, 몬스터 등을 만들 때오 ㅏ같이
다양한 작업들이 필요
어떠한 특성을 가진 객체를 정의하는 목적으로 사용
- 구조체의 선언, 접근
----------
struct 구조체명
{
자료형1 변수명1;
자료형2 변수명2;
...
}
------------
와 같은 형태로 선언한다.
ex)
한 명의 학생에 대한 정보를 담고 있는 객체,
구조체를 정의해보자.
----------------
struct Student
{
char studentID[10];
char name[10];
int grade;
char major[100]; // int major 이런 식으로 선언해도 무관, 그냥 예시일 뿐이고 목적에 맞게끔 선언하면 됨
}
-----------------
* 구조체의 변수에 접근할 때 온점 (.) 사용한다.
(나중에 포인터가 사용될 때는 온점 대신 화살표가 쓰이기도 함)
------------
struct Student s; // 구조체 변수 선언
strcpy (s.studentID, "20201114"); // 구조체 변수에 접근
strcpy (s.name, "홍길동");
s.grade=4;
strcpy (s.major, "빼빼로제조학과");
------------
* 구조체 선언 및 활용 예제
--------------------------------
#include <stdio.h>
struct Student //학생 구조체 정의
{
char studentID[10];
char name[10];
int grade;
char major[100];
}
int main(void)
{
struct Student s; //구조체 변수 선언
strcpy (s.studentID, "12345678"); //구조체 변수에 접근
strcpy (s.name, "유관순");
s.grade=1;
strcpy (s.major, "항일운동학과");
printf("학번: %s\n", s.studentID); //구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
return 0;
}
-------------------------------
*하나의 구조체 변수만 사용하는 경우,
정의 & 선언을 동시에 할 수도 있다. -> 이 경우 변수는 전역변수로 사용됨
( 많이 사용되는 형태는 아니고 이런게 있구나 정도로 넘어갈 것 )
-----------
struct Student
{
char studendID[10];
char name[10];
int grade;
char major[100];
} s;
--------------
- 구조체의 초기화
* 구조체의 변수를 한 번에 초기화할 수 있다. - 선언 & 초기화
( 중괄호에 변수를 차례대로 넣는다.)
--------------------------------
#include <stdio.h>
struct Student //학생 구조체 정의
{
char studentID[10];
char name[10];
int grade;
char major[100];
}
int main(void)
{
struct Student s = { "12345678", "유관순", 1, "항일운동학과"); // 선언, 초기화를 한 번에
printf("학번: %s\n", s.studentID); //구조체 내용 출력
printf("이름: %s\n", s.name);
printf("학년: %d\n", s.grade);
printf("학과: %s\n", s.major);
return 0;
}
-------------------------------
- 구조체 간단하게 정의
* typedef 키워드 사용 - 임의의 자료형을 만듬
-----------------
#include <stdio.h>
typedef struct Student //학생 구조체 정의
{
char studentID[10];
char name;
int grade;
char major[100];
} Student; //이 구조체를 앞으로 그냥 Student라고 부르겠다고 정의하는 것
int main(void)
{
Student s; // 앞서 typedef에 의해 구조체를 Student라고 부르도록 정의했으므로 struct를 따로 붙이지 않고 Student라는 단어 하나만으로 구조체 변수 사용가능
~~~~~상기예제
------------------
* 익명 구조체 개념, 구조체 이름을 비워도 된다.
-----------------
#include <stdio.h>
typedef struct // 구조체 정의, 앞의 예제에서 studen(구조체 이름) 항목이 빠졌다
{
char studentID[10];
char name;
int grade;
char major[100];
} Student; //이 구조체를 앞으로 그냥 Student라고 부르겠다고 정의하는 것
int main(void)
{
Student s={~~~~~
~~~~~상기예제
------------------
- 구조체 포인터 변수에 접근하기
구조체가 포인터 변수로 사용되는 경우
내부 변수에 접근할 때 화살표 (->) 사용
---------------
typedef struct
{
char studentID[10];
char name[10];
int grade;
char major[100];
} Student;
int main(void)
{
Student *s = malloc(sizeof(Student)); //
strcpy (s->studentID, "20201234");
strcpy (s-> name, "김개똥");
s->grade=1;
strcpy (s->major, "똥");
printf("학번: %s\n", s->studentID);//구조체 내용출력
printf("이름: %s\n", s->name);
printf("학년: %d\n", s->grade);
printf("학과: %s\n", s->major);
return 0;
}
------------------------
소프트웨어 베이직 - c언어의 기초 - 17. 파일 입출력
소프트웨어에서 파일 입출력이 필요한 이유
- 프로그램이 꺼진 이후에도 데이터를 저장하기 위해 파일 입출력 필요
c언어를 이용해 파일 입출력 하는 방법 학습
- 파일 입출력
열고, 읽고/쓰고, 닫기 과정을 철저히 따라야 한다.
파일 열 때는 파일 포인터 사용 (동적으로 할당된 것)
파일 처리 이후에 파일을 닫아야 메모리 누수가 발생하지 않는다.
* 파일 열고닫기
파일 입출력 변수는 FILE 형식의 포인터 변수로 선언
열 때 fopen (), 닫을 때 fclose() 사용
-------------
FILE *fp;
fp = fopen (파일 경로, 접근방식);
// 파일 관련 처리
fclose(fp);
--------------
* fopen() 함수
기본 경로는 현재 프로그램이 실행되고 있는 경로
접근 방식
•r : read, 파일에 접근하여 데이터 읽음
•w : write, 파일에 접근하여 데이터 기록 (이미 존재하면 덮어쓰기)
•a : 파일에 접근하여 데이터를 뒤에서부터 기록
* 파일 입출력 함수
파일 입출력에서는 아래의 함수 사용
fprintf (파일 포인터, 서식, 형식지정자);
fscanf (파일 포인터, 서식, 형식지정자);
#include <stdio.h>
int main(void)
{
char s[20] = "Hello world";
FILE *fp;
fp = fopen("temp.txt", "w");
fprintf (fp, "%s\n", s);
//컴퓨터 메모리 공간에서 특정한 파일에 접근할 수 있는 메모리에 접근해서, 하나의 문자열을 쓰도록 한다.
기능적인 부분은 일반적으로 사용하는 printf와 동일하다고 볼 수 있다.
fclose(fp);
return 0;
}
- 파일 입출력 간단한 프로젝트 ( 간단한 학생 정보 시스템 만들기 )
데이터 파일을 읽어서 프로그램 상에서 처리해보는 프로그램
1. 학생 이름, 성적 입력 - Input.txt
5명의 학생에 대한 정보 입력,
2. 학생 구조체를 만들어서 특정 형태를 유지하는 학생들의 속성들을 프로그램 상에서 저장할 예정
3. 학생 데이터를 읽어 그대로 출력 (메인 함수)
-------------
#include <stdio.h>
#include <stdlib.h> //동적 메모리 할당을 위해
#include <string.h> //문자열 처리가 필요
typedef struct
{
char name[20];
int score;
} Student;
int main(void)
{
int n, sum=0; //총 인원, 총 점수
FILE *fp;
fp = fopen("input.txt", "r");
fscanf (fp, "%d", &n);
Student *students = (Student*)malloc(sizeof(Student)* n);
//동적 메모리 할당을 이용, 총 n명의 학생에 대한 정보가 담길 수 있는 공간을 메모리 주소 상에 할당
for (int i=0; i<n; i++)
{
fscanf(fp, "%s %d", &((students + i)->name), &((students + i)->score));
//학생 배열의 i번째 인덱스에 접근해서 네임, 스코어 값에 입력받음
printf("이름 : %s, 성적 : %d\n", (students + i)->name, (students + i)->score );
}
system("pause"); //프로그램이 동작 후에 바로 꺼지지 않고 멈추었다가 종료됨
return 0;
}
4. 성적 평균을 구하고 메모리 할당 해제하기
int main(void)
{
int n, sum=0; //총 인원, 총 점수
FILE *fp;
fp = fopen("input.txt", "r");
fscanf (fp, "%d", &n);
Student *students = (Student*)malloc(sizeof(Student)* n);
for (int i=0; i<n; i++)
{
fscanf(fp, "%s %d", &((students + i)->name), &((students + i)->score));
}
for (int i=0; i<n; i++)
{
sum += (students + i)->score; //각 학생들의 점수 더하기
}
free(students); //원하는 처리가 끝났으므로 students의 메모리 공간 할당 해제
fclose(fp); //열려있는 파일 닫기
printf("점수 평균: %.2f\n", (double)sum/n );
system ("pause");
return 0;
}
올인원 패키지 : 컴퓨터 공학 전공 필수👉https://bit.ly/3i4sCVE
'패스트캠퍼스' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 29회차 미션 (0) | 2020.11.16 |
---|---|
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 28회차 미션 (0) | 2020.11.15 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 26회차 미션 (0) | 2020.11.13 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 25회차 미션 (0) | 2020.11.12 |
[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 24회차 미션 (0) | 2020.11.11 |