이젠.. 지쳤어.. 아.. 내 JPT

솔직히 이젠 어찌되도.. orz

#include <windows.h>
#include <stdio.h>

int A[100];

HANDLE hEventA;
HANDLE hEventB;

// 스레드 A
DWORD WINAPI MyThreadA(LPVOID arg)
{
 DWORD retval;

 // 이벤트 B(스레드B에서 SetEvent 함수가 올라올때까지)가 완료될때까지 기다리기
 retval = WaitForSingleObject(hEventB, INFINITE);
 if(retval == WAIT_FAILED)
  return 0;

 printf("난 3번을 찍어내는 0번 스레드에염\n");
 for(int i=0; i<100; i++)
 {
  A[i]=3;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);
 printf("\n");

 // 쓰기 완료를 알림
 SetEvent(hEventA);
 // 이벤트 제거
 CloseHandle(hEventA);

 return 0;
}

// 스레드 B
DWORD WINAPI MyThreadB(LPVOID arg)
{
 DWORD retval;

 retval = WaitForSingleObject(hEventA, INFINITE);
 if(retval == WAIT_FAILED)
  return 0;

 printf("난 4번을 찍어내는 1번 스레드에염\n");
 for(int i=99; i>=0; i--)
 {
  A[i] = 4;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);
 printf("\n");
 
 // 쓰기 완료를 알림
 SetEvent(hEventB);
 // 이벤트 제거
 CloseHandle(hEventB);

 return 0;
}

int main()
{
 int judge = 0;   // 우선 초기화
 while(1)
 {
  printf("어떤스레드를 먼저 실행하게 할껀가?\n");
  printf(" -> 0 : 0번스레드, 1 : 1번 스레드\n");
  scanf("%d",&judge);
  if(judge == 0 || judge == 1)
   break;
  else
   printf("0 아님 1만 입력하라고!");
 }

 //이벤트 생성
 if(judge == 0)
 {
  // A스레드를 비신호 상태로 만들어서 먼저 실행하게 만든다.
  hEventA = CreateEvent(NULL, FALSE, FALSE, NULL);
  if(hEventA == NULL)
   return -1;
  hEventB = CreateEvent(NULL, FALSE, TRUE, NULL);
  if(hEventB == NULL)
   return -1;
 }
 else
 {
  // B스레드를 비신호 상태로 만들어서 먼저 실행하게 한다.
  hEventA = CreateEvent(NULL, FALSE, TRUE, NULL);
  if(hEventA == NULL)
   return -1;
  hEventB = CreateEvent(NULL, FALSE, FALSE, NULL);
  if(hEventB == NULL)
   return -1;
 }

 // 두개의 스레드 생성
 HANDLE hThread[2];
 DWORD ThreadId[2];
 hThread[0] = CreateThread(NULL, 0, MyThreadA, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, MyThreadB, NULL, 0, &ThreadId[1]);

 // 스레드 종료 대기
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
 
 //--- 결과 출력 ---//
 printf("최종결과는 이거에염 ㅡㅡ..\n");
 for(int i=0; i<100; i++)
  printf("%d ", A[i]);
 printf("\n");

 return 0;
}
/*
// p179 예제.. 임계영역 설정 방법
#include <windows.h>
#include <stdio.h>

int A[100];
int judge;     // 판단자
CRITICAL_SECTION cs;


DWORD WINAPI MyThread1(LPVOID arg)
{
 if(judge == 0)
  Sleep(1);      // 다음 스레드가 스케쥴링되게 잠깐 쉬게함..

 EnterCriticalSection(&cs);   // 임계영역 깃을 내림
 
 printf("난 3번을 찍어내는 0번 스레드에염\n");
 for(int i=0; i<100; i++)
 {
  A[i]=3;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);

 printf("\n");
 LeaveCriticalSection(&cs);   // 임계영역 깃을 올림
 return 0;
}

DWORD WINAPI MyThread2(LPVOID arg)
{
 if(judge == 1)
  Sleep(1);      // 다음 스레드가 스케쥴링되게 잠깐 쉬게함..

 EnterCriticalSection(&cs);

 printf("난 4번을 찍어내는 1번 스레드에염\n");
 for(int i=99; i>=0; i--)
 {
  A[i] = 4;
  Sleep(10);
 }
 for(int i=0; i<100; i++)
  printf("%d ",A[i]);

 printf("\n");
 LeaveCriticalSection(&cs);
 return 0;
}

int main()
{
 judge = 0;   // 우선 초기화
 while(1)
 {
  printf("어떤스레드를 먼저 쉬게할껀가?\n");
  printf(" -> 0 : 0번스레드, 1 : 1번 스레드\n");
  scanf("%d",&judge);
  if(judge == 0 || judge == 1)
   break;
  else
   printf("0 아님 1만 입력하라고!");
 }
 // 임계영역 생성
 InitializeCriticalSection(&cs);

 // 두개의 스레드 생성
 HANDLE hThread[2];
 DWORD ThreadId[2];
 hThread[0] = CreateThread(NULL, 0, MyThread1, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, MyThread2, NULL, 0, &ThreadId[1]);

 // 스레드 종료 대기
 WaitForMultipleObjects(2, hThread, TRUE, INFINITE);

 // 임계 영역 제거
 DeleteCriticalSection(&cs);

 printf("최종결과는 이거에염 ㅡㅡ..\n");
 // 결과 출력
 for(int i=0; i<100; i++)
  printf("%d ", A[i]);

 printf("\n");

 return 0;
}
*/

/*
#include <windows.h>
#include <stdio.h>

#define BUFSIZE 16

HANDLE hReadEvent;
HANDLE hWriteEvent;
char buf[BUFSIZE];

DWORD WINAPI WriteThread(LPVOID arg)
{
 DWORD retval;

 for(int k=0; k<10; k++)
 {
  // 읽기 완료를 기다림.
  retval = WaitForSingleObject(hReadEvent, INFINITE);
  if(retval == WAIT_FAILED)
   break;

  // 공유 버퍼에 데이터 쓰기
  for(int i=0; i<BUFSIZE; i++)
   buf[i] = 3;

  // 쓰기 완료를 알림
  SetEvent(hWriteEvent);
 }

 // 이벤트 제거
 CloseHandle(hWriteEvent);

 return 0;
}

DWORD WINAPI ReadThread(LPVOID arg)
{
 DWORD retval;

 while(1)
 {
  // 쓰기 완료를 기다림
  retval = WaitForSingleObject(hWriteEvent, INFINITE);
  if(retval == WAIT_FAILED)
   break;

  // 읽을 데이터를 출력
  printf("Thread %d:\t", GetCurrentThreadId());
  for(int i=0; i<BUFSIZE; i++)
   printf("%d ", buf[i]);
  printf("\n");

  // 버퍼를 0으로 초기화
  ZeroMemory(buf, sizeof(buf));

  // 읽기 완료를 알림
  SetEvent(hReadEvent);
 }

 return 0;
}

int main()
{
 //이벤트 생성
 hReadEvent = CreateEvent(NULL, FALSE, TRUE, NULL);
 if(hReadEvent == NULL)
  return -1;
 hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
 if(hWriteEvent == NULL)
  return -1;

 // 세 개의 스레드 생성
 HANDLE hThread[3];
 DWORD ThreadId[3];
 hThread[0] = CreateThread(NULL, 0, WriteThread, NULL, 0, &ThreadId[0]);
 hThread[1] = CreateThread(NULL, 0, ReadThread, NULL, 0, &ThreadId[2]);
 hThread[2] = CreateThread(NULL, 0, ReadThread, NULL, 0, &ThreadId[2]);

 // 스레드 종료 대기
 WaitForMultipleObjects(3, hThread, TRUE, INFINITE);

 // 이벤트 제거
 CloseHandle(hReadEvent);

 printf("모든 작업을 완료했습니다.\n");

 return 0;
}
*/

컹..

숙제는.....어떻게 해야 하남..

// 문제1

class Account
{
 String accountNo;
 String ownerName;
 int balance;
 Account(String accountNo, String ownerName, int balance)
 {
  this.accountNo = accountNo;
  this.ownerName = ownerName;
  this.balance = balance;
 }
 
 void deposit(int amount)
 {
  balance += amount;
 }
 int withdraw(int amount) throws Exception
 {
  if(balance < amount)
   throw new Exception("잔액 부족");
  balance -= amount;
  return amount;
 }
}

class CheckingAccount extends Account
{
 String cardNo;
 CheckingAccount(String accountNo, String ownerName, int balance, String candNo)
 {
  super(accountNo, ownerName, balance);
  this.cardNo = candNo;
 }
 int pay(String cardNo, int amount) throws Exception
 {
  if(!cardNo.equals(this.cardNo) || (balance < amount))
   throw new Exception("지불 불가");
 
  return withdraw(amount);
 }
}

public class test
{
 public static void main(String[] args)
 {
  Account obj1 = new Account("111-22-33333","임꺽정",10000);
  Account obj2 = new Account("777-88-99999","김선달",30000);
  Account obj3 = new CheckingAccount("444-55-66666","홍길동",20000,"5555-6666-77777-8888");
  Account obj4 = new Account("000-00-00000","김미영",0);
 
  printAccountInfo(obj1);
  printAccountInfo(obj2);
  printAccountInfo(obj3);
  printAccountInfo(obj4);
 }
 
 static void printAccountInfo(Account obj)
 {
  System.out.println("계좌번호 : "+obj.accountNo);
  System.out.println("예금주 이름 : "+obj.ownerName);
  System.out.println("잔액 : "+obj.balance);
  if(obj instanceof CheckingAccount)
  {
   CheckingAccount CAobj = (CheckingAccount)obj;
   System.out.println("카드번호 : " + CAobj.cardNo);
  }
  System.out.println();
 }
}

// 문제 2번
enum Color
{
 YELLOW("노랑"), RED("빨강"), BLUE("파랑");
 final private String name;
 Color(String name)
 {
  this.name = name;
 }
 String value()
 {
  return name;
 }
}

// 문제 3
enum State
{
 BORROWED(1), NORMAL(0);
 final private int state;
 State(int state)
 {
  this.state = state;
 }
 int value()
 {
  return state;
 }
}

class SeparateVolume
{
 String requestNo;
 String bookTitle;
 String writer;
 String borrower;
 String checkOutData;
 State state;
 SeparateVolume(String requno, String book, String writer)
 {
  this.requestNo = requno;
  this.bookTitle = book;
  this.writer = writer;
 }
 public void checkOut(String borrower, String data)//대출함
 {
  if(state.value()!= state.NORMAL)
   return;
  this.borrower = borrower;
  this.checkOutData = data;
  this.state = state.BORROWED;
  System.out.println("*"+ bookTitle + "이(가) 대출되었음");
  System.out.println("대출인 : "+ borrower);
  System.out.println("대출일 : "+ checkOutData);
 }
 
 public void checkID()       // 반납
 {
  this.borrower = null;
  this.checkOutData = null;
  this.state = state.NORMAL;
  System.out.println("*"+ bookTitle + "이(가) 반납되었음");
 }
}

+ Recent posts