배열, 포인터, 함수 Review & 과제 1, 2
배열 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료구조 같은 자료형을 가진 변수들이 여러 개 필요할 때 사용
int arr[100]; 배열의 선언 자료형: 배열의 자료형 배열 이름: 변수명과 같이 배열을 구분하는 이름. 배열의 이름은 배열의 시작 주소를 가리키는 포인터 배열 길이: 배열을 구성하는 원소의 개수 배열 크기: 원소 하나의 크기 * 배열의 길이 ex) 4(int) * 100(배열길이) int arr[100]; 자료형 배열이름 배열 길이
배열의 초기화 길이가 지정된 배열의 초기화 – 2_15.c 길이가 지정되지 않은 배열의 초기화 – 2_16.c
배열의 접근 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] …
int arr[3][4]; 2차원 배열의 선언 자료형: 배열의 자료형 배열 이름: 변수명과 같이 배열을 구분하는 이름. 2차원 배열의 이름은 배열의 시작 주소를 가리키는 이중 포인터 배열 길이: 배열의 요소 길이를 행과 열로 지정 배열 크기: 원소 하나의 크기 * 배열의 길이 ex) 4(int) * 3(행) * 4(열) 행 열 int arr[3][4]; 자료형 배열이름 배열 길이
2차원 배열을 어디에 쓸까? m x n 행렬을 나타내는 데 쓴다 n 𝒂 𝟏, 𝟏 𝒂 𝟏,𝟐 𝒂 𝟏,𝟑 𝒂 𝟏,𝟒 𝒂 𝟐,𝟏 𝒂 𝟏, 𝟏 𝒂 𝟏,𝟐 𝒂 𝟏,𝟑 𝒂 𝟏,𝟒 𝒂 𝟐,𝟏 𝒂 𝟐,𝟐 𝒂 𝟐,𝟑 𝒂 𝟐,𝟒 𝒂 𝟑,𝟏 𝒂 𝟑,𝟐 𝒂 𝟑,𝟑 𝒂 𝟑,𝟒 m
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번째 행
2차원 배열의 초기화 int arr[3][4] = {{1, 2}, {3}, {4, 5}}; 선언과 동시에 초기화 하는 방식 3 4 5
𝑐 𝑖,𝑗 = 𝑘=1 𝑛 𝑎 𝑖,𝑘 ∗ 𝑏 𝑘,𝑗 , 1≤i≤m, 1≤j≤r 행렬의 곱셈 행렬 A의 열의 개수와 행렬 B의 행의 개수가 같아야 곱셈이 가능 𝑐 𝑖,𝑗 = 𝑘=1 𝑛 𝑎 𝑖,𝑘 ∗ 𝑏 𝑘,𝑗 , 1≤i≤m, 1≤j≤r
예제 연습 2x4 행렬과 4x2 행렬의 곱셈 8 4 2 1 3 3 6 4 ∗ 1 7 2 4 5 2 6 12 = ? https://www.acmicpc.net/problem/2740
포인터 메모리의 주소를 저장하는 변수 주소의 크기가 4 bytes 라고 하면, 포인터의 크기도 4 bytes다. 즉, 32bit 환경에서는 4 bytes, 64bit 환경에서는 8 bytes다.
포인터의 연산 * 연산자는 피연산자(보통 포인터)에 저장되어 있는 주소에 들어있는 값을 가져온다. ex) *ptr & 연산자는 피연산자(보통 변수명)가 저장되어있는 메모리 주소를 기져온다. ex) &val
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &a b = 3 c = 5
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &b b = 3 c = 5
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &b b = 4 c = 5
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &c b = 4
포인터의 장점? 메모리 주소를 이용하여 다양한 변수들에 접근하고 제어하기 용이하다. a = 1 ptr = &c b = 4
함수의 정의 return_type function_name(parameters) { /* … */ return (return_type)expression; }
Prototype int func (int, char, double*);
function_name(arguments) 함수 호출 function_name(arguments)
함수의 정의 및 함수 호출
인자(argument) 함수 호출 시 넘겨주는 값 func(1, 3)
매개변수(parameter) 함수 정의부에서 정의된 변수 void func(int a, int b) { /* … */ }
Call by value 함수의 인자(argument)로 값을 넘겨준다. 값이 함수로 넘어갈 때 복사된 값이 넘어간다. 함수에서는 복사된 값을 사용한다.
Call by Reference 인자(argument)로 메모리 주소를 담고있는 변수를 넘겨준다. 함수 내에서 그 메모리 주소에 담겨있는 값에 접근할 수 있다.
Call by value
Call by reference
함수를 이용한 재귀(Recursion)
함수를 이용한 재귀(Recursion) 탈출조건
함수를 이용한 재귀(Recursion) 탈출조건
재귀를 이용한 전수조사 방법 Depth First Search Back tracking = DFS + 커팅
과제 1, 2
과제 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--)
과제 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; }
과제 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;
과제 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;
과제 2-9 #include <stdio.h> #include <string.h> void push(char); void pop(); int size(); char top(); int main() { char input[100]; char stack[100 + 1]; 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;
#include <stack> 함수: push, pop, size, top, empty void push(element): 스택의 맨 위에 원소를 추가한다. void pop(): 스택의 맨 위의 원소를 제거한다. size_type size(): 스택에 있는 원소의 개수를 반환한다. element_type top(): 스택 맨 위의 원소를 반환한다. void empty(): 스택이 비어있으면 true, 아니면 false를 반환한다. http://www.cplusplus.com/reference/vector/vector/?kw=vector