//객체지향 금123 200911636
//ex1) 12-2 합산점수 역순 출력
#include<iostream>
using namespace std;
#define NUMBERS_OF_USERS 3 //User의 수를 Define 시킨다.
struct User //구조체 User의 정의
{
char userID[20]; //아이디
char passwd[20]; //패스워드
int scores_per_stage[5]; //스테이지별 점수
unsigned long magicPt; //MP
unsigned long healthPt; //HP
int sum; //sum=MP+HP+스테이지 점수1,2,3,4,5
int rank; //순위;다른 유저와 비교하여 순위를 구함.
};
void cout_user(User A); //1명의 유저의 정보를 cout 한다.
void cout_users(User user[]); //user 배열의 모든 유저들을 for문을 사용하여 cout_user[i]를 호출한다
void get_sum_rank(User user[]); //user 배열의 모든 유저의 합계를 구하고, 합계를비교해 순위를 정한다.
void cout_by_rank(User user[]); //순위를 비교하여, 순위 역순으로 cout_user함수를 호출한다.
int Rank[NUMBERS_OF_USERS]; //Rank배열;user[i].rank 를 참조하여 i를 저장한다.
//main 함수
void main()
{
User user[NUMBERS_OF_USERS] = //user의 초기화. 유저의 수는 3명, 총합과 순위는 비워둔다.
{
{"denzang","sd933k", {80, 56, 72, 86, 91}, 300, 10010},
{"zzazang","!@sd487", {100, 98, 100, 100, 91},20000, 19000},
{"gozang","df321#4", {34, 54, 70, 48, 54}, 400, 5000}
};
get_sum_rank(user); //get_sum_rank함수 호출;user들의 총합과 랭크를 구하여ㅎ 저장시킨다.
cout_users(user); //cout_users함수 호출;user들의 정보를 출력한다.
cout << endl <<"총합 역순으로 정렬"<<endl; //총합 역순으로 정렬.
cout_by_rank(user); //cout_by_rank함수 호출;총합의 역순으로 user들의 정보를 출력한다.
}
//cout_users함수
//배열 user의 모든 정보를 출력한다.
void cout_users(User user[])
{ int i; //for문을 이용하기 위해 쓰는 변수
cout << "ID PW st1 st2 st3 st4 st5 MP HP sum" << endl; //최상단에 ID PW st1 st2 st3 st4 st5 MP HP sum을 표시한다.
for(i=0; i<NUMBERS_OF_USERS ; i++) //for문을 사용하여 각 user들(user[i])을 cout_user함수로 호출한다
{ cout_user(user[i]); }
};
//cout_user함수
//1명의 user의 정보를 출력한다.
void cout_user(User A)
{
int i; //for문을 이용하기 위해 쓰는 변수
//cout << "ID PW st1 st2 st3 st4 st5 MP HP sum" << endl;
cout << A.userID <<" "<<A.passwd<<" "; //ID,PW 출력.
for(i=0; i<5; i++) //for문을 이용하여 scores_per_stage배열의 값을 순차적으로 출력
{ cout << A.scores_per_stage[i]<<" ";}
cout << A.magicPt << " "<<A.healthPt<<" "<<A.sum<<endl; //MP,HP,sum 출력.
};
//get_sum_rank함수
//user들의 총합과 순위를 구한다.
void get_sum_rank(User user[])
{
int i,j; //2중 for문을 사용하시위한 변수들
//get sum
for(i=0; i< NUMBERS_OF_USERS; i++) //총합을 구하는 for문. MP+HP+st1,2,3,4,5=sum
{ user[i].sum=0; user[i].rank=0;
user[i].sum += user[i].healthPt+user[i].magicPt;
for(j=0; j<5; j++)
{ user[i].sum += user[i].scores_per_stage[j]; }
}
//get rank
for(i=0 ; i<NUMBERS_OF_USERS; i++) //순위를 구하는 함수. 첫번째 유저부터 순차적으로 sum을 비교한다.
{ for(j=i+1 ; j<NUMBERS_OF_USERS ; j++) //비교하여 더 높은 총합을 가진 유저의 rank를 증가시킨다.
{ if(user[i].sum < user[j].sum)
{ user[j].rank++; }
else
{ user[i].rank++; }
}
}
};
//cout_by_rank함수
//순위의 역순으로 출력한다.
void cout_by_rank(User user[])
{
int i, j, tmp; //for문을 사용하기위한 변수 i와 j. 임시저장변수 tmp
//랭크 역순으로 정렬
for(i=0 ; i< NUMBERS_OF_USERS ; i++) //순위를 낮은순으로 비교하여 Rank배열에 저장시킨다.
{ for(j=0;j<NUMBERS_OF_USERS ; j++) //ex) Rank[i]= user[j].rank의 j
{ if(user[j].rank==i)
{ Rank[i]= j;}
}
}
//출력
for(i=0; i<NUMBERS_OF_USERS;i++) //저장된 배열 Rank의 값을 이용해 총합 역순으로 출력한다.
{ cout_user(user[Rank[i]]); }
};