Download presentation
Presentation is loading. Please wait.
1
배열, 포인터, 함수 Review & 과제 1, 2
2
배열 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료구조 같은 자료형을 가진 변수들이 여러 개 필요할 때 사용
3
int arr[100]; 배열의 선언 자료형: 배열의 자료형
배열 이름: 변수명과 같이 배열을 구분하는 이름. 배열의 이름은 배열의 시작 주소를 가리키는 포인터 배열 길이: 배열을 구성하는 원소의 개수 배열 크기: 원소 하나의 크기 * 배열의 길이 ex) 4(int) * 100(배열길이) int arr[100]; 자료형 배열이름 배열 길이
4
배열의 초기화 길이가 지정된 배열의 초기화 – 2_15.c 길이가 지정되지 않은 배열의 초기화 – 2_16.c
5
배열의 접근 0 번 인덱스(index)부터 시작 int arr[10];
arr[3]은 arr[0]의 주소(&arr[0])로부터 (자료형의 크기)*3만큼 떨어진 곳의 주소에 들어있는 값이다. arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] arr[6] arr[7] …
6
int arr[3][4]; 2차원 배열의 선언 자료형: 배열의 자료형
배열 이름: 변수명과 같이 배열을 구분하는 이름. 2차원 배열의 이름은 배열의 시작 주소를 가리키는 이중 포인터 배열 길이: 배열의 요소 길이를 행과 열로 지정 배열 크기: 원소 하나의 크기 * 배열의 길이 ex) 4(int) * 3(행) * 4(열) 행 열 int arr[3][4]; 자료형 배열이름 배열 길이
7
2차원 배열을 어디에 쓸까? m x n 행렬을 나타내는 데 쓴다 n 𝒂 𝟏, 𝟏 𝒂 𝟏,𝟐 𝒂 𝟏,𝟑 𝒂 𝟏,𝟒 𝒂 𝟐,𝟏
𝒂 𝟏, 𝟏 𝒂 𝟏,𝟐 𝒂 𝟏,𝟑 𝒂 𝟏,𝟒 𝒂 𝟐,𝟏 𝒂 𝟐,𝟐 𝒂 𝟐,𝟑 𝒂 𝟐,𝟒 𝒂 𝟑,𝟏 𝒂 𝟑,𝟐 𝒂 𝟑,𝟑 𝒂 𝟑,𝟒 m
8
m x n 행렬(m x n Matrix) A = 𝑎 1,1 ⋯ 𝑎 1,𝑛 ⋮ ⋱ ⋮ 𝑎 𝑚,1 ⋯ 𝑎 𝑚,𝑛
행렬의 정의: 수나 기호, 수식 등을 네모꼴로 배열한 것 A[i][j] : 𝑎 𝑖,𝑗 (행렬A의 i번째 행 j번째 열의 원소) A = 𝑎 1,1 ⋯ 𝑎 1,𝑛 ⋮ ⋱ ⋮ 𝑎 𝑚,1 ⋯ 𝑎 𝑚,𝑛 j번째 열 i번째 행
9
2차원 배열의 초기화 int arr[3][4] = {{1, 2}, {3}, {4, 5}}; 선언과 동시에 초기화 하는 방식
3 4 5
10
𝑐 𝑖,𝑗 = 𝑘=1 𝑛 𝑎 𝑖,𝑘 ∗ 𝑏 𝑘,𝑗 , 1≤i≤m, 1≤j≤r
행렬의 곱셈 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같아야 곱셈이 가능 𝑐 𝑖,𝑗 = 𝑘=1 𝑛 𝑎 𝑖,𝑘 ∗ 𝑏 𝑘,𝑗 , 1≤i≤m, 1≤j≤r
11
예제 연습 2x4 행렬과 4x2 행렬의 곱셈 ∗ = ?
12
포인터 메모리의 주소를 저장하는 변수 주소의 크기가 4 bytes 라고 하면, 포인터의 크기도 4 bytes다.
즉, 32bit 환경에서는 4 bytes, 64bit 환경에서는 8 bytes다.
13
포인터의 연산 * 연산자는 피연산자(보통 포인터)에 저장되어 있는 주소에 들어있는 값을 가져온다.
ex) *ptr & 연산자는 피연산자(보통 변수명)가 저장되어있는 메모리 주소를 기져온다. ex) &val
14
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &a b = 3
c = 5
15
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &b b = 3
c = 5
16
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &b b = 4
c = 5
17
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &c b = 4
18
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &c b = 4
19
함수의 정의 return_type function_name(parameters) { /* … */
return (return_type)expression; }
20
Prototype int func (int, char, double*);
21
function_name(arguments)
함수 호출 function_name(arguments)
22
함수의 정의 및 함수 호출
23
인자(argument) 함수 호출 시 넘겨주는 값 func(1, 3)
24
매개변수(parameter) 함수 정의부에서 정의된 변수 void func(int a, int b) { /* … */ }
25
Call by value 함수의 인자(argument)로 값을 넘겨준다. 값이 함수로 넘어갈 때 복사된 값이 넘어간다.
함수에서는 복사된 값을 사용한다.
26
Call by Reference 인자(argument)로 메모리 주소를 담고있는 변수를 넘겨준다.
함수 내에서 그 메모리 주소에 담겨있는 값에 접근할 수 있다.
27
Call by value
28
Call by reference
29
함수를 이용한 재귀(Recursion)
30
함수를 이용한 재귀(Recursion) 탈출조건
31
함수를 이용한 재귀(Recursion) 탈출조건
32
재귀를 이용한 전수조사 방법 Depth First Search Back tracking = DFS + 커팅
33
과제 1, 2
34
과제 1-12 //중간피라미드 space = 0; #include<stdio.h>
space2 = length - 1; for (i = 1; i <= length; i++, space++, space2--) { for (j = 0; j<length + space; j++) { if (i >= length - n + 1) { if (j<space2) printf(" "); else printf("*"); } if (i >= length - n + 1) printf("\n"); //역피라미드 for (i = 0; i<n; i++) { for (j = 1; j <= i + middle_line; j++) for (j = 1; j <= n - i; j++) for (j = n - i - 1; j >= 1; j--) return 0; #include<stdio.h> int main(void) { int n, i, j; scanf("%d", &n); int middle_line = n * 2 - 1; int space = 0 + middle_line; int space2 = middle_line + n - 1; int length = n + (n - 1) * 2 + 1; //피라미드 for (i = 1; i <= n; i++, space++, space2--) { for (j = 0; j<n + space; j++) { if (j<space2) printf(" "); else printf("*"); } printf("\n"); //중간역피라미드 for (i = 0; i<n - 1; i++) { for (j = 1; j <= i; j++) for (j = 1; j <= length - i; j++) for (j = length - i - 1; j >= 1; j--)
35
과제 1-14(1) if (num1 == a) { strike++; }
else if (num1 == b || num1 == c) { ball++; if (num2 == b) { else if (num2 == a || num2 == c) { if (num3 == c) { else if (num3 == a || num3 == b) { printf("%d Strike %d Ball \n", strike, ball); ball = 0, strike = 0; return 0; #include <stdio.h> #define true 1 int main(void) { const int a = 3, b = 5, c = 1; static int count = 0; int ball = 0, strike = 0; int num1, num2, num3; while (true) { scanf("%d %d %d", &num1, &num2, &num3); count++; if (num1 == a && num2 == b && num3 == c) { printf("3 Strike Out!!\n"); printf("%d Game Played\n", count); break; }
36
과제 1-14(2) #include <stdio.h> int main() { int input[3], i;
const int ans[3] = { 3, 5, 1 }; int strike, ball; while (1) { printf("guess: "); for (i = 0; i < 3; i++) scanf("%d", &input[i]); strike = 0, ball = 0; for (i = 0; i < 3; i++) { if (input[i] == ans[i]) strike++; else if (input[i] == ans[(i + 1)%3] || input[i] == ans[(i + 2)%3]) ball++; } printf("%d Strike %d Ball\n", strike, ball); if (strike == 3) break; return 0;
37
과제 1-15 #include <stdio.h> int main (void){ char n; float a,b;
while(1) { scanf("%c", &n); scanf("%f %f", &a, &b); if (n=='+') printf("%f\n", a+b); else if (n=='-') printf("%f\n", a-b); else if (n=='*') printf("%f\n", a*b); else if (n=='/') printf("%f\n", a/b); else if (n=='q') break; } return 0;
38
과제 2-9 #include <stdio.h> #include <string.h>
void push(char); void pop(); int size(); char top(); int main() { char input[100]; char stack[ ]; int len, i; int valid = 1; scanf("%s", input); len = strlen(input); for (i = 0; i < len; i++) { if (input[i] == '(') push(input[i]); else if (input[i] == ')') { //size가 0인데 ')'가 등장했다는 것은 짝이 안맞는다는 뜻 if (size() == 0) { valid = 0; break; } else pop(); if(size()!=0) valid = 0; printf("%s\n", valid ? "True" : "False"); return 0;
39
#include <stack>
함수: push, pop, size, top, empty void push(element): 스택의 맨 위에 원소를 추가한다. void pop(): 스택의 맨 위의 원소를 제거한다. size_type size(): 스택에 있는 원소의 개수를 반환한다. element_type top(): 스택 맨 위의 원소를 반환한다. void empty(): 스택이 비어있으면 true, 아니면 false를 반환한다.
Similar presentations