티스토리 뷰

기부금 관리 프로그램을 만듭니다.

자선단체에 기부하는 사람들의 명단과 금액을 입력한 후에 평균 기부액을 출력합니다.

 

단, 기부하는 사람의 수는 제한이 없습니다.

이름으로 "end"를 입력하면 입력을 종료합니다.

 

실행결과는 다음과 같습니다.

/*
실행결과

이름 : 홍길동
기부금 : 80
이름 : 이순신
기부금 : 230
이름 : 유관순
기부금 : 60
이름 : KOEY
기부금 : 850
이름 : end
1. 홍길동 80
2. 이순신 230
3. 유관순 60
4. KOEY 850
평균 기부액 : 305
*/

 


기부하는 사람의 수는 제한이 없으므로

기부하는 사람의 이름이나 기부금을 저장할 배열은 그 크기가 하드코딩되면 안 됩니다.

이를 동적 메모리 할당으로 해결합니다.

 

제가 작성한 코드는 아래와 같습니다.

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

int getNameAndDonation(char*** names, int*** donations, int* max);
void printNameAndDonation(char** names, int** donations, int count);

void main(void)
{
	char** names;
	int** donations;

	names = (char**)malloc(sizeof(char*) * 3);
	donations = (int**)malloc(sizeof(int*) * 3);

	int max = 2, count = 0;

	//이름과 기부금을 입력받는 함수
	count = getNameAndDonation(&names, &donations, &max);

	//평균 기부금을 계산하는 로직
	double avg;
	int sum = 0;
	for (int i = 0; i < count; i++)
	{
		sum += *donations[i];
	}
	avg = sum / (double)count;

	//이름과 기부금을 출력하는 함수
	printNameAndDonation(names, donations, count);

	printf("평균 기부액 : %.1lf\n", avg);
}

int getNameAndDonation(char ***names, int***donations, int* max)
{
	int i = 0;
	while (1)
	{
		char temp[41];

		printf("이름 : ");
		fgets(temp, 41, stdin);
		temp[strlen(temp) - 1] = '\0';

		if (strcmp(temp, "end") == 0) break;

		(*names)[i] = (char*)malloc(sizeof(char) * (strlen(temp) + 1));
		if ((*names)[i] == NULL)
		{
			printf("메모리가 부족합니다.\n");
			exit(1);
		}

		strcpy((*names)[i], temp);

		(*donations)[i] = (int*)malloc(sizeof(int));
		if ((*donations)[i] == NULL)
		{
			printf("메모리가 부족합니다.\n");
			exit(1);
		}

		printf("기부금 : ");
		scanf("%d", (*donations)[i]);
		getchar();

		i++;
		
		if (i == *max)
		{
			printf("메모리를 확보합니다.\n");
			*max += 3;
			*names = (char**)realloc(*names, sizeof(char*) * (*max + 1));
			if (*names == NULL)
			{
				printf("메모리가 부족합니다.\n");
				exit(1);
			}

			*donations = (int**)realloc(*donations, sizeof(int*) * (*max + 1));
			if (*donations == NULL)
			{
				printf("메모리가 부족합니다.\n");
				exit(1);
			}
		}
		
	}

	return i;
}

void printNameAndDonation(char** names, int**donations, int count)
{
	for (int i = 0; i < count; i++)
	{
		printf("%d. ", i + 1);
		printf("%s ", names[i]);
		printf("%d\n", *donations[i]);
	}
}

다음은 제 코드의 실행결과입니다.

/*
실행결과

이름 : 홍길동
기부금 : 80
이름 : 이순신
기부금 : 230
메모리를 확보합니다.
이름 : 유관순
기부금 : 60
이름 : KOEY
기부금 : 850
1. 홍길동 80
2. 이순신 230
3. 유관순 60
4. KOEY 850
평균 기부액 : 305.0
*/

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함