Skip to content

CHAPTER 06

Tony Kim edited this page Oct 29, 2019 · 12 revisions

함수

  • 1번 문제

직사각형의 둘레를 구하는 함수 프로그램

#include<stdio.h>
int get_perimeter(int a, int b) {
	// 직사각형의 둘레 = (가로 + 세로) * 2
	return (a + b) * 2;
}
int main(void) {
	int a, b;

	printf("가로? ");
	scanf_s("%d", &a);
	printf("세로? ");
	scanf_s("%d", &b);

	printf("직사각형의 둘레: %d", get_perimeter(a, b));

	return 0;
}
[실행 결과]

가로? 10
세로? 20
직사각형의 둘레: 60
  • 2번 문제

정사각형의 넓이를 구하는 함수 프로그램

#include<stdio.h>
float get_area_of_squarer(float a) {
	// 정사각형의 면적 = 한변의 길이 * 한변의 길이
	return a * a;
}
int main(void) {
	float a;

	printf("한 변의 길이? ");
	scanf_s("%f", &a);

	printf("정사각형의 면적: %f", get_area_of_squarer(a));

	return 0;
}
[실행 결과]

한 변의 길이? 3.5
정사각형의 면적: 12.250000
  • 3번 문제

두 점 사이의 직선 거리를 구하는 함수 프로그램

#include<stdio.h>
#include<math.h> // sqrt(), pow()함수
double distance(int a, int b, int c, int d) {
	// sqrt() == 루트, pow() == 거듭제곱
	return sqrt(pow(c - a, 2) + pow(d - b, 2));
}
int main(void) {
	int a, b, c, d;

	printf("직선의 시작점 좌표? ");
	scanf_s("%d %d", &a, &b);
	printf("직선의 끝점 좌표? ");
	scanf_s("%d %d", &c, &d);

	printf("(%d,%d)~(%d,%d) 직선의 길이: %f", a, b, c, d, distance(a, b, c, d));

	return 0;
}
[실행 결과]

직선의 시작점 좌표? 0 0
직선의 끝점 좌표? 3 4
(0,0)~(3,4) 직선의 길이: 5.000000
  • 4번 문제

제품의 가격과 한인율을 인자로 받아서 할인가를 리턴하는 함수 프로그램

#include<stdio.h>
int discount_price(int a, int b) {

	return (1 - (0.01 * a)) * b;
}
int main(void) {
	int a, b;

	printf("할인율(%%)? ");
	scanf_s("%d", &a);

	// 무한루프 for(;;) == while(1)
	for (;;) {
		printf("제품의 가격? ");
		scanf_s("%d", &b);
		printf("할인가: %d원\n", discount_price(a, b));
		// b == 0 무한루프 탈출
		if (b == 0) {
			break;
		}
	}
	return 0;
}
[실행 결과]

할인율(%)? 20
제품의 가격? 5000
할인가: 4000원
제품의 가격? 2000
할인가: 1600원
제품의 가격? 0
할인가: 0원
  • 5번 문제

전달받은 정수가 짝수인지 홀수인지 검사하는 함수 프로그램

#include<stdio.h>
int is_even(int a) {
	int even = 0;

	// 2로 나눈 나머지가 0 == 짝수
	if (a % 2 == 0) {
		even++;
	}
	return even;
}
int is_odd(int a) {
	int odd = 0;

	// 2로 나눈 나머지가 1 == 홀수
	if (a % 2 == 1) {
		odd++;
	}
	return odd;
}
int main(void) {
	int a;
	int odd = 0;
	int even = 0;

	printf("정수를 빈칸으로 구분해서 입력하세요.(마지막에 0 입력)\n");

	// 무한루프 for(;;) == while(1)
	for (;;) {
		scanf_s("%d", &a);

		if (is_odd(a) == 1) {
			odd++;
		}
		else {
			even++;
		}
		// 0을 입력하면 짝수와 홀수의 갯수를 출력하고 무한루프 탈출
		if (a == 0) {
			// 마지막에 입력되는 0은 짝수로 입력된다 그러므로 even - 1
			printf("입력받은 정수 중 짝수는 %d개, 홀수는 %d개입니다.", even - 1, odd);
			break;
		}
	}
	return 0;
}
[실행 결과]

정수를 빈칸으로 구분해서 입력하세요.(마지막에 0 입력)
12 24 21 42 71 37 100 211 113 0
입력받은 정수 중 짝수는 4개, 홀수는 5개입니다.
  • 6번 문제

메뉴를 출력하고 선택된 메뉴 항목의 번호를 출력하는 함수 프로그램

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int choose_menu(void) {
	int a;

	printf("[1. 파일 열기  2.파일 저장  3.인쇄  0.종료] ");
	scanf("%d", &a);
	
	// 입력 받은 a를 리턴
	return a;
}
int main(void) {

	for (;;) {
		// choose_menu()함수의 리턴값으로 수행할 내용이 정해짐
		switch (choose_menu()) {
		case 1:
			printf("파일 열기를 수행합니다.\n");
			break;
		case 2:
			printf("파일 저장을 수행합니다.\n");
			break;
		case 3:
			printf("인쇄를 수행합니다.\n");
			break;
		case 0:
			return 0;
		}
	}
	return 0;
}
[실행 결과]

[1. 파일 열기  2.파일 저장  3.인쇄  0.종료] 1
파일 열기를 수행합니다.
[1. 파일 열기  2.파일 저장  3.인쇄  0.종료] 2
파일 저장을 수행합니다.
[1. 파일 열기  2.파일 저장  3.인쇄  0.종료] 5
[1. 파일 열기  2.파일 저장  3.인쇄  0.종료] 0
  • 7번 문제

정수가 소수인지 검사하는 함수 프로그램

#include<stdio.h>
int is_prime(int n) {
	int i, prime = 0;

	for (int a = 2; a <= n; a++) {
		i = 0; // 소수 검사값
		for (int b = 1; b <= a; b++) {
			if (a % b == 0)
				i++;
		}
		if (i == 2) {
			prime++;
			printf("%5d", a);
			// 소수를 10개 출력할 때마다 줄 바꿈
			if (prime != 0 && prime % 10 == 0)
				printf("\n");
		}
	}
	// 소수의 개수 prime을 리턴
	return prime;
}
int main(void) {
	int n;

	printf("1~N사이의 소수를 구합니다. N은? ");
	scanf_s("%d", &n);

	printf("\n소수는 모두 %d개 입니다.", is_prime(n));

	return 0;
}
[실행 결과]

1~N사이의 소수를 구합니다. N은? 100
    2    3    5    7   11   13   17   19   23   29
   31   37   41   43   47   53   59   61   67   71
   73   79   83   89   97
소수는 모두 25개 입니다.
  • 8번 문제

RGB값을 추출하는 함수 프로그램

#include<stdio.h>
int get_red(int a) {
	// 쉬프트 연산으로 Red값을 구함
	return a >> 16;
}
int get_green(int a) {
	// 쉬프트 연산으로 Green값을 구함
	a = a >> 8;
	a = a & 0xFF;
	return a;
}
int get_blue(int a) {
	a = a & 0xFF;
	return a;
}
int main(void) {
	int a;

	printf("RGB 색상? ");
	scanf_s("%x", &a);

	printf("RGB %X의 Red: %d, Greed: %d, Blue: %d", a, get_red(a), get_green(a), get_blue(a));

	return 0;
}
[실행 결과]

RGB 색상? 0xff0080
RGB FF0080의 Red: 255, Greed: 0, Blue: 128
  • 9번 문제

Red, Green, Blue 값을 전달받아 RGB값을 생성하는 함수 프로그램

#include<stdio.h>
int get_red(int a) {
	return a >> 16;
}
int get_green(int a) {
	a = a >> 8;
	a = a & 0xFF;
	return a;
}
int get_blue(int a) {
	a = a & 0xFF;
	return a;
}
int make_rgb(int a) {
	int r, g, b;
	int color = 0;

	// 마이너스 연산을 통해 보색을 구함
	r = 255 - get_red(a);
	g = 255 - get_green(a);
	b = 255 - get_blue(a);

	// or 연산으로 rgb값을 만듬
	color = color | (r << 16);
	color = color | (g << 8);
	color = color | b;

	return color;
}
int main(void) {
	int a;

	printf("RGB 색상? ");
	scanf_s("%x", &a);

	printf("RGB %X의 보색: %06X", a, make_rgb(a));
	return 0;
}
[실행 결과]

RGB 색상? 0xff0080
RGB FF0080의 보색: 00FF7F
  • 10번 문제

rand 함수를 이용해 0 ~ 99 범위의 임의의 정수 10개를 출력하고 그 합계를 출력

#include <stdio.h>
#include <stdlib.h> //rand() 함수
#include <time.h> //time() 함수
int random(int add) {
	int random = 0;
	srand(time(NULL)); // 매 출력마다 다른 변수를 얻음

	for (int i = 0; i < 10; i++) {
		// rand() % 100 == 0~99 사이의 랜덤 정수
		random = rand() % 100;
		printf("%5d", random);
		add = random + add;
	}
	return add;
}
int main(void) {
	int add = 0;

	printf("0 ~ 99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.\n");
	printf("\n합계: %d", random(add));

	return 0;
}
[실행 결과]

0 ~ 99사이의 임의의 정수를 10개 생성해서 합계를 구합니다.
   25   67   63    3    6   69   81   25   27   30
합계: 396
  • 11번 문제

연산자 2개, 피연산자를 인자로 받아 사칙연산을 수행하는 함수 프로그램

#include<stdio.h>
float calculator(float a, float b, char c) {
	float n = 0;

	switch (c)
	{
	case '+':
		n = a + b;
		break;
	case '-':
		n = a - b;
		break;
	case '*':
		n = a * b;
		break;
	case '/':
		n = a / b;
	default:
		printf("Error!!\n");
		break;
	}

	return n;
}
int main(void) {
	float a = 0, b = 0;
	char c;

	// for(;;), while(1) == 무한 루프
	for (;;) {
		printf("수식 (0 0 0 입력 시 종료)? ");
		scanf_s("%f %c %f", &a, &c, 30, &b);

		// 0 0 0 입력시 무한루프 탈출
		if (a == 0 && b == 0 && c == '0') {
			break;
		}
		printf("%f\n", calculator(a, b, c));
	}
	return 0;
}
[실행 결과]

수식 (0 0 0 입력 시 종료)? 12.34 + 1.123
13.463000
수식 (0 0 0 입력 시 종료)? 1234.56 * 0.012
14.814721
수식 (0 0 0 입력 시 종료)? 0 0 0
  • 12번 문제

윤년인지 검사하는 함수 프로그램

#include<stdio.h>
int is_leap_year(int i) {
	
	if ((i % 4 == 0) && (i % 100 != 0) || (i % 400 == 0)) {
		return i;
	}
	return 0;
}
int main(void) {
	int count = 0; // 윤년을 출력하는 횟수 카운터

	printf("2000년 ~ 2100년 사이의 윤년\n");

	for (int i = 2000; i < 2101; i++) {

		// 리턴값이 0이 아니면 함수에서 찾은 윤년 i를 출력
		if (is_leap_year(i) != 0) {
			printf("%d년  ", i);
			count++;

			// 10개의 윤년을 찾을때 마다 줄바꿈
			if (count % 10 == 0) {
				printf("\n");
			}
		}
	}
	return 0;
}
[실행 결과]

2000년 ~ 2100년 사이의 윤년
2000년  2004년  2008년  2012년  2016년  2020년  2024년  2028년  2032년  2036년
2040년  2044년  2048년  2052년  2056년  2060년  2064년  2068년  2072년  2076년
2080년  2084년  2088년  2092년  2096년
  • 13번 문제

연도와 월을 인자로 전달받아 그 달이 며칠인지 구하는 함수 프로그램

#include<stdio.h>
int is_leap_year(int year) {
	// 윤년인지 검사하는 함수
	if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
		return year;
	}
	return 0;
}
int get_days_of_month(int year, int i) {
	// 해당 년도 달의 날짜수를 리턴하는 함수
	if (i != 2 && i != 8 && i / 2 == 0) {
		return 31;
	}
	else if (i == 2) {
		if (is_leap_year(year) != 0) {
			return 29;
		}
		else return 28;
	}
	else return 30;
	
}
int main(void) {
	int year;

	printf("연도? ");
	scanf_s("%d", &year);

	printf("[ %d년 ]\n", year);

	for (int i = 1; i < 13; i++) {
		printf("%2d월:%d일 ", i, get_days_of_month(year, i));
		if (i == 6) {
			printf("\n");
		}
	}
	return 0;
}
[실행 결과]

연도? 2019
[ 2019년 ]
 1월:31일  2월:28일  3월:30일  4월:30일  5월:30일  6월:30일
 7월:30일  8월:30일  9월:30일 10월:30일 11월:30일 12월:30일
  • 14번 문제

연, 월, 일을 전달받아 유효한 날짜인지 검사하는 함수

#include<stdio.h>
int check_date(int year, int month, int date) {
	int err = 0;

	// 윤년인지 아닌지 검사 윤년일때 2월은 29일까지
	if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
		// 달이 0보다 작거나 12보다 클 경우 err에 1을 더한다.
		if (month < 0 || month > 12) {
			err++;
		}
		// 8월을 제외한 짝수 달은 30일 홀수 달은 31일까지 있다.
		else if ((month % 2 == 0 && date > 30) && month != 8) {
			err++;
		}
		else if (month == 2 && date > 29) {
			err++;
		}
		else if (month % 1 == 0 && date > 31) {
			err++;
		}
	}
	else if (month < 0 || month > 12) {
		err++;
	}
	else if ((month % 2 == 0 && date > 30) && month != 8) {
		err++;
	}
	// 윤년이 아니라면 2월은 28일까지 
	else if (month == 2 && date > 28) {
		err++;
	}
	else if (month % 1 == 0 && date > 31) {
		err++;
	}
	
	return err;
}
int main(void) {
	int year, month, date;

	for (;;) {
		printf("날짜 (연 월 일)? ");
		scanf_s("%d %d %d", &year, &month, &date);

		// 리턴값 0 == 올바른 날짜, 리턴값 1 == 잘못된 날짜
		if (check_date(year, month, date) == 0) {
			printf("입력한 날짜는 %d년 %d월 %d일 입니다.\n", year, month, date);
			break;
		}
		else {
			printf("잘못 입력하셨습니다. 유효한 날짜를 입력하세요.\n");
		}
	}
	return 0;
}
[실행 결과]

날짜 (연 월 일)? 2019 13 1
잘못 입력하셨습니다. 유효한 날짜를 입력하세요.
날짜 (연 월 일)? 2019 1 32
잘못 입력하셨습니다. 유효한 날짜를 입력하세요.
날짜 (연 월 일)? 2019 2 28
입력한 날짜는 2019년 2월 28일 입니다.
  • 15번 문제

정수 1357을 1 ~ 3 번째 자리에서 반올림해 출력하는 함수 프로그램

#include<stdio.h>
#include<math.h> // pow()함수
int round_pos(int n) {
	int a = 0;

	a = pow(10, n); // 10의 n승
	// 1의 자리에서 반올림 알고리즘 == (X + 5) / 10 * 10
	return (((1357 + (5 * a)) / (10 * a)) * (10 * a));
}
int main(void) {

	for (int n = 0; n < 3; n++)
		printf("%d번째 자리에서 반올림한 결과: %d\n", n, round_pos(n));
	
	return 0;
}
[실행 결과]

0번째 자리에서 반올림한 결과: 1360
1번째 자리에서 반올림한 결과: 1400
2번째 자리에서 반올림한 결과: 1000
  • 16번 문제

32비트데이터와 비트 위치 pos를 인자로 전달받아 32비트 데이터의 pos번째 비트가 1이면 1 아니면 0을 리턴하는 함수 프로그램

#include<stdio.h>
int is_bit_set(int num,int pos) {
	// pos번째 비트의 값을 찾고, 조건 연산
	if (((num & (1 << (pos - 1))) ? 1 : 0) == 0) {
		return 0;
	}
	else if (((num & (1 << (pos - 1))) ? 1 : 0) == 1) {
		return 1;
	}
	else return -1;
}
int main(void) {
	int num;
	int count = 0;

	printf("정수? ");
	scanf_s("%x", &num);
	printf("%X: ", num);

	for (int i = 32; i > 0; i--) {
		printf("%d", is_bit_set(num, i));
		count++;
		// 4bit 출력시 칸 띄우기, count 초기화 
		if (count == 4) {
			printf(" ");
			count = 0;
		}
	}
	return 0;
}
[실행 결과]

정수? 0x12345678
12345678: 0001 0010 0011 0100 0101 0110 0111 1000
  • 17번 문제

전달된 점의 좌표가 어느 사분면의 점인지 알려주는 함수 프로그램

#include<stdio.h>
int get_quadrant(int x, int y) {

	// 점의 위치 n분면을 찾아서 리턴
	if (x > 0 && y > 0) return 1;

	else if (x < 0 && y > 0) return 2;

	else if (x < 0 && y < 0) return 3;

	else if (x > 0 && y < 0) return 4;
		
	return 0;
}
int main(void) {
	int x, y;

	for (;;) {
		printf("점의 좌표 (x, y)? ");
		scanf_s("%d %d", &x, &y);

		switch (get_quadrant(x, y)) {
			// 0 리턴시 프로그램 종료
		case 0:
			return 0;
		case 1:
			printf("1사분면에 있습니다.\n");
			break;
		case 2:
			printf("2사분면에 있습니다.\n");
			break;
		case 3:
			printf("3사분면에 있습니다.\n");
			break;
		case 4:
			printf("4사분면에 있습니다.\n");
			break;
		}
	}
}
[실행 결과]

점의 좌표 (x, y)? 10 20
1사분면에 있습니다.
점의 좌표 (x, y)? -10 20
2사분면에 있습니다.
점의 좌표 (x, y)? 0 0
  • 18번 문제

0 ~ 999 사이의 난수의 약수를 구해서 출력하는 함수 프로그램

#include <stdio.h>
#include <stdlib.h> // rand(),srand() 함수
#include <time.h> // time() 함수
void divisors(int a) {
	int count = 0;

	printf("%d의 약수: ", a);

	for (int i = 1; i <= a; i++) {
		// 난수 a를 1부터 a까지 나눈 나머지가 0 == count++
		if (a % i == 0) {
			// count에 약수의 개수 저장
			count++;
			printf("%3d ", i);
		}
	}
	printf("==> 총 %d개\n", count);
}
int main(void) {
	srand(time(NULL)); // 항상 다른 난수를 얻을 수 있다.
	int i;
	
	for (i = 0; i < 3; i++) {
		// 0~999 사이의 난수
		int a = rand() % 1000;
		divisors(a);
	}
	return 0;
}
[실행 결과]

798의 약수:   1   2   3   6   7  14  19  21  38  42  57 114 133 266 399 798 ==> 총 16개
520의 약수:   1   2   4   5   8  10  13  20  26  40  52  65 104 130 260 520 ==> 총 16개
844의 약수:   1   2   4 211 422 844 ==> 총 6개
  • 19번 문제

수치 데이터와 스케일을 인자로 받아 그래프를 출력하는 함수 프로그램

#include <stdio.h>
#include <stdlib.h> // rand(),srand() 함수
#include <time.h> // time() 함수
void make_graph(int a) {
	a = a / 100;

	for (int i = 0; i <= a; ++i) {
		printf("*");
	}
	printf("\n");
}
int main(void) {
	srand(time(NULL)); // 매회 다른 난수를 얻음
	int i;

	for (i = 0; i < 3; i++) {
		// 0~9999 사이의 난수를 a에 입력
		int a = rand() % 10000;
		printf("%d: ", a);
		make_graph(a);
	}
	return 0;
}
[실행 결과]

3657: *************************************
2303: ************************
3297: *********************************
  • 20번 문제

전기 요금을 계산하는 함수 프로그램

#include<stdio.h>
double electric_charge(unsigned int kwh) {
	double a = 0, b = 0;

	// 사용량에 따른 전력량 요금 + 기본 요금 계산
	if (0 < kwh <= 20) {
		a = 910;
		b = 93.3 * kwh;

		if (200 < kwh < 400) {
			a = 1600;
			b = 187.9 * (kwh - 200) + (200 * 93.3);

			if (400 < kwh) {
				a = 7300;
				b = 280.6 * (kwh - 400) + (200 * 93.3) + (200 * 187.9);
			}
		}
	}
	// a == 기본 요금, b == 전력량 요금
	return a + b;
}
int main(void) {
	unsigned int kwh;

	for (;;) {
		printf("월 사용량 (kwh)? ");
		scanf_s("%d", &kwh);
		// -1 입력시 프로그램 종료
		if (kwh == -1) break;

		printf("전기 요금 합계: %.0f원\n", electric_charge(kwh));
	}
	return 0;
}
[실행 결과]

월 사용량 (kwh)? 350
전기 요금 합계: 48445원
월 사용량 (kwh)? 420
전기 요금 합계: 69152원
월 사용량 (kwh)? -1
Clone this wiki locally