개정판 누구나 즐기는 C언어 콘서트 제7장 배열 출처: pixabay.

Slides:



Advertisements
Similar presentations
Chapter 12. 배열. 배열  동일한 항목들이 동일한 크기로 연속적으로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는 자료 구조.
Advertisements

1 08 배열. 한국대학교 객체지향연구소 2 C 로 배우는 프로그래밍 기초 2 nd Edition 배열  동일한 자료유형의 여러 변수를 일괄 선언  연속적인 항목들이 동일한 크기로 메모리에 저장되는 구조  동일한 자료 유형이 여러 개 필요한 경우에 이용할 수 있는.
1. 2 차원 배열  배열은 동일한 데이터 유형으로 여러 개의 변수를 사용할 경우 같은 이 름으로 지정하여 간편하게 사용할 수 있도록 하는 것으로서 앞에서 1 차원 배열을 공부하였습니다.  2 차원 배열은 바둑판을 생각하면 되며, 1 차원 배열에서 사용하는 첨자를 2.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express.
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
배열, 포인터 컴퓨터시뮬레이션학과 2016년 봄학기 담당교수 : 이형원 E304호,
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
#include <stdio.h> int main(void) { float radius; // 원의 반지름
제 9 장 구조체와 공용체.
Report #2 - Solution 문제 #1: 다음과 같이 프로그램을 작성하라.
-Part2- 제3장 포인터란 무엇인가.
7장 배열 ②.
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
개정판 누구나 즐기는 C언어 콘서트 제9장 포인터 출처: pixabay.
5장 배열 작성자 : 변재현.
누구나 즐기는 C언어 콘서트 제8장 배열.
10장 함수.
C 프로그래밍.
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
8장 함수 함수의 필요성 라이브러리 함수와 사용자 정의 함수 함수의 정의, 원형, 호출 배열을 함수 인자로 전달 재귀호출.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express Slide 1 (of 32)
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
제8장 배열 1부 8.1 배열 8.2 배열의 초기화 8.3 배열의 응용 8.4 정렬과 탐색 8.5 다차원 배열.
프로그래밍 랩 – 7주 리스트.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
쉽게 풀어쓴 C언어 Express 제7장 반복문 C Express Slide 1 (of 27)
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
개정판 누구나 즐기는 C언어 콘서트 제6장 반복문 출처: pixabay.
프로그래밍 개요
어서와 C언어는 처음이지 제14장.
어서와 C언어는 처음이지 제15장.
박성진 컴퓨터 프로그래밍 기초 [09] 배열 part 1 박성진
쉽게 풀어쓴 C언어 Express 제10장 배열 C Express.
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
Report #3 - due: 4/6 100*100의 2개의 희소 행렬 A, B를 전달 받아서 이들의 덧셈을 구하고, 그 결과의 행렬 C를 반환하는 add_sparse_matrix(A, B, C)를 다음과 같이 작성하라. 희소 행렬은 sparse_matrix 타입으로 표현된다.
Quiz #7 다음 수들을 합병 정렬과 퀵 정렬 알고리즘을 이용하여 오름 차순으로 정렬하였을 때, 데이터 이동 회수를 각각 구하라. 여러분은 정렬 과정을 단계별로 보이면서 이동 회수를 추적해야 한다. 단, 퀵 정렬시에 피봇으로 배열의 왼쪽 첫 번째 원소를 선택한다. 5.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
컴퓨터 프로그래밍 기초 - 5th : 조건문(if, else if, else, switch-case) -
처음으로 배우는 C 프로그래밍 제4부 복합 데이터 형 제 7 장 배열.
김선균 컴퓨터 프로그래밍 기초 - 7th : 함수 - 김선균
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
5강. 배열 배열이란? 배열의 문법 변수와 같이 이해하는 배열의 메모리 구조의 이해 레퍼런스의 이해 다차원 배열
#1 배열 활용 #include int main(void) { int i; int grade[5]; grade[0] = 10; grade[1] = 20; grade[2] = 30; grade[3] = 40; grade[4] = 50; for(i=0;i.
문자열 컴퓨터시뮬레이션학과 2015년 봄학기 담당교수 : 이형원 E304호,
^^ Computer Programming 2 dmpr.cnu.ac.kr/~daygax.
함수(Function) ◈ 함수의 개념 및 사용 이유 ◈ 함수 정의, 호출 및 선언 ◈ 지역변수와 전역변수 ◈ return 문
4장. 데이터 표현 방식의 이해. 4장. 데이터 표현 방식의 이해 4-1 컴퓨터의 데이터 표현 진법에 대한 이해 n 진수 표현 방식 : n개의 문자를 이용해서 데이터를 표현 그림 4-1.
Flow Diagram IV While.
7주차: Functions and Arrays
Chapter 10 데이터 검색1.
CHAP 9: 정렬 순천향대학교 컴퓨터학부 하 상 호.
11장 배열 1. 배열이란? 1.1 배열의 개요 1.2 배열의 선언과 사용.
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
실습과제 (변수와 자료형, ) 1. 다음 작업 (가), (나), (다)를 수행하는 프로그램 작성
프로그래밍 개론 Ⅰ-실습 2장 데이터와 식①.
제 29 강 스트링(string) 다루기 s a i s . s T i h t g r i n.
어서와 C언어는 처음이지 제21장.
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
Report #2 (기한: 3/16) 데이터 구조 과목의 수강생이 50명이라고 가정한다. 이 학생(학번은 2016????으로 표현됨)들의 중간 시험(0~100), 기말 시험(0~100) 성적을 성적 파일에 작성하라(프로그램을 통해서 또는 수작업으로). 성적 파일을 읽어들여서.
C++ Espresso 제15장 STL 알고리즘.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

개정판 누구나 즐기는 C언어 콘서트 제7장 배열 출처: pixabay

배열을 사용하면 한 번에 여러 개의 값을 저장할 수 있는 공간을 할당받을 수 있다. 이번 장에서 학습할 내용 배열을 사용하면 한 번에 여러 개의 값을 저장할 수 있는 공간을 할당받을 수 있다. 배열의 개념 배열의 선언과 초기화 일차원 배열 다차원 배열

이번 장에서 만들 프로그램

배열 많은 값을 한꺼번에 저장할 수 있는 저장 장소

배열의 필요성 학생이 10명이 있고 이들의 평균 성적을 계산한다고 가정하자.

배열의 선언

배열 요소와 인덱스 인덱스(index): 배열 요소의 번호

배열 선언의 예 // 60개의 int형 값을 가지는 배열 scores int score[60]; // 12개의 float형 값을 가지는 배열 cost float cost[12];  char name[50];  // 50개의 char형 값을 가지는 배열 name

배열 요소 접근 scores[0] = 80; // 0번째 요소에 80을 저장한다. scores[3] = scores[2]; // 2번째 요소를 3번째 요소로 복사한다. scores[k] = 100; // k번째 요소에 100을 저장한다.

배열 선언 예제 #include <stdio.h> int main(void) { int i; int scores[5]; scores[0] = 10; scores[1] = 20; scores[2] = 30; scores[3] = 40; scores[4] = 50; for(i=0;i < 5; i++) printf("scores[%d]=%d\n",i, scores[i]); return 0; }

배열과 반복문 배열의 가장 큰 장점은 반복문을 사용하여서 배열의 원소를 간편하 게 처리할 수 있다는 점 scores[0] = 0; scores[1] = 0; scores[2] = 0; scores[3] = 0; scores[4] = 0; #define SIZE 5 ... for(i=0 ; i<SIZE ; i++) scores[i] = 0;  

문자형 배열 #include <stdio.h> #define SIZE 26 int main(void) { int i; char codes[SIZE]; for (i = 0; i < SIZE; i++) codes[i] = 'a' + i; // ‘a'에 1을 더하면 ’b'가 된다. printf("%c ", codes[i]); printf("\n"); return 0; }

배열 예제 #3 #include <stdio.h> #define STUDENTS 5 int main(void) { int scores[STUDENTS]; int sum = 0; int i, average; for(i = 0; i < STUDENTS; i++) printf("학생들의 성적을 입력하시오: "); scanf("%d", &scores[i]); } sum += scores[i]; average = sum / STUDENTS; printf("성적 평균= %d\n", average);   return 0; 학생들의 성적을 입력하시오: 10 학생들의 성적을 입력하시오: 20 학생들의 성적을 입력하시오: 30 학생들의 성적을 입력하시오: 40 학생들의 성적을 입력하시오: 50 성적 평균 = 30

잘못된 인덱스 문제 인덱스가 배열의 크기를 벗어나게 되면 프로그램에 치명적인 오류 를 발생시킨다. int scores[10]; … scores[10] = 98; // 치명적인 오류!

잘못된 인덱스 예제 #include <stdio.h> int main(void) { int scores[5]; int i;   scores[0]=10; scores[1]=20; scores[2]=30; scores[3]=40; scores[4]=50; scores[5]=60; for(i = 0; i <= 5; i++) printf("scores[%d]=%d\n", i, scores[i]); return 0; } 시스템에 심각한 오류가 발생할 수도 있다.

중간 점검 1. n개의 원소를 가지는 배열의 경우, 첫 번째 원소의 인덱스는 무엇인 가? 2. n개의 원소를 가지는 배열의 경우, 마지막 원소의 인덱스는 무엇인 가? 3. 범위를 벗어나는 인덱스를 사용하면 어떻게 되는가? 즉 int a[10]; 과 같이 선언된 배열이 있는 경우, a[10]에 6을 대입하면 어떻게 되 는가?

배열의 초기화

배열의 초기화 배열의 크기가 주어지지 않으면 자동적으로 초기값의 개수만큼이 배열의 크기로 잡힌다.

배열의 초기화 초깃값이 주어지지 않는다면 일반 변수와 마찬가지로 아무 의미없 는 쓰레기 값이 들어가게 된다.

배열 초기화 예제 #include <stdio.h> int main(void) { int scores[5] = { 31, 63, 62, 87, 14 }; int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0] = 31 scores[1] = 63 scores[2] = 62 scores[3] = 87 scores[4] = 14

배열 초기화 예제 #include <stdio.h> int main(void) { int scores[5] = { 31, 63 }; int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0] = 31 scores[1] = 63 scores[2] = 0 scores[3] = 0 scores[4] = 0

배열 초기화 예제 #include <stdio.h> int main(void) { int scores[5] ; int i; for(i = 0; i < 5; i++) printf("scores[%d] = %d\n", i, scores[i]); return 0; } scores[0]=4206620 scores[1]=0 scores[2]=4206636 scores[3]=2018779649 scores[4]=1

중간 점검 배열 a[6]의 원소를 1, 2, 3, 4, 5, 6으로 초기화하는 문장을 작성 하라. 배열의 초기화에서 초기값이 개수가 배열 원소의 개수보다 적은 경우에는 어떻게 되는가? 또 반대로 많은 경우에는 어떻게 되는가? 배열의 크기를 주지 않고 초기값의 개수로 배열의 크기를 결정할 수 있는가?

Lab: 배열에 출석 기록하기 간단한 전자 출석부를 배열을 이용하여 구현해보자

Sol: #include <stdio.h> #define SIZE 16 int main(void) { int att_book[SIZE] = { 0 }; int i, count=0; // 사용자로부터 출석인지 결석인지를 받아서 배열에 저장한다. for (i = 0; i < SIZE; i++) { printf("%d번째 강의에 출석하셨나요(출석은 1, 결석은 0): ", i+1); scanf("%d", &att_book[i]); }

Sol: // 배열을 검사하여서 결석한 횟수를 계산한다. for (i = 0; i < SIZE; i++) { if (att_book[i] == 0) count++; } // 이번 학기 결석률을 계산한다. double ratio = count / 16.0; if (ratio > 0.3) printf("수업 일수 부족입니다(%f%%). \n", ratio*100.0); return 0;

Lab: 가장 싼 물건 찾기 우리는 인터넷에서 상품을 살 때, 가격 비교 사이트를 통하여 가장 싼 곳을 검색한다. 우리는 인터넷에서 상품을 살 때, 가격 비교 사이트를 통하여 가장 싼 곳을 검색한다. 일반적으로 배열에 들어 있는 정수 중에서 최소값을 찾는 문제와 같 다.

실행 결과

알고리즘 배열 prices[]의 원소를 난수로 초기화한다. 일단 첫 번째 원소를 최소값 minium이라고 가정한다. for(i=1; i<배열의 크기; i++) if ( prices[i] < minimum ) minimum = prices[i] 반복이 종료되면 minimum에 최소값이 저장된다.

Sol: #include <stdio.h> #define SIZE 10 int main(void) { int prices[SIZE] = { 12, 3, 19, 6, 18, 8, 12, 4, 1, 19 }; int i, minimum; printf("[ "); for (i = 0; i < SIZE; i++) { printf("%d ", prices[i]); } printf("]\n"); minimum = prices[0]; for (i = 1; i < SIZE; i++) if (prices[i] < minimum) minimum = prices[i]; printf("최소값은 %d입니다.\n", minimum); return 0; Sol:

도전문제 위의 프로그램에서는 최소값을 계산하였다. 이번에는 배열의 원소 중에서 최대값을 찾도록 변경하여 보자. 변수 이름도 적절하게 변경 하라.

Lab: 배열에서 특정한 값 탐색하기 여기서는 정수들이 배열에 저장되어 있고 여기에서 사용자가 특정 한 정수를 찾는다고 가정한다.

Sol: #include <stdio.h> #define SIZE 10 int main(void) { int key, i; int list[SIZE] = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; printf("[ "); for (i = 0; i < SIZE; i++) { printf("%d ", list[i]); } printf("]\n");

Sol: printf("탐색할 값을 입력하시오:"); scanf("%d", &key); for (i = 0; i < SIZE; i++) { if (list[i] == key) { printf("탐색 성공 인덱스= %d\n", i); break; } return 0;

정렬이란? 정렬은 물건을 크기순으로 오름차순이나 내림차순으로 나열하는 것 정렬은 컴퓨터 공학분야에서 가장 기본적이고 중요한 알고리즘중의 하나

정렬이란? 정렬은 자료 탐색에 있어서 필수적이다. (예) 만약 사전에서 단어들이 정렬이 안되어 있다면?

버블 정렬

버블 정렬

버블 정렬 #include <stdio.h> #define SIZE 5 int main(void) { int i, k; int list[SIZE] = { 16, 7, 9, 1, 3 }; // 배열의 요소를 정렬한다. for (k = 0; k < SIZE; k++) { for (i = 0; i < SIZE-1; i++) { if (list[i] > list[i + 1]) { // 크기 순이 아니면 // 서로 교환한다. int tmp = list[i]; list[i] = list[i + 1]; list[i + 1] = tmp; }

버블 정렬 // 배열의 요소를 출력한다. for (i = 0; i < SIZE; i++) { printf("%d ", list[i]); } return 0;

변수의 값을 서로 교환할 때 다음과 같이 하면 안됨 list[i] = list[least]; // list[i]의 기존값은 파괴된다! list[least] = list[i]; 올바른 방법 temp = list[i]; list[i] = list[least]; list[least] = temp;

Lab: 버블 정렬(그래픽 버전) 다음과 같이 버블 정렬의 과정을 그림으로 보여주는 프로그램을 작 성해보자.

Sol. #include <windows.h> #include <stdio.h> #define SIZE 10 int main(void) { int i, k; int list[SIZE] = { 100, 30, 20, 78, 89, 12, 56, 38, 99, 66 }; HDC hdc = GetWindowDC(GetForegroundWindow()); for (k = 0; k < SIZE; k++) { Rectangle(hdc, 0, 0, 800, 800); // 화면을 지운다. for (i = 0; i < SIZE-1; i++) { // 버블 정렬 if (list[i] > list[i + 1]) { int tmp = list[i]; list[i] = list[i + 1]; list[i + 1] = tmp; }

Sol. // 배열의 요소를 하나씩 꺼내서 사각형을 그린다. for (i = 0; i < SIZE; i++) { Rectangle(hdc, 200 + i * 30, 200, 230 + i * 30, 200 - list[i]); } Sleep(1000); // 1초 동안 기다린다. return 0;

2차원 배열 int s[3][5];    // 2차원 배열

2차원 배열의 초기화 int s[3][5] = { { 0, 1, 2, 3, 4 }, // 첫 번째 행의 원소들의 초기값   {  0,  1,  2,  3,  4 }, // 첫 번째 행의 원소들의 초기값   { 10, 11, 12, 13, 14 }, // 두 번째 행의 원소들의 초기값   { 20, 21, 22, 23, 24 } // 세 번째 행의 원소들의 초기값 };

기본 예제 #include <stdio.h> int main(void) { int i, j; // 3행과 5열을 가지는 2차원 배열 선언 int a[3][5] = { { 0, 1, 2, 3, 4 }, { 0, 1, 2, 3, 4 }, { 0, 1, 2, 3, 4 } }; // 각 배열 요소의 값을 출력한다. for (i = 0; i < 3; i++) { for (j = 0; j < 5; j++) { printf("a[%d][%d] = %d ", i, j, a[i][j]); } printf("\n"); return 0;

실행 결과

Lab: 행렬 행렬(matrix)는 자연과학에서 많은 문제를 해결하는데 사용

Sol: #include <stdio.h> #define ROWS 3 #define COLS 3 int main(void) { int r, c; int A[ROWS][COLS] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; int B[ROWS][COLS] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } }; int C[ROWS][COLS]; // 두개의 행렬을 더한다. for (r = 0; r < ROWS; r++) { for (c = 0; c < COLS; c++) { C[r][c] = A[r][c] + B[r][c]; printf("%d ", C[r][c]); } printf("\n"); return 0;

실습: tic-tac-toe tic-tac-toe 게임은 2명의 경기자가 오른쪽과 같은 보드를 이용하 여서 번갈아가며 O와 X를 놓는 게임이다. 같은 글자가 가로, 세로, 혹은 대각선 상에 놓이면 이기게 된다.

실행 결과 (x, y) 좌표(종료 -1, -1): 0 0 ---|---|--- X | | | | | | (x, y) 좌표(종료 -1, -1): 1 1 | O | ...

알고리즘 보드를 초기화한다. while(1) 보드를 화면에 출력한다. 사용자로부터 좌표 x, y를 받는다. if (board[x][y]가 비어 있으면) if( 현재 경기자가 ‘X’이면 ) board[x][y] = ‘X’ else board[x][y] = ‘O’ 오류 메시지를 출력한다

소스 #include <stdio.h> int main(void) { char board[3][3]; int x, y, k, i; // 보드를 초기화한다. for (x = 0; x < 3; x++) for (y = 0; y < 3; y++) board[x][y] = ' '; // 사용자로부터 위치를 받아서 보드에 표시한다. for (k = 0; k < 9; k++) { printf("(x, y) 좌표: "); scanf("%d %d", &x, &y); board[x][y] = (k%2==0)?'X':'O'; // 현재의 순번에 따라 'X', 'O'중 선택

소스 // 보드를 화면에 그린다. for (i = 0; i < 3; i++) { printf("---|---|---\n"); printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]); } return 0;

도전문제 (1) 한번 놓은 곳에는 놓지 못하게 하라. (2) 컴퓨터와 인간의 게임으로 업그레이드해보자. 컴퓨터가 다음 수를 결정하도록 프로그램을 변경하라. 가장 간단한 알고리즘을 사용한다. 예를 들면 비어 있는 첫 번째 위치에 놓는다.

Q & A