과제 #3 함수, 포인터의 사용

언어로그/C/C++ 2010. 12. 10. 14:25

1. 최대값과 최소값을 구하는 함수

  • 세 개의 정수를 입력받아서 그중 가장 큰 수를 반환하는 함수와 가장 작은 수를 반환하는 함수 작성.

입력

  • 세 개의 정수 입력 : 7 4 9

출력

  • 최대값 : 9
  • 최소값 : 4

코드

/*
    입력: 세 개의 정수 
    출력: 가장 큰수와 가장 작은 수 
    조건: 가장 큰수를 반환하는  함수 
        가장 작은수를 반환하는 함수 작성  
*/

#include <stdio.h>

int max_num(int a, int b, int c);
int min_num(int a, int b, int c);

int main (int argc, char const* argv[])
{
    int a, b, c, max, min;

    printf("세 개의 정수 입력 : ");
    scanf("%d %d %d", &a, &b, &c);

    max = max_num(a, b, c);
    min = min_num(a, b, c);

    printf("\n최대값 : %d\n", max);
    printf("\n최소값 : %d\n", min);

    return 0;
}

int max_num(int a, int b, int c) {
    int temp = a > b ? a : b;
    return temp > c ? temp : c;
}


int min_num(int a, int b, int c) {
    int temp = a < b ? a : b;
    return temp < c ? temp : c;
}  



2. 온도변환 : 화씨와 섭씨 변환 함수

  • Fahrenheit 함수 : 섭씨온도를 입력하면 화씨 온도로 변환
  • Celsius 함수 : 화씨 온도를 섭씨 온도로 변환
  • 공식 : F = 1.8 * C + 32
## 온도 변환 ##  
1) 섭씨 입력  
2) 화씨 입력

## 메뉴선택: 1
입력:
섭씨 입력:  32

출력:
변환된 화씨 : 89.60

코드

/*
    입력: 섭씨온도 또는 화씨온도 
    출력: 섭씨온도 또는 화씨온도 
    조건: 섭씨온도는 화씨온도 / 화씨온도는 섭씨온도로 변환하는 함수 작성 
*/

#include <stdio.h>

double fahrenheit_to_celsius(double f);
double celsius_to_fahrenheit(double c);

int main (int argc, char const* argv[])
{
    double input, output;
    int select;

    printf(" ### 온도 변환 ### \n\n");
    printf("1) 섭씨 입력 \n");
    printf("2) 화씨 입력 \n");
    printf("\n메뉴 선택 : ");

    scanf("%d", &select);

    if (select == 1) {
        printf("\n섭씨입력 : ");
        scanf("%lf", &input);
        output = celsius_to_fahrenheit(input);
        printf("변환된 화씨 : %.2lf \n", output);
    } else if (select == 2) {
        printf("\n화씨입력 : ");
        scanf("%lf", &input);
        output = fahrenheit_to_celsius(input);
        printf("변환된 섭씨 : %.2lf \n", output);
    }

    return 0;
}

double fahrenheit_to_celsius(double f) {
    double c = (f - 32) / 1.8;
    return c;
}

double celsius_to_fahrenheit(double c) {
    double f = 1.8 * c + 32;
    return f;
}  



3. 최대값과 최소값의 주소를 반환하는 함수

  • 세 개의 정수를 입력 받아서 그 중 가장 큰 수의 주소를 반환하는 함수와 가장 작은수의 주소를 반환하는 함수를 작성 (입출력은 #1과 동일)
int *MAX(int *, int *, int *);  
int *MIN(int *, int *,  int *);

코드

/*
    입력: 세 개의 정수 
    출력: 가장 큰수, 가장 작은수 
    조건: 가장 큰수의 주소를 반환하는 함수 
       가장 작은수의 주수를 반환하는 함수 작성 
*/

#include <stdio.h>

int* max_num_addr(int *a, int *b, int *c);
int* min_num_addr(int *a, int *b, int *c);

int main (int argc, char const* argv[])
{
    int a, b, c, *max, *min;

    printf("세 개의 정수 입력 : ");
    scanf("%d %d %d", &a, &b, &c);

    max = max_num_addr(&a, &b, &c);
    min = min_num_addr(&a, &b, &c);

    printf("\n최대값 : %d\n", *max);
    printf("최소값 : %d\n", *min);

    return 0;
}

int* max_num_addr(int *a, int *b, int *c) {
    int *temp = *a > *b ? a : b;
    return *temp > *c ? temp : c;
}


int* min_num_addr(int *a, int *b, int *c) {
    int *temp = *a < *b ? a : b;
    return *temp < *c ? temp : c;
}



4. 반올림 계산 함수

  • 양의 부동소수점 수를 받아서 소수점 셋째 자리에서 반올림 하는 함수 작성

입력

  • 양의 부동소수점을 입력 하시오 : 123.456789

출력

  • 반올림 결과 : 123.460000

문제해결

  • 소수점 셋째자리 반올림을 위해, 1000을 곱한다. 그리고 1의 자리 수가 5이상이면 10을 더하고, 1의 자리 수를 버린다. 이 수를 다시 1000으로 나누면 소수점 셋째 자리에서 반올림한 결과를 얻을 수 있다.

코드

/*
    입력: 양의 부동소수 점 
    출력: 소수 셋째 자리까지 반올림 된 수 (소수 6째 자리까지 출력) 
    조건: 
*/

#include <stdio.h>

#define SPACE 1000.0

double roundTwo(double x);

int main (int argc, char const* argv[])
{
    double input, output;

    printf("양의 부동소수점을 입력하시오 : ");
    scanf("%lf", &input);

    output = roundTwo(input);

    printf("\n반올림 결과 : %.6lf \n", output);

    return 0;
}

// 소수 3째 자리에서 반올림  
double roundTwo(double x) {
    int temp  = (int)(x * SPACE);

    if (temp % 10 >= 5) {
        temp += 10;
    }
    temp -= (temp%10); 

    return temp / SPACE;
} 



5. 이진수를 십진수로 변환하는 함수

  • 사용자로 부터 이진수를 입력 받아서 십진수로 변환하는 프로그램을 작성.
  • 사용자로부터 이진수를 입력받는 함수 (입력값이 0과 1로만 이루어져 있는지 판별)
  • 이진수를 십진수로 변환하는 함수

입/출력

이진수를 입력하시오 (0 또는 1) : 123
이진수가 아닙니다. 0 또는 1만 입력하시오.

이진수를 입력하시오 (0 또는 1) : 1010

입력한 이진수 : 1010
변환된 십진수: 10  

문제해결

  • 이진수 여부를 판별하기 위해서는 입력된 수의 각 자리수가 0 또는 1이어야 한다. 각 자리 수 확인을 위해 입력된 수를 10으로 나눈 나머지를 통해 각 자리수를 확인할 수 있다. 이진수를 십진수로 변경은 이진수 각 자리수에 대해서 2를 자리수만큼 곱한 것들의 합으로 구할 수 있다. 이 때 2의 자리수만큼의 곱은 시프트 연산으로 대신해 코드를 간결하게 할 수 있다.

코드

/*
    입력: 이진수
    출력: 십진수 
    조건: 이진수를 입력받는 함수 
        이진수를 십진수로 변환하는 함수 작성 
*/

#include <stdio.h>

#define TRUE 1
#define FALSE 0

int input_binary(int *input);
int binary_to_decimal(int binary);

int main (int argc, char const* argv[])
{   
    int input, output;

    while (input_binary(&input) == FALSE) {
        printf("이진수가 아닙니다. 0 또는 1만 입력하시오. \n\n");
    }
    output = binary_to_decimal(input);

    printf("입력된 이진수: %d \n", input);
    printf("변환된 십진 수 : %d \n", output);

    return 0;
}

// 이진수를 입력받고, 검사 
int input_binary(int *input) {  
    int temp;

    printf("이진수를 입력하시오 (0 또는 1) : ");
    scanf("%d", input);

    temp = *input;  
    while (temp != 0) {
        if (temp % 10 > 1) {
            return FALSE;
        }
        temp /= 10;
    }
    return TRUE;
}

// 이진수를 십진수로 변환 
int binary_to_decimal(int binary) {
    int decimal = 0, b = binary; 
    int i, rem;

    for (i = 0; b != 0; i++) {
        rem = b % 10;
        rem = rem << i;
        decimal += rem;
        b /= 10;
    }

    return decimal;
} 


'언어로그 > C/C++' 카테고리의 다른 글

C 프로그램 실행과정  (0) 2011.02.22
C 언어란?  (0) 2011.02.22
비트필드  (0) 2010.12.10
함수의 이해 / 데이터 전달  (0) 2010.12.10
과제 #3 함수, 포인터의 사용  (0) 2010.12.10
과제#4 배열과 문자열  (0) 2009.10.03