// -----<변수의 선언범위>-----
// 지역변수 : 지역 내부에 새로운 지역에서 같은 이름의 변수가 선언되면 외부에 있는 변수보다 내부에 있는 변수가 더 높은 우선순위를 갖게 된다.
// 전역변수 : 전역변수는 별도의 초기화를 진행하지 않으면 0으로 초기화된다.
// 전역변수와 지역변수가 이름이 같다면 해당 지역에 선언된 지역변수가 더 높은 우선 순위를 갖게 된다.
// 정적변수 : 지역변수와 전역변수의 특성을 둘 다 갖고 있다.
// 전역변수의 특성인 프로그램이 종료될 때 공간이 해제된다는 특성을 갖고 있다.
// 지역 변수의 특성인 블록 내부에서만 유효하다는 특성을 갖고 있다.
//
// 정적 변수 선언 방법 : static 자료형 변수명;
---------------------------------------------------------------------------------------------------------------------------------------
// 지역변수 예시 코드
#include<stdio.h>
int main()
{
int num = 5;
int num2 = 7;
{
int num = 3; // 안쪽에 있는 변수가 더 우선순위를 가지게 된다.
printf("num의 값 : %d\n", num);
printf("num2의 값 : %d\n", num2); // 크게 봐서 main 함수에서 선언되었기 때문에 블록 내부에서 선언 안 돼도 실행된다.
}
printf("num의 값 : %d\n", num);
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------
// 전역변수 예시 코드
#include<stdio.h>
int num;
void Func()
{
printf("num의 값 : %d\n", num);
}
int main()
{
int num = 6;
printf("num의 값 : %d\n", num); // 지역변수 num의 값 6 출력
Func(); // Func 함수 내부에서 실행되기 때문에 전역변수 num의 초기값 0 출력
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------
// 정적변수 예시 코드
#include<stdio.h>
void Func()
{
int n1 = 3;
static int n2 = 3;
printf("n1 : %d, n2 : %d\n", n1, n2);
n1++;
n2++;
}
int main()
{
Func();
Func();
// printf("n2의 값 : %d\n", n2); // n2라는 공간이 있지만 접근이 불가능. 블록 내부에서만 유효.
return 0;
}
---------------------------------------------------------------------------------------------------------------------------------------
// 변수의 범위
// 지역변수 : '블록' 내부에서 선언된 변수로, 블록 내부에서만 유효하고 블록이 끝나면 해제
//
// 블록 : { }
//
// 전역변수 : 함수 외부에서 선언된 변수로, 프로그램이 종료될 때 해제
// 정적변수 : 지역변수와 전역변수의 특성을 둘 다 갖고 있음
// 별도 그림 참고
// 메모리의 공간을 나타내는 그림
// Code
// Data <- 전역변수, 정적변수
// Heap
// Stack <- 지역변수
---------------------------------------------------------------------------------------------------------------------------------------
// 간단한 예제
#include<stdio.h>
void Func(int num)
{
num++;
}
int main()
{
int num = 4;
Func(num);
printf("num의 값 : %d\n", num);
return 0;
}
// 다른 지역에 있는 지역변수에는 접근할 수가 없다.
---------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
void Func(int* num)
{
(*num)++;
}
int main()
{
int num = 4;
Func(&num); // num의 주소를 전달.
printf("num의 값 : %d\n", num);
return 0;
}
// 매개변수와 포인터를 적절하게 사용한다면 다른 지역에 있는 변수까지 접근할 수 있다.
// 포인터는 따라서 함수와 같이 사용되어야 그 효용이 있다고 할 수 있다.
---------------------------------------------------------------------------------------------------------------------------------------
// 문제)
// 철수의 성적을 국어, 수학, 영어 순서로 입력 받은 후
// 세 성적의 총합을 메인의 total 변수에 할당해주는 함수,
// 성적의 평균을 메인의 avg 변수에 할당해주는 함수,
// 평균에 해당하는 등급을 나누고 메인의 grade 변수에 할당해주는 함수를 만드세요.
// 출력은 반드시 main 함수에서 진행하세요.
// 모든 함수는 반환값이 존재하지 않는 형태로 작성해주는 함수.
// (90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F)
#include<stdio.h>
void Total(int kor, int mat, int eng, int* total)
{
*total = kor + mat + eng;
}
void Avg(int total, double *avg)
{
*avg = (double)total / 3;
}
void Grade(double avg, char *grade)
{
if (avg >= 90)
*grade = 'A';
else if (avg >= 80)
*grade = 'B';
else if (avg >= 70)
*grade = 'C';
else if (avg >= 60)
*grade = 'D';
else
*grade = 'F';
}
int main()
{
int kor, mat, eng, total;
double avg;
char grade;
printf("국어. 수학, 영어 입력 :");
scanf("%d%d%d", &kor, &mat, &eng);
Total(kor, eng, mat, &total);
Avg(total, &avg);
Grade(avg, &grade);
printf("총합 : %d\n", total);
printf("평균 : %.2f\n", avg);
printf("등급 : %c\n", grade);
return 0;
}
'IT&코딩 > 자료구조' 카테고리의 다른 글
자료구조 - 6일차 (동적할당) (1) | 2022.09.19 |
---|---|
자료구조 - 5일차 (구조체) (0) | 2022.09.15 |
자료구조 - 4일차 (재귀함수) (0) | 2022.09.15 |
자료구조 - 2일차 (함수) (0) | 2022.09.12 |
자료구조 - 1일차 (포인터) (2) | 2022.09.10 |