본문 바로가기

공부/자료구조 | 알고리즘

[자료구조] 동적 메모리 할당 / 반별, 과목별 평균 성적 구하기 예제

반응형
배열의 문제점
  • 원소의 개수가 미리 파악이 안되는 경우 문제 발생 

    • 학생 성적 평균 예의 경우, 학생수를 모른다면? 아주 큰 배열로 선언할 수도 있으나, 비효율적임 
    • 실제 학생수에 맞는 배열 선언이 필요
    •  학생수는 실행 도중 사용자로부터 입력을 받을 수도 있음  

 동적 메모리 할당의 필요성 ! 

 

 

동적 메모리 할당
  • 동적 메모리 할당 (Dynamic Memory Allocation)

    • 실행 도중, 추가적인 메모리 영역을 배정받고자 하는 경우에 사용 malloc() 함수가 대표적으로 사용됨  
      void *malloc(int size)
      (char *) malloc(100); (int *) malloc(sizeof(int)*20);
  • C++ “new 객체명 같은 방식 주로 사용(보다 편리)
  • ) int *ptr = new int[10]; // ptr 10개의 원소로 이루어진 배열을 가리킴

 

예제) 학생들의 성적을 입력 받아 반별, 과목별 평균을 계산하고 출력하기 
- 학급별 학생수가 다르고, 또한 프로그램 개발 시점에서 이를 미리 알지 못한다.
- 모든 학급에 적용 가능한 프로그램을 작성하시오.
- 단, 실행 시 학급 인원수를 먼저 입력할 수 있다.
#include <iostream>
using namespace std;

const int CLASS = 3;
const int SUBJECT = 3;
const int STUDENT = 10;

int main()
{
    int score[CLASS][SUBJECT][STUDENT] = {
        90,80,70,60,57,40,96,86,76,66,
        56,90,87,70,60,50,40,96,86,76,
        66,58,90,82,70,60,58,40,96,86,
        76,66,57,94,80,70,68,50,40,96,
        86,76,66,56,94,80,70,61,50,47,
        96,86,76,66,56,90,80,70,60,58,
        44,96,86,76,68,56,90,87,70,60,
        51,40,96,86,76,66,56,97,80,74,
        60,50,40,96,86,76,66,56,95,83};
    
    //각 반별 과목별 평균
    cout << "각 반별 과목별 평균" << endl;
    for (int cls = 0; cls < CLASS; cls++) {
        for (int subject = 0; subject < SUBJECT; subject++) {
            int sum = 0;
            for (int student = 0; student < STUDENT; student++) {
                sum += score[cls][subject][student];
            }
            double average = (double)sum / STUDENT;
            cout << "CLASS = " << cls << " SUBJECT = " << subject << " AVERAGE = " << average << endl;
        }
    }
    
    //과목별 전체 평균
    cout << "\n" << "과목별 전체 평균" << endl;
    for (int subject = 0; subject<SUBJECT; subject++){
        int sum = 0;
        for (int cls = 0; cls < CLASS; cls++)
            for (int student = 0; student < STUDENT; student++)
                sum += score[cls][subject][student];
        double average = (double)sum / (CLASS + STUDENT);
        
        cout << "SUBJECT = " << subject << " AVEARAGE = " << average << endl;
    }
}

 

 

 

반응형