shellSort

#include<iostream>
#include<iomanip>
using namespace std;



#define MAX_ARY 15

void shellSort(int list[], int last);

int main()
{

 int ary[MAX_ARY]={12,12,23,54,67,43,67,87,56,4,3,2,54,67,9};


 cout << "before sort"<<endl;

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }

 cout<<endl;

 cout<<"after sort"<<endl;

 shellSort(ary, MAX_ARY-1);

 for(int i=0; i<MAX_ARY; i++)
 {
  cout<<setw(3)<<ary[i];
 }
 cout<<endl;

}

void shellSort(int list[], int last)
{
 int hold;
 int incre;
 int curr;
 int walker;
 incre = last /2;
 int pass =1;

 while(incre != 0)
 {
  for(curr=incre; curr<=last; curr++)
  {
   hold = list[curr];
   walker = curr - incre;

   while(walker>=0 && hold < list[walker])
   {
    list[walker + incre] = list[walker];
    walker = walker - incre;
   }//while(walker>=0 && hold < list[walker])
   list[walker + incre] = hold;
  }//for
  //pass출력하기
  
  cout<<"PASS"<<pass++<<"("<<incre<<")"<<":";

  for(int i=0; i<MAX_ARY; i++)
  {
   cout<<setw(3)<<list[i];
  }
  cout<<endl;

  incre=incre/2;

 }//while(incre!=0)
 
}

 

 

'1. IT Story > Development' 카테고리의 다른 글

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

오픈 API를 이용한 간단한 번역프로그램

 

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;
using System.Net;
using System.IO;
using System.Xml;

namespace translator
{
    public partial class Form1 : Form
    {
        const string AppId = "오픈API 인증코드 얻으세요!";

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.comboBox1.Items.Add("ko"); //콤보박스에 아이템추가
            this.comboBox1.Items.Add("en");

            this.comboBox2.Items.Add("ko");
            this.comboBox2.Items.Add("en");

            this.comboBox1.SelectedIndex = 0; //0번째 요소 꺼내오기
            this.comboBox2.SelectedIndex = 1;

        }
        private void button1_Click_1(object sender, EventArgs e)
        {
            //웹으로부터 값을 받아오기 위해서 선언       번역할 한글            현재 형태                               번역할 형태
            HttpWebRequest request = BuildRequest(this.textBox.Text, this.comboBox1.SelectedItem.ToString(), this.comboBox2.SelectedItem.ToString());

            try
            {
                // 요청에 응답했을경우~
                HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // 리소스를 받아옵니다.
                this.textBox1.Text = DisplayResponse(response); // 리소스를 번역된 창에 뿌려줌 그전에...DisplayResponse(response)으로 고고~
            }
            catch (WebException ex)
            {
                // 응답하지 않았을경우!, 네트워크문제~
                Console.WriteLine(ex.Message);
            }
        }

        public static HttpWebRequest BuildRequest(string str, string SourceLanguage, string TargetLanguage) //번역할 값, 현재 언어, 번역될 언어
        {
            string requestString = "http://api.bing.net/xml.aspx?" // open API에서 xml 받아와서 필요한 태그만 씀

                // 공통된 요청필드들.. (필수!)
                + "AppId=" + AppId 
                + "&Query=" + str
                + "&Sources=Translation"

                // 공통된 요청필드들.. (선택적으로)
                + "&Version=2.2"

                // 특정소스타입 가져오기 (필수!!) // 우리에게 필요한건 번역을 담당하는 부분
                + "&Translation.SourceLanguage=" + SourceLanguage
                + "&Translation.TargetLanguage=" + TargetLanguage;

          
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestString);  // 요청을 생성하고 초기화

            return request;
        }

        static string DisplayResponse(HttpWebResponse response)
        {
            // XmlDocument로 응답을 로드함.
            XmlDocument document = new XmlDocument();
            document.Load(response.GetResponseStream());

            //namespace 관리자에 대해서 네임스페이스 추가
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(document.NameTable); //XmlNamespaceManager 를통한 xml 파싱 변환작업 
                                                                                        //yweather:forecast  --> ":"
            nsmgr.AddNamespace(
                "api", //api의 값을 파싱하기위해서
                "http://schemas.microsoft.com/LiveSearch/2008/04/XML/element");

            XmlNodeList errors = document.DocumentElement.SelectNodes(  //에러가 발생할 경우
                "./api:Errors/api:Error",
                nsmgr);

            string result = string.Empty; // " "

            if (errors.Count > 0)
            {
                // 에러가 발생했을 경우
                DisplayErrors(errors);
            }
            else
            {
                // 에러가 발생하지 않을 경우 값을 result에 넣자~
                result = DisplayResults(document.DocumentElement, nsmgr);//document.DocumentElement 페이지를 옴겨다닐때 기본요소들의 값을 가져오기 위해서, 파싱데이터
            }
            return result;
        }


        static string DisplayResults(XmlNode root, XmlNamespaceManager nsmgr)
        {
            string version = root.SelectSingleNode("./@Version", nsmgr).InnerText; // 버전과 파싱받은 값  InnerText: 시작태그와 종료태그 사이의 값을 가져옴
            string searchTerms = root.SelectSingleNode( //SelectSingleNode 패턴과 일치하는 제일 첫번째의 값을 가저온다.
                "./api:Query/api:SearchTerms",
                nsmgr).InnerText;

            // 결과를 헤더에 표시
            Console.WriteLine("Bing API Version " + version);
            Console.WriteLine("Translation results for " + searchTerms);
            Console.WriteLine();

            // 네임스페이스 관리자 안에 네임스페이스 Translation SourceType 추가
            nsmgr.AddNamespace(
                "tra", //tra의 값을 파싱해가기위해서
                "http://schemas.microsoft.com/LiveSearch/2008/04/XML/translation");


            XmlNodeList results = root.SelectNodes( //드디어 변역된 값을 받아 오기 위한 실질적인 태그를 가저옴
                "./tra:Translation/tra:Results/tra:TranslationResult",
                nsmgr);

            // Display the Translation results.
            string MsgResult = string.Empty;//""

            foreach (XmlNode result in results)
            {

                MsgResult = result.SelectSingleNode("./tra:TranslatedTerm", nsmgr).InnerText;  // 변역된 값을 받아와서
            }
            return MsgResult; //리턴해줌
        }
        static void DisplayErrors(XmlNodeList errors)
        {
            // Iterate over the list of errors and display error details.
            Console.WriteLine("Errors:");
            Console.WriteLine();
            foreach (XmlNode error in errors)
            {
                foreach (XmlNode detail in error.ChildNodes)
                {
                    Console.WriteLine(detail.Name + ": " + detail.InnerText);
                }

                Console.WriteLine();
            }
        }

    }
}

 

'1. IT Story > Development' 카테고리의 다른 글

무료 IT 개발 언어공부, 코딩공부 유튜브 TOP5  (0) 2021.01.26
heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

ChatClient

1. IT Story/Development 2012. 3. 29. 11:40

 

ChatClient

 

package exam.Chat;
import java.io.*;
import java.net.*;

import android.app.Activity;
import android.os.*;
import android.view.*;
import android.widget.*;


public class ChatClient extends Activity {
 View page1,page2; // 로그인과 로그아웃에 따라 페이지 전환
 TextView txtid,txtloginid; //로그인, 로그아웃시에 보여질 텍스트뷰
 EditText txtmid,txtsend; // 로그인, 로그아웃시에 보여질 입력창
 
 String ip; // ip 값을 받기
 Socket socket; // 소캣을 이용
 
 // 입출력 스트림
 BufferedReader inMsg;
 PrintWriter outMsg;
 
 mThread thread; //멀티스래드
 
 boolean status; // 현재상태
 
 String msg;     //메시지 담기
 String[] rmsg; //현재 로그인인지 아닌지에 대한 값을 받음
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main); //main 레이아웃을 가져옴       
       
        //각각의 레이아웃(페이지, 텍스트뷰 버튼 등..)의 위치 확인
        page1=findViewById(R.id.page1);
        page2=findViewById(R.id.page2);
        txtid=(TextView)findViewById(R.id.txtid);      
        txtsend=(EditText)findViewById(R.id.txtsend);
        txtloginid=(TextView)findViewById(R.id.txtloginid);
        txtmid=(EditText)findViewById(R.id.txtmid);
        findViewById(R.id.btnlogin).setOnClickListener(mClickListener);
        findViewById(R.id.btnlogout).setOnClickListener(mClickListener);
        findViewById(R.id.btnsend).setOnClickListener(mClickListener);
       
        ip="192.168.43.33";
       
    }
   
    Button.OnClickListener mClickListener = new Button.OnClickListener(){ //로그인 버튼을 눌렀을때
     public void connectServer(){
      try {
       
       socket = new Socket(ip,8888);  // 소캣이 할당되고
       
       txtmid.append("[Client]Server connected");  //연결성공시 화면에 출력, 자동으로 띄어씀(append)  
      
       inMsg = new BufferedReader(new InputStreamReader(socket.getInputStream(), "euc-kr")); //받아오는 메시지
       //outMsg = new PrintWriter(socket.getOutputStream(),true); // 입력을 통해 출력하는 메시지는 깨짐
       
       outMsg = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), "euc-kr")),true);
      
       outMsg.println(txtid.getText()+"/"+"login"); // 로그인 확인 메시지
       
       
       thread = new mThread(); //멀티스래드 생성
       thread.start();   //스래드 실행
      }
      catch(Exception e) {         
       System.out.println("[MultiChatClient]connectServer() Exeption 발생");
      }
     }

     public void onClick(View v){
      
      switch(v.getId()){  
       case R.id.btnlogin:  //로그인 버튼을 눌렀을때
             page2.setVisibility(View.VISIBLE);
             page1.setVisibility(View.INVISIBLE);
             txtid.setText(txtloginid.getText());
           
             connectServer();
          
             break;
            
      case R.id.btnlogout:   //로그 아웃 버튼을 눌렀을때  
       page1.setVisibility(View.VISIBLE); 
           
          page2.setVisibility(View.INVISIBLE);
          txtloginid.setText("");
          txtloginid.setHint("id입력");
          txtmid.setText("");
          break;
      case R.id.btnsend:  //보내기 버튼을 눌렀을때
       
       outMsg.println(txtid.getText()+"/"+txtsend.getText());
       txtsend.setText("");
          break;
      }
     }
    };
    class mThread extends Thread{ 
     public void run() {
      
      status=true;
      
      while(status) {  //지금의 상태를 확인해서
       try{
        
        msg = inMsg.readLine(); //메시지를 읽고
        rmsg = msg.split("/");  // 띄어쓰기      
        mhandler.sendEmptyMessage(0); //핸들러를 통해서 메시지를 보냄
       }
       catch(IOException e) {        
        status = false;
       }
      }
      System.out.println("[MultiChatClient]"+thread.getName()+"종료됨");
      
     }
    }
    Handler mhandler = new Handler(){
     public void handleMessage(Message msg){
      if(msg.what==0){ //메시지의 의미를 설명, 의미가 정해져 있지는 않으며 핸들러별로 지역적으로 핸들러와 충돌할 위험이 없다.
       txtmid.append(rmsg[0]+">"+rmsg[1]+"\n");
      }
     }
    };
   
}

'1. IT Story > Development' 카테고리의 다른 글

heapSort  (0) 2012.04.04
selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

MultiChatServer

 

package com.chat.v5;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class MultiChatServer {

 // 서버 소켓 및 클라이언트 연결 소켓
 private ServerSocket  ss= null;
 private Socket s= null;
 
 // 연결된 클라이언트 스레드를 관리하기 위한 ArrayList
 ArrayList<ChatThread> chatlist = new ArrayList<ChatThread>();
 
 // 멀티챗 메인 프로그램 부
 public void start() {
  try {
   // 서버 소켓 생성
   ss = new ServerSocket(8888);
   System.out.println("server start");
   
   // 무한 루프를 돌면서 클라이언트 연결을 기다림
   while(true) {
    s=ss.accept();    
    // 연결된 클라이언트에 대해 쓰레드 클래스 생성
    ChatThread chat = new ChatThread();
    // 클라이언트 리스트 추가
    chatlist.add(chat);
    // 스레드 시작
    chat.start();
   }
  } catch (Exception e) {
   //System.out.println(e);
   System.out.println("[MultiChatServer]start() Exception 발생!!");
  }  
 }
 
 public static void main(String[] args){
  MultiChatServer server = new MultiChatServer();
  server.start();
 }
 
 // 연결된 모든 클라이언트에 메시지 중계
 void msgSendAll(String msg) {
  for(ChatThread ct : chatlist) {
   ct.outMsg.println(msg);
  }
 }

 // 각각의 클라이언트 관리를 위한 쓰레드 클래스
 class ChatThread extends Thread {
  // 수신 메시지 및 파싱 메시지 처리를 위한 변수 선언
  String msg;
  String[] rmsg;
  
  // 입출력 스트림
  private BufferedReader inMsg = null;
  private PrintWriter outMsg = null;

  public void run() {
  
   boolean status = true;
   System.out.println("##ChatThread start...");
   try {
    // 입출력 스트림 생성
    inMsg = new BufferedReader(new InputStreamReader(s.getInputStream()));
    outMsg = new PrintWriter(s.getOutputStream(),true);
    
    // 상태정보가 true 이면 루프를 돌면서 사용자로 부터 수신된 메시지 처리
    while(status) {
     // 수신된 메시지를 msg 변수에 저장
     msg = inMsg.readLine();
     // "/" 구분자를 기준으로 메시지를 문자열 배열로 파싱
     rmsg = msg.split("/");
     
     // 파싱된 문자열 배열의 두번째 요소 값에 따라 처리
     // 로그아웃 메시지 인 경우
     if(rmsg[1].equals("logout")) {
      chatlist.remove(this);
      msgSendAll("server/"+rmsg[0]+"님이 종료 했습니다.");
      // 해당 클라이언트 스레드 종료로 인해 status 를 false 로 설정
      status = false;
     }
     // 로그인 메시지 인 경우
     else if(rmsg[1].equals("login")) {
      msgSendAll("server/"+rmsg[0]+"님이 로그인 했습니다.");
     }
     // 그밖의 경우 즉 일반 메시지인 경우
     else {
      msgSendAll(msg);
     }
    }
    // 루프를 벗어나면 클라이언트 연결 종료 이므로 스레드 인터럽트
    this.interrupt();
    System.out.println("##"+this.getName()+"stop!!");
    
   } catch (IOException e) {
    chatlist.remove(this);
    //e.printStackTrace();
    System.out.println("[ChatThread]run() IOException 발생!!");
   }
  }
 }
}

'1. IT Story > Development' 카테고리의 다른 글

selectionSort  (0) 2012.04.04
shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
circularAry 큐를 사용하여 복사하기  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

MultiChatClient

 

package com.chat.v5;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class MultiChatClient implements ActionListener, Runnable{
 private String ip;
 private String id;
 private Socket socket;
 
 // 입출력 스트림
 private BufferedReader inMsg = null;
 private PrintWriter outMsg = null;

 // 로그인 패널
 private JPanel loginPanel;
 // 로그인 버튼
 private JButton loginButton;
 // 대화명 라벨
 private JLabel label1;
 // 대화명 입력 텍스트필드
 private JTextField idInput;
 
 // 로그아웃 패널
 private JPanel logoutPanel;
 // 대화명 출력 라벨
 private JLabel label2;
 // 로그아웃 버튼
 private JButton logoutButton;

 
 // 입력  패널 구성
 private JPanel msgPanel;
 // 메시지 입력 텍스트필드
 private JTextField msgInput;
 // 종료 버튼
 private JButton exitButton;

 // 메인 윈도우
 private JFrame jframe;
 // 채팅 내용 출력창
 private JTextArea msgOut;
 
 // 카드레이아웃 관련
 private Container tab;
 private CardLayout clayout;
 
 private Thread thread;
 
 // 상태 플래그
 boolean status;
 
 public MultiChatClient(String ip) {
  this.ip = ip;
    
  // 로그인 패널 화면 구성
  loginPanel = new JPanel();
  // 레이아웃 설정
  loginPanel.setLayout(new BorderLayout());
  idInput = new JTextField(15);
  loginButton = new JButton("로그인");
  // 이벤트 리스너 등록
  loginButton.addActionListener(this);
  label1 = new JLabel("대화명 ");
  // 패널에 위젯 구성
  loginPanel.add(label1,BorderLayout.WEST);
  loginPanel.add(idInput,BorderLayout.CENTER);
  loginPanel.add(loginButton,BorderLayout.EAST);
  
  // 로그아웃 패널 구성
  logoutPanel = new JPanel();
  // 레이아웃 설정
  logoutPanel.setLayout(new BorderLayout());
  label2 = new JLabel();
  logoutButton = new JButton("로그아웃");
  // 이벤트 리스너 등록
  logoutButton.addActionListener(this);
  
  // 패널에 위젯 구성
  logoutPanel.add(label2,BorderLayout.CENTER);
  logoutPanel.add(logoutButton,BorderLayout.EAST);

  // 입력 패널 구성
  msgPanel = new JPanel();
  // 레이아웃 설정
  msgPanel.setLayout(new BorderLayout());
  msgInput = new JTextField(30);
  // 이벤트 리스너 등록
  msgInput.addActionListener(this);
  exitButton = new JButton("종료");
  exitButton.addActionListener(this);
  // 패널에 위젯 구성
  msgPanel.add(msgInput,BorderLayout.CENTER);
  msgPanel.add(exitButton,BorderLayout.EAST);

  
  // 로그인/로그아웃 패널 선택을 위한 CardLayout 패널
  tab = new JPanel();
  clayout = new CardLayout();
  tab.setLayout(clayout);
  tab.add(loginPanel,"login");
  tab.add(logoutPanel,"logout");
  
  // 메인 프레임 구성
  jframe = new JFrame("::멀티챗::");
  msgOut = new JTextArea("",10,30);
  // JTextArea 의 내용을 수정하지 못하도록 함. 즉 출력전용으로 사용
  msgOut.setEditable(false);
  // 수직 스크롤바는 항상 나타내고 수평 스크롤바는 필요시 나타나도록 함.
  JScrollPane jsp = new JScrollPane(msgOut,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
  jframe.add(tab,BorderLayout.NORTH);
  jframe.add(jsp,BorderLayout.CENTER);
  jframe.add(msgPanel,BorderLayout.SOUTH);
  // loginPanel 을 우선 보이도록 함.
  clayout.show(tab, "login");
  // 프레임 크기 자동으로 설정
  jframe.pack();
  // 프레임 크기 조정 불가 설정
  jframe.setResizable(false);
  // 프레임이 보여지도록 함
  jframe.setVisible(true);
  
 }

 public void connectServer() {
  try {
   // 소켓 생성
   socket = new Socket(ip,8888);
   System.out.println("[Client]Server 연결 성공!!");
   
   // 입출력 스트림 생성
   inMsg = new BufferedReader(new InputStreamReader(socket.getInputStream()));
   outMsg = new PrintWriter(socket.getOutputStream(),true);
  
   // 서버에 로그인 메시지 전달
   outMsg.println(id+"/"+"login");
   
   // 메시지 수신을 위한 스레드 생성
   thread = new Thread(this);
   thread.start();
  }
  catch(Exception e) {
   //e.printStackTrace();
   System.out.println("[MultiChatClient]connectServer() Exception 발생!!");
  }
 }
 
 // 이벤트 처리
 public void actionPerformed(ActionEvent arg0) {
  Object obj = arg0.getSource();
  
  // 종료버튼 처리
  if(obj == exitButton) {
   System.exit(0);
  }
  else if(obj == loginButton) {
   id = idInput.getText();
   
   label2.setText(" 대화명 : "+id);
   clayout.show(tab, "logout");
   connectServer();
  }
  else if(obj == logoutButton) {
   // 로그아웃 메시지 전송
   outMsg.println(id+"/"+"logout");
   // 대화창 클리어
   msgOut.setText("");
   // 로그인 패널로 전환
   clayout.show(tab, "login");
   outMsg.close();
   try {
    inMsg.close();
    socket.close();
   } catch (IOException e) {
    e.printStackTrace();
   }

   status=false;
  }
  else if(obj == msgInput) {
   // 메시지 전송
   outMsg.println(id+"/"+msgInput.getText());
   // 입력창 클리어
   msgInput.setText("");
  }
 }
 
 public void run() {
  // 수신 메시지 처리를 위한 변수
  String msg;
  String[] rmsg;
  
  status=true;
  
  while(status) {
   try{
    // 메시지 수신 및 파싱
    msg = inMsg.readLine();
    rmsg = msg.split("/");
    
    // JTextArea 에 수신된 메시지 추가
    msgOut.append(rmsg[0]+">"+rmsg[1]+"\n");
    
    // 커서를 현재 대화 메시지에 보여줌
    msgOut.setCaretPosition(msgOut.getDocument().getLength());
   }
   catch(IOException e) {
    //e.printStackTrace();
    status = false;
   }
  }
  System.out.println("[MultiChatClient]"+thread.getName()+" 종료됨");
 }
 
 public static void main(String[] args) {
  MultiChatClient mcc = new MultiChatClient("localhost");
 }
}

'1. IT Story > Development' 카테고리의 다른 글

shellSort  (0) 2012.04.04
오픈 API를 이용한 간단한 번역프로그램  (0) 2012.03.29
ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
circularAry 큐를 사용하여 복사하기  (0) 2012.03.29
StackADT를 이용한 중위식구하기  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

큐를 이용한 간단한 구직Pro

 

Queue.h

template<typename TYPE>
struct NODE
{
 TYPE data;
 
};

template<typename TYPE>
class Queue
{
private:
 int front;
 int rear;
 int count;
 int maxSize;
 NODE<TYPE>* queueAry;

public:
 Queue(int size = 100);
 ~Queue();
 bool EnQueue(TYPE dataln);
 bool DeQueue(TYPE& dataOut);
 int QueueCount();
 bool QueueFront(TYPE& dataOut);
 bool QueueRear(TYPE& dataOut);
 bool EmptyQueue();
 bool FullQueue();

};

template<typename TYPE>
Queue<TYPE>::Queue(int size=100)
{
 maxSize= size;
 queueAry = new NODE<TYPE> [maxSize];

    if(!queueAry)
 {
  cout << " 큐에 할당할 메모리가 충분치 않습니다."<<endl;
  exit(100);
 }

 front =-1;
 rear = -1;
 count = 0;
}

template<typename TYPE>
Queue<TYPE>::~Queue()
{
 delete [] queueAry;
 queueAry=NULL;
}

template<typename TYPE>
bool Queue<TYPE>::EnQueue(TYPE dataIn)
{
  if(count == maxSize)
  {
   return false;
 
  }
  rear++;
  if(rear == maxSize)
  {
   rear=0;
  }

  queueAry[rear].data=dataIn;

  if(count == 0)
  {
  front = 0;
  }

  count++;
  return true;
 
}

template<typename TYPE>
bool Queue<TYPE>::DeQueue(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
 }

 dataOut = queueAry[front].data;
 front++;

 if(front== maxSize)
 {
 front=0;
 }

 if(count==1)
 {
 rear=front =-1; // 다시 초기화
 }

 count--;
 return true;
}

template<typename TYPE>
int Queue<TYPE>::QueueCount()
{
 return count;
}

template<typename TYPE>
bool Queue<TYPE>::QueueFront(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
  //underflow
 }
 else
 {
  dataOut = queueAry[front].data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::QueueRear(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
 }
 else
 {
  dataOut = queueAry[rear].data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::EmptyQueue()
{
 return (count==0);
}

template<typename TYPE>
bool Queue<TYPE>::FullQueue()
{
 return (count==maxSize);
}

 

 

main.cpp

#include <iostream>
#include <iomanip> 
#include <ctime>  // 랜덤변수를 넣기 위해
#include "Queue.h"

#include <string>
#include <fstream>

using namespace std;


struct FUNC
{
   char name[100];
   char num[100];
   int time;

};


enum MENU{MENU_ADD,MENU_jobPe, MENU_deQ, MENU_QUIT};

MENU ShowMenu(); //응용

void inPutFUNC(Queue< FUNC >& funclist);
void add(Queue< FUNC >& funclist);
void Pser(Queue< FUNC >& funclist);


int main()
{
 Queue<FUNC> FList;

 inPutFUNC(FList);


 bool flag=false;
 while(true)
 {
  MENU select;
  select=ShowMenu();
 
  switch(select)
  {
  case MENU_ADD:
   {
    add(FList);
    break;
   }
  case MENU_jobPe:
   {
     Pser(FList);
    break;
   }
  case MENU_QUIT:
   {
       cout<<"프로그램종료"<<endl;
    flag=true;
    break;
   }
  }
 if(flag==true)
   {
    break;
   }
 }
 return 0; //소멸자

}


MENU ShowMenu()
{
  while(true)
  {
   cout<< "\n------메뉴-----\n";
   cout<< "1. 추가 \n";
   cout<< "2. 구직서비스 받기 \n";
   cout<< "Q. 프로그램 종료\n";
   cout<<"===================\n";
   cout<<"원하는 작업의 번호를 입력하세요 : ";
 
   char select;
   cin>>select;

   switch(select)
   {
   case '1':
   return MENU_ADD;
   case '2':
    return MENU_jobPe;
   case 'q':
   case 'Q':
      return MENU_QUIT;
   default :
    cout<<"\n올바른 값을 입력해주세요\n";
    break;
     
   }

  }
}


void inPutFUNC(Queue< FUNC >& funclist)
{
 
   int res;
   FUNC func;

  ifstream infile;
  infile.open("in.txt");

  while(infile>>func.name)
  {
  
   infile.getline(func.num,sizeof(func.num));
  
   func.time=time(0);

   res= funclist.EnQueue(func);

   cout<< func.name<<" "<<func.num<<""<<"입력된시간:"<<func.time<<endl;
  
  }
  cout<< "현재 큐에 3명의 학생이 서비스를 기다림"<<endl;
  infile.close();
  
 
}


void add(Queue< FUNC >& funclist)
{
    FUNC func;
 char temp[15];
    bool res;
  
 int count=funclist.QueueCount();

 if(count<5)
 {
     cout<<"이름 입력: ";
  cin>>func.name;
  cin.getline(temp, 10);
 
  cout<<"전화번호입력: ";
  cin.getline(func.num, sizeof(func.num));
  
     func.time=time(0);

  res=funclist.EnQueue(func);
 
 cout<<"성공적으로 추가"<<endl;
 }
 else
 {
   cout <<"최대학생수 5명이 찼습니다"<<endl;
 }
  


}
void Pser(Queue< FUNC >& funclist)
{
  FUNC func;
  srand(time(0));

  int nowTime=time(0);

 

 while(!(funclist.EmptyQueue()))
  {
  bool success=funclist.DeQueue(func);

 
  int inFutTime=func.time;
  int tot= nowTime-inFutTime;


 
  cout<<endl;
  cout<< func.name<<" "<<func.num<<""<<"큐에 들어온 시각"<<func.time<<endl;
  cout <<"서비스 받은 시각:"<<time(0) <<endl;
  cout<< "큐에서 기다린 시간:"<<tot<<"(s)"<<endl;
  cout<<endl;
 

}

}

블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,


 

queueADT를 이용한 간단한 응용프로그램

 

queueADT.h

template<typename TYPE>
struct NODE
{
 TYPE data;
 NODE<TYPE>* next;
};

template<typename TYPE>
class Queue
{
private:
 NODE<TYPE>* front;
 NODE<TYPE>* rear;
 int count;

public:
 Queue();
 ~Queue();
 bool EnQueue(TYPE dataln);
 bool DeQueue(TYPE& dataOut);
 int QueueCount();
 bool QueueFront(TYPE& dataOut);
 bool QueueRear(TYPE& dataOut);
 bool EmptyQueue();
 bool FullQueue();

};

template<typename TYPE>
Queue<TYPE>::Queue()
{
 front =NULL;
 rear = NULL;
 count = 0;
}

template<typename TYPE>
Queue<TYPE>::~Queue()
{
 NODE<TYPE>* deletePtr;

 while(front!=NULL)
 {
  deletePtr = front;
  front=front->next;
  delete deletePtr;
 }
}

template<typename TYPE>
bool Queue<TYPE>::EnQueue(TYPE dataln)
{

 NODE<TYPE>* newPtr;

 newPtr = new NODE<TYPE>;

 if(newPtr==NULL) //메모리 FULL
 {
  return false;
 }
 
 newPtr->data = dataln;
 newPtr->next = NULL;

 if(count ==0)
 {
  front = newPtr;
 }
 else
 {
  rear->next =  newPtr;
 }
 count++;
 rear = newPtr;
 
 return true;
}

template<typename TYPE>
bool Queue<TYPE>::DeQueue(TYPE& dataOut)
{
 NODE<TYPE>* deleteLoc;

 if(count==0)
 {
  return false;
 }

 dataOut=front->data;
 deleteLoc = front;

 if(count==1)
 {
  rear= NULL;
 }
 
 front = front->next;
 count--;
 delete deleteLoc;
 return true;
}

template<typename TYPE>
int Queue<TYPE>::QueueCount()
{
 return count;
}

template<typename TYPE>
bool Queue<TYPE>::QueueFront(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
  //underflow
 }
 else
 {
  dataOut = front->data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::QueueRear(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
 }
 else
 {
  dataOut = rear->data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::EmptyQueue()
{
 return(count==0);
}

template<typename TYPE>
bool Queue<TYPE>::FullQueue()
{
 NODE<TYPE>* tempPtr;
 temp = new NODE<TYPE>;

 if(temp!=NULL)
 {
  delete temp;
  return false;
 }
 return true;
}

 

main.cpp

#include <iostream>
#include "queueADT.h"
#include <iomanip>
#include <string>
#include <ctime>  // 랜덤변수를 넣기 위해
using namespace std;

void fillQueues(Queue<int>& q0to9, Queue<int>& q10to19, Queue<int>& q20to29, Queue<int>& qOver29);
void printQueues(Queue<int>& q0to9, Queue<int>& q10to19, Queue<int>& q20to29, Queue<int>& qOver29);
void printQueue(Queue<int>& anyQueue);

int main()
{
 Queue<int> q0to9;
 Queue<int> q10to19;
 Queue<int> q20to29;
 Queue<int> qOver29;

 
 

fillQueues(q0to9, q10to19, q20to29, qOver29);
printQueues(q0to9, q10to19, q20to29, qOver29);

//printQueues(anyQueue);

 return 0;
}

void fillQueues(Queue<int>& q0to9, Queue<int>& q10to19, Queue<int>& q20to29, Queue<int>& qOver29)
{
 srand(time(0));

// srand(time(0)); // 씨앗(현재시간을 기본으로)

 int rnum;
 int category;

 for(int i=0; i<25; i++)
 {
  rnum = rand() % 51;    // 랜덤  0~50 으로 고정하기 위해 %51로 나머지 연산자 사용.
  category = rnum/10;    // 0~50의 수의 categorization
 
  cout<< setw(3) << rnum;
 
  switch(category)
  {
  case 0:
   q0to9.EnQueue(rnum);
   break;
   
  case 1:
   q10to19.EnQueue(rnum);

        break;
  case 2:
   q20to29.EnQueue(rnum);

        break;
  default :
   qOver29.EnQueue(rnum);

        break;
 
  }
 
 }
}
void printQueues(Queue<int>& q0to9, Queue<int>& q10to19, Queue<int>& q20to29, Queue<int>& qOver29)
{
    cout<<endl;
 cout<<endl;
 cout<< "DATA 0~9 : " << endl;
    printQueue(q0to9);
 
    cout<< "DATA 10~19 : " << endl;
 printQueue(q10to19);
 
 cout<< "DATA 20~29 : " << endl;
 printQueue(q20to29);

 cout<< "DATA OVER : " << endl;
    printQueue(qOver29);

}

void printQueue(Queue<int>& anyQueue)
{
  int itemp=0;
  int data;

 while(anyQueue.DeQueue(data))
 {
 if(itemp++ >=10)
 {
  itemp=1;
  cout<<endl;
 }
 cout << setw(3)<<data;
 }
 cout<<endl;

}

'1. IT Story > Development' 카테고리의 다른 글

ChatClient  (0) 2012.03.29
MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
circularAry 큐를 사용하여 복사하기  (0) 2012.03.29
StackADT를 이용한 중위식구하기  (0) 2012.03.29
배열로 구현한 Stack을 이용한 중위식구하기  (0) 2012.03.29
seqSearch  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,

 

circularAry 큐를 사용하여 복사하기

 

queueADT_ARY.h

template<typename TYPE>
struct NODE
{
 TYPE data;
 
};

template<typename TYPE>
class Queue
{
private:
 int front;
 int rear;
 int count;
 int maxSize;
 NODE<TYPE>* queueAry;

public:
 Queue(int size = 100);
 ~Queue();
 bool EnQueue(TYPE dataln);
 bool DeQueue(TYPE& dataOut);
 int QueueCount();
 bool QueueFront(TYPE& dataOut);
 bool QueueRear(TYPE& dataOut);
 bool EmptyQueue();
 bool FullQueue();

};

template<typename TYPE>
Queue<TYPE>::Queue(int size=100)
{
 maxSize= size;
 queueAry = new NODE<TYPE> [maxSize];

    if(!queueAry)
 {
  cout << " 큐에 할당할 메모리가 충분치 않습니다."<<endl;
  exit(100);
 }

 front =-1;
 rear = -1;
 count = 0;
}

template<typename TYPE>
Queue<TYPE>::~Queue()
{
 delete [] queueAry;
 queueAry=NULL;
}

template<typename TYPE>
bool Queue<TYPE>::EnQueue(TYPE dataIn)
{
  if(count == maxSize)
  {
   return false;
 
  }
  rear++;
  if(rear == maxSize)
  {
   rear=0;
  }

  queueAry[rear].data=dataIn;

  if(count == 0)
  {
  front = 0;
  }

  count++;
  return true;
 
}

template<typename TYPE>
bool Queue<TYPE>::DeQueue(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
 }

 dataOut = queueAry[front].data;
 front++;

 if(front== maxSize)
 {
 front=0;
 }

 if(count==1)
 {
 rear=front =-1; // 다시 초기화
 }

 count--;
 return true;
}

template<typename TYPE>
int Queue<TYPE>::QueueCount()
{
 return count;
}

template<typename TYPE>
bool Queue<TYPE>::QueueFront(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
  //underflow
 }
 else
 {
  dataOut = queueAry[front].data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::QueueRear(TYPE& dataOut)
{
 if(count==0)
 {
  return false;
 }
 else
 {
  dataOut = queueAry[rear].data;
  return true;
 }
}

template<typename TYPE>
bool Queue<TYPE>::EmptyQueue()
{
 return (count==0);
}

template<typename TYPE>
bool Queue<TYPE>::FullQueue()
{
 return (count==maxSize);
}

 

main.cpp

#include <iostream>
#include "queueADT_ARY.h"
#include <iomanip>
#include <string>
#include <ctime>  // 랜덤변수를 넣기 위해
using namespace std;

void fillQueue(Queue<int>& q);
void copyQueue(Queue<int>& q,Queue<int>& q1);

 

int main()
{
 Queue<int> q;
 Queue<int> q1;

 fillQueue(q);
 copyQueue(q,q1);

 return 0;
}

 

void fillQueue(Queue<int>& q)
{
 cout<<"======원본 Q1======"<<endl;

 srand(time(0)); // 씨앗(현재시간을 기본으로)

 int rnum;
 int category;

 for(int i=0; i<25; i++)
 {
  rnum = rand() % 51;    // 랜덤  0~50 으로 고정하기 위해 %51로 나머지 연산자 사용.
  category = rnum/10;    // 0~50의 수의 categorization
 
  cout<<setw(3) << rnum;
 
  q.EnQueue(rnum);
 }
}
 
void copyQueue(Queue<int>& q,Queue<int>& q1)
{
 cout<<endl;
    cout<<"======복사본 Q2======"<<endl;

    int temp=0;
    int data;

 while(q.DeQueue(data))
 {
 
  q1.EnQueue(data);
     temp=1;
    
    
 cout << setw(3)<<data;
     }


    cout<<endl;

}

'1. IT Story > Development' 카테고리의 다른 글

MultiChatServer  (0) 2012.03.29
MultiChatClient  (0) 2012.03.29
큐를 이용한 간단한 구직Pro  (0) 2012.03.29
queueADT를 이용한 간단한 응용프로그램  (0) 2012.03.29
StackADT를 이용한 중위식구하기  (0) 2012.03.29
배열로 구현한 Stack을 이용한 중위식구하기  (0) 2012.03.29
seqSearch  (0) 2012.03.29
AddressListing  (0) 2012.03.29
블로그 이미지

운명을바꾸는자

IT와 함께 살아가는 삶

,