관리 메뉴

공부 기록장 💻

[자료구조] 성적 관리 프로그램 (2차원 배열, 파일 입출력, 반복문 활용) 본문

# CS Study/DS Algorithm

[자료구조] 성적 관리 프로그램 (2차원 배열, 파일 입출력, 반복문 활용)

dream_for 2021. 3. 14. 20:39

자료구조1 실습 2주차

 

 

data.txt 파일

20184035     80 76 91
20184095     76 42 85
20184057     83 37 76
20184033     71 86 75
20184022     94 57 80

 

내가 작성한 코드

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

// _CRT_SECURE_NO_WARNINGS (속성 전처리기 추가)
#pragma warning (disable : 4996)

int main(void) {
	
	FILE* fp;
	int STUD[5][5] = { 0, }; // 5명의 학번/국어/영어/수학/총점을 저장하는 배열
	double avg[5] = { 0, }; // 5명의 과목 평균점수 저장
	int subjectSum[3] = { 0, }; // 각 과목에 대한 총점
	int studSum = 0; // 각 학생의 전체 과목에 대한 ㅊ오점
	double avgTotal = 0.0; // 학생들의 평균 점수에 대한 총점

	fp = fopen("data.txt", "rt");
	if (fp == NULL) {
		printf("File not found\n");
		return 0;
	}

	printf("|==============================================|\n");
	printf("| 학  번 | 국어 | 영어 | 수학 | 총 점 | 평  균 |\n");

	for (int i = 0; i < 5; i++) {
		fscanf(fp, "%d", &STUD[i][0]); // 학번 저장
		printf("|%d|", STUD[i][0]); // 학번 출력(1번째 열)

		for (int j = 1; j < 4; j++) {
			fscanf(fp, "%d", &STUD[i][j]);
			STUD[i][4] += STUD[i][j]; // 과목들의 총합을 각 행의 5번쨰 열(인덱스 번호 4)에 저장
			subjectSum[j-1] += STUD[i][j]; // 각 과목의 합을 저장
			printf("  %d  |", STUD[i][j]); // 각 과목 점수 출력(2,3,4번째 열)
		}

		printf("  %d  |", STUD[i][4]); // 각 학생의 총점을 5번째 열에 출력
		studSum += STUD[i][4]; // 학생들의 총점을 저장

		avg[i] = STUD[i][4] / 3.0; // 각 학생의 총점에 대한 평균을 저장
		avgTotal += avg[i]; // 학생들의 평균을 저장

		printf("  %.2f |\n", avg[i]); // 각 학생의 평균 점수를 6번째 열에 출력
	}

	printf("|========|======|======|======|=======|========|\n");
	
	printf("| 평  균 |");
	for (int i = 0; i < 3; i++)
		printf(" %.2f|", (double)subjectSum[i]/5.0);
	
	printf("% .1f |", (double)studSum / 5.0);
	printf(" %.2f |\n", avgTotal);

	printf("|==============================================|\n");

	fclose(fp);

	return 0;
}

 

학생이 5명이라는 전제 하에 배열의 행과 열의 수를 미리 선언하였다.

 

 

정답 코드

#include "pch.h"
#include <iostream>
#include <stdio.h>
#pragma warning(disable : 4996)

int main()
{
	FILE *fp;
	int StudentScore[4][10] = { 0 };
	int nCount = 0;
	int i = 0;
	int ScoreSum = 0;
	double ScoreAverage = 0.0;
	double SubjectAverage[3] = { 0.0 };

	fp = fopen("data.txt", "r");
	if (fp == NULL)
	{
		printf("File Not Found\n");
		return 0;
	}

	while (!feof(fp))
	{
		fscanf(fp, "%d%d%d%d", 
			&StudentScore[0][nCount],	// 학번
			&StudentScore[1][nCount],	// 국어
			&StudentScore[2][nCount],	// 영어
			&StudentScore[3][nCount]);	// 수학
		
		nCount++;	
	}
	
	fclose(fp);

	for (i = 0; i < nCount; i++)
	{
		ScoreSum = StudentScore[1][i] + 
			StudentScore[2][i] + 
			StudentScore[3][i];
		ScoreAverage = ScoreSum / 3.0;

		printf("%d %d %d %d %d %f\n",
			StudentScore[0][i],
			StudentScore[1][i],
			StudentScore[2][i],
			StudentScore[3][i],
			ScoreSum, ScoreAverage);

		SubjectAverage[0] += StudentScore[1][i];
		SubjectAverage[1] += StudentScore[2][i];
		SubjectAverage[2] += StudentScore[3][i];
	}
	printf("%f %f %f \n",
		SubjectAverage[0] / (double)nCount,
		SubjectAverage[1] / (double)nCount,
		SubjectAverage[2] / (double)nCount );

	return 0;

}

 

행을 학번/국어/영어/수학으로 설정하였다.

그리고 열을 각 학생의 정보로 설정하였다. (열의 개수가 10으로 충분한 공간을 확보)

 

 

1. 파일 입력 받으면서 학생의 수 증가시키기

- 차례대로 한 학생에 대한 정보가 한 행에 가로로 저장되어 있기 때문에, 한꺼번에 네 개의 정수를 입력 받도록 한다.

- 한 세트(정수 4개)에 대한 데이터를 입력 받고 나면, 학생의 수에 1을 더한다.

 

	while (!feof(fp))
	{
		fscanf(fp, "%d%d%d%d", 
			&StudentScore[0][nCount],	// 학번
			&StudentScore[1][nCount],	// 국어
			&StudentScore[2][nCount],	// 영어
			&StudentScore[3][nCount]);	// 수학
		
		nCount++;	
	}

 

 

2. 한 학생이 얻은 총점 / 각 과목별 총점

 

- nCount만큼(학생의 수만큼) 반복하면서 한 열에 대한 데이터 세트(학생 한 명의 각 과목별 점수들)를 모두 더해서 ScoreAverage에 누적하여 저장하고, 3.0으로 나눈다.

- 한 학생에 대하여, 각 과목 성적 전체를 출력하고, 각 과목별 총점에 대한 배열의 각 과목에 한 학생의 각 과목별 점수를 누적하여 저장하도록 한다.

 

 

for (i = 0; i < nCount; i++)
	{
		ScoreSum = StudentScore[1][i] + 
			StudentScore[2][i] + 
			StudentScore[3][i];
		ScoreAverage = ScoreSum / 3.0;

		printf("%d %d %d %d %d %f\n",
			StudentScore[0][i],
			StudentScore[1][i],
			StudentScore[2][i],
			StudentScore[3][i],
			ScoreSum, ScoreAverage);

		SubjectAverage[0] += StudentScore[1][i];
		SubjectAverage[1] += StudentScore[2][i];
		SubjectAverage[2] += StudentScore[3][i];
	}

 

728x90
반응형
Comments