반응형

힙(Heap) 메모리에 임의의 외부 파일에 저장되어 있는 2차원 배열 데이터를 저장할 수 있는 동적 메모리를 생성하고, 최소값과 최대값 그리고 각각의 행의 평균을 계산하는 프로그램을 작성해 보자. 2차원 데이터는 파일로부터 읽는다. 처음 두 개의 요소들은 배열의 행 과 열의 수를 나타낸다. 파일 데이터는 아래와 같다. 아래의 2차원 배열은 12 X 8 배열이다.
------------------------------------------
8 12
638 758 113 515 51 627 10 41 9 212 86 749
767 84 60 225 54 3 89 183 137 566 966 979
495 31 1 387 54 31 145 882 736 524 50 5
394 102 851 57 754 553 561 9 8 628 188 85
43 957 406 165 40 3 562 834 343 950 444 803
953 21 8 753 548 484 21 848 231 234 87 8
448 979 721 315 875 342 587 89 4 942 37 987
351 321 897 8 64 334 90 73 48 95 79 12
------------------------------------------

1. 문제에서 주어진 2차원 데이터 배열을 (배열의 행과 열 정보도 같이)메모장 등의 텍스트 편집기를 이용하여 임의의 이름으로 파일을 저장(예 test.txt)하고, File 입출력 함수를 통하여 test.txt에 저장되어 있는 배열 정보와 데이터를 정확하게 읽고 출력 해보는 프로그램을 작성한다. (동적으로 배열을 할당 시 2차원 배열을 1차원 배열로 할당해도 상관없음)

2. 각 행의 평균과 전체 데이터의 최소값, 최대값을 계산하고, 출력하는 프로그램을 추가하여 프로그램을 완성한다.

01: #include <iostream>
02: #include <fstream>
03: using namespace std;
04: 
05: void main( )
06: {   
07:         char array1[9]={0,}, array2[9]={0,}; //data.txt 파일 첫 라인에 있는 array1,2 를 구하기 위한 char[]
08:         int x,y,countx=0,county=0; // [x][y] (countx,couny x,y를 구하기 위함)
09:         bool space=false;//(countx,couny x,y를 구하기 위함)
10:         int count1=0,count3=0; //카운트를 세기 위한 변수
11:         char temp[9]={0,}, ch; //data.txt에서 추출한 수가 임시로 들어가있을 장소
12: 
13:     ifstream fin("data.txt"); //data.txt 파일을 읽는다.
14:         if (fin.is_open()) //파일이 열렸다면
15:                 cout<<"File open success.\n\n";
16:         else
17:                 cout<<"File open fail.\n\n";
18: 
19: //      char recs[array_size]; // 문자배열선언 1000개
20: 
21:         char sizetemp[9]; //data.txt파일의 첫번째 줄 을 읽기 위한 임시 저장소
22:         fin.getline(sizetemp,9,'\n'); //data.txt 파일의 첫 라인을 읽고 sizetemp에 저장하한다.
23:         
24:         //---1--------------------------------------//
25:         for (int a1=0; a1<9; a1++){
26:                 if(sizetemp[a1]==NULL)
27:                         break;
28:                 if(sizetemp[a1]==' '){
29:                         space=true;
30:                         continue;
31:                 }
32:                 if (!space){
33:                         array1[countx]=sizetemp[a1];
34:                         countx++;
35:                 }
36:                 if (space){
37:                         array2[county]=sizetemp[a1];
38:                         county++;
39:                 }
40:         }
41:         x=atoi(array1);
42:         y=atoi(array2);
43:         int* data=(int *)malloc(sizeof(int)*x*y); //data[x][y] 에 읽은 내용이 들어갈것임
44:         cout<< x<<'*'<<y<<endl;
45:         //---1 : 배열 크기 할당 ---------------------//
46: 
47:         while(!fin.eof()){
48:                 fin.get(ch); // 한글자씩 읽어들인다.
49:                 if (!isspace(ch)) //만일 공백이 아니라면
50:                         temp[count1++]=ch; //임시 char에 넣어 둔다.
51:                 else{                   //공백이 발생하면
52:                         count1=0;           //temp에 새로운 데이터를 넣어야 하니까 카운트를 0으로 잡고
53:                         data[count3++]=atoi(temp); //그리고 동적 할당한 배열에 넣고 
54:                         for (int count2=0;count2<9;count2++) //temp를 초기화 한다.
55:                                 temp[count2]=0;
56:                 }               
57:         }
58:         fin.close(); //파일 닫기
59:         
60:         for(count1=0; count1<x*y ; count1++){//읽어들인 자료 화면에 출력
61:                 if (count1%y==0)
62:                         cout<<endl;
63:                 cout << data[count1]<< ' ';
64:         }
65:         cout <<  endl;
66: 
67:         count1=1;
68:         int ttemp=0, min=data[0],max=data[0]; //계산을 위한 임시 변수
69:         for(int j=1; j<=x*y ; j++){ //계산하기 위하여 돌린다.
70:                 if (data[j-1]<min)
71:                         min=data[j-1];
72:                 if(data[j-1]>max)
73:                         max=data[j-1];
74:                 ttemp+=data[j-1];
75:                 if (j%y==0){
76:                         cout<<count1++<<"행 합 :"<<ttemp<<"평균 :"<<ttemp/y<<endl;
77:                         ttemp=0;
78:                 }
79:         }
80:         cout<<"최소값 : "<<min<<" 최대값 : "<<max<<endl;
81: }
82: /*--------------------data.txt----------------------//
83: 8 12
84: 638 758 113 515 51 627 10 41 9 212 86 749
85: 767 84 60 225 54 3 89 183 137 566 966 979
86: 495 31 1 387 54 31 145 882 736 524 50 5
87: 394 102 851 57 754 553 561 9 8 628 188 85
88: 43 957 406 165 40 3 562 834 343 950 444 803
89: 953 21 8 753 548 484 21 848 231 234 87 8
90: 448 979 721 315 875 342 587 89 4 942 37 987
91: 351 321 897 8 64 334 90 73 48 95 79 12 
92: //--------------------data.txt----------------------*/
반응형

'C & C++ 관련' 카테고리의 다른 글

File Copy LowLevel  (0) 2007.03.28
socket을 옳바르게 닫기  (0) 2007.03.26
Socket Programing 기본 함수  (0) 2007.03.26
Posted by Real_G