220824 C언어#6, 앱인벤터#7

김혜진·2022년 8월 24일
0

C언어

목록 보기
6/13

C언어 #6

함수

void형 함수

● 사각형의 넓이를 구하는 함수 작성하기

#include<stdio.h>

void Rect(int width, int height);

void main() {

	int width = 0;
	int height = 0;
	
	printf("가로의 길이: ");
	scanf_s("%d", &width);
	printf("세로의 길이: ");
	scanf_s("%d", &height);

	Rect(width, height);

	}

	void Rect(int width, int height) {
		printf("사각형의 넓이: %d \n", width * height);
}

출력결과
가로의 길이: 5
세로의 길이: 8
사각형의 넓이: 40

● 원의 넓이를 구하는 함수 작성하기

#include<stdio.h>

void Circle(int radian);

void main() {

	int radian = 0;

	printf("반지름의 길이 : ");
	scanf_s("%d", &radian);

	Circle(radian);
}

void Circle(int radian) {
	printf("원의 넓이: %.4f\n", radian * radian * 3.14);
}

출력결과
반지름의 길이 : 3
원의 넓이: 28.2600

void는 리턴값이 없는 형태지만, int, double 등 리턴값이 있는 형태로 출력할 수도 있다. 보통은 리턴값이 있음.

● 사칙연산 함수 작성하기

#include<stdio.h>

int plus(int a, int b);
int minus(int a, int b);
int multiple(int a, int b);
int divide(int a, int b);

void main() {

	int a = 0;
	int b = 0;

	printf("두 정수를 입력하시오 : ");
	scanf_s("%d%d", &a, &b);

	printf("두 정수의 합은 %d입니다.\n", plus(a, b));
	printf("두 정수의 차는 %d입니다.\n", minus(a, b));
	printf("두 정수의 곱은 %d입니다.\n", multiple(a, b));
	printf("두 정수의 나누기는 %d입니다.\n", divide(a, b));

}

int plus(int a, int b) {
	return a + b;
}

int minus(int a, int b) {
	return a - b;
}

int multiple(int a, int b) {
	return a * b;
}

int divide(int a, int b) {
	return a / b;
}

출력결과
두 정수를 입력하시오 : 5 2
두 정수의 합은 7입니다.
두 정수의 차는 3입니다.
두 정수의 곱은 10입니다.
두 정수의 나누기는 2입니다.

● 두 수를 입력받아 최대값과 최소값을 구하는 함수 작성하기

#include<stdio.h>

int Max(int a, int b);
int Min(int a, int b);

void main() {

	int a = 0;
	int b = 0;

	printf("두 정수를 입력하시오: ");
	scanf_s("%d%d", &a, &b);

	printf("최대값: %d 최소값: %d", Max(a, b), Min(a, b));

}

int Max(int a, int b) {
	if (a > b) return a;
	else return b;
}

int Min(int a, int b) {
	if (a > b) return b;
	else return a;
}

출력결과
두 정수를 입력하시오: 10 5
최대값: 10 최소값: 5

● 사용자로부터 100을 입력받으면 "블랙커피", 200을 입력받으면 "밀크커피" 출력하기

#include<stdio.h>

void coffeeMachine(int price);

void main() {

	int price = 0;

	printf("가격을 입력하세요 : ");
	scanf_s("%d", &price);

	coffeeMachine(price);
}

void coffeeMachine(int price) {
	if (price == 100) {
		printf("블랙커피\n");
	}
	else if (price == 200) {
		printf("밀크커피\n");
	}
	else {
		printf("유효하지 않습니다.");
	}
}

출력결과
가격을 입력하세요 : 100
블랙커피


변수의 범위

지역 변수

  • 코드에서의 지역 의미

같은 이름이라도 다른 영역의 함수에 속해 있으므로 독립된 다른 변수이다.

스택

  • 스택은 LIFO(Last In First Out)의 원리로 동작하는 선형적인 자료구조이다.
  • 스택은 데이터가 들어가고 나오는 입구가 하나이다.
  • 임시적인 정보를 저장하는 용도로 사용된다.
  • 함수의 지역변수 및 전달인자들이 스택 메모리 관리의 대표적인 예이다.
  • 푸시되는 순서대로 스택에 데이터가 차곡차곡 쌓이며 팝 할때는 푸시된 역순으로 꺼내진다.
  • 메모리가 존재하는 시간
    스택 메모리에 언제 할당되고, 언제 소멸되는지 살펴보도록 하자.
#include<stdio.h>

void func1();
void func2();
void main(void)
{
	int val = 0;

	printf("첫 번째 메모리 할당 : val = 0\n");
	func1();
	printf("두 번째 메모리 소멸 : local = 10\n");

}

void func1()
{
	int local = 10;
	printf("두 번째 메모리 할당 : val = 10\n");
	func2();
	printf("첫 번째 메모리 소멸 : local = 10\n");

}

void func2()
{
	int local = 20;
	printf("세 번째 메모리 할당 : local = 20\n");

}

출력결과
첫 번째 메모리 할당 : val = 0
두 번째 메모리 할당 : val = 10
세 번째 메모리 할당 : local = 20
첫 번째 메모리 소멸 : local = 10
두 번째 메모리 소멸 : local = 10

함수 호출 순서와 소멸 순서는 반대이다.

  • 매개 변수도 지역 변수이다
    함수의 매개 변수도 스택 메모리에 할당되는 지역 변수이다.
    함수가 수행이 될 때 자동으로 할당되었다가, 함수가 끝나면 자동으로 소멸된다.

전역 변수

  • 전역 변수의 선언
    main 바깥쪽에 선언한다.
    초기화를 시켜주지 않아도 0으로 초기화가 된다.
int global;
void plus(int a, int b);

int main() {

	int a = 0;
	int b = 0;

	printf("두 정수를 입력하시오 : ");
	scanf_s("%d%d", &a, &b);

	plus(a, b);
	printf("두 정수의 합은 %d입니다.\n", global);
	return 0;
}

void plus(int a, int b) {
	global = a + b;
}

출력결과
두 정수를 입력하시오 : 2 3
두 정수의 합은 5입니다.

전역 변수를 남용하면 값의 추적이 어려워지기 때문에 꼭 필요한 상황이 아니면 사용하지 않는 것이 좋다.

  • 전역 변수가 메모리에 존재하는 시간
    전역변수는 프로그램 시작하자마자 메모리 상에 올라가서 프로그램이 종료될 때 메모리 상에서 소멸된다.

static 변수

static 변수의 선언

사전적 의미로 '정지된', '고정상태의'라는 뜻을 가지고 있다.
지역 변수처럼 중괄호 영역에서 선언되지만, 중괄호를 벗어나도 메모리 상에 고정되어 소멸되지 않고 프로그램이 종료될 때 소멸한다.

void func(void);

int main(void)
{
	int i = 0;

	while (i < 5)
	{
		func();
		i++;
	}
	return 0;
}

void func(void)
{
	static int value = 0;
	value++;
	printf("%d\n", value);
}

출력결과
1
2
3
4
5

static이 붙은 value라는 변수의 메모리는 함수가 끝나더라도 지역변수처럼 사라지지 않고 계속해서 남아있게 된다.

static 변수가 메모리에 존재하는 시간

생성하는 시점은 지역 변수와 같고, 소멸하는 시간은 전역변수와 같다는 특징을 가진다.

과제
static, 전역 변수를 활용해 입력받은 페이지의 누적결과 출력하기
(사용자가 -1을 입력할 떄까지 반복)

static 변수

내 코드

void read(int page);

int main(void)
{
	int page = 0;

	while (page >= 0)
	{
		printf("읽은 책의 페이지 수를 입력하시오: ");
		scanf_s("%d", &page);

		if (page == -1)
		{
			printf("더 분발하세요.");
			break;
		}

		else if (page < 0)
		{
			printf("유효하지 않는 수입니다.");
			break;
		}
		read(page);
	}
	return 0;
}

void read(int page)
{
	static int total = 0;
	total += page;
	printf("최종 누적 페이지: %d\n", total);
}

강사님 코드

void Add(int page);

int main(void)
{
	int page = 0;

	do {
		printf("읽은 책의 페이지 수를 입력하세요 : ");
		scanf_s("%d", &page);
		
		Add(page);

	} while (page != -1);

	printf("더 분발하세요.\n");

	return 0;
}

void Add(int page)
{
	static int sum = 0;
	sum += page;
	printf("최종 누적 페이지 : %d\n", sum);
}

❗ 사용자의 입력에 따라 프로그램 수행 진행 여부를 결정해야 하는 경우에는 do~while문이 적절할 수 있다.

전역 변수

int total;

void read(int page);

int main(void)
{
	int page = 0;

	while (page >= 0)
	{
		printf("읽은 책의 페이지 수를 입력하시오: ");
		scanf_s("%d", &page);

		if (page == -1)
		{
			printf("더 분발하세요.\n");
			break;
		}

		else if (page < 0)
		{
			printf("유효하지 않는 수입니다.\n");
			break;
		}

		read(page);
	}
	return 0;
}

void read(int page)
{
	total += page;
	printf("최종 누적 페이지: %d\n", total);
}

전역변수도 do while문으로 수정할 수 있다.

int total;

void read(int page);

int main(void)
{
	int page = 0;


	do {
		printf("읽은 책의 페이지 수를 입력하세요 : ");
		scanf_s("%d", &page);
		
		read(page);

	} while (page != -1);

	printf("더 분발하세요.\n");

	return 0;
}

void read(int page)
{
	total += page;
	printf("최종 누적 페이지: %d\n", total);
}

-1이 되어도 합산되는 점은 고려하지 않았다.


앱인벤터 #7

만보기 만들기

  • 블록

과제
일정 거리, 걸음수만큼 이동했을 때 장소 이미지 출력하기

가위바위보 게임 만들기

  • 디자인
profile
알고 쓰자!

0개의 댓글