관리 메뉴

나구리의 개발공부기록

Chapter 02 - C언어(배열, 문자열, 구조체) 본문

2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 6강 - 프로그래밍 언어 활용

Chapter 02 - C언어(배열, 문자열, 구조체)

소소한나구리 2024. 5. 21. 22:59

2024년도 수제비 실기책(6판) 내용 정리


9. 배열

1) 배열(Array) 개념

  • 같은 자료형의 변수들로 이루어진 집합

2) 배열 종류

(1) 1차원 배열

구분 선언
초깃값이 없는 경우 자료형 배열명[배열_요소_개수];
초깃값이 있는 경우 자료형 배열명[배열_요소_개수] = {초깃값};

 

  • 배열 요소 개수에 정의된 숫자만큼 같은 자료형의 데이터 공간이 할당됨
  • 초깃값을 선언하지 않으면 쓰레깃값이 저장됨
  • 배열 요소 개수보다 적은 개수만큼 초기화 하면 초깃값이 명시되지 않은 값들은 정수형은 0, 실수형은 0.09 문자형은 NULL로 초기화가 됨
  • NULL이 아스키코드로 0이므로 결국 C언어는 배열 요소 개수보다 적은 개수만큼 초기화하면 0으로 저장된다고 보면 됨
#include <stdio.h>
int main() {
  int a[3] = {1, 2}; // int배열 a의 길이를 3으로 하고 1, 2를 초기값으로 초기화
                     // a는 1, 2, 0의 값을 가지게 되고 각 인덱스 값은 0,1,2가 됨
                     // a[0] = 1, a[1] = 2, a[2] = 0
  int i;
  
  for (i=0; i<3; i++)     // i가 3이미만까지(0,1,2 3번 수행)
    printf("%d\n", a[i]); // a[0]의값, a[1]의값, a[2]의 값을 꺼냄 
    
  return 0;
}
// 1
// 2
// 0

 

(2) 2차원 배열

구분 선언
초깃값이 없는 경우 자료형 배열명[행의 개수][열의 개수];
초깃값이 있는 경우 자료형 배열명[행의 개수][열의 개수] = {초깃값};

 

  • 행의 개수 x 열의 개수에 정의된 숫자만큼 같은 자료형의 데이터 공간이 할당 되며 마찬가지로 초기값을 선언하지 않으면 쓰레기 값이 저장됨,
  • 행의 개수, 열의 개수 보다 적은 개수만큼 초기화하면 0, 0.0, NULL 값으로 초기화 됨
#include <stdio.h>
int main() {
  int a[2][3] = {1, 2, 3, 4}; // int 타입 배열 a에 행이 2개 열이 3개인 공간을 할당
                              // 초기값으로 1, 2, 3, 4를 저장하고 나머지 공간은 0이 저장됨
                              // a[0][0] = 1, a[0][1] = 2, a[0][2] = 3
                              // a[1][0] = 4, a[1][1] = 0, a[1][2] = 0
  int i; j;
  
  for (i=0;, i<2; i++)  // 1차 반복문으로 i값을 a[i][]로 집어넣어서 행의 인덱스를 순차적으로 탐색
    for (j=0, j<3; j++) // 2차 반복문으로 j값을 a[][j]로 집어넣어서 열의 인덱스를 순차적으로 탐색
      printf("%d ", a[i][j]);
      
  return 0;
}
// 1 2 3 4 0 0 이 출력됨
// 2중 반복문이 돌면 위에 적인 배열의 인덱스 순서대로 출력됨

10. 문자열

1) 1차원 배열과 문자열

  • C언어에서는 문자열을 char형 배열로 표현함
  • 문자열을 초기화 할 때 마지막에 NULL 문자가 삽입되므로 초기화 하는 글자수보다 1이상 큰 값으로 배열을 선언(배열의 크기를 명시하지 않으면 문자열의 문자 수 + 1만큼 자동으로 생성됨)
  • printf함수에서 %s를 이용하여 문자열을 읽고 출력하는데 printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL 직전값까지 읽어서 출력함
  • 문자열에서 주소는 포인터를 배워야 이해할 수 있는 내용, scanf에서 변수에 &를 붙여도 되고, 1차원 배열에서는 대괄호를 빼고 써도 됨, ex) &a[n] = a의 n번째 값 주소, a = a의 0번째 값 주소, a+3 = a의 3번째 값 주소
#include <stdio.h>
int main() {
  char a[8] = "Hello" // char타입 a에 크기가 8인 배열을 선언 후 Hello를 저장하고 나머지 값은 NULL이 저장
  
  // a대신 &a로 a+1대신 &a[1]로 밖꿔도 결과는 동일함
  printf("%s\n", a);    // a의 0번째 주소부터 null값까지 출력, Hello
  printf("%s\n", a+1);  // a의 1번째 주소값 출력 null값까지 출력, ello
  
  a[3] = NULL;  // a의 3번재인덱스의 값을 NULL로 변경(l이 NULL로 변경됨)
  printf("%s\n", a+1); // 위와 동일하나 a[3]이 NULL이 되었으므로 el출력
  printf("%s\n", a+4); // o
}
// Hello
// ello
// el
// o

2) 2차원 배열과 문자열

  • 문자열을 여러 개 정의할 때 char형 2차원 배열을 사용
#include <stdio.h>
int main() {
  char a[2][8] = {"Hello","Soojebi"};
  //        0  1  2  3  4  5  6  7 
  // a[0] = H, e, l, l, o, NULL, NULL, NULL
  // a[0] = S, o, o, j, e, b, i, NULL 
  
  printf("%s\n", a[0]); // a의 0번째 행의 첫번째 요소부터 NULL값까지 출력
  printf("%s\n", a[1]); // a의 1번째 행의 첫번째 요소부터 NULL값까지 출력
  printf("%s\n", a[1]+3); // a의 1번째 행의 3번째 요소부터 NULL값까지 출력
  
  a[1][4] = NULL;  // 해당 위치의 값을 NULL로 변경(soojebi의 e를 NULL로 변경)
  printf("%s\n", a[1]+2); // a의 1번째 행의 2번재 요소분터 NULL값까지 출력
}

// Hello
// Soojebi
// jebi
// oj

11. 구조체

1) 구조체(Structure Type) 개념

  • 사용자가 기본 자료형을 가지도 새롭게 정의할 수 있는 사용자 정의 자료형

2) 구조체 선언

struct 구조체명{
  자료형 변수명1;
  자료형 변수명2;
}

strcut 구조체명 구조체변수();
// 구조체는 구조체변수.변수명 형태로 값을 가르킴
#include <stdio.h>
struct Student { // 구조체 선언 시작
  char gender;   // 구조체의 char타입 변수 gender 선언
  int age;       // 구조체의 int타입 변수 age 선언
}

int main() {
  // 구조체타입 변수 s를 선언하고 gender의 값을 'F', age의 값을 21로 초기화
  struct Student s = {'F', 21};
  s.gender = 'M'; // s의 gender의 값을 'M'으로 초기화
  
  printf("%c", s.gender); // M 출력(문자형태)
  printf("%d," s.age);    // 21 출력(10진 정수 형태)
  
  return 0;
}

//M21