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

C언어 연습문제 풀이 CH7 (9~12)

라이피 (Lypi) 2018. 5. 21. 21:46
반응형

9. 7명의 심판에게 점수를 입력받고, 최고점과 최저점을 뺀 점수의 평균을 구하는 프로그램을 작성하라.

#include <stdio.h>
#include <stdlib.h>

int sum(int sc[], int N);
int max(int sc[], int N);
int min(int sc[], int N);

int main()
{
	int score[7];
	int N = sizeof(score) / sizeof(int);

	for (int i = 0; i < N; i++) {
		printf("%d번째 심판의 점수를 입력하세요 : ", i + 1); scanf_s("%d", &score[i]);
	}

	printf("최종 점수는 최고점 %d점과 최하점 %d점을 뺀 총점 %d점의 평균인 %.2lf점 입니다. \n",
		max(score, N), min(score, N), (sum(score, N) - max(score, N) - min(score, N)),
		(double)(sum(score, N) - max(score, N) - min(score, N)) / (double)(N - 2)
	);
	
}

int sum(int sc[], int N)
{
	int sum = 0;

	for (int i = 0; i < N; i++) {
		sum += sc[i];
	}

	return sum;
}

int max(int sc[], int N)
{
	int max = sc[0];

	for (int i = 1; i < N; i++) {
		if (max < sc[i]) {
			max = sc[i];
		}
	}

	return max;
}

int min(int sc[], int N)
{
	int min = sc[0];

	for (int i = 1; i < N; i++) {
		if (min > sc[i]) {
			min = sc[i];
		}
	}

	return min;
}


10. 2차 방정식 ax^2+bx+c=0에서 a,b,c의 값을 입력받고, 판별식D를 확인하는 함수를 작성하고, 허근이 아닐 때 근을 구하는 함수를 작성하라.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

double discriminant(double a, double b, double c);
double quadratic(double a, double b, double c, double D);

int main()
{
	double a, b, c;

	printf("2차방정식 ax^2+bx+c의 근을 확인합니다. \n");
	printf("a값을 입력하세요 : "); scanf_s("%lf", &a);
	printf("b값을 입력하세요 : "); scanf_s("%lf", &b);
	printf("c값을 입력하세요 : "); scanf_s("%lf", &c);

	quadratic(a, b, c, discriminant(a, b, c));
}

double discriminant(double a, double b, double c)
{
	return pow(b, 2) - (4 * a*c);
}

double quadratic(double a, double b, double c, double D)
{
	if (a == 0) {
		printf("2차 방정식이 아닙니다. \n");
		printf("1차 방정식의 근은 %lf입니다. \n", (-(double)c/(double)b));
		return (-(double)c / (double)b);
	}

	if (D < 0) {
		printf("2차방정식의 두근이 허근입니다. \n");
		return 0;
	}

	if(D > 0) {
		printf("2차 방정식의 두근은 %.2lf,%.2lf입니다. \n",
			(-b + (pow(D, 1.0 / 2.0))) / 2 * a , 
			(-b - (pow(D, 1.0 / 2.0))) / 2 * a);
		printf("리턴값은 첫번째 값입니다. \n");
	}

	if (D == 0) {
		printf("이 2차방정식의 근은 %.2lf입니다. \n",
			(-b + (pow(D, 1.0 / 2.0))) / 2 * a);
		printf("이 2차방정식은 중근 하나만 갖습니다. \n");
	}

	return (-b + (pow(D, 1.0 / 2.0))) / 2 * a;
}


11. 산술, 기하, 조화 평균을 구하는 함수를 각각 작성하라.

#include <stdio.h>
#include <math.h>

double arithmatic(int iarr[],int Num);
double geometric(int iarr[],int Num);
double harmonic(int iarr[], int Num);

int main()
{
	const int Num = 2;

	int iarr[Num];

	for (int i = 0; i < Num; i++) {
		printf("%d번째 값을 입력하세요 : ", i + 1); scanf_s("%d", &iarr[i]);
	}
	
	int line = 0;

	for (int i = 0; i < Num; i++) {
		printf("%d ", iarr[i]);
		line++;
		if (line == 10) {
			printf("\n");
			line = 0;
		}
	}

	printf("의 산술평균 = %.2lf, 기하평균 = %.2lf, 조화평균 = %.2lf 입니다.", 
		arithmatic(iarr, Num), geometric(iarr, Num), harmonic(iarr, Num));
}

double arithmatic(int iarr[], int Num)
{

	double sum = 0;

	for (int i = 0; i < Num; i++) {
		sum += iarr[i];
	}

	return (sum / (double)Num);
}

double geometric(int iarr[], int Num)
{
	
	double multiple = 1;

	for (int i = 0; i < Num; i++) {
		multiple *= iarr[i];
	}

	return pow(multiple, 1.0 / Num);
}

double harmonic(int iarr[], int Num)
{
	
	for (int i = 0; i < Num; i++) {
		if (iarr[i] < 0) {
			printf("모든 수가 양수일 때만 조화평균을 구할 수 있습니다. \n");
			return 0;
		}
	}

	double sum = 0;

	for (int i = 0; i < Num; i++) {
		sum += (1.0 / iarr[i]);
	}

	return (double)Num / sum;
}


12. 1열에 점수가 들어있는 2차원 배열의 2열에 각 점수에 대한 석차를 구해서 저장하는 함수를 작성하라.

#include <stdio.h>

const int N = 5;

void grade(int score[N][2], int Num);


int main()
{
	int score[N][2];
	
	printf("점수를 입력받습니다. \n");

	for (int i = 0; i < N; i++) {
		printf("%d번째 점수를 입력해주세요 : ",i+1); scanf_s("%d", &score[i][0]);
	}

	grade(score, N);

	for (int i = 0; i < N; i++) {
		printf("%d점 %d등 \n", score[i][0], score[i][1]);
	}

}

void grade(int score[N][2], int Num)
{
	int top;

	for (int i = 0; i < Num; i++) {
		score[i][1] = 1;
	}
	
	for (int k = 0; k < Num; k++) {

		for (int i = 0; i < Num; i++) {
			if (score[i][1] > i) {
				top = score[i][0];
				break;
			}
		}

		for (int i = 0; i < Num; i++) {
			if (score[i][1] > k) {
				if (score[i][0] > top) {
					top = score[i][0];
				}
			}
		}

		for (int i = 0; i < Num; i++) {
			if (score[i][0] < top) {
				score[i][1]++;
			}
		}
	}
}

//머리가 안 돌아... 왜 되는건지 잘 모르겠어... 순서도 그려봐야지...

반응형