*자료형의 분류

 

- 기본 자료형 : char , int , float , double

 

- 파생 자료형 : 배열 , 열거형 , 구조체 , 공용체

 

 

 

#구조체란 ?

 

- 여러 자료형 변수를 묶어놓은 공간이다.

 

- 구조체는 사용자가 만들어 사용하는 자료형이다.

  (사용자 정의 자료형)

 

- 구조체 선언과 구조체 변수 선언은 다르므로 주의

 

- 구조체 선언이 있어야 구조체 변수 선언이 가능하다.

 

 

 

#구조체의 필요성

 

- 변수들을 하나로 묶을 수 있다.

 

 

 

 

 

 

 

 

 

#구조체와 배열

 

 

 

 

 

 

 

 

 

 

 

 

#구조체 선언

 

- 여러 자료형 변수를 묶어놓은 공간을 설계해놓은 설계도

 

- 변수 선언과 모양이 비슷하지만 , 저장 공간이 생기지 않는다.

 

- 여러개의 구조체를 선언 할때는 이름이 중복되면 안된다.

 

선언 형식

 

struct 구조체 이름{

제목

주연배우

개봉날짜

};

 

 

 

 

 

 

 

 

 

#구조체 변수

 

- 구조체 선언(설계도)의 구조로 실제 데이터를 저장하는 전체 공간(집)이다.

 

- 구조체 정의와 구조체 변수 선언은 다르다.

 

 

 

 

 

 

 

 

 

 

#구조체 초기화

 

- 중괄호를 이용하여 초기값을 나열

 

 

 

 

 

 

 

 

#구조체 멤버 참조

 

- 구조체 멤버를 참조하려면 ( . ) 연산자를 이용하면 된다.

 

 

 

 

 

 

 

 

 

 

#구조체를 멤버로 가지는 구조체

 

 

 

 

 

 

 

 

 

 

 

#구조체 변수의 대입과 비교

 

- 같은 구조체 변수끼리 대입은 가능하지만 비교는 불가능하다.

 

 

 

 

 

 

 

 

 

#(이름 , 핸드폰번호 , 나이) 2명에 대한 정보

 

 

 

 

 

 

 

 

 

#구조체 배열

 

 

선언형식

 

struct person{
  int number;

  char name[20];

  double grade;

};

 

main (void)

{

 struct person list[100] //구조체 배열 선언

}    

 

 

#구조체 배열 초기화

 

 

 

 

 

 

 

#구조체 배열을 사용해 3명에 대한 (이름,핸드폰번호,나이) 정보 받기

 

 

 

 

 

 

 

 

#구조체 함수

 

- 구조체를 함수로 전달하는 경우 : 구조체의 복사본이 함수로 전달되게 된다.

 

 만약 구조체의 크기가 크면 그만큼 시간과 메모리가 소요된다.

 

 

 

 

 

 

 

 

 

- 구조체의 포인터를 함수의 인수로 전달하는 경우 : 시간과 공간을 절약할 수 있다.

                                                                   원본 훼손의 가능성이 있다.

 

 

 

 

 

 

 

 

 

 

#구조체를 반환하는 경우

 

- 복사본이 반환

 

 

 

 

 

 

 

 

#typedef

 

- typedef는 새로운 자료형(type)을 정의(define)하는것이다.

 

- C의 기본 자료형을 확장시키는 역할

 

 

 

 

 

 

 

 

 

 

 

#구조체로 typedef 정의

 

 

사용형식

 

typedef struct point{

 

  int x;

  int y;

 

}PP;

 

 

 

 

 

 

 

 

#출력함수로 출력해보기

 

 

 

 

 

 

 

 

 

#구조체 포인터

 

- 구조체 변수를 대상으로 가리키는 포인터변수

  포인터 -> 구조체!

 

 

 

 

 

 

 

 

# -> 연산자

 

 

 

 

 

 

 

#예제

 

 

 

 

 

 

 

 

 

#포인터를 멤버로 가지는 구조체

 

 

 

 

 

 

 

 

 

 

 

#구조체를 반환하는 경우

 

- 복사본이 반환된다.

 

 

 

 

 

 

 

#구조체 예제들

 

 

- 우유이름 , 가격표기

 

 

 

 

 

 

 

 

- 영어 사전 프로그램

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 두 가지 차 이름,가격을 입력받고 출력

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

- 구조체 안에 구조체 본인을 선언 , 구조체 포인터변수 선언 변수,배열

 

 

 

 

 

 

 

 

 

*포인터

 

- 메모리 주소를 이용하여 원하는 저장 공간에 접근하는 것을 얘기한다.

 

- 주소를 가지고있는 변수

 

 

 

#포인터 변수

 

- 주소값

  변수의 주소를 계산하는 연산자 : &

 

- 가리키는 대상의 정보가 포인터 안에 있어야함.

 

 

 

 

 

 

 

 

 

#포인터 변수를 사용하는 이유

 

- 함수가 리턴해야 할 값이 2개 이상인 경우 사용한다.

 

- 함수에서 배열을 매개 변수로 받아들일 때

 

- 프로그램에서 동적할당을 진행할 때 (자료구조)

 

- 이름을 모르는 변수를 이용해야 될 경우

   (외부 프로그램 및 외부 메모리에 직접 접근이 가능하다.)

 

- 메모리를 효율적으로 사용할 수 있다.

 Ex) int arr[100];

 

 

 

#포인터 변수의 크기

 

- 16bit 시스템 -> 주소값의 크기 -> 2byte

- 32bit 시스템 -> 주고값의 크기 -> 4byte

 

- 메모리의 주소는 고정적으로 정해져있다.

 

- 메모리의 주소는 음수 x

 

- %d -> +,-

- %u -> 부호없이 양수만 출력

- %p -> 16진수의 주소값

 

0~42억 -> 4byte

 

 

 

#포인터 선언

 

정보↓

     int* 포인터 변수명 = 가리키는 대상의 주소값 

 

 

 

 

 

 

 

 

 

#포인터 변수의 연결

 

 

 

 

 

 

 

#다양한 포인터 선언

 

 

 

 

 

 

 

 

#간접 참조 연산자 ( * )

 

- 포인터가 가리키는 값을 가져오는 연산자

 

- 지정된 위치에서 포인터의 타입에 따라 값을 읽어들인다.

 

- &연산자는 변수의 주소를 구하여 포인터에 대입할 때 사용 , *연산자는 포인터를 통하여 변수를 간접 참조할 때 사용

 

 

 

 

 

 

 

 

 

 

#포인터 예제

 

 

 

 

 

 

 

 

 

 

#포인터와 scanf()를 이용하여 정수 1개를 입력 받고 값이

  짝수인 경우 "짝수" 홀수면 "홀수" 출력하는 프로그램을 작성해보자

 

 

 

 

 

 

 

 

 

 

 

 

#포인터 사용시 주의점

 

 

 

 

 

 

 

 

 

 

 

#포인터 연산

 

- 가능한 연산 : 증가 , 감소 , 덧셈 , 뺄셈 연산

 

- 증가 연산의 경우 증가되는 값은 포인터가 가리키는 자료형의 크기만큼 증가

 

 

 

 

 

 

#증가 연산 예제

 

 

 

 

 

 

 

 

 

 

 

 

#간접 참조 연산자와 증감 연산자

 

 

- *p++;  = p가 가리키는 위치에서 값을 가져온 후에 p를 증가한다.

 

- (*p)++; = p가 가리키는 위치의 값을 증가한다.

 

 

 

 

 

 

 

#포인터 배열

 

- 배열과 포인터는 아주 밀접한 관계를 가지고있다.

 

- 배열 이름 = 포인터

 

- 포인터는 배열처럼 사용이 가능하다.

 

- int arr[3]; 

 

- arr -> &arr[0]주소값을 가리킨다.

 

 

#int형 변수 정보

 

- 배열을 구성하는 원소 한개의 접근하는 형식이다.

 

- 배열 전체의 시작주소만 저장한다.

 

- 배열의 이름 자체는 바꿀 수 없는 상수이며 곧 주소값을 의미하게 된다.

 

scanf("%s",name)

char name[30];

name -> name[0] - 주소값을 가리키고 문자를 저장하라 라는 정보를 가지고있다.

 

- 배열은 포인터이기 때문에 메모리에 접근하는 간접 참조 연산자( * )를 사용할 수 있다. 

 

 

 

 

#포인터 배열 주소값 비교

 

 

 

 

 

 

 

 

 

#2차원 배열에 문자열 저장

 

 

 

 

 

 

 

 

 

#문자형 포인터 배열

 

 

 

 

 

 

 

 

 

#배열3개를 선언하고 배열에 있는 값을 10진수와 주소값으로 출력

 

사용형식

 

- 정수 주소값 3개를 저장하는 배열

 

- int* arr[3];

 

 

 

 

 

 

 

 

 

#C에서의 인수 전달 방법

 

- 값에 의한 호출(call by value) : 기본적인 방법 , 함수 호출시에 변수의 값을 함수에 전달

 

- 참조에 의한 호출(call by reference) : 포인터 이용 , 함수 호출시에 변수의 주소를 함수의 매개변수로 전달

 

 

 

 

#swap() 함수

 

- 변수 2개의 값을 바꾸는 작업을 함수로 작성

 

 

 

 

 

 

 

 

#포인터를 이용한 swap() 함수

 

 

 

 

 

 

 

#scanf() 함수

 

- 변수에 값을 저장하기 위하여 변수의 주소를 받는다.

 

 

 

 

 

 

 

 

#포인터 사용의 장점

 

- 연결 리스트나 이진 트리 등의 향상된 자료 구조를 만들 수 있다.

 

- 참조에 의한 호출 : 포인터를 매개 변수로 이용하여 함수 외부의 변수의 값을 변경할 수 있다.

 

- 동적 메모리를 할당한다.

 

 

 

 

#const 포인터

 

- const를 붙이는 위치에 따라서 의미가 달라진다.

 

 

 

 

 

 

 

 

 

 

*함수 원형

 

- 함수 원형(function prototyping) : 컴파일러에게 함수에 대하여 미리 정보를 알리는 것

 

- 함수 원형의 형식 ↓

 

  반환형 함수이름 (매개 변수1 , 매개 변수2 ,~~~~);

 

Ex) int get_integer(void);                

int combination(int n ,int r);

 

 

 

#라이브러리 함수

 

- 라이브러리 함수(library function) : 컴파일러에게 제공하는 함수

 

- 표준 입출력

- 수학 연산

- 문자열 처리

- 시간 처리

- 오류 처리

- 데이터 검색과 정렬

 

 

 

#난수 함수 라이브러리

 

- 난수(random number)는 규칙성이 없이 임의로 생성되는 수이다.

 

- 난수는 암호학이나 시뮬레이션 , 게임 등에서 필수적이다.

 

 

 

 

#rand() : 난수를 생성하는 함수

            0부터 RAND_MAX 까지의 난수를 생성

 

헤더파일 : <stdlib.h> 기본 사용 : rand();

 

- 범위를 지정하여 임의의 값을 생성하는 경우 : rand() % 갯수 + 시작 수;

 

 

 

 

 

 

 

 

#srand()함수

 

- rand()함수의 초기값을 설정하는 함수

 

- srand(초기값);

 

- 매번 난수를 다르게 생성하려면 시드(seed)를 다르게 하여야 한다.

   srand((unsigned)time(NULL));

 

 

 

 

 

 

 

#time()함수


- 1970년 1월1일 0시0분0초부터 현재까지의 시간을 초단위로 제공한다.

 

- time(NULL)


- 헤더파일: time.h

 

- rand()함수의 값이 일정하지 않도록 time()을 이용하여 초기화

 

- srand(time(NULL))

 

 

 

#Sleep()함수

 

- 밀리언 초(1/1000)단위로 프로그램의 실행지연

 

- Sleep(밀리언초);  /* S는 무조건 대문자 */

 

 

system()함수
  - 콘솔창에서 사용할 수 있는 명령어를 실행시키는 함수

 

  사용형식


  system("명령어 입력");

 

  **화면을 깨끗이 지우는 명령
  system("cls");

 

  **화면을 잠깐 멈추는 명령
  system("pause");

 

  **지금위치의 폴더들을 확인명령
  system("dir");

 

 

 

 

 

 

 

 

#rand()함수를 이용하여 로또 6개 숫자 뽑아보기

 

 

 

 

 

 

 

 

 

#로또 프로그램 중복 x

 

 

 

 

 

 

 

#변수의 속성

 

- 이름 , 타입 , 크기 , 값 , + 범위 , 생존시간 , 연결

 

- 범위(scope) : 변수가 사용 가능한 범위 , 가시성

 

- 생존시간(lifetime) : 메모리에 존재하는 시간

 

- 연결(linkage) : 다른 영역에 있는 변수와의 연결 상태

 

 

 

 

#변수의 종류

 

- 지역 변수 : 함수 내에서 선언된 변수

 

  선언된 영역이 다르면 동일한 변수명을 사용할 수 있다.

 

  해당 지역을 빠져나가면 지역변수는 소멸된다.


  호출할때마다 새롭게 할당된다.

 

 

 

 

 

 

 

 

 

 

#지역변수 예제

 

 

 

 

 

 

 

 

 

- 전역 변수 : 함수 밖에서 선언된 변수

 

  프로그램이 시작하고 끝날때까지 메모리공간이 남아있는다.

 

                 자동적으로 0으로 초기화 된다.

 

                 main함수든 내가 만든 함수 안에서 자유롭게 접근이 가능하다.

 

 

 

 

 

 

 

 

 

 

#전역 변수 예제

 

 

 

 

 

 

 

 

 

#문자열 처리 라이브러리

 

 

 

 

 

 

#문자열 길이 (strlen)

 

- strlen("Hello") 는 5를 반환한다.

 

 

 

 

 

 

 

 

 

#문자열 복사 (strcpy)

 

- char dst[6];

 

- char src[6] ="Hello";

 

- strcpy(dst,src)

 

 

 

 

 

 

 

 

 

 

 

#문자열 연결 (strcat)

 

- char dst[12] = "Hello";

 

- char src[6] = "World";

 

- strcat(dst,src);

 

 

 

 

 

 

 

 

 

 

 

 

#배열 초기화 방법

 

- 1. 배열선언과 동시에 초기화


- 2. scanf()입력


- 3. strcpy() 초기화

 

 

 

 

#문자열 비교

 

 

 

 

 

 

 

 

 

#if문으로 문자열 비교

 

 

 

 

 

 

 

 

 

 

 

#strcmp로 문자열 비교

 

 

 

 

 

 

 

 

 

 

 

#수학 라이브러리 함수

 

 

 

 

 

 

- 헤더파일은 #include <math.h> 사용

 

 

 

 

#간단한 자동차 게임 만들어보기

 

 

알고리즘 : 난수 발생기를 초기화 한다.

    

for( i = 0 ; i < 주행시간 ; i++)

 

난수를 발생하여 자동차1의 주행거리에 누적한다.

 

    난수를 발생하여 자동차2의 주행거리에 누적한다.

 

    disp_car()를 호출하여 자동차1을 화면에 *표로 그린다.

 

      disp_car()를 호출하여 자동차2를 화면에 *표로 그린다.

 

 

 

 

 

 

 

 

 

#로그인 프로그램 만들어보기

 

 

 

 

 

 

 

 

 

 

#가위바위보 프로그램 만들어보기

 

 

 

 

 

 

 

 

 

 

 

#숫자 맞추는 프로그램

 

 

 

 

 

 

+ Recent posts