본문 바로가기
C/C

C언어 심화 (14주차) [구조체, 총정리 1]

by DeathStar183 2022. 6. 11.

오늘은 지금까지 배워왔던것들을 총정리 해볼시간입니다!

(이번을 포함한 주랑 다음주는 내용이 상당히 깁니다.)

 

 

 

일단 C언어를 하려면 4가지를 알아야 해요!

 

→ 32개(44개)의 키워드 [제일 중요] : int, if, for등

 

→ printf()같은 표준 라이브러리 함수

 

→ 40여개의 연산자 : + , - , * , / 등

 

→ 10개의 구두점(토큰을 구분하기 위한 용도) : [] , {} , () , ; , : 등

 

 

 

 

 

예약어 (Reserved word, keyword)

 

컴파일러에 의해 미리 의미가 정해져 있는 32(44)개의 단어

 

C99에서 추가된 예악어 ↓

inline, restrict, _Bool, _Complex, _Imaginary

 

C11에서 추가된 예악어 

_Alignas, _Alignof, _Atomic, _Generic, _Noreturn, _Static_assert, _Thread_local

 

현재 총 44개 ( 기본 32개 + C99 [5개] + C11 [7개] )

(너무 알려하면 머리가 아프니 "이런게 있다" 정도만 알고 넘어가시는게 좋습니다)

 

 

 

 

연산자의 우선순위와 결합성

결합성이란? 우선순위가 같은 연산자의 결합 방향이다.

 

 

 

 

 

토큰(token)과 구두점

 

토큰? → C 프로그램을 구성하는 기본 단위

 

 ● 예악어 (Reserved word, keyword) : int, if

 ● 연산자 (operator) : + , - 등

 ● 구두점 (punctuator) : [] , ()

 ● 식별자 (identifier) : 변수 , 함수 , 배열 , 구조체등의 이름들

 ● 리터럴 (literal) or 상수 (constant) : 10 , 3.5 , a

 ● 문자열 (string) : "hello"

 

구두점

 ● 토큰을 구분하기 위해서 사용하는 기호

 ● [ ] , { } , ( ) , ; , * 등

 ● = , ( ) , [ ] , 콤마 등은 같은 모양의 연산자도 있음

 ● 소스의 어느 부분에서 사용하느냐에 따라서 연산자인지 구두점인지 판별

 

 

구두점 목록

 

 

 

함수

 ● C 프로그램은 함수(function)의 집합

 ● 함수란 특정한 작업을 하도록 만들어진 독립적인 단위 모듈

 ● 프로그램 하나를 여러 개의 함수로 분할하여 구현하는 구조적 프로그래밍(Structured programming)의 기본

 

 ● printf() , 자판기 , 전광판 , 계산기 등

 ● 함수에 입력시키는것을 매개변수(parametet) 또는 전달인자(인수, argument) 라고 함

 ● 함수가 돌려주는 결과 값을 반환값 또는 리턴값(return value) 이라고 함

 ● 자판기 함수의 경우 동전이나 버튼이 매개변수나 인자가 되고, 커피나 음료수가 리턴값이 됨

 

 

 

 

표준 라이브러리 함수

●C 언어는 기본 문법과 함께 상당히 많은 함수들을 컴파일러에서 지원하는데 이러한 함수들의 집합을 표준 라이브러리 함수(standard library function)라 함

 

●프로그래머를 위해서 이미 만들어져 있는 printf()와 같은 표준 라이브러리 함수는 이미 만들어져 있으므로 바로 사용하면 되지만 사용하기 전에 반드시 선언을 해야 함

 

●직접 선언을 할 수도 있지만 이 함수가 선언되어 있는 stdio.h라는 파일(표준 헤더 파일)을 프로그램에 포함시키는 방법을 더 많이 사용

표준 헤더 파일(standard header file)은 표준 라이브러리 함수들을 미리 선언해 놓은 파일

 

 

C언어 표준 라이브러리 함수 도움말 링크들  ↓ 

 

https://www.tutorialspoint.com/c_standard_library/index.htm 

https://en.wikipedia.org/wiki/C_standard_library

http://www.cplusplus.com/reference/clibrary/

 

 

 

 

 

14-1. C언어의 기본 틀

시작점인 main()함수는 반드시 필요하며, 리턴형은 int형임

int main()함수중 괄호안에 쓰는 void는 써도, 안써도 무방함 (어느정도 배우고나면 자신도 모르는 사이에 안쓰게 됨)

 

 

 

 

 

14-2. 변수,상수,주석

변수 선언문 int num1, num2

변수에 상수를 대입함 num1 = 100; , num2 = 95;

주석 : 초록색 글자로 처리된 부분

 

 

 

 

 

기본 자료형의 종류 : 문자형

→ 문자 하나를 저장하기 위한 형

→ 1바이트의 메모리가 할당

      ● char ch ;  // 문자형 변수 ch선언

      ● char ch= 'A' ; // 문자형 번수 ch선언과 초기화

→ 실제 기억 장소에 기억될 때는 해당 아스키 코드 값인 수로 저장됨

→ 문자 리터럴을 쓸 때는 반드시 양쪽애 작은 따옴표를 사용

→ 한글은 한글자라도 2바이트에 저장하므로 문자가 될 수 없음

→ unsigned가 추가로 붙은 형은 부호 없는 형으로 양의 값만 가지며 0부터 시작하므로 부호가 있는 형에 비해 2배

     크기 수까지 저장할수 있음

→ char형은 signed가 생략된 부호있는 형에 속함

 

자료 이해를 돕기 위한 사진

 

 

 

 

 

 

기본 자료형의 종류 : 정수형

→ 약 -21억 (정확하게는 -2의 31승 부터 2의 31승 -1)까지 또는 0에서 약 42억(2의 32승 -1)까지의 소수점 없는

    정수를 저장하기 위한 형

int형의 크기는 플랫폼이나 컴파일러에 따라 다름

Windows OS처럼 32비트(64비트 포함) 플랫폼상에서 동작하는 Visual C++, Dev-C++등의 컴파일러는 32비트

    (4바이트)

16비트 DOS상에서 동작하는 Turbo-C, Quick C와 같이 오래된 컴파일러에서는 int형이 16비트

 

범위 지정 참고용

 

 

 

 

 

 

C99에서 추가된 정수형

C99에서 추가된 정수형은 long long int와 _Bool형

long long int형은 최소 8바이트로 규정하고 있으며 현재는 Visual C++2008과 DEV-C++ 모두 8바이트

C99에서 추가된 _Bool형은 boolean형으로 0이나 1만을 저장하는 부호없는 정수형

-만약 0이 아닌 다른값은 모두 1로 저장됨

 

→ C 언어에서는 0은 거짓, 0이 아니면 모두 참

● _Bool b1, b2;

● b1=1;

● b2=0;

→ stdbool.h에 보면 다음과 같이 매크로로 정의

● #define bool _Bool

● #define true 1

● #define false 0

→ Dev-C++에서는 다음과 같이 좀 더 편한 방법으로 사용

● #include <stdbool.n>

● bool bl1, bl2;

● bl1=false;

● bl2=true;

 

 

 

 

 

기본 자료형의 종류 : 실수형

실수형 (부동형,floatting type)의 크기와 종류들

 

 

 

 

 

 

식별자/상수/자료형/변수

식별자와 명명 규칙

식별자(identifier)란 변수, 함수 등에 부여하는 이름이다.

식별자는 영문자(A∼Z, a∼z), 숫자(0∼9), 밑줄(_)만 가능

한글이나 밑줄(_)을 제외한 특수 문자, int, char 등 컴파일러에 의해 미리 의미가 정해져 있는 단어인 예약어(keyword)는 불가능

첫 글자는 반드시 영문자 또는 밑줄로 시작

 

리터럴(literal) or 상수

상수(constant)는 항상 그 값이 변하지 않는 요소

문자 상수는 양쪽에 작은 따옴표(예를 들어 'a')

문자열 상수는 양쪽에 큰 따옴표(예를 들어 "soft", "한")

숫자는 그냥 씀

자료형(data type)

자료형은 처리, 저장하고자 하는 자료의 형태를 나타낸다.

기본 자료형에는 문자형, 정수형, 실수형, 열거형이 있다.

문자형(char, 1바이트), 정수형(int, 4바이트), 실수형(double, 8바이트)

 

변수

변수는 프로그램이 실행되는 동안 가변적인 자료를 저장하기 위한 기억장소의 이름으로 모든 변수는 사용하기 전에 반드시 선언을 해야 한다.

변수를 선언하는 선언문은 모든 실행문보다 앞에 위치해야 한다.

C99에서는 사용하기 전에만 선언하면 됨(VS 2013부터 가능)

 

 

 

 

 

14-3. 두 변수의 합

변수에 각각 100,95가 대입시키므로 합은 195가 된다.

 

 

 

 

 

14-4. 합과 평균 출력

int형 정수인 2로 나누면 소수점 단위가 짤려서 나온다.

 

 

 

 

 

자동 형 변환

10/4, 10.0/4, 10/4.0, 10.0/4.0

1+’A’ 가 가능할까?

자료형이 서로 다른 혼합 연산에서는 기억 장소의 크기가 큰 쪽으로 통일시켜 연산이 이루어짐

이것을 자동 형 변환(implicit arithmetic conversions)이라 함

 

char(1바이트)형과 int(4바이트)형이 혼합 연산을 하게 되면 char형이 int형으로 변경되어 연산이 되고 결과도 int형으로 나옴

 

int형(4바이트)과 double형(8바이트)의 혼합 연산에서는 int형이 double형으로 변경되어 연산이 되고 결과도 double형으로 나옴

 

변환 우선 순위 

char → unsigned char → int → unsigned int → long → unsigned long → float → double

 

 

 

 

 

14-5. 숫자를 입력하고 합,평균 출력하기

 

 

 

 

 

14-6. 성적 비교해보기

2명의 각각의 과목 점수 변수 선언

각각의 성적을 직접 입력하고, 프로그램에서 연산하여 결과를 띄워줌

2.0으로 나누지 않으면 소수점 단위가 잘려서 나오므로 주의

 

 

 

 

 

변수와 배열

변수

단독주택

int x; // 4바이트 짜리 단독주택 1가구  □  (단일)

 

 

배열

 

같은 평수로 구성된 아파트

int x[5]; // 4바이트 짜리 5가구   □ □  (다수)

 

 

 

 

 

 

14-7. 배열을 이용한 성적처리

 

 

 

 

 

14-8. 성적처리를 정렬하여 등수 순으로 출력

 

selection sort에 대한 정보는 이 링크의 13-8,9번을 참고하세요 ^^

https://thisgame.tistory.com/20

 

C언어 심화 13주차 [배열(array)]

←저번에 보고 넘어간것들 ■지역 변수와 전역 변수 ■자동(auto) 변수 ■레지스터(register) 변수 ■정적(static) 변수 ■extern 변수 ■변수와 메모리 영역 →이번주에 보고 넘어갈것들 ■배열 개요

thisgame.tistory.com

 

 

 

 

 

구조체

다른 형(type)의 데이터들을 하나의 단위로 취급함

해당 방식은 나중에 배울 C++에서도 심화되어 나오니 꼭 알아둬야 좋음

 

(int, char, 그 외 본인이 직접 지정한 변수가 하나의 데이터로 취급하기에 사용시 주의가 필요하다.)

 

주로 저장하는 자료형

숫자를 저장

정수형인 int, 실수형인 double형을 주로 저장

 

문자를 저장

● char형

 

문자열을 저장

char *형

char 배열

 

 

예를 들어 사람에 대한 구조체를 만들고자 한다면

대부분 이름, 키, 몸무게 같은 기초적인 정보를 말하듯, 그걸 구조체로 간단하게 표현할수 있다.

 

이름은 char name[10];

나이는 int age;

몸무게는 double weight;

그 외에도 여러가지를 저장이 가능하니 알아보는것도 좋다.

 

 

 

이걸 이용해 간단한 구조체가 들어간 코드를 작성한다면? 

아래처럼 작성이 가능하다.

 

 

14-9. struct  man형 구조체를 선언하고 변수를 만들어서 접근

struct man이라는 구조체를 선언함

안에 age(나이) weight(몸무게가) 선언되어 있으며 초기화는 되어있지 않다.

이는 엄연히 변수지만, 일단 구조체안에 있어 하나의 데이터로 취급한다.

 

하지만 데이터가 없기에 그냥 불러오면 이상한 값이 나오게 되므로,

main() 함수에서 직접 가져와 변수 멤버를 가져와 값을 입력한다.

 

당연히 불러올때는 구조체의 이름과 구조체를 어떤이름으로 부를지 써서 결정해야하며,

 

구조체의 이름 : struct man

떤 이름으로 부르는가? : han

 

han.age=20; 이게 뭐지?

 

 han이라 불리는 구조체 struct man

안에 있는 변수 age에 20이라고 입력한다. 이뜻이 된다.

 

 

 

 

해당 내용은 인덕대학교 2021년도 1학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.

강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.

댓글