반응형
13. 화씨->섭씨, 섭씨->화씨로 바꾸는 함수를 각각 작성하라.
#include <stdio.h> double FtoC(double F); double CtoF(double C); int main() { char CF; double temperature; do { printf("입력할 온도가 섭씨면 C, 화씨면 F를 입력하세요 : "); scanf_s("%c", &CF, sizeof(char)); while (getchar() != '\n') {} if ('a' <= CF && CF <= 'z') { CF -= 32; } if (CF != 'C' && CF != 'F') { printf("잘못 입력하셨습니다. 다시 입력하세요. \n"); } } while (CF != 'C' && CF != 'F'); printf("온도를 입력하세요 : "); scanf_s("%lf", &temperature); switch (CF) { case 'C': printf("섭씨%.2lf도는 화씨%.2lf도 입니다. \n", temperature, CtoF(temperature)); break; case 'F': printf("화씨%.2lf도는 섭씨%.2lf도 입니다. \n", temperature, FtoC(temperature)); break; } } double FtoC(double F) { return (F - 32) * 5 / 9; } double CtoF(double C) { return (9 / 5 * C) + 32; }
화씨 : Tf, 섭씨 : Tc
Tf = (9/5 * Tc) + 32
Tc = (Tf - 32) * 9/5
14. 자연로그 2를 구하는 프로그램을 함수로 변경하라. (문제 내용 대폭 생략)
#include <stdio.h> #include <math.h> double NL(double x); int main() { printf("백만항까지 계산한 log(2) = %lf \n", NL(2)); printf("표준함수로 계산한 Log(2) = %lf \n", log(2)); } //자연로그 2만 계산 가능한 함수... double NL(double x) { double sign = 1.0, log = 0.0, temp; temp = x - 1.0; x -= 1.0; for (int i = 1; i <= 1000000; i++) { log += (sign * x) / i; x *= temp; sign *= -1; } return log; }
자연로그 :
자연상수e를 밑으로 하는 로그.
자연상수e :
//잘 모르니까 공부하는걸로...
15. 다음은 라이프니치의 pi를 구하는 공식이다. 이를 함수로 작성하라. (1000항까지 계산)
#include <stdio.h> double LeibnizPi(void); int main() { printf("라이프니치가 계산한 파이는 %lf \n", LeibnizPi()); } double LeibnizPi(void) { double sum = 0; for (int i = 1; i <= 1000; i++) { if (i % 2 != 0) { sum += 1.0 / (2 * i - 1); } else { sum -= 1.0 / (2 * i - 1); } } return 4 * sum; }
16. 두 수를 넘겨받아 두 수 사이의 합을 반환하는 함수를 작성하라.
#include <stdio.h> int sumAtoZ(int a, int z); int main() { int a, z; printf("두 수 사이의 합을 계산합니다. \n"); printf("첫번째 정수를 입력하세요 : "); scanf_s("%d", &a); printf("두번째 정수를 입력하세요 : "); scanf_s("%d", &z); printf("%d부터 %d까지의 합은 %d입니다. \n", (a < z ? a : z), (a > z ? a : z), sumAtoZ(a, z)); } int sumAtoZ(int a, int z) { int sum = 0; for (int i = (a < z ? a : z); i <= (a > z ? a : z); i++) { sum += i; } return sum; }
17. 대문자는 소문자로, 소문자는 대문자로 변경시키는 함수를 각각 작성하라.
#include <stdio.h> void UptoLo(char str[]); void LotoUp(char str[]); int main() { int input; char str[100]; do { printf("원하는 작업을 선택하세요. \n"); printf("1. 대문자를 소문자로 변경 \n"); printf("2. 소문자를 대문자로 변경 \n"); scanf_s("%d", &input); if (input != 1 && input != 2) { printf("잘못 입력하셨습니다. \n"); } } while (input != 1 && input != 2); while (getchar() != '\n') {} //버퍼 비우기 printf("변환을 실행할 문자열을 입력하세요 :"); scanf_s("%[^\n]s", str, sizeof(str)); // fgets(str, sizeof(str), stdin); /* 그냥 scanf_s로 받으면 공백이 입력될 시 입력이 종료되므로 둘 중 하나로 사용하면 된다. [^\n]는 개행문자가 들어오기 전까지 입력된 가장 긴 문자열을 버퍼에 저장하라는 뜻이다. */ switch (input) { case 1: UptoLo(str); break; case 2: LotoUp(str); break; } printf("\n"); printf("변환 후 문자열은\n"); printf("%s\n", str); printf("입니다."); } void UptoLo(char str[]) { for (int i = 0; str[i] != '\0'; i++) { if ('A' <= str[i] && str[i] <= 'Z') { str[i] += 32; } } } void LotoUp(char str[]) { for (int i = 0; str[i] != '\0'; i++) { if ('a' <= str[i] && str[i] <= 'z') { str[i] -= 32; } } }
18. main함수의 매개변수로 16진수를 받아들여 10진수로 변환하는 프로그램을 작성하라.
#include <stdio.h> #include <string.h> //strlen(), _strupr_s() //strlen() : 인수로 전달된 문자열의 길이를 리턴하는 함수 //_strupr_s() : 문자열을 받아 소문자를 대문자로 변환해주는 함수. void LotoUp(char str[]); int main(int argc, char *argv[]) { int sqr = 1, sum = 0; if (argc != 2) { printf("사용방법 : \n \t 매개변수로 16진수를 입력하세요. \n"); return 0; } for (int i = 1; argv[1][i] != '\0'; i++) { sqr *= 16; } LotoUp(argv[1]); for (int i = 0; argv[1][i] != '\0'; i++) { if (argv[1][i] >= 'A' && argv[1][i] <= 'F') { sum += ((argv[1][i] - 55)*sqr); } else if (argv[1][i] >= '0' && argv[1][i] <= '9') { sum += ((argv[1][i] - 48) * sqr); } sqr /= 16; } printf("16진수 %s의 10진수 값은 %d입니다. \n", argv[1], sum); } void LotoUp(char str[]) { for (int i = 0; str[i] != '\0'; i++) { if ('a' <= str[i] && str[i] <= 'z') { str[i] -= 32; } } }
19. 자연상수 e
= 2.71828182...이다. 다음 공식을 이용하여 입력받은 x에 대한 ex를 구하는 함수를 작성하라.
#include <stdio.h> #include <math.h> double NaE(double x); int main() { double x; printf("자연상수 e의 x승을 구합니다. \n"); printf("x를 입력해주세요. : "); scanf_s("%lf", &x); printf("e의 %g승은 %g입니다. \n", x, NaE(x)); } double NaE(double x) { int under = 1; double result = 1; for (int i = 1; i <= 10; i++) { under = 1; for (int k = 1; k <= i; k++) { under *= k; } result += (pow(x, i)/under); } return result; }
20. 다음 공식을 이용하여 sinx를 구하는 함수를 작성하라. 여기서 x는 radian값이다.
#include <stdio.h> #include <math.h> const double PI = 3.141592; double sinx(double x); int main() { char DR; double Degree; do { printf("사인값을 계산합니다. 각도를 입력할 방법을 선택하세요. \n : "); printf("D. degree, R. radian \n"); scanf_s("%c", &DR, sizeof(char)); while (getchar() != '\n') {} if ('a' <= DR && DR <= 'z') { DR -= 32; } if (DR != 'D' && DR != 'R') { printf("잘못 입력하셨습니다. 다시 입력하세요. \n"); } } while (DR != 'D' && DR != 'R'); printf("각도를 입력하세요 : "); scanf_s("%lf", &Degree); switch (DR) { case 'D': printf("sin(%gDegree)는 %g입니다. (정밀도 주의) \n",Degree, sinx(PI/180*Degree)); break; case 'R': printf("sin(%gRadian)은 %g입니다. \n", Degree, sinx(Degree)); break; } } double sinx(double x) { int under = 1; double result = 0; for (int i = 1; i <= 10; i += 2) { under = 1; for (int k = 1; k <= i; k++) { under *= k; } if ((i/2) % 2 == 0) { result += (pow(x, i) / under); } else { result -= (pow(x, i) / under); } } return result; }
21. 정수의 몫과 나머지를 구하여 출력하는 함수를 작성하라.
#include <stdio.h> void DvMo (int x, int y); int main() { int x, y; printf("x 나누기 y의 몫과 나머지를 출력합니다. \n"); printf("x값을 입력하세요 :"); scanf_s("%d", &x); printf("y값을 입력하세요 :"); scanf_s("%d", &y); DvMo(x, y); } void DvMo(int x, int y) { printf("%d 나누기 %d의 몫은 %d이고 나머지는 %d입니다. \n", x, y, x / y, x % y); }
22. 정해진 소수 자리에서 반올림을 구하는 함수(round)를 작성하라. 원형은 double round(double i, int pointN); 이다.
#include <stdio.h> #include <math.h> double round(double i, int pointN); int main() { double x; int n; printf("실수를 입력하세요 : "); scanf_s("%lf", &x); printf("반올림할 자리수를 입력하세요 : "); scanf_s("%d", &n); printf("%g \n", round(x, n)); } double round(double i, int pointN) { double result; result = i * pow(10, pointN); result = (int)result; result = result / pow(10, pointN); return result; }
23. 실수의 몫과 나머지를 구하여 출력하는 함수를 작성하라. //실수형의 나머지를 계산하는 fmod라는 표준함수가 있다
#include <stdio.h> int Fdiv(double dsor, double dend); double Fmod(double dsor, double dend); int main() { double sor, end; printf("실수 나누기의 몫과 나머지를 계산합니다. \n"); printf("나눠질 실수를 입력하세요 : "); scanf_s("%lf", &sor); printf("나눌 실수를 입력하세요 : "); scanf_s("%lf", &end); printf("%g 나누기 %g의 몫은 %d 나머지는 %g입니다. \n",sor,end, Fdiv(sor,end), Fmod(sor,end)); } int Fdiv(double dsor, double dend) { int quotient = 0; while (dsor > dend) { dsor -= dend; quotient++; } return quotient; } double Fmod(double dsor, double dend) { while (dsor > dend) { dsor -= dend; } return dsor; }
24. 거리 환산 프로그램을 각각 함수로 작성하라.
#include <stdio.h> double nmile_m(double nm); double m_nmile(double m); double feet_m(double ft); double knot_kmh(double knot); double mile_m(double mile); int main() { int ch; double input; do { printf("원하는 연산을 선택하세요 \n"); printf("1. 해리를 미터로 변환 \n"); printf("2. 미터를 해리로 변환 \n"); printf("3. 피트를 미터로 변환 \n"); printf("4. 마일을 미터로 변환 \n"); printf("5. 노트를 킬로미터퍼시로 변환 \n"); scanf_s("%d", &ch); if (1 > ch && ch > 5) { printf("잘못 입력하셨습니다. 다시 입력하세요. \n"); } } while (1 > ch && ch > 5); switch (ch) { case 1: printf("몇 해리인지 입력하세요 :"); scanf_s("%lf", &input); printf("%g해리는 %g미터입니다. \n", input, nmile_m(input)); break; case 2: printf("몇 미터인지 입력하세요 :"); scanf_s("%lf", &input); printf("%g미터는 %g해리입니다. \n", input, m_nmile(input)); break; case 3: printf("몇 피트인지 입력하세요 :"); scanf_s("%lf", &input); printf("%g피트는 %g미터입니다. \n", input, feet_m(input)); break; case 4: printf("몇 마일인지 입력하세요 :"); scanf_s("%lf", &input); printf("%g마일은 %g미터입니다. \n", input, mile_m(input)); break; case 5: printf("몇 노트인지 입력하세요 :"); scanf_s("%lf", &input); printf("%g노트는 %gkm/h입니다. \n", input, knot_kmh(input)); break; } } double nmile_m(double nm) { return nm * 1852; } double m_nmile(double m) { return m * 0.5399568; } double feet_m(double ft) { return ft * 0.3048; } double knot_kmh(double knot) { return knot * 1852; } double mile_m(double mile) { return mile * 0.0006; }
반응형