연재 완료/C Lang 예제코드 모음

C언어 연습문제 풀이 CH7 (13~24)

라이피 (Lypi) 2018. 5. 22. 22:31
반응형

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 : 


\displaystyle \lim_{n->\infty} {(1+1/n)^{n}} = \lim _{n->0} {(1+n)^{\frac{1}{n}}}


//잘 모르니까 공부하는걸로...



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;
}


반응형