최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

Download Report

Transcript 최신 C 프로그래밍 언어 문제해결에서 프로그래밍까지

최신 C 프로그래밍 언어
문제해결에서 프로그래밍까지
개정판
7장 : 배열과 문자열
도서출판 - 인터비젼
1
7장 배열과 문자열

학습목표




1.
2.
3.
4.
배열의 의미와
배열의 초기화
문자열에 대해
다차원 배열과
특징에 대해 이해한다.
및 입력방법을 이해한다.
이해한다.
활용에 대해 이해한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2
목차

7장 배열과 문자열
 예습시간
–
–
–
–
–
–
1. 배열의 기본 개념
[기초다지기] 배열의 기본 개념 이해하기
2. 문자열 관련 함수들
[기초다지기] 문자열 함수 이용하기
3. 다차원 배열의 이해
[기초다지기] 다차원 배열 이해하기
 실습시간
– 다차원 배열 활용
– 문자열 배열과 관련 함수
 연습시간
– 배열의 특징 분석
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
3
예습시간 – 1 교시
배열의 기본 개념
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
배열의 기본 개념

학습 개요
 배열의 개념에 대해 이야기한다.
 배열의 선언과 초기화 방법에 대해 다룬다.
 1차원 배열과 문자열에 대해 알아본다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
5
배열의 기본 개념

배열의 기본 개념
 배열은 동일한 유형의 데이터들의 집합으로 동일한
유형의 많은 데이터 처리를 위해 사용된다.
 일반 변수의 문제점
– 프로그램 내의 동일한 유형의 많은 변수를 각기 다른 이름으로
사용 시 변수를 조작하는데 많은 어려움 존재
 배열의 선언 형식
– [기억클래스] 데이터형 배열명[배열의크기][배열의크기][…]
»
»
»
»
기억 클래스 : 배열이 저장될 메모리상의 위치 및 특징, 생략가능
데이터형 : 배열에 저장될 값의 유형
배열명 : 배열을 나타내는 대표멍
[배열의크기]
 배열에 포함될 요소의 수
 1개일 경우 1차, 2개일 경우 2차원 배열이 된다.
 첨자로 접근.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
6
배열의 기본 개념

1차원 배열




선형 리스트 구조를 가지며, 첨자의 개수가 하나인 배열
물리적으로 연결된 구조
선언 예> int array[10];
메모리 구조
array (배열의 대표명)
array[0]
array[1]
array[2]
array[3]
array[4]
array[5]
array[6]
array[7]
array[8]
array[9]
– 배열의 대표명
» 배열이 저장된 대표 주소의 의미
» 배열의 각 요소는 첨자를 통해 접근 (예 3요소 : array[2])
» 첨자는 0부터 [배열의 수 -1]값 까지 표현
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
7
배열의 기본 개념

1차원 배열 활용 예








01 #include <stdio.h>
02 void main(){
03
int array[5]; // 5개의 정수형 배열 선언
04
int index;
05
for(index =0 ; index < 5; index ++){
06
array[index] = 0; // 첨자를 통한 각 요소 접근
07
}
08 }
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
8
배열의 기본 개념

1차원 배열의 선언과 초기화
 C언어는 배열의 선언과 동시에 초기값을 할당하는 방법을 제공
 선언과 초기화의 예
– static int array[5]={1,2,3,4,5};
– 메모리 구조
array
1
2
3
4
5
array[0]
array[1]
array[2]
array[3]
array[4]
 일반적으로 선언과 동시에 초기화 가능한 배열은 static과 extern
기억클래스 형태의 배열이다.
 auto 배열은 선언과 동시에 초기화 할 수 없기 때문에 각 요소 별로
값을 할당해 주어야 한다.
 배열의 선언과 초기화가 동시에 이루어질 경우 첨자의 값 생략 가능
이때 초기값의 개수에 의해 자동적으로 배열 크기 결정됨
– static int array[]={10,20,30,40,50,60};
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
9
배열의 기본 개념

배열의 선언과 초기화의 예
구분
지역
배열
변수
기억클래스
auto,
register
또는 생략
static
extern
생략
전역
배열
변수
static
extern
사용 예
사용 여부 설명
int array[3]={1,2,3}
//사용불가
auto, register 또는 생략형 기억클래스를 가진 지
역 배열은 초기화 할 수 없다.
static int array[5]={1,2}
정적으로 선언된 지역 배열 변수는 초기값을 할당
할 수 있다. 또한 배열의 크기보다 초기 값의 수가
적을 경우 앞에서부터 채워지고 나머지는 0으로
설정된다.
char array[5]={'A','B','C'}
전역 배열 선언에서 기억클래스의 생략은 static으
로 간주되어지기 때문에 초기값 할당이 가능하다.
static float array[]={1.0,2.0}
전역 변수에 기억 클래스를 포함할 수 있으며 첨자
생략 시 초기화 값의 개수에 의해 배열의 크기 결
정
static int array[3]={1,2,3,4}
//잘못된 사용
이 배열의 초기화는 배열의 요소가 3개이지만 값
을 4개로 초기화 하고자 하기 때문에 에러를 발생
한다.
※ 일부 컴파일러는 auto 변수에 대한 지역 배열의 초기화 값 설정 기능을 제공한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
10
배열의 기본 개념

배열의 요소에 값 할당
 프로그램 과정 중 언제든지 배열의 각 요소에 값을 할당
할 수 있다.
 배열의 요소에 값 할당은 첨자를 통해 이루어진다.
 첨자를 포함한 배열은 일반변수와 같은 의미를 가진다.
 사용 예
01 int data[10];
02 data[0] = 30;
03 data[9] = 20;
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
01 int data[10];
02 scanf("%d", &data[5]);
11
배열의 기본 개념

문자열
 문자배열 : 문자형 데이터 값이 배열로써 존재
 문자열 : 문자 배열 끝에 NULL('\0') 문자를 포함하는 배열
 문자배열과 문자열의 관계
문자 배열
선언 예
저장 형태
문자열
char str[5]={'H','A','P','P','Y'};
H
A
P
P
Y
char str[6]="HAPPY";
H
A
P
P
Y
\0
 문자열은 ""을 통해 값을 할당할 수 있다.
 마지막에 NULL('\0')문자가 추가되므로 항상 문자열의 크기는
글자수 + 1을 가진다.
 문자열 역시 선언과 초기화 과정이 동시에 일어날 경우 배열의
크기를 생략할 수 있다. 예> char str[]="good day";
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
12
배열의 기본 개념

문자열
 scanf()함수를 사용한 문자열 입력 시
– 키보드를 통해 문자열을 입력 받기 위해서는 %s의 형식 지정
문자를 사용한다.
– 입력 데이터가 문자의 배열이기 때문에 문자열 대표 이름을 통해
입력 받는다.
 사용 예
– 01
– 02
char input[80];
scanf("%s",input);
– 배열의 크기가 80이므로 79자까지의 문자열의 입력이 가능하다.
배열의 마지막 문자는 자동적으로 NULL('\0')문자로 채워진다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
13
[기초다지기] 배열의 기본 개념 이해하기

1. 1차원 배열의 선언, 초기화 그리고 할당 과정
#include <stdio.h>
void main(){
int i;
static int odd[5]={1,3,5,7,9};
static int even[]={2,4,6,8,10};
int array[10],j=0,k=0;
for(i=0;i<10;i++){
if(i % 2 == 0){
array[i] = odd[j];
j++;
}else{
array[i]= even[k];
k++;
}
}
printf("array[10]= {");
for(i=0;i<9;i++){
printf("%d, ",array[i]);
}
printf("%d}\n",array[i]);
}
array[10]={1,2,3,4,5,6,7,8,9,10}
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
14
[기초다지기] 배열의 기본 개념 이해하기

1. 1차원 배열의 선언, 초기화 그리고 할당 과정

분석
 홀수 값을 가진 odd와 짝수 값을 가진 even 배열을
하나의 array배열에 담는 프로그램
 odd와 even 배열을 초기화하기 위해 static 타입의
정수형 배열 변수를 선언
 even[]은 초기화 개수에 의해 자동적으로 5개의 배열
공간이 할당
 for문에서 0에서 9까지 10번 반복하면서 홀수의 값은
0,2,4...와 같은 인덱스 값에 저장
 짝수 값은 1,3,5,... 인덱스의 위치에 저장
 배열의 인덱스가 0에서부터
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
15
[기초다지기] 배열의 기본 개념 이해하기

2. 문자 배열과 문자열에 대해 이해하자.
#include <stdio.h>
void main(){
int i;
static char str1[7]={'Y','E','L','L','O','W','\0'};
static char str2[6]="GREEN";
printf("문자 배열 요소로 출력하기\n");
for(i=0;str1[i]!='\0';i++){
문자 배열 요소로 출력하기
printf("str1[%d] = %c \n",i,str1[i]);
str1[0] = Y
}
str1[1] = E
for(i=0;str2[i]!='\0';i++){
str1[2] = L
printf("str2[%d] = %c\n",i,str2[i]);
str1[3] = L
}
str1[4] = O
printf("문자열로 출력하기\n");
str1[5] = W
printf("str1 = %s \n",str1);
str2[0] = G
printf("str2 = %s \n",str2);
str2[1] = R
}
str2[2] = E
str2[3] = E
str2[4] = N
문자열로 출력하기
str1 = YELLOW
str2 = GREEN
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
16
[기초다지기] 배열의 기본 개념 이해하기


2. 문자 배열과 문자열에 대해 이해하자.
분석
 두 개의 문자열 선언
 첫 번째 문자열
– 문자 요소단위로 각 배열에 저장하고 마지막에
NULL('\n')문자를 입력
 두 번째 문자열
– 문자열로 저장
 출력방법
– 각 요소로 출력할 수 있으며 문자열로 출력 가능
– 첫 번째/ 두번째 for문 : 각 요소별로 출력
– printf함수 : %s를 통해 문자열로 출력
» %s에 매칭되는 것은 배열의 대표명이며 NULL('\0')문자를 만날
때까지 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
17
예습시간 – 2 교시
문자열 관련 함수들
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
18
문자열 관련 함수들

학습 개요
 문자열은 프로그램에서 빈번하게 사용되는 요소이다.
 문자열의 효율적인 사용을 위해 필요한 문자열 관련 표준
라이브러리 함수들에 대해 알아본다.
 문자열 관련 함수 종류
–
–
–
–
문자열 비교
길이 구하기
복사 및 문자 형태 변환
문자열 연결
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
19
문자열 관련 함수들

문자열 함수의 사용
 문자열 함수의 종류
–
–
–
–
–
문자열 비교
길이 구하기
문자열 복사
두 문자열 연결
문자열의 값 반환
 문자열 관련 함수는 모두 string.h 헤더파일에 포함되어
있다.
 문자열 함수를 사용하기 위해서는 이 스트링 관련 헤더
파일을 프로그램에 다음과 같이 선언해야 한다.
– #include <string.h>
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
20
문자열 관련 함수들

두 문자열 비교 함수 (strcmp, strncmp)
 이 함수는 ASCII 코드 값에 의해 두 문자열의 크기를
비교한다.
 사용 형식
– 1) int strcmp(str1,str2)
» 두 문자열을 비교 하여 정수 값의 결과를 변환
» 반환 결과
 양수
 0
 음수
: str1 > str2
: str1 == str2
: str1 < str2
– 2) int strncmp(str1,str2,n)
» 1의 형식과 동일하지만 3번째 인자 n 값을 포함
» n은 몇 번째 문자까지 비교 대상으로 할 것인지를 설정
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
21
문자열 관련 함수들

두 문자열 비교 함수 (strcmp, strncmp)
 사용 예
–
–
–
–
–
–
–
–
–
–
#include <stdio.h>
string.h
#include <①_______________>
void main(){
int result1,result2;
static char string1[] = "hello world";
static char string2[] = "hello c";
result1 = strcmp(string1, string2);
result2 = strncmp(string1, string2, 5);
printf("result1 = %d , result2 = %d \n", result1,result2);
}
– 실행결과 : result1 = ②_________,
result2 = ③____________
1
0
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
22
문자열 관련 함수들

문자열의 길이 얻기 (strlen)
 문자열의 크기를 얻어온다.
 형식
– int strlen(str)
 사용 예>
–
–
–
–
–
–
–
–
–
#include <stdio.h>
#include <string.h>
void main(){
char buffer[80];
int length;
buffer = "Today is good";
length= strlen(buffer);
printf(" %s의 길이는 %d 이다. \n", buffer, length);
}
Today is good
13
– 실행 결과는 “________________의
길이는 ________이다.”
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
23
문자열 관련 함수들

문자열의 처리 (strcpy, strcat, strlwr, strupr)
 문자열 처리는 문자열 복사, 연결, 대소문자 변환 함수를
포함
 strcpy 함수
– 문자열 복사
– 한 문자열을 다른 문자열로 복사
– 형식 : strcpy(str1,str2)
» str2의 문자열을 str1에 복사한다.
» str1은 str2의 공간보다 크거나 같아야 한다. 그렇지 않을 경우
잘림현상
 strncpy 함수
– strcpy함수와 동일하지만 복사할 문자열의 크기를 지정할 수
있다.
– 형식 : strncpy(str1,str2,n)
» str2의 n개의 문자를 복사하여 str1에 저장
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
24
문자열 관련 함수들

문자열의 처리
 strcpy와 strncpy 사용 예
–
–
–
–
–
–
–
–
–
–
#include <stdio.h>
#include <string.h>
void main(){
static char target[80], two[40];
static char source[] = "Hi everyone";
strcpy(target,source);
strncpy(two, source,2);
printf("target = %s, two = %s \n" ,target, two);
}
everyone, two = ____________
Hi
출력 결과 : target = Hi
__________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
25
문자열 관련 함수들

문자열의 처리
 strcat 함수
– 두 문자열을 하나의 문자열로 결합
– 형식 : strcat(str1,str2)
» str1에 str2의 문자열을 결합한다.
» str1은 두 문자열이 결합된 크기보다 커야 한다.
 strncat 함수
– 결합할 문자열의 크기를 지정할 수 있다.
– 형식 : strncat(str1,str2,n)
» str2의 n의 크기만 str1에 결합한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
26
문자열 관련 함수들

문자열의 처리
 strcat와 strncat 함수 활용 예
–
–
–
–
–
–
–
–
–
–
#include <stdio.h>
#include <string.h>
void main(){
static char target[80]= "programming ";
static char two[80]= "the language ";
static char source[] = "is easy";
strcat(target, source);
strncat(two, source,2);
printf("target = %s, two = %s\n" ,target, two);
}
programming is easy, two = __________________
the language is
 출력 결과 : target = ___________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
27
문자열 관련 함수들

문자열의 처리
 대소문자 변환 함수 (strlwr, strupr)
– strlwr 함수
» 문자열을 소문자로 변환하고 이때의 주소를 반환
» 문자열 포인터 변수 = strlwr(문자열)
– strupr 함수
» 문자열을 대문자로 변환하고 이때의 주소를 반환
» 문자열 포인터 변수 = strupr(문자열)
– 사용 예>
#include <stdio.h>
#include <string.h>
void main(){
static char *first= "PROGramming ";
static char *second= "language ";
first = strlwr(first);
second = strupr(second);
printf("first = %s, second = %s\n" ,first, second);
}
programming
LANGUAGE
출력 결과 : first = _______________
, second = __________________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
28
문자열 관련 함수들

문자열의 처리
 기타 문자열의 처리 함수
 strrev 함수
– 문자열을 역순으로 변환하는 함수
– 형식 : 문자열 변수 = strrev(문자열)
// 해당 문자열을 역순으로 반환
 strset 함수
– 문자 상수로 문자열 변수를 모두 채움
– 형식 : strset(문자열 변수, 문자 상수)
– 사용 예>
» strset(str,'\0');
» 문자열의 모든 값을 NULL 값으로 설정
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
29
문자열 관련 함수들

문자열 검색 (strstr)
 특정 문자열에서 해당 문자열을 포함하고 있는 최초의
위치를 반환한다.
 사용형태
– 문자열 포인터 변수 = strstr(str1,str);
– str1의 문자열에서 str2의 문자열을 포함하는 최초의 위치를
문자열 포인터 변수에 전달한다.
 사용 예>
#include <stdio.h>
#include <string.h>
void main(){
static char *str= "programming is good";
char *pstr;
pstr = strstr(str,"is");
printf("pstr = %s \n" ,pstr);
}
is good
출력 결과 : pstr = _______________
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
30
[기초다지기] 문자열 함수 이용하기

1. 문자열 비교 , 검색, 결합 등을 이용한 문자열 처리
01 #include <stdio.h>
02 #include <string.h>
03 void main(){
04
static char buffer[80]={"0512011#홍길동"};
05
static char tel1[80]={"0512011#02-454-2322"};
06
static char tel2[80]={"05232013#02-569-7654"};
07
static char result[80], find[80], temp[80];
08
char *cp;
09
10
if(strncmp(buffer,tel1,7)){
11
strcpy(find,tel1);
12
}else if(strncmp(buffer,tel2,7)){
13
strcpy(find,tel2);
14
}
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 }
strset(result,'\0');
cp = strstr(buffer,"#");
cp++;
strset(temp,'\0');
strncpy(temp,cp,6);
strcat(result,"이름 : ");
strcat(result,temp);
cp = strstr(find,"#");
cp++;
strset(temp,'\0');
strncpy(temp,cp,11);
strcat(result," ,전화번호 : ");
strcat(result,temp);
printf("결과 = %s \n",result);
결과 : 이름 : 홍길동 , 전화번호 : 02-454-2322
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
31
예습시간 – 3 교시
다차원 배열의 이해
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
32
다차원 배열의 이해

학습 개요
 다차원 배열의 개념과 의미를 알아본다.
 2차원, 3차원 배열의 구조를 알아본다.
 다차원 문자열의 특징에 대해 알아본다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
33
다차원 배열의 이해

다차원 배열의 개념
 2차원 이상의 배열 (첨자가 두개 이상인 배열)
 C언어는 7차원 정도의 배열을 지원하지만 보통 3차원
정도를 이용해 프로그래밍한다.
 차원이 복잡할 수록 프로그램의 이해가 어려움
 첨자의 수에 따라 차원이 결정
– 첨자 2개 : 2차원 배열
– 첨자 3개 : 3차원 배열
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
34
다차원 배열의 이해

2차원 배열
 첨자가 두개인 배열로 개념적으로 행렬의 원리를 가진다.
 기억장소의 저장 순서는 행 우선 순위를 가지고 저장된다.
 배열의 선언/개념적 모델/메모리 저장 관계
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
35
다차원 배열의 이해

2차원 배열 선언과 초기화




2차원 배열 역시 1차원 배열처럼 초기화 가능
초기화 제약 조건 1차원 배열과 동일
대입되는 데이터 값이 행렬로 표현
선언 및 초기화 예
– static int array[2][3]={{1,2,3},{4,5,6}}
» 한 행에 들어가는 열의 개수로 분리
– static int array[2][3]={{1,2},{4,5,6}}
» array[0][2]의 값은 들어가지 않는다.
– static int array[2][3]={10,20,30,40,50}
» (0,0),(0,1),(0,2),(1,0),(1,1)의 순으로 값이 채워짐
– static int array[][3]={{1,2,3},{4,5,6}}
» 행의 개수 생략 가능
» 행의 개수 생략 시 초기값에 의해 자동적으로 채워짐 (예 : 2행 3열)
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
36
다차원 배열의 이해

3차원 배열의 사용
 2차원 배열에 면의 개념을 포함시켜 표현된다.
 면,행,열의 개념으로 3개의 첨자로 표현
 선언, 논리적 표현 그리고 메모리 구조 관계
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
37
다차원 배열의 이해

3차원 배열의 초기화
 3차원 배열의 초기화 역시 2차원 배열의 초기화 과정과 유사
 초기화 시 생략 가능한 첨자는 면에 대한 첨자이다.
 사용 예>
–
–
–
–
static int data[][2][3]={1,2,3,4,5,6,7,8,9};
0면에 2행 3열의 6개 값이 채워지고
1면에 나머지 값이 채워진다.
결국 이 문장은 data[2][2][3]의 3차원 배열을 가진다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
38
다차원 배열의 이해

다차원 문자열
 문자열을 배열로 가진 형태
 문자열 배열은 문자열 자체가 문자 배열의 형태를 가지므로 2차원
배열 형태를 가진다.
 문자열 배열은 주로 메뉴를 구성하는 많이 이용됨
 사용 예>
– static char txt[3][10];
» 9자 크기의 문자열에 대한 3개의 문자배열 선언
 문자열 배열의 초기화
– static char txt[3][8] = {"New","Open","Save As"};
– 메모리 구조
행\열
0
1
2
3
txt[0]
N
e
w
\0
txt[1]
O
p
e
n
txt[2]
S
a
v
e
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
4
5
6
7
A
s
\0
\0
39
다차원 배열의 이해

다차원 배열의 활용
 다차원 배열의 대표명은 그 배열의 시작 주소의 의미를
가진다.
 열의 첨자를 포함하지 않는 배열 이름은 해당 면이나
행의 시작 주소를 나타낸다.
 사용 예> static char txt[3][8]
– 3x8 행렬의 2차원 배열
– 1) 배열의 대표 명으로 사용
» 예> txt : 2차원 배열의 시작 주소의 의미
– 2) 배열의 행 첨자만 가지고 사용
» 예> txt[1] : txt배열의 두 번째 행의 시작 주소
– 3) 배열의 행과 열의 첨자를 모두 포함하여 사용
» 예> txt[1][2] : 배열에 포함된 요소의 이름
»
변수의 의미를 가지고 실제 값을 접근 한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
40
[기초다지기] 다차원 배열 이해하기

1. 2차원 배열의 선언, 초기화 그리고 접근 방법의 이해
#include <stdio.h>
#include <string.h>
void main(){
static int data1[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
static int data2[][4]={{4,6,9,2},{6,7,4,9},{32,12,13,56}};
int rs[3][4];
rs[0][0] = 4

분석
rs[0][1] = 7
rs[0][2] = 11 rs[0][3] = 5
int i,j;
rs[1][0] = 10 rs[1][1] = 12 rs[1][2] = 10 rs[1][3] = 16
for(i=0;i<3;i++){
rs[2][0] = 40 rs[2][1] = 21 rs[2][2] = 23 rs[2][3] = 67
for(j=0;j<4;j++){
rs[i][j] = data1[i][j] + data2[i][j];
printf("rs[%d][%d] = %d \t",i,j,rs[i][j]);
}
printf("\n");
}
}
 2차원 배열의 초기화 : 행렬의 요소를 { }를 통해 기술
 행의 초기값이 주어질 때 행의 요소의 수를 생략 가능
– 행의 수는 값에 의해 결정
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
41
[기초다지기] 다차원 배열 이해하기
#include <stdio.h>

void main(){
char select;
int i;
static char file[][8] ={"New","Open","Save As","Exit"};
static char edit[][11]={"Cut","Copy","Paste","Delete","Select All"};
printf("작업 선택 ( F: File , E : Edit ) : ");
scanf("%c",&select);
switch(select){
case 'F' :
작업 선택 ( F: File , E : Edit ) : printf("File Menu \n");
for(i=0;i<4;i++){
Edit Menu
printf("[%d]==> %s \n", i, file[i]);
[0]==> Cut
}
[1]==> Copy
break;
[2]==> Paste
case 'E':
[3]==> Delete
printf("Edit Menu \n");
[4]==> Select All
for(i=0;i<5;i++){
printf("[%d]==> %s \n", i,edit[i]);
}
break;
default:
printf(" 잘못된 입력입니다. \n");
}
}
42
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
2. 다차원
문자열 활용
[기초다지기] 다차원 배열 이해하기

2. 다차원 문자열 활용

분석
 사용자의 선택에 대한 메뉴를 출력
 문자열 배열은 2차원으로 구성되며 문자열 요소는 " "를
통해 표현
 각 요소의 열의 크기는 문자열 중 가장 큰 요소 +1 값
– 1이 추가되는 이유 : 문자열이 NULL('\0')문자 포함
 각 행의 문자열은 %s를 통해 출력 가능
– file[i] 또는 edit[i]와 같이 행 첨자만으로 접근
– 즉 2차원 배열에서 행의 요소만을 포함하는 배열 이름은 각 행의
시작 주소
– 구성요소가 문자열인 경우 그 문자열의 시작 주소
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
43
실습시간 – 1 교시
다차원 배열 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
44
다차원 배열 활용

학습개요
 배열을 이용한 판매실적 보고서 생성 프로그램을 만든다.
 데이터 저장을 위해 2차원 배열을 활용한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
45
다차원 배열 활용

판매 실적 보고서 생성 프로그램
 문제 정의
– XX보험 회사에서 한 해의 판매 실적 보고서를 만들려고 한다.
현재 직원은 5명으로 구성되어 있고 분기별 실적데이터를 가지고
있다. 이 데이터를 이용해 개인별 총합과 분기별 총합 그리고
분기별 평균을 보여주는 보고서를 만든다. 또한 이 분기별
평균을 통해 한해 분기의 판매 현황을 그래프로 보여준다.
 입/출력 조건
– 입력 조건
» 각 사원에 대한 분기별 판매 금액 (단위 : 원)
– 출력 조건
» 개인별 총합과 분기 총합/평균을 가진 표 형식의 보고서
» 분기별 평균을 이용한 한해 분기 판매 현황 그래프
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
46
다차원 배열 활용
 출력 형태
– 판매 실적 보고서
============================================================
판매사원 1/4분기
2/4분기
3/4분기
4/4분기
총합
============================================================
KIM
34000
56000
23000
78000
191000
LEE
23000
65000
18000
94000
200000
PARK
25000
34000
19000
68000
146000
SONG
18000
52000
23500
73950
167450
CHOI
25000
38000
26000
64000
153000
분기총합
125000
245000
109500
377950
857450
============================================================
분기평균
25000.00
49000.00
21900.00
75590.00
171490.00
============================================================
– 분기별 판매 실적 그래프
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
|
|
|
|
|
|
|
*
|
*
|
*
*
|
*
*
* *
-------------------------------1/4 2/4 3/4 4/4
47
다차원 배열 활용
 관련 함수 및 식
–
–
–
–
–
–
–
–
–
–
–
1>
2>
3>
4>
개인별 총합 = 개인별로 입력된 4분기의 판매 총합
분기별 총합 = 해당분기에 개인별로 판매된 총합
한해 총합 = 개인별 총합의 합
분기별 평균 = 분기별 총합 / 회사원의 수
소수점 2째 자리까지 표시한다.
5> 년 평균 = 한해 총합 / 회사원 수
6> 분기별 평균에 대한 그래프 값
년 평균을 100으로 하여 각 분기별 100분율을 계산한다.
10%당 한개의 별표(*)로 표시한다.
수식 : 그래프 크기 = ((분기별 평균 X 100) / 년 평균 ) / 10
소숫점 이하는 버리고 그래프 개수만큼 분기별로 별표하여 생성
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
48
다차원 배열 활용
 알고리즘 (또는 플로우차트)
– 1. 회사원별 판매 실적 데이터 입력
» 1.1 회사원별 판매 실적을 회사원 수만큼 반복해서 입력
» 1.2 입력된 결과는 2차원 배열의 판매 실적 배열에 저장
–
–
–
–
2.
3.
4.
5.
개인별 총합 계산
분기별 총합 및 년 총합 계산
분기별 평균 및 년 평균 계산
판매 실적 결과 출력
» 5.1 판매 실적에 대한 타이틀 출력
» 5.2 개인별 총합 및 분기별 총합을 포함한 판매 실적데이터 출력
» 5.3 분기별 평균 출력
– 6. 분기별 평균에 대한 그래프 값 계산
» 6.1 전체 평균을 100으로 하는 분기별 평균의 100분율 계산
» 6.2 분기별 평균 10%당 그래프 크기 계산
» 6.3 분기별 크기만큼 그래프 배열에 “*”값 표현
– 7. 분기별 판매 실적 그래프 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
49
다차원 배열 활용

프로그램 작성
 1 단계
– 180 페이지의 프로그램을 분석하고 부족한 부분을 채워 넣은
다음 작성하자. (sale.c로 저장한다.)
①. i<COUNT
②. j < 4
③. data[i][4] += data[i][j];
④. data[COUNT][i] += data[j][i]
⑤. data[COUNT+1][i] = data[COUNT][i] / COUNT
⑥. column_title[i]
⑦. row_title[i]
⑧. graph[j][i] = '*'
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
50
다차원 배열 활용

프로그램 작성
 2 단계
– 프로그램이 정상적으로 동작할 경우 다음 입력에 대한 값을
작성하자.
입력 (판매실적값)(분기별)
KIM :34000 56000 23000 78000
LEE :23000 65000 18000 94000
PARK :25000 34000 19000 68000
SONG :18000 52000 23500 73950
CHOI :25000 38000 26000 64000
출력 결과
개인별 총합:
191000,200000,146000,167450,153000,857450
분기별 총합:125000,245000,109500,377950
분기별 평균:
25000.00,49000.00,21900.00,75590.00
KIM : 23450 32450 21200 65000
LEE : 34000 54000 43200 78000
PARK :12500 24500 45000 98000
SONG :23000 26000 36000 54900
CHOI : 14600 34500 54200 67800
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
51
실습시간 – 2 교시
문자열 배열과 관련 함수 활용
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
52
문자열 배열과 관련 함수 활용

학습개요
 문자열 배열을 포함하는 응용 프로그램 만들기
 문자열 조작을 위한 표준 라이브러리 함수 활용하기
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
53
문자열 배열과 관련 함수 활용

e-Mail 주소 변환 프로그램
 문제 정의
– 많은 사람들은 인터넷을 통해 다른 위치에 있는 사람들로부터 email을 주고 받는다. 이러한 e-mail은 특수한 형태의 주소체계를
가진다. 이 프로그램은 이러한 e-mail 정보를 이용해 각
요소들을 분류하거나 각 요소들을 이용해 e-mail 주소로 만드는
작업을 한다.
 입/출력 조건
– 입력조건
» 1. e-Mail 주소로부터 각 요소 분리 선택 시 e-Mail 주소 입력
» 2. 각 요소로부터 e-Mail 생성 선택 시 각각의 요소들 입력
– 출력 조건
» 1. e-Mail --> 각 요소 분리 시 각 요소에 대한 정보 출력
» 2. 각 요소들 --> eMail 생성 시 eMail 주소 출력
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
54
문자열 배열과 관련 함수 활용
 출력 형태
– e-Mail 주소로부터 각
요소 분리 선택 시
– 각 요소로부터 e-Mail
주소 생성 시
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
55
문자열 배열과 관련 함수 활용
 관련 함수 및 식
– 1. e-Mail 주소 체계
» e-Mail은 다음과 같은 주소체계만을 가진다고 가정한다.
» 1. 일반 국가일 경우 : [email protected]
 예 : [email protected]
» 2. 미국일 경우 : [email protected]
 예 : [email protected]
– 2. 사용되는 문자열 관련 함수들
»
»
»
»
»
»
1.
2.
3.
4.
5.
6.
문자열 관련 해더 파일은 <string.h>이다.
strlwr
: 문자열을 소문자로 변환
strstr
: 문자열에 특정 문자 검색
strcpy, strncpy : 문자열 복사
strcat
: 두 문자열 결합
strcmp
: 두 문자열 비교
– 3. 제약 조건들
» 1. 입력된 e-Mail은 대/소문자 구분 없이 들어 올 수 있지만 내부적으로는
항상 소문자로 만들어 사용한다.
» 2. 각 요소 --> e-Mail 생성시 e-Mail 요소에 국가를 포함하고 있지 않을
경우 국가 요소에 "usa" 값을 입력한다.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
56
문자열 배열과 관련 함수 활용
 알고리즘 (또는 플로우차트)
– 두 가지 작업 흐름
» e-Mail로 부터 요소 추출, 요소들로부터 e-Mail 생성 흐름
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
57
문자열 배열과 관련 함수 활용

프로그램 작성
 1 단계
– 위의 알고리즘을 기반으로 187페이지의 프로그램을 분석하고 빈
부분을 채워 넣은 다음 email.c 파일로 작성하여 저장하자.
①. strlwr(email)
②. strstr(email,"@")
③. strncpy(elements[i],start,len)
④. strcpy(elements[3],start)
⑤. elements[i]
⑥. strcat(email,"@")
⑦. strcat(email,elements[3])
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
58
문자열 배열과 관련 함수 활용

프로그램 작성
 2 단계
– 프로그램 컴파일 후 아래의 입력 값을 통해 얻어온 결과를 작성하자.
입력 조건
국가명을 가진 eMail
입력 : [email protected]
출력 결과
name : blue
system : hi
domain : seoul
organization : go
country : kr
국가명 없는 eMail
입력 : [email protected]
각 요소 입력 값
(이름 시스템 도메인 조직 국가)
language wmail iso
edu usa
각 요소 입력 값
(이름 시스템 도메인 조직 국가)
farmer wserver miss
co kr
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
59
배열과 문자열
The End.
최신 C 프로그래밍 언어 – 문제해결에서 프로그래밍까지
60