Chapter 07
This presentation is the property of its rightful owner.
Sponsored Links
1 / 95

CHAPTER 07. 배열 PowerPoint PPT Presentation


  • 312 Views
  • Uploaded on
  • Presentation posted in: General

CHAPTER 07. 배열. 배열의 필요성과 편리성을 공부한다 . 1 차원 , 2 차원 , 다차원 배열의 선언과 사용법을 공부한다 . char 형 배열을 이용한 문자열 처리를 공부한다 . 배열을 이용한 다양한 프로그래밍을 공부한다 . 배열의 평균 구하기 배열의 최솟값 구하기 배열 정렬하기 설문 조사 결과 통계치 구하기 2 차원 행렬의 덧셈 학생 정보 조회 시스템 3 차원 배열을 이용한 텍스트 그래픽 처리. 7.0 개요 p. 254. 배열 (array) 동일한 구조의 많은 자료를 다룰 때 사용

Download Presentation

CHAPTER 07. 배열

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


Chapter 07

CHAPTER 07. 배열


Chapter 07

  • 배열의 필요성과 편리성을 공부한다.

  • 1차원, 2차원, 다차원 배열의 선언과 사용법을 공부한다.

  • char형 배열을 이용한 문자열 처리를 공부한다.

  • 배열을 이용한 다양한 프로그래밍을 공부한다.

    • 배열의 평균 구하기

    • 배열의 최솟값 구하기

    • 배열 정렬하기

    • 설문 조사 결과 통계치 구하기

    • 2차원 행렬의 덧셈

    • 학생 정보 조회 시스템

    • 3차원 배열을 이용한 텍스트 그래픽 처리


7 0 p 254

7.0 개요p. 254

  • 배열(array)

    • 동일한 구조의 많은 자료를 다룰 때 사용

      • 학생 1000명의 성적, 책 만권의 도서명, 직원 30명의 급여 등

    • 변수는 한 개의 자료를 저장하는 데 사용하므로배열은 자료 개수만큼의 변수를 모아 둔 것으로 볼 수 있다.


7 1 1 p 255

7.1 1차원 배열p.255

  • 배열이란

    • 자료형이 같은 값 여러 개를 연속된 기억장소에 같은 이름(배열명)으로 저장한 것 즉 같은 자료형의 여러 변수들을 연속적으로 모아 둔 것

  • 배열의 원소(element)

    • 배열에 포함된 값 한 개

    • 배열원소 한 개를 구분할 때는 첨자(index)를 사용

  • 배열의 차원

    • 1차원,2차원, 3차원 등의 다차원 배열

    • 배열의 첨자의 개수와 동일


7 1 1

7.1 1차원 배열

  • 일렬로 연속된 구조로 자료를 저장한 것

  • 특정 원소 한 개를 명시하기 위해 1씩 증가하는 첨자 한 개를 사용.

첨자


7 1 1 1 p 255

7.1.1 1차원 배열의 선언과 배열 원소p.255

  • int age[1000];// 1000명의 나이를 저장하기 위한 배열

  • int quiz[5]; // 5명의 퀴즈 점수를 저장하기 위한 배열

  • double average[100]; // 100명의 평균을 저장하기 위한 배열

  • char name[10];// 10개의 문자를 저장하기 위한 배열

  • 주의)

    • 배열 원소수와 상관없이 배열에 저장되는 모든 값의 자료형은 같아야 한다.

    • 배열 원소수는 배열의 크기를 의미하며 정수형 상수만 가능하다.  매크로 상수는 가능하나 int n=10; int data[n];는 에러


7 1 1 1 p 256

7.1.1 1차원 배열의 선언과 배열 원소 p.256

  • int quiz[5] = {8, 9, 10, 8, 7};// [그림 7-2] 참조

  • int sum[100] = {0};

    • {} 안의 초깃값 개수가 배열 원소수보다 적으면 나머지 원소는 0으로 초기화된다.

  • int error[] = {0, 1, 0, 2, 3, 0, 1};

    • 배열 원소수를 명시하지 않으면 {} 안의 값 개수가 배열 원소수로 결정된다. 즉 int error[7] = {0, 1, 0, 2, 3, 0, 1};과 같다.


7 1 1 1 p 2561

7.1.1 1차원 배열의 선언과 배열 원소 p.256

  • quiz[0] = 1;

  • printf("%d", quiz[1]);

  • quiz[4]++;

  • 주의) int a[3] = {21, 25, 20};으로 선언한 배열에서 세 번째 원소를 a[3]으로 참조한다면?에러는 발생하지 않으나 실제로 a[3]은 a 배열에 포함된 기억장소가 아니므로 프로그램 실행 결과를 예측할 수 없게 된다.


7 1 2 1 p 257

7.1.2 1차원 배열과 반복문 p.257

  • 배열 원소의 참조(사용)

    배열명만으로 모든 배열 원소를 한번에 입출력하거나 저장할 수 없으며, 배열 원소 단위로 입출력하거나 저장해야 한다.

    • scanf("%d", &quiz[0]);

      표준 입력 함수에서는 입력된 자료를 저장할 기억장소의 주소를 명시해야 하므로 배열 원소 앞에 ‘&’를 붙인다.

    • quiz[0] = 8; quiz[1] = 9; quiz[2] = 10; quiz[3] = 8; quiz[4] = 7;

    • printf("%d", quiz[0]);

  • 배열 원소 전체에 대한 처리

    선언과 동시에 초기화하는 경우를 제외하고는 배열명에 배열 원소를 바로 입력하거나 저장하는 것이 불가능하다.  배열 원소수가 100개라면 대입문이나 입력문을 100개 사용해야 할까?


  • 7 1 2 1 p 2571

    7.1.2 1차원 배열과 반복문 p.257

    • 배열의 편리성은

      배열 원소수와 상관없이 반복문을 이용해 편리하게 코드화할 수 있다는 것


    7 2 1 5 p 258

    7.2.1 5명 퀴즈 점수의 평균 및 평균 미만 학생 수 구하기 p.258

    • 학생 다섯 명의 퀴즈 점수를 입력받은 후, 전체 평균과 퀴즈 점수가 평균보다 낮은 학생 수를 구하고, 각 학생마다 자신의 점수와 평균 점수와의 차이를 구하여 출력하시오.

    • 퀴즈 점수 5개를 1차원 배열 quiz에 입력하기 (for문)

    • 배열 quiz의 평균을 avg에 구하기

      • 배열 quiz의 원소 5개의 합을 sum에 구하기 (for문)

      • avg← sum/5

  • 2.에서 구한 avg와 각 학생의 점수를 비교하여 학생의 점수가 더 낮을 때마다 count를 1 증가시키는 방식으로 평균 미만인 학생 수를 count에 구하기 (for문)

  • 각 학생마다 평균과의 차이 점수 quiz [i]-avg를 출력하기 (for문)


  • 7 2 1 5

    7.2.1 5명 퀴즈 점수의 평균 및 평균 미만 학생 수 구하기

    • 퀴즈 점수 5개를 1차원 배열 quiz에 입력하기 (for문)

    • 배열 quiz의 평균을 avg에 구하기

      • 배열 quiz의 원소 5개의 합을 sum에 구하기 (for문)

      • avg← sum/5

  • 2.에서 구한 avg와 각 학생의 점수를 비교하여 학생의 점수가 더 낮을 때마다 count를 1 증가시키는 방식으로 평균 미만인 학생 수를 count에 구하기 (for문)

  • 각 학생마다 평균과의 차이 점수 quiz [i]-avg를 출력하기 (for문)


  • 7 2 1 51

    7.2.1 5명 퀴즈 점수의 평균 및 평균 미만 학생 수 구하기

    퀴즈 점수 5개를 1차원 배열 quiz에 입력하기 (for문)


    7 2 1 52

    7.2.1 5명 퀴즈 점수의 평균 및 평균 미만 학생 수 구하기

    배열 quiz의 평균을 avg에 구하기

    • 3. 2.에서 구한 avg와 각 학생의 점수를 비교하여 학생의 점수가 더 낮을 때마다 count를 1 증가시키는 방식으로 평균 미만인 학생 수를 count에 구하기 (for문)


    7 2 1 53

    7.2.1 5명 퀴즈 점수의 평균 및 평균 미만 학생 수 구하기

    4. 각 학생마다 평균과의 차이 점수 quiz [i]-avg를 출력하기 (for문)


    7 2 2 p 261

    7.2.2 배열의 최솟값 구하기p.261

    • 다섯 가지 물질의 어는 점 3, 0, -30, -20, -1 중 가장 낮은 어는 점(최솟값)을 구하여 출력하시오.

    • 배열에 저장된 최솟값은 [그림 7-5]의 ①~⑤ 과정을 통해 min 변수에 구할 수 있다.

      • 1. 최솟값은 배열 원소 중 하나이므로 min을 배열의 첫 원소로 초기화한다(①).

      • 2. min이 배열 첫 원소로 초기화되어 있으므로 두 번째 원소부터 마지막 원소까지 차례로 다음 확인 과정을 반복해 최종적으로 min에 최솟값이 저장되게 한다(②~⑤).

        • 현재 min에 저장된 값과 배열 원소의 값을 비교해 min보다 더 작다면 min을 이 배열 원소의 값으로 수정한다. 이 같은 과정을 통해 현재까지 구한 min보다 작은 배열 원소 값이 나타날 때마다 min 값이 새로 수정되고, 마지막 원소까지 비교하면 min에는 배열 원소 중 최소의 값이 저장된다.


    7 2 2 p 262

    7.2.2 배열의 최솟값 구하기p.262

    • min = 배열의 첫 원소;

    • 나머지 원소에 대해 min과 비교해 작은 값으로 min을 변경하기 (for문)

    • if (min > 배열 원소)

  • min = 배열 원소;


  • 7 2 2

    7.2.2 배열의 최솟값 구하기


    7 2 21

    7.2.2 배열의 최솟값 구하기


    7 2 3 p 263

    7.2.3 설문 조사 결과 구하기p.263

    • 30명에게 5명의 연예인에 대한 선호도를 설문 조사한 결과로부터 각 연예인 번호별로 총 득표수를 구해 출력하시오.

    • 설문 조사 응답 정보를 저장하는 배열 survey는프로그램이 완성되기까지는 survey 배열을 선언하면서 초기화하여 프로그램을 실행할 때 직접 입력하는 번거로움을 없앤다

      • intsurvey[30] = {1, 3, 2, 5, 3, 2, 1, …, 1, 4, 2, 3};


    7 2 3

    7.2.3 설문 조사 결과 구하기

    • 해당 연예인의 득표수 누적

      • 설문 조사 응답이 3이라면 3번 연예인의 득표수를 1 증가시켜야 한다.

      •  vote[3]++

      • 응답자가 답한 연예인 번호 3은 survey 배열에 저장되어 있으므로  survey[i]가 3일 때 vote[survey[i]]++;로 표현할 수 있다.

    • 각 연예인의 득표수를 저장하는 배열 vote

      • - 해당 연예인의 번호와 첨자를 통일하기 위해 6개의 원소를 갖는 배열로 선언

      • - 각 원소는 득표수를 누적하기 위해 0으로 초기화


    7 2 31

    7.2.3 설문 조사 결과 구하기


    7 2 32

    7.2.3 설문 조사 결과 구하기


    Chapter 07

    연습문제 7-8

    • 열 가지 물질의 어는 점 15, 0, -20, -30, 50, -5, -120, -5, 10, -12를 freeze 배열에 저장한 후 가장 높은 어는 점(최댓값)을 구하여 다음과 같이 출력하시오.

    • [힌트]

      • - 배열에 저장된 값 중에서 최솟값을 구하는 7.3을 참고하여 최댓값 max를 구한다.

      • - 배열의 최댓값에 해당하는 배열 원소의 첨자 index를 구하기 위해 max를 배열의 첫 원소로 초기화할 때 index 또한 첫 원소의 첨자 0으로 초기화한다. 그 다음 max와 배열 원소의 값을 차례대로 비교할 때 max가 새로운 배열 원소 값으로 바뀔 때마다 index 또한 이 배열 원소의 첨자로 수정한다.


    Chapter 07

    연습문제 7-9

    • 표준편차는 각 자료들이 평균에 얼마나 근접하게 분포되어 있는지 알려주는 값으로 표준편차가 0이라면 모든 자료가 동일한 값임을 의미한다. 실행 결과와 같이 5개의 자료에 대해 표준편차를 구하여 출력하시오.

    • [힌트]

      • sum의 제곱근은 sqrt(sum)

      • 표준편차 std_D = sqrt(sum);

      • sqrt함수를 사용하려면 #include <math.h>를 프로그램에 추가해야 한다. printf 함수를 사용하기 위해서 #include <stdio.h>를 포함하는 것과 같은 의미이다.


    7 2 4 p 264

    7.2.4 버블 정렬(오름차순)p.264

    • 정렬(sort)

      • 프로그램에서가장 많이 처리하는 기능 중 하나

        • 도서명을 가나다순으로 정렬하기

        • 도서를 최근 출판년도 순으로 정렬하기

        • 수능 성적을 내림차순으로 정렬하기

        • 주소록의 이름을 가나다순으로 정렬하기 등

      • 원소수 증가 시 실행 시간이 급격히 증가(원소수의 제곱에 비례)하는 문제 발생실행 시간을 줄이기 위해 많은 정렬 알고리즘이 개발되었다.그 중 하나로 아주 빠른 ‘퀵 정렬’이 있지만 알고리즘 자체가 쉽지 않다.여기서는 가장 단순한 버블 정렬 알고리즘을 소개한다.


    7 2 4 p 2641

    7.2.4 버블 정렬(오름차순)p.264

    • 버블 정렬(bubblesort)

      • 버블 정렬의 원리

        • 이웃하는 두 원소씩 차례대로 정렬하는 작업을 반복함으로써 배열 전체를 정렬 

          [그림 7-6]처럼 이웃하는 두 원소를 정렬하는 과정을

          [그림 7-7]과 같이(배열 원소수-1)만큼 반복한다.


    7 2 4

    7.2.4 버블 정렬(오름차순)

    • 두 변수의 값을 교환하기: 잘못된 예p.266

       x와 y 둘 다 y의 값이 저장된다.

    • 눈으로 보기에는 2행과 3행의 x가 같은 변수명이지만 실제의 값은 상황에 따라 달라진다.

    • 2행에서 x의 값이 1로 수정됨으로써 x의 원래 값 3이 사라졌고, 현재 x에 저장된 1이 새로 저장된다.


    7 2 41

    7.2.4 버블 정렬(오름차순)

    • 두 변수의 값을 교환하기: 바른 방법p.267

      x의 값을 수정하기 전에 임시 저장소에 보관


    7 2 4 p 265

    7.2.4 버블 정렬(오름차순)p.265


    7 2 4 p 266

    7.2.4 버블 정렬(오름차순)p.266


    P 267

    p.267


    7 2 4 7 4 p 268

    7.2.4 버블 정렬(오름차순): [프로그램7-4]의 개선p.268


    7 2 4 7 4 p 2681

    7.2.4 버블 정렬(오름차순): [프로그램7-4]의 개선p.268

    • 불필요한 비교를 제거하기 위한 repeat와 i의 상관관계 분석

      • repeat가 1 i가 0~3일 때까지 a[i]와 a[i+1]을 비교 (a[0],a[1]) (a[1],a[2]) (a[2],a[3]) (a[3],a[4])

      • repeat가 2 i가 0~2일 때까지 (a[0],a[1]) (a[1],a[2]) (a[2],a[3])

      • - repeat가 3  i가 0~1일 때까지 (a[0],a[1]) (a[1],a[2]))

      • repeat가 4  i가 0~0일 때까지 (a[0],a[1])

    • repeat가 1씩 증가할 때마다 i의 마지막 값은 1씩 감소

      •  12행의 for문을 for (i=0; i<SIZE-repeat; i++)로 수정하면불필요한 비교를 제거할 수 있다.


    7 2 4 7 4

    7.2.4 버블 정렬(오름차순): [프로그램7-4]의 개선


    7 2 4 7 5 p 270

    7.2.4 버블 정렬(오름차순): [프로그램7-5]의 개선p.270

    • 최적화한 버블 정렬 프로그램p.270

      • [프로그램 7-5]는 아직까지 개선할 내용이 있다.

        b[5] = {1, 2, 3, 5, 4};라면?

        • 그러나 [프로그램 7-5]는 무조건 repeat가 2일 때부터 4일 때까지 계속 안쪽 for문을 실행함 배열이 완전히 정렬된 상태라면 더 이상 바깥 for문을 실행하지 않게 하자.


    7 2 4 7 5

    7.2.4 버블 정렬(오름차순): [프로그램7-5]의 개선

    • 배열의 정렬 완료 여부를 어떻게 알 수 있을까?

      • 안쪽 for문에서 두 원소 간의 교환이 발생했다.

         두 원소가 정렬되지 않았기 때문이므로 아직 정렬 완료 여부를 알 수 없다.

      • 안쪽 for문에서 이웃 원소 간의 교환이 발생한 적이 없다

        • 정렬이 완료된 상태기 때문이므로 정렬 작업을 끝낸다.

    • 플래그(flag) 변수

      • 프로그램에서 특정 상태를 표시하고 상태 변화를 확인하는 데 사용하는 변수

        예) 정렬이 완료된 상태인지 아닌지, 두 원소 간에 값의 교환이 발생했는지 아닌지, 입력이 완료되었는지 아닌지를 표시 또는 확인


    7 2 4 7 51

    7.2.4 버블 정렬(오름차순): [프로그램7-5]의 개선

    • 버블 정렬에서 플래그 변수의 사용법

      • 안쪽 for문 시작 전에 두 원소 간의 교환이 발생한 적이 없는 상태를 나타내게 함  swap = ‘N’;

      • 안쪽 for문에서 두 원소의 교환이 일어난다면 상태 변화를 저장 swap = ‘Y’;

      • 안쪽 for문을 마쳤을 때 swap의 값이 ‘N’ 그대로라면 교환이 일어난 적이 없으므로 정렬이 완료되었다는 뜻이다. 따라서 더 이상 정렬 과정을 진행하지 않고 break를 통해 바깥 for문을 완전히 끝낸다. if(swap == ‘N’) break;


    7 2 4 7 5 p 271

    7.2.4 버블 정렬(오름차순): [프로그램7-5]의 개선 p.271


    7 2 4 7 52

    7.2.4 버블 정렬(오름차순): [프로그램7-5]의 개선


    7 3 2 p 272

    7.3 2차원 배열p.272

    • 2차원 배열

      • 1차원 배열이 여러 개 모인 배열

      • 표 형태의 구조로 표현되는 자료들을 저장하는 데 사용


    7 3 2 p 2721

    7.3 2차원 배열p.272


    7 3 1 2 p 273

    7.3.1 2차원 배열의 선언과 배열 원소p.273

    • 2차원 배열의 선언

      • 전체 행의 개수를 먼저 명시하고 그 다음에 각 행에 들어 있는 열의 개수를 명시

      • 배열에 저장되는 모든 값의 자료형이 같아야 한다.


    7 3 1 2 p 2731

    7.3.1 2차원 배열의 선언과 배열 원소p.273


    7 3 1 2 p 2732

    7.3.1 2차원 배열의 선언과 배열 원소p.273


    7 3 2 2 p 273

    7.3.2 2차원 배열과 반복문p.273

    • 배열 원소 처리

      • 2차원 배열도 입출력이나 대입문에서 배열 원소 단위로 처리해야 한다.

      • 2차원 배열은 1차원 배열의 배열이므로 일반적으로 이중으로 중첩된 반복문으로 처리한다.


    7 3 2 2 p 274

    7.3.2 2차원 배열과 반복문p.274

    첫 행

    둘째 행


    7 3 3 2 p 275

    7.3.3 2차원 배열의 입력: 행 단위 입력과 열 단위 입력p.275

    • 2차원 배열의 입력

      학생들의 여러 과목 점수를 과목별로 입력하거나 학생별로 입력하는 것처럼 [그림 7-16]의 (a)처럼 한 행씩 차례로 입력하거나 (b)처럼 한 열씩 차례로 입력할 수 있다.


    7 3 3 2 p 2751

    7.3.3 2차원 배열의 입력: 행 단위 입력p.275

    한 행을 입력받을 때 행 첨자는 같고 열 첨자만 변한다.


    7 3 3 2 p 276

    7.3.3 2차원 배열의 입력: 열 단위 입력p.276

    같은 열의 배열 원소를 입력받을 때 원소의 열 첨자는 같고 행 첨자만 변한다.


    7 4 1 p 277

    7.4.1 행렬의 덧셈p.277

    • 2행 3열의 두 행렬 A와 B를 더한 결과인 행렬 C를 구해서 출력하시오.

    • 행렬은 행과 열 수가 같아야 덧셈이 가능하므로 세 행렬 A, B, C 모두 동일한 크기의 2차원 배열을 이용한다.

    두 행렬의 각 대응 성분의 합이 결과 행렬의 성분이 되며 2차원 배열을 이용하므로 중첩 for문으로 표현한다.


    7 4 1

    7.4.1 행렬의 덧셈

    • 2차원 배열 A에 행렬 A를 행 단위로 입력받기(중첩 for문)

    • 2차원 배열 B에 행렬 B를 행 단위로 입력받기(중첩 for문)

    • 두 행렬 A와 B를 합하여 결과 행렬 C를 구하기 (중첩 for문)

      • C[i][j] = A[i][j] + B[i][j] (i = 0~1, j = 0~2)

    • 결과 행렬이 저장된 배열 C를 출력하기 (중첩 for문)


    7 4 11

    7.4.1 행렬의 덧셈


    7 4 12

    7.4.1 행렬의 덧셈


    7 4 13

    7.4.1 행렬의 덧셈


    7 5 1 char 1

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열 상수

      • “ ”로 묶어 놓은 연속된 문자들: “Seoul”, “Korea”, “Hong Gil Dong”

      • 문자열의 끝에는 널(null)이라는 ‘\0’으로 표현하는 문자가 포함된다.

         문자열 상수는 기억장치에서 (“ ” 안의 문자수+1) 바이트로 표현된다.


    7 5 1 char 11

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • char형 변수는 문자 상수 즉 한 개의 문자만 저장할 수 있으므로 여러 개의 문자를포함한 문자열 상수를 저장하려면 char형 1차원 배열을 이용해야 한다.


    7 5 1 char 12

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열을 저장할 배열 선언

      • 배열의 크기를 정할 때 문자열에 포함된 문자의 수보다 최소한 한 개 이상 더 많게 지정해야 한다  널문자 ‘\0’을 배열에 저장하기 위해

      • 예)

        • char c[6];

          널문자를 제외한 최대 5개의 문자를 저장할 수 있는 배열

        • char c[6] = {'S', 'e', 'o', 'u', 'l'};

          선언과 동시에 초기화 시 원소가 char형이므로 {} 안에 문자 상수를 명시한다.

        • char c[6] = "Seoul";

          문자열일 경우에는 초깃값을 문자열 상수 그대로 표현할 수 있다.


    7 5 1 char 13

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • scanf/printf를 이용한 문자열의 입출력

      • 문자열 출력 또는 입력 시엔 배열명만 사용

      • 배열명 자체가 배열의 시작 주소이므로 입력 시 배열명 앞에 &를 사용할 필요가 없다.  &를 사용하면 오히려 결과를 예측할 수 없어짐

    &를 사용하지 않는다.


    7 5 1 char 14

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열 전용 입력 함수 gets

      • 엔터키를 입력할 때까지의 모든 문자를 배열에 저장하므로공백을 포함한 문자열을 입력받을 수 있다.

        주) scanf 함수는 C 언어의 공백 문자(공백키, 탭키, 엔터키) 이전까지의 문자들만 문자열로 저장됨 ‘Hong Gil Dong’을 입력하고 엔터키를 입력하면 name에는 “Hong”만 저장됨


    7 5 1 char 15

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열 전용 출력 함수 puts

      • 문자열을 출력한 후 언제나 행을 바꾼다.

      • 주) printf 함수에서 %s를 이용해 문자열을 출력할 때는 문자열에 포함된 공백 문자들을 출력할 수 있다.


    7 5 1 char 16

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열에 포함된 문자의 처리

      문자는 char형 배열에 저장된 원소에 해당하므로 배열명과 첨자를 이용해 다음과 같이 처리한다.

    주) char형 배열의 특정 원소의 값을 직접 입력받을 때는 scanf(“%d”, &id[6]); 처럼 원소의 주소를 구하기 &를 사용해야 한다.


    7 5 1 char 17

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    • 문자열의 끝을 의미하는 널문자의 중요성

      • 만일 배열에 널문자가 포함되어 있지 않다면 어떻게 될까?

      • 문자열 출력 원리

        문자열이 저장되어 있는 첫 기억장소부터 차례대로 저장된 문자를 출력하되 문자열의 끝을 의미하는 널문자를 만날 때까지 출력한다.

         배열 안에 널문자가 포함되지 않았다면 배열의 영역을 벗어나 계속 출력하므로 현재 기억장소의 상태에 따라 출력 결과가 달라진다.


    7 5 1 char 18

    7.5.1 char형 1차원 배열을 이용한 문자열 처리

    현재 book 배열의 마지막 원소인 book[4]가 널문자가 아니므로 널문자를 만날 때까지 계속 출력하여 엉뚱한 문자가 출력된다.


    7 5 2 char 2

    7.5.2 char형 2차원 배열을 이용한 여러 개의 문자열 처리

    해당 행에 저장된 문자열을 의미하며,

    실제로는 해당 행의 시작 주소이다.


    7 5 2 char 21

    7.5.2 char형 2차원 배열을 이용한 여러 개의 문자열 처리


    Chapter 07

    7.6 프로그래밍 실습


    7 6 1

    7.6.1 학생 정보 출력하기

    • 사용자로부터 학교명, 학번, 이름을 입력받은 후 ‘우리대학교 12학번 홍 길동’과 같이 그 정보를 한 행으로 출력하시오.

    • 이름

      • 영어의 알파벳이나 일반 문자들은 1바이트의 코드로 표현할 수 있지만 한글 한 자는 두 바이트로 표현해야 한다.

      • - “제갈공명”과 같이 이름이 넉 자인 문자열을 저장하려면 열 크기를 널문자를 포함해 9로 지정해야 한다.


    7 6 11

    7.6.1 학생 정보 출력하기

    • 학번

      • - 문자열로 취급하면 원하는 위치의 문자를 쉽게 뽑아올 수 있으므로 편리한 점이 많으므로 문자열로 처리한다.


    7 6 12

    7.6.1 학생 정보 출력하기


    7 6 13

    7.6.1 학생 정보 출력하기


    7 6 2

    7.6.2 학생 정보 조회 시스템

    • 학생 10명에 대한 이름, 전화번호, 평점이 저장된 배열로부터 학생의 이름을 입력하면 그 학생의 이름, 전화번호, 평점을 조회하여 출력하는 학생 정보 조회 시스템을 만드시오.

      • 배열에서 입력한 학생 이름을 찾지 못하면 그런 학생이 존재하지 않는다는 메시지를 출력하기

      • 입력한 학생의 이름이 배열에 두 개 이상이면 이들 모두의 정보를 표시하기

    • 학생들의정보 저장

      • 미리 만들어진 데이터베이스나 파일에서 읽어 배열에 저장하지 않고 단순화를 위해 프로그램 안에서 배열을 선언하면서 [그림 7-25]와 같이 정해진 값으로 초기화한다.

      • 학생의 이름은 한글 2~4자  char name[10][9]

      • 전화번호는 -를 포함하여 12~13자 phone[10][14]

      • 학생의 평점은 실수값 double grade[10]


    7 6 21

    7.6.2 학생 정보 조회 시스템

    문자열이 저장된 배열의 행 첨자와 평균이 저장된 1차원 배열의 첨자가 동일하면 같은 학생에 대한 정보에 해당한다.

    즉 첫 번째 학생의 이름은 name[0]에, 전화번호는 phone[0]에, 평점은 grade[0]에 저장된다.


    7 6 22

    7.6.2 학생 정보 조회 시스템

    • 사용자가 정보를 찾고 싶은 학생의 이름

      • 문자열 1개므로 char who[9]

    • 조회의 성공 여부 확인

      • 조회된 인원수를 확인하기 위해 카운터 cnt를 이용한다.

      • 조회를 시작하기 전에 cnt를 0으로 초기화한 후 해당 학생을 찾을 때마다 cnt를 1씩 증가시킨다. 모든 학생을 검사한 후에도 cnt가 0이면 찾지 못했다는 뜻이므로 적절한 안내문을 출력한다.

    • name 배열에서조회할 이름(who) 찾기

      • 수치 자료에 대해서는 if (cnt == 0)과 같이 == 연산자로 동일 여부를 확인할 수 있지만 문자열에 대해서는 if (name[0] == who)로 사용할 수 없다.

      •  strcmp함수를 이용해야 한다.


    7 6 23

    7.6.2 학생 정보 조회 시스템

    • •strcmp(문자열1, 문자열2)

      • - #include <string.h>가 필요

      • 문자열 처리를 위해 C 언어에서 제공하는 라이브러리 함수

      • 사전적 순서에 의해 앞에 나오는 문자열이 작은 문자열이 된다.

      • 반환값: 크기 비교에 의해 세 개중 한 개

        • ① ‘문자열1==문자열2’ 두 문자열이 동일한 문자열이라면 0을 반환

        • ② ‘문자열1 < 문자열2’ 사전적 순서로 문자열1이 사전에서 먼저 나타난다면 음수(-1)를 반환

        • ③ ‘문자열1 > 문자열2’ 문자열1이 문자열2보다 사전에서 더 뒤에 나타난다면 양수(1)를 반환


    7 6 24

    7.6.2 학생 정보 조회 시스템

    • 예)

      • strcmp("apple", "apple") → 0

    • strcmp("apple", "banana") → apple이 banana보다 먼저이므로 -1

    • strcmp("apple", "age") → 1

    • strcmp("010", "011") → -1

    • char str1[6] = "Daegu", str2[6] = "Seoul“;

    • if (strcmp(str1, str2) == 0)

      • printf("두 문자열은 똑같습니다.");

    • else

      • printf("두 문자열은 서로 다릅니다.");


    7 6 25

    7.6.2 학생 정보 조회 시스템

    • 정보를 조회하고 싶은 학생의 이름을 who 배열에 입력받기

    • name 배열에 저장된 모든 문자열에 대해 다음을 반복하기 (for문)strcmp함수를 이용하여 name[i]와 who에 저장된 문자열이 동일한지 확인한 후 동일한 문자열이라면

      • - cnt를 1 증가하기

      • - 해당 학생의 정보 즉 name[i], phone[i], grade[i]를 출력하기

    • cnt를 확인하여 0이라면 해당 학생의 정보 조회가 실패하였음을 표시하고 그렇지 않다면 몇 명의 학생을 찾았는지 표시한다.


    7 6 26

    7.6.2 학생 정보 조회 시스템


    7 6 27

    7.6.2 학생 정보 조회 시스템


    7 6 28

    7.6.2 학생 정보 조회 시스템


    7 7 3

    7.7 3차원 배열

    • 3차원 배열: 표 형태의 자료가 여러 개 있을 때 사용


    7 7 31

    7.7 3차원 배열

    • 3차원 배열의 처리

      • 3중 중첩 반복문이 많이 사용된다.


    7 7 32

    7.7 3차원 배열


    Chapter 07

    7.8 프로그래밍 실습


    7 8 1 3

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리

    • 모니터는 M×N개의 픽셀(해상도를 의미)로 구성

    • 각 픽셀마다 특정 색을 표시해 화면에 그림이나 글자를 표시

    • 비주얼C++의 실행 창을 이용한 텍스트 그래픽 처리

      • 결과 창이 25줄×79칸으로 구성된다면 이 결과 창에는 최대 25줄을 출력할 수 있으며,한 줄에는 최대 79개의 문자를 출력할 수 있다.

      • 한글 한 글자와 ★, ■, ◈와 같은 특수 기호는 두 칸을 차지

    • 그림 7-27숫자 3을 5줄Ⅹ6칸에 ■를 이용하여 표시한 예

      • - 이 텍스트 그래픽은 5행 7열의 이차원 배열에 저장할 수 있다.

      • - 마지막 열은 문자열의 끝을 나타내는 널문자를 저장하기 위한 것이다.


    7 8 1 31

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리

    • 사용자가 입력한 1~5 중 하나의 정수를 텍스트 그래픽을 이용해 확대 출력하시오.

    5개의 각 면마다 확대 출력할 숫자의 텍스트 그래픽을 위한 문자열들을 저장

    각 행의 문자열 끝에 널문자를 넣기 위해 열의 개수를 1 더 크게 지정


    7 8 1 32

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리

    • 숫자 n의 확대 출력

      • 확대한 텍스트 그래픽이 들어 있는 면의 첨자는 n-1이다.

        • no[0]에는 1, no[1]에는 2의 텍스트 그래픽이 저장되어 있다.

    • 특정 면의 각 행에 저장된 문자열을 출력하면 확대된 숫자가 화면에 표시됨

      • no는 char형 3차원 배열이므로 면과 행에 대한 첨자만 사용하면 해당 행에 저장된 문자열을 출력할 수 있다.

    • (0+1)번째 면의

    • (0+1)행의

    • 문자열 “ ■ ”를 의미


    7 8 1 33

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리

    숫자 3의확대 텍스트 그래픽을 위한 면


    7 8 1 34

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리


    7 8 1 35

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리

    • [프로그램 7-12]

      • [프로그램 7-11]의 3차원 배열 대신 2차원 배열 5개를 사용하도록 수정한 것

      • 2차원 배열의 면 첨자를 활용할 수 없으므로 19~35행과 같이 switch문을 사용해야 한다.


    7 8 1 36

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리


    7 8 1 37

    7.8.1 3차원 배열을 이용한 텍스트 그래픽 처리


  • Login