티스토리 뷰
[49,50,51,52강] static 변수
* static 변수? (정적변수, 공유하고 있는 변수)
- 단 한번만 초기화하고, 그 이후에는 전역변수(함수 위에 선언해 모든 함수들이 공유)처럼 프로그램이 종료될때까지 메모리공간에 존재하는 변수.
- 초기값이 지정이 안되면, 자동으로 0 이 대입.
ex. int a; a에 이상한 쓰레기 값 들어감, static int a; 자동으로 a에 0값이 들어감
* 배열도 선언만 하면 자동으로 0이 들어감
지역 변수 | static 변수 |
void test(){ int a = 10; a++; // a=11 printf("%d", a); } void main() { test(); // 11출력, 동작 수행 후 test 안의 변수들 초기화 test(); // 11출력, 동작 수행 후 test 안의 변수들 초기화 } |
void test(){ static int a = 10; static이므로 초기화X(메모리에 남아있음) a++; // a=11 → 12 printf("%d", a); } void main() { test(); // 11출력 test(); 12출력 } |
* 예시
문제1 | 풀이 |
#include <stdio.h> void funCount(); //니 밑에 funCount라는 함수가 있어~ int main(void){ int num; for(num=0; num<2; num++) funCount(); return 0; } void funCount(){ int num = 0; static int count; printf("num=%d, count=%d\n", ++num, count++); } |
for { num=0, funCount(){ num=0, static count, num=1, count=0 출력 후 count=1 } num=1, funCount(){ num=0, static count, num=1, count=1 출력 후 count=2 } num=2, 종료 } |
문제2 | 풀이 |
#include <stdio.h> int a = 10; int b = 20; int c = 30; void main() { func(); func(); printf("a=%d, b=%d, c=%d\n", a,b,c); } void func(void){ static int a =100; int b=200; a++; b++; c=a; } |
a=10 b=20 c= static a = func() { static a= 100 지역변수 b= 200 a++; static a=101, b++; 지역변수 b=201 **c는 함수 내 선언 안했으므로 전역변수 c=101, } func() { static a=101로 남아있음 지역변수 b=200 a++; static a=102, b++; 지역변수 b=201, 전역변수 c = 102, } printf → 전역변수 a 10, 전역변수 b 20, 전역변수c 102출력 |
[53,54,55,56,57강] 재귀함수 (요즘 잘 안씀, 시험용으로 공부)
* 재귀함수란? 함수 내에서 자기의 함수를 다시 호출하는 함수
문제1 | 풀이 |
#include <stdio.> int func(int num) { if(num == 1) return 1; else return num * func(num-1); } void main(){ int i; for(i=5; i>=0; i--) { if(i%2 ==1) printf("func(%d) : %d\n", i, func(i)); } } |
i=5, 5>=0, 5%2 = 1 → func(5) : 120출력 func(5) { 5 != 1, return num*func(num-1) = 5*func(4) = 5*24= 120 } func(4) { 4 != 1, return num*func(num-1) = 4*func(3) = 6*4=24 } func(3) { 3 != 1, return num*func(num-1) = 3*func(2) = 3*2 =6 } func(2) { 2 != 1, return num*func(num-1) = 2*func(1) = 2*1=2 } func(1) { 1 == 1, return 1 } i=5, 5>=0, 5%2 = 1 이므로 func(5): 120 출력 i=4, 4>=0, 4%2 !=1 이므로 출력 X i=3, 3>=0, 3%2 =1 이므로 func(3): 6출력 i=2, 2>=0, 2%2 !=1 이므로 출력 X i=1, 1>=0, 1%2 =1 이므로 func(1):1 출력 i=0, 0>=0, 0%2 !=1 이므로 출력 X i=-1, -1>=0 거짓이므로 for문 빠져나옴 |
문제2 | 풀이 |
int result; result = func(19); printf("result==%d\n", result); int func(int n){ if(n%2 ==1) n=n-1; if(n==0) **** n%2=0아니고 n==0임, 문제 잘 읽기** return 0; return (func(n-2)+n); } |
func(19) {19%2 = 1, n= 19-1=18 return func(16)+18} 72+18= 90 func(16) { 16%2!==1, 16!=0, return func(14)+16 } 56+16= 72 func(14) { 14%2 !==1, 14!=0, return func(12)+14} 42+14= 56 func(12) →func(10)+12= 30+12=42 func(10) →func(8)+10= 20+10=30 func(8) →func(6)+8= 12+8=20 func(6) →func(4)+6= 6+6=12 func(4) →func(2)+4= 2+4=6 func(2) →func(0)+2= 0+2=2 func(0) →n==0, return 0 result = 90 출력 |
문제3 | 풀이 |
#include <stdio.> int recursion(int n){ if(n<5) return 1; else if (n%5 ==1) return n+ recursion(n-1); else recursion(n-1); } void main(){ int n = recursion(16); printf("%d",n) } |
recursion(16) { 16<5 거짓, 16%5 == 1 → 16+recursion(15)호출 =16+18=34리턴 } recursion(15) { 15<5 거짓, 15%5 == 1 거짓, recursion(14) = 18리턴 } rec(14)→rec(13)→rec(12)→rec(11) = 18 recursion(11) { 11<5거짓, 11%5==1 → 11+recursion(10)=11+7=18 리턴 } rec(10)→rec(9)→rec(8)→rec(7)→rec(6) =7 recursion(6) { 6<5거짓, 6%5==1 → 6+recursion(5) = 6+1=7 리턴 } rec(5)=1→rec(4)=1 recursion(4) { 4<5 → return 1 34출력 |
[58,59,60강] 중복 재귀함수
문제1 | 풀이 |
#include <stdio.> int recur(int a, int b){ if(a<=1) return a*b; else return a*recur(a-1, b+1)+recur(a-1,b); *자기가 자기호출하는게 2개있음 } void main(){ int a= 3, b=2; print("%d\n", recur(a,b)); } |
a=3 b=2 recur(3,2) { 3<=1거짓 → 3 * recur(2,3) + recur(2,2)=3*11+8=41 } recur(2,3) { 2<=1거짓 → 2 * recur(1,4) + recur(1,3)=2*4+3=11 } recur(2,2) { 2<=1거짓 → 2 * recur(1,3) + recur(1,2) = 2*3+2=8 } recur(1,4) { 1<=1 → 1*4=4 } recur(1,3) { 1<=1 → 1*3=3 } recur(1,2) { 1<=1 → 1*2=2 } 41 출력 |
문제2 | 풀이 |
#include<stdio.> int fib(int n){ if(n==0) return 0; if(n==1) return 1; return (fib(n-1)+fib(n-2)); } void main(){ fib(5); } *main()함수를 실행할 때 fib()함수가 호출되는 횟수는? |
fib(5) = f(4)+f(3) = 3+2 = 5 fib(4) = f(3)+f(2) = 2+1 = 3 fib(3) = f(2)+f(1) = 1+1 = 2 fib(2) = f(1)+f(0) = 1+0 = 1 fib(1) = 1 fib(0) = 0 return 값은 5 *피라미드 그리면 쉬움 = 3+4+6+2=15번 (5) = (4) + (3) 3번 (3)+(2) (2)+(1) 4번 (2)+(1) (1)+(0) (1)+(0) 6번 (1)+(0) 2번 |
※ 출처 : 흥달쌤 C언어 49강~60강 https://youtu.be/G_SIfsm00TU?si=XJSTDGBQYWpEyuDb
※ 컴파일 사이트 : http://ideone.com
반응형
'AI > 정보처리기사(C언어)' 카테고리의 다른 글
[정보처리기사 실기] C언어 총 정리(7) print 출력순서, 단항연산자, fork (0) | 2024.05.21 |
---|---|
[정보처리기사 실기] C언어 총 정리(5) 함수와 변수의 유효범위 (0) | 2024.05.20 |
[정보처리기사 실기] C언어 총 정리(4) - 2차원 배열과 포인터, 포인터 배열, 배열 포인터, 구조체 (0) | 2024.05.19 |
[정보처리기사 실기] C언어 총 정리(3) 배열과 포인터 (0) | 2024.05.18 |
[정보처리기사 실기] C언어 총 정리(2) 조건문, 반복문 (0) | 2024.05.17 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 프로그래머스
- 아침
- 루틴
- 빅데이터 분석기사
- 오블완
- Ai
- 경제
- 티스토리챌린지
- 미라클모닝
- 운동
- 30분
- opic
- 영어회화
- IH
- 오픽
- SQL
- 습관
- ChatGPT
- 다이어트
- 고득점 Kit
- 기초
- 아침운동
- C언어
- llm
- 스크랩
- 뉴스
- Python
- 갓생
- 실기
- 줄넘기
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함