Programing/C- programing

화일처리 - MovieLensData 통계 소스

sosal 2011. 5. 20. 13:11
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */



- Input data.

인풋파일에 담겨져있는 데이터를 읽어와 통계를 내려고 합니다.


다음은 각 데이터 파일에 해당하는 레코드 구성 정보입니다.

 


==================================== 예제 1 ====================================

/*
 * Users.dat 로 부터 '총인원' '남성' '여성' 의 수와
 * '남성평균나이' '여성평균나이' 전체평균나이' 를 구한다.
 */

#include<iostream>
#include<cstring>
#include<string>
#include<iomanip>
#include<unistd.h>
#include<fcntl.h>
using namespace std;

double N=0,F=0,M=0,Fage=0,Mage=0;

void tok(char* str)
{
    char* ID;
    char* Gender;
    char* Age;
    char y[32],m[32],d[32];
    ID   = strtok(str, "#");
    Gender     = strtok(NULL, "#");
    Age    = strtok(NULL, "#");
    if(strcmp(Gender,"F")==0){
        N++;F++;
        Fage+=atoi(Age);
    }
    else{
        N++;M++;
        Mage+=atoi(Age);
    }
}

int main(void){
    char buf[256];
    int n;
    FILE* fd = fopen("./users.dat","r+");
    while(1){
        if(fgets(buf,sizeof(buf),fd)==NULL)
            break;
        tok(buf);
    }
    cout<<"총인원:"<<N<<endl;
    cout<<"남자:"<<M<<"여자"<<F<<endl;
    cout<<"남자평균 나이:"<<Mage/M<<endl;
    cout<<"여자평균 나이:"<<Fage/F<<endl;
    cout<<"전체평균 나이:"<<(Mage+Fage)/(M+F)<<endl;

    fclose(fd);
    return 0 ;
}

==================================== 예제 1 ====================================



==================================== 예제 2 ====================================

/*
 * MovieLens Data를 이용하여 아래와 같은 정보를 출력한다.
 
 
첫 번째 사용자 ID를 입력하세요 : 1
 두번째 사용자 ID를 입력하세요 : 2
 
 사용자 1과 2가 공통으로 본 영화리스트 입니다.
 -Shadows (Cienie) (1988)
 - Bad Boys (1995)
 - Othello (1995)
 …..
 
 첫번째 사용자 ID를 입력하세요 : the end
 (종료)
 */
 
#include<iostream>
#include<cstring>
#include<iomanip>
#include<unistd.h>
#include<fcntl.h>
using namespace std;
#define NUM_MOVIE 1000
class user{
    private:
        int id,index,list[NUM_MOVIE];
        FILE* fd;
    public:
        user(int _id):id(_id){index=0;};
        int getid(){return id;};
        int getindex(){return index;};
        int getlist(int _index){return list[_index];}
        void listing();
};
class movie{
    private:
        int index;
        int same[NUM_MOVIE];
        FILE* fd;
    public:
        movie(){index=0;};
        void compare(user,user);
        void printMovie();
        void swap(int *a,int *b);
        void bubble();
};

int main(){
    char check[10];
    int ID[2];
    FILE* fd;
    user* ID_1;
    user* ID_2;
    movie* list;
    int trash;
    while(1){
        cout<<"첫 번째 사용자 ID를 입력하세요:";
        cin.getline(check,10);
        if(strcmp(check,"the end") == 0)
            break;
        ID[0] = atoi(check);
        cout<<"두 번째 사용자 ID를 입력하세요:";
        cin>>ID[1];
        cin.ignore();

        ID_1 = new user(ID[0]);
        ID_2 = new user(ID[1]);
        list = new movie();

        cout<<"사용자"<<ID[0]<<"와 "<<ID[1]<<"가 공통으로 본 영화리스트 입니다."<<endl;
        ID_1->listing();            // ID_1의 영화 목록
        ID_2->listing();            // ID_2의 영화 목록
        list->compare(*ID_1,*ID_2);
        list->printMovie();       // 공통된 영화 출력
        delete ID_1;
        delete ID_2;
        delete list;
    }
    cout<<"종료"<<endl;
}
 
void user::listing(){
    char buf[256],*tmp;
    int compare;
    fd=fopen("./ratings.dat","r");
    while(fgets(buf,sizeof(buf),fd)){
        tmp = strtok(buf,"#");
        compare=atoi(tmp);
        if(compare == id){
            tmp = strtok(NULL,"#");
            list[index] = atoi(tmp);
            index++;
        }
    }
}
 
void movie::compare(user ID_1,user ID_2){
    for(int i=0;i<ID_1.getindex();i++){
        for(int j=0;j<ID_2.getindex();j++){
            if(ID_1.getlist(i) == ID_2.getlist(j)){
                same[index] = ID_1.getlist(i);
                index++;
            }
        }
    }
}

void
movie::printMovie(){
    char buf[256],*tmp;
    int compare,i=0;
    bubble();
    fd=fopen("./movies.dat","r");
    while(fgets(buf,sizeof(buf),fd)){
        tmp=strtok(buf,"#");
        compare=atoi(tmp);
        if(compare == same[i]){
            tmp = strtok(NULL,"#");
            cout<<setprecision(5)<<same[i]<<"-";
            cout<<tmp<<endl;
            i++;
        }
        if(i==index)
            break;
    }
}

void movie::swap(int *a,int *b){
    int tmp;
    tmp = *b;
    *b = *a;
    *a = tmp;
}
void movie::bubble(){
    for(int i=0;i<index;i++){
        for(int j=0;j<index-(i+1);j++){
            if(same[j] > same[j+1])
                swap(&same[j],&same[j+1]);
        }
    }
}


==================================== 예제 2 ====================================



==================================== 예제 3 ====================================
/*
 * 첫 번째 사용자 ID를 입력하세요 : 1
 * 두번째 사용자 ID를 입력하세요 : 2
 * 기준 평점값을 입력하세요 : 3
 
 * 사용자 1과 2가 공통으로 본 영화리스트 입니다.
 * - Shadows (Cienie) (1988)
 * - Othello (1995)
 * …..
 
 * 첫번째 사용자 ID를 입력하세요 : the end
 * (종료)
 */
 
#include<iostream>
#include<cstring>
#include<iomanip>
#include<unistd.h>
#include<fcntl.h>
using namespace std;
#define NUM_MOVIE 1000
class user{
    private:
        int id,index,value,list[NUM_MOVIE];
        FILE* fd;
    public:
        user(int _id,int _star):id(_id),value(_star){index=0;};
        int getid(){return id;};
        int getindex(){return index;};
        int getlist(int _index){return list[_index];}
        void listing();
};
class movie{
    private:
        int index;
        int same[NUM_MOVIE];
        FILE* fd;
    public:
        movie(){index=0;};
        void compare(user,user);
        void printMovie();
        void swap(int *a,int *b);
        void bubble();
};

int main(){
    char check[10];
    int ID[3];
    FILE* fd;
    user* ID_1;
    user* ID_2;
    movie* list;
    int trash;
    while(1){
        cout<<"첫 번째 사용자 ID를 입력하세요:";
        cin.getline(check,10);
        if(strcmp(check,"the end") == 0)
            break;
        ID[0] = atoi(check);
        cout<<"두 번째 사용자 ID를 입력하세요:";
        cin>>ID[1];
        cout<<"기준 평점값을 입력하세요:";
        cin>>ID[2];
        cin.ignore();

        ID_1 = new user(ID[0],ID[2]);
        ID_2 = new user(ID[1],ID[2]);
        list = new movie();

        cout<<"사용자"<<ID[0]<<"와 "<<ID[1]<<"가 공통으로 본 영화리스트 입니다."<<endl;
        ID_1->listing();
        ID_2->listing();
        list->compare(*ID_1,*ID_2);
        list->printMovie();
        delete ID_1;
        delete ID_2;
        delete list;
    }
    cout<<"종료"<<endl;
}
void user::listing(){
    char buf[256],*tmp,*tmp1;
    int compare,star;
    fd=fopen("./ratings.dat","r");
    while(fgets(buf,sizeof(buf),fd)){
        tmp = strtok(buf,"#");
        compare=atoi(tmp);
        if(compare == id){
            tmp = strtok(NULL,"#");
            tmp1 = strtok(NULL,"#");
            star = atoi(tmp1);
            if(star >= value){
                list[index] = atoi(tmp);
                index++;
            }
        }
    }
}
void movie::compare(user ID_1,user ID_2){
    for(int i=0;i<ID_1.getindex();i++){
        for(int j=0;j<ID_2.getindex();j++){
            if(ID_1.getlist(i) == ID_2.getlist(j)){
                same[index] = ID_1.getlist(i);
                index++;
            }
        }
    }
}
void movie::printMovie(){
    char buf[256],*tmp;
    int compare,i=0;
    bubble();
    fd=fopen("./movies.dat","r");
    while(fgets(buf,sizeof(buf),fd)){
        tmp=strtok(buf,"#");
        compare=atoi(tmp);
        if(compare == same[i]){
            tmp = strtok(NULL,"#");
            cout<<setprecision(5)<<same[i]<<"-";
            cout<<tmp<<endl;
            i++;
        }
        if(i==index)
            break;
    }
}
void movie::swap(int *a,int *b){
    int tmp;
    tmp = *b;
    *b = *a;
    *a = tmp;
}
void movie::bubble(){
    for(int i=0;i<index;i++){
        for(int j=0;j<index-(i+1);j++){
            if(same[j] > same[j+1])
                swap(&same[j],&same[j+1]);
        }
    }
}

==================================== 예제 3 ====================================