본문 바로가기

IT&코딩/자료구조

자료구조 - 3일차 (변수)

728x90
반응형

// -----<변수의 선언범위>-----


// 지역변수 : 지역 내부에 새로운 지역에서 같은 이름의 변수가 선언되면 외부에 있는 변수보다 내부에 있는 변수가 더 높은 우선순위를 갖게 된다.
// 전역변수 : 전역변수는 별도의 초기화를 진행하지 않으면 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;

}

 

728x90
반응형