==> Program.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace 인터넷쇼핑몰문제
{
    static class Program
    {
        /// <summary>
        /// 해당 응용 프로그램의 주 진입점입니다.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Frm인터넷쇼핑몰());
        }
    }
}




==============================================================================================



==> OrderInfo.cs



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 인터넷쇼핑몰문제
{
    public class OrderInfo {
        // 입력
        public int 고객회원번호 { get; set; }
        public string 주문상품코드 { get; set; }
        public int 주문수주량 { get; set; }
        // 고객회원번호=>[회원정보] 표 참조
        public int 연령 { get; set; }
        public string 성별 { get; set; }
        // 주문상품코드=>[주문상품정보] 표 참조
        public string 상품명 { get; set; }
        public int 단가 { get; set; }
    }
    public class OrderDetail {
        public string 주문상품명 { get; set; }
        public int 주문율10 { get; set; }
        public int 주문율20 { get; set; }
        public int 주문율30 { get; set; }
        public int 전체수주량 { get; set; }
        // 프로젝트 어디에서나 'OrderDetail.남자주문총금액' 으로 접근
        public static int 남자주문총금액;
        public static int 여자주문총금액;
    }
}




==============================================================================================



==> Frm인터넷쇼핑몰.cs



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace 인터넷쇼핑몰문제
{
    public partial class Frm인터넷쇼핑몰 : Form
    {
        public Frm인터넷쇼핑몰()
        {
            InitializeComponent();
            orders =  new List<OrderInfo>();
        }

        private List<OrderInfo> orders;

        private void btn입력_Click(object sender, EventArgs e)
        {
            OrderInfo oi = new OrderInfo();
            oi.고객회원번호 = Convert.ToInt32(txt고객회원번호.Text);
            oi.주문상품코드 = txt주문상품코드.Text.ToUpper(); // 대문자
            oi.주문수주량 = Convert.ToInt32(txt주문수주량.Text);

           
            //[1] 코드표 참조(회원정보 테이블/주문상품정보 테이블)
            #region 회원정보
           
            switch (oi.고객회원번호)
            {
                case 101: oi.연령 = 36; oi.성별 = "여자"; break;
                case 102: oi.연령 = 28; oi.성별 = "남자"; break;
                case 103: oi.연령 = 17; oi.성별 = "여자"; break;
                case 104: oi.연령 = 39; oi.성별 = "여자"; break;
                case 105: oi.연령 = 21; oi.성별 = "남자"; break;
                case 106: oi.연령 = 35; oi.성별 = "여자"; break;
                case 107: oi.연령 = 11; oi.성별 = "남자"; break;
                case 108: oi.연령 = 19; oi.성별 = "여자"; break;
                case 109: oi.연령 = 24; oi.성별 = "여자"; break;
                case 110: oi.연령 = 30; oi.성별 = "남자"; break;
                default: break;
            }
           
            #endregion
            #region 주문상품정보
           
            switch (oi.주문상품코드)
            {
                case "PA": oi.상품명 = "책상";     oi.단가 = 100000; break;
                case "PB": oi.상품명 = "냉장고";   oi.단가 = 360000; break;
                case "PC": oi.상품명 = "세탁기";   oi.단가 = 220000; break;
                case "PD": oi.상품명 = "VTR";       oi.단가 = 300000; break;
                case "PE": oi.상품명 = "자전거";   oi.단가 = 90000; break;
                case "PF": oi.상품명 = "시계";     oi.단가 = 6000; break;
                case "PG": oi.상품명 = "TV";       oi.단가 = 80000; break;
                case "PH": oi.상품명 = "탁자";     oi.단가 = 30000; break;
                default:
                    break;
            }
           
            #endregion

            orders.Add(oi); // 한개 레코드 저장
            txt고객회원번호.Text = txt주문상품코드.Text = txt주문수주량.Text = "";
        }

        private void btn출력_Click(object sender, EventArgs e) {
           

            //[2] Process
            List<OrderDetail> details = new List<OrderDetail>();
            OrderDetail od;
            for (int i = 0; i < orders.Count; i++) {
                od = new OrderDetail();
                od.주문상품명 = orders[i].상품명;
                od.전체수주량 = orders[i].주문수주량; // G
                switch (Convert.ToInt32(orders[i].연령 / 10)) {
                    case 1:
                        od.주문율10 = od.전체수주량; od.주문율20 = 0; od.주문율30 = 0; // G
                        break;
                    case 2:
                        od.주문율10 = 0; od.주문율20 = od.전체수주량; od.주문율30 = 0; // G
                        break;
                    case 3:
                        od.주문율10 = 0; od.주문율20 = 0; od.주문율30 = od.전체수주량; // G
                        break;
                    default:
                        break;
                }
                details.Add(od);
                // 남, 여 주문 총 금액
                if (orders[i].성별 == "남자")
                {
                    OrderDetail.남자주문총금액 +=
                        (orders[i].단가 * orders[i].주문수주량);
                }
                else
                {
                    OrderDetail.여자주문총금액 +=
                        (orders[i].단가 * orders[i].주문수주량);
                }
            }
           
            //[!] 그룹 알고리즘 적용
           
            //[A] 소트
            #region 정렬
            OrderDetail imsi = new OrderDetail();
            for (int i = 0; i < details.Count - 1; i++)
            {
                for (int j = i + 1; j < details.Count; j++)
                {
                    if (String.Compare(details[i].주문상품명, details[j].주문상품명) > 0)
                    {
                        imsi = details[i]; details[i] = details[j]; details[j] = imsi;
                    }
                }
            }
            #endregion
                       
            //[B] 그룹
            List<OrderDetail> result = new List<OrderDetail>();
            int subTotal = 0; // 소계
            int age10 = 0; int age20 = 0; int age30 = 0; // G
            for (int i = 0; i < details.Count; i++)
            {
                subTotal += details[i].전체수주량;
                age10 += details[i].주문율10; // G
                age20 += details[i].주문율20; // G
                age30 += details[i].주문율30;  // G
                if ((i + 1) == details.Count ||
                    String.Compare(details[i].주문상품명, details[i + 1].주문상품명) != 0)
                {
                    OrderDetail rlt = new OrderDetail();
                    rlt.주문상품명 = details[i].주문상품명;
                    rlt.전체수주량 = subTotal; // 현재까지 소계
                    rlt.주문율10 = age10; // G
                    rlt.주문율20 = age20; // G
                    rlt.주문율30 = age30; // G
                    result.Add(rlt); // 한개 그룹 저장
                    subTotal = 0; age10 = 0; age20 = 0; age30 = 0; // G
                }
            }
           
            // 연령별 주문율 계산
            for (int i = 0; i < result.Count; i++) // G
            {
                if (result[i].주문율10 > 0)
                    result[i].주문율10 = Convert.ToInt32((result[i].주문율10 / (double)result[i].전체수주량) * 100);
                if (result[i].주문율20 > 0)
                    result[i].주문율20 = Convert.ToInt32((result[i].주문율20 / (double)result[i].전체수주량) * 100);
                if (result[i].주문율30 > 0)
                    result[i].주문율30 = Convert.ToInt32((result[i].주문율30 / (double)result[i].전체수주량) * 100);
            }
           
           
           
            //[3] Output
            lbl남.Text +=
                String.Format("{0:###,###}", OrderDetail.남자주문총금액);
            lbl여.Text +=
                String.Format("{0:###,###}", OrderDetail.여자주문총금액);
            this.ctlPrint.DataSource = result; // 일단 출력
        }
    }
}




< 실행결과 >









* 참고자료 --> C++로 구현한 코드




#include <iostream>
#include <fstream>
#include <string>

using namespace std;

const int MAX = 80;

// 3개의 값 입력 자료 : 파일에서 읽어오기
struct Member
{
    int Num;            // 번호
    int Age;            // 나이
    char Gender;        // 성별
};

// 입력 자료 저장 구조체
struct InData
{
    int Num;            // 번호
    int Age;            // 나이
    char Gender;        // 성별

    char Code[3];       // 코드
    int Order;          // 수주량
    char Name[25];      // 상품명
    int Ten;            // 10대
    int Twenty;         // 20대
    int Thirty;         // 30대
    int Total;          // 전체수주량
    int Cost;           // 단가
};

// 출력 자료 저장
struct OutData
{
    char Name[25];      // 상품명
    int Ten;            // 10대 주문률
    int Twenty;         // 20대
    int Thirty;         // 30대
    int Total;          // 총
    int Order;          // 단가
};

// 10개 데이터 입출력 저장 구조체 배열 선언
static struct InData inData[10];    // 회원정보 10명
static struct OutData procData[10]; // Process 임시 처리
static struct OutData outData[10];  // 출력

void main(void)
{
    //[!] 멤버 정보 읽어오기 start
    static struct Member member[10];
    //[1] 파일 읽기 개체 생성
    ifstream in;
    //[2] 파일 오픈
    in.open("C:\\Temp\\InShop.txt");
    //[3] 전체 읽어 오기
    char oneline[MAX];
    int count = 0;
    while (in.getline(oneline, MAX))
    {
        string data = oneline;
        member[count].Num = atoi(data.substr(0, 3).c_str());
        member[count].Age = atoi(data.substr(3, 3).c_str());
        if (strcmp(data.substr(7).c_str(), "남자") == 0)
        {
            member[count].Gender = 'M';
        }
        else
        {
            member[count].Gender = 'F';
        }

        count++;
    }
    //[4] 닫기
    in.close();
    //[!] 멤버 정보 읽어오기 end


    //[!] 화면으로부터 3개의 데이터 읽어서 inData[] 구조체 배열에 저장
    int cnt = 0;
    char buff[100];
    char c[2];
    do
    {
        cout << "고객회원번호 : "; cin >> inData[cnt].Num;
        cout << "주문상품코드 : "; cin >> buff; strcpy(inData[cnt].Code, buff);
        cout << "주문량 : "; cin >> inData[cnt].Order;
        cout << "계속(y) 중지(n)"; cin >> c;
        cnt++;
    } while (c[0] == 'y');

    // 입력 데이터 출력
    for (int i = 0; i < cnt; i++)
    {
        cout << inData[i].Num << ", " << inData[i].Code << ", " << inData[i].Order << endl;
    }


    long manTotal = 0;      // 남자 주문 총금액
    long womenTotal = 0;    // 여자 주문 총금액
    for (int i = 0; i < cnt; i++)
    {
        //inData[i].Ten = inData[i].Twenty = inData[i].Thirty = inData[i].Total; // 초기화
        for (int j = 0; j < 10; j++)
        {
            if (inData[i].Num == member[j].Num)
            {
                inData[i].Age = member[j].Age;
                inData[i].Gender = member[j].Gender;

                if (inData[i].Age <= 19)
                {
                    inData[i].Ten = inData[i].Order;
                }
                else if (inData[i].Age >= 20 && inData[i].Age <= 29)
                {
                    inData[i].Twenty = inData[i].Order;                
                }
                else if (inData[i].Age >= 30 && inData[i].Age <= 39)
                {
                    inData[i].Thirty = inData[i].Order;                                
                }

                inData[i].Total = inData[i].Ten + inData[i].Twenty + inData[i].Thirty;

                //[!] 주문상품정보
                switch(inData[i].Code[1])
                {
                case 'A':
                    strcpy(inData[i].Name, "책상");
                    inData[i].Cost = 100000;
                    break;
                case 'B':
                    strcpy(inData[i].Name, "냉장고");
                    inData[i].Cost = 360000;
                    break;
                case 'C':
                    strcpy(inData[i].Name, "세탁기");
                    inData[i].Cost = 220000;
                    break;
                case 'D':
                    strcpy(inData[i].Name, "VTR");
                    inData[i].Cost = 300000;
                    break;
                case 'E':
                    strcpy(inData[i].Name, "자전거");
                    inData[i].Cost = 90000;
                    break;
                case 'F':
                    strcpy(inData[i].Name, "시계");
                    inData[i].Cost = 6000;
                    break;
                case 'G':
                    strcpy(inData[i].Name, "TV");
                    inData[i].Cost = 80000;
                    break;
                case 'H':
                    strcpy(inData[i].Name, "탁자");
                    inData[i].Cost = 30000;
                    break;
                }
            }
        }

        // 남/여 주문 총금액
        if (inData[i].Gender == 'M')
        {
            manTotal += (inData[i].Order * inData[i].Cost);
        }
        else
        {
            womenTotal += (inData[i].Order * inData[i].Cost);
        }
    }

 

    // 처리
    // 대입 : procData에서 정렬 및 그룹알고리즘 적용
    for (int i = 0; i < cnt; i++)
    {
        strcpy(procData[i].Name, inData[i].Name);
        procData[i].Ten = inData[i].Ten;
        procData[i].Twenty = inData[i].Twenty;
        procData[i].Thirty = inData[i].Thirty;
        procData[i].Total = inData[i].Total;
        procData[i].Order = inData[i].Order;
    }

    // 입력 데이터 출력
    for (int i = 0; i < cnt; i++)
    {
        cout << procData[i].Ten << ", " << procData[i].Twenty << ", " << procData[i].Thirty << endl;
    }

    //[A] 정렬(선택) : 상품명에 따라서 정렬
    struct OutData temp;
 for (int i = 0; i < cnt - 1; i++)
 {
  for (int j = i + 1; j < cnt; j++)
  {
   if (strcmp(procData[i].Name, procData[j].Name) > 0)
   {
    temp = procData[i];
    procData[i] = procData[j];
    procData[j] = temp;
   }
  }
 }
 //[B] Group
    int ten = 0; int twenty = 0; int thirty = 0; int total = 0;
 int orderTotal = 0;  // 그룹소계
 int groupCount = 0;  // 그룹수
 for (int i = 0; i < cnt; i++)
 {
        ten += procData[i].Ten;
        twenty += procData[i].Twenty;
        thirty += procData[i].Thirty;
        total += procData[i].Total;
        orderTotal += procData[i].Order; // 그룹소계
        // 상품명이 다르면, 새로운 상품명으로 이동
  if(strcmp(procData[i].Name, procData[i+1].Name) != 0)
  {
   strcpy(outData[groupCount].Name, procData[i].Name);
            outData[groupCount].Ten = ten; // 그룹소계
            outData[groupCount].Twenty = twenty; // 그룹소계
            outData[groupCount].Thirty = thirty; // 그룹소계
            outData[groupCount].Total = total; // 그룹소계
            outData[groupCount].Order = orderTotal; // 그룹소계
   groupCount++;  // 그룹수 증가
            ten = twenty = thirty = total = orderTotal = 0; // 소계 초기화
  }
 }
    //[C] 주문률
    for (int i = 0; i < groupCount; i++)
    {
        if (outData[i].Ten > 0)
            outData[i].Ten = (double)(outData[i].Ten / (double)outData[i].Total) * 100;
        if (outData[i].Twenty > 0)
            outData[i].Twenty = (double)(outData[i].Twenty / (double)outData[i].Total) * 100;
        if (outData[i].Thirty > 0)
            outData[i].Thirty = (double)(outData[i].Thirty / (double)outData[i].Total) * 100;
    }

    // 출력 데이터 출력
    for (int i = 0; i < groupCount; i++)
    {
        cout << outData[i].Name << ", " << outData[i].Ten << ", " << outData[i].Twenty << ", " << outData[i].Thirty << ", " << outData[i].Order << endl;
    }

    cout << "주문 총 금액 : " << endl;
    cout << " 남 : " << manTotal << endl;
    cout << " 여 : " << womenTotal << endl;
}



Posted by holland14
: