-
Notifications
You must be signed in to change notification settings - Fork 0
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
Visual Studio 2019 에서 작성 되었습니다.