티스토리 뷰
기부금 관리 프로그램을 만듭니다.
자선단체에 기부하는 사람들의 명단과 금액을 입력한 후에 평균 기부액을 출력합니다.
단, 기부하는 사람의 수는 제한이 없습니다.
이름으로 "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
*/
'공부 일지 > C언어 공부 일지' 카테고리의 다른 글
사용자 정의 자료형 (0) | 2021.01.29 |
---|---|
동적 메모리 할당 및 활용 관련 문제2 (0) | 2021.01.28 |
동적 할당 저장 공간의 활용 (0) | 2021.01.28 |
메모리 동적 할당 (0) | 2021.01.28 |
C언어 과정 기록에 앞서.. (0) | 2021.01.27 |