패스트캠퍼스

[패스트캠퍼스 수강 후기] 올인원 패키지 : 컴퓨터 공학 전공 필수👉C언어인강 100% 환급 챌린지 27회차 미션

돌맹이시터 2020. 11. 14. 20:43

 

 

 

환급미션 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