[JAVA][동적할당]Hamming code

stack overflow/JAVA 2013. 6. 29. 16:24 posted by Allen Park


Hamming.java

HammingTest.java







<HammingTest.java> - 메인함수


import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class HammingTest {

public static void main(String[] args) throws IOException {

int parityLength = 1; //패리티 길이(예시 : 4)

int[] parityData; //패리티 값 (자동생성)

int numOfDataBits; //데이터 길이(직접 입력)

int[] data; // 데이터 값 (직접 입력)

int[] hammingData; //패리티 + 데이터 값 (자동 생성)

int hammingDataLength; //패리티 + 데이터 길이 (자동 생성)

int[][] location; //매트릭스 값 (자동 생성)

int[] enteredHamming; //비교 대상 값 (직접 입력)

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//Hamming hamming = new Hamming(); //굳이 인스턴스화 될 필요가 없음


//Data 비트 수 입력 받기

while (true) {

System.out.println("Enter number of bits : ");

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter an integer value over 0.");

}

else {

numOfDataBits = Integer.parseInt(str);

if(numOfDataBits < 1)

System.out.println("Please enter an integer value over 0.");

else break;

}

}

//Parity 길이 구하고 해밍코드 길이 산출하기

while(true) {

if(Math.pow(2, parityLength) >= numOfDataBits + parityLength + 1)

break;

else parityLength++;

}

hammingDataLength = numOfDataBits + parityLength;

//배열 크기 할당

data = new int[numOfDataBits];

parityData = new int[parityLength];

hammingData = new int[hammingDataLength];

enteredHamming = new int[hammingDataLength];

location = new int[parityLength][hammingDataLength];

System.out.println("Number of parity bits : " + parityLength);

System.out.println("Number of hamming bits : " + hammingDataLength);

//Data 값 입력 받고 출력

System.out.println("Enter bit number : ");

for(int i = 0; i < numOfDataBits; i++) {

while(true) {

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter a bit value 0 or 1.");

}

else {

data[i] = Integer.parseInt(str);

if(data[i] < 0 || data[i] > 1)

System.out.println("Please enter a bit value 0 or 1.");

else break;

}

}

}

Hamming.showDataBit(numOfDataBits, data);

Hamming.hammingArrayGeneration(data, hammingData, parityLength, hammingDataLength);

Hamming.setLocationsToZero(parityLength, hammingDataLength, location);

for(int i = 0; i < parityLength; i++)

Hamming.getLocations(i, hammingData, location, hammingDataLength);

Hamming.showMatrix(parityLength, hammingDataLength, location);

Hamming.generateParity(location, parityData, parityLength, hammingDataLength);

Hamming.showParity(parityLength, parityData);

Hamming.hammingArrayCompletion(hammingDataLength, hammingData, parityData);

Hamming.showHammingCode(hammingData, hammingDataLength);

//틀린 Hamming Data 입력받기

System.out.println("Enter hamming code of " + hammingDataLength + " bits :");

for(int i = 0; i < hammingDataLength; i++) {

while(true) {

String str = br.readLine();

if(str.length() == 0) {

System.out.println("Please enter a bit value 0 or 1.");

}

else {

enteredHamming[i] = Integer.parseInt(str);

if(enteredHamming[i] < 0 || enteredHamming[i] > 1)

System.out.println("Please enter a bit value 0 or 1.");

else break;

}

}

}

Hamming.setLocationsToZero(parityLength, hammingDataLength, location);

for(int i = 0; i < parityLength; i++)

Hamming.getLocations(i, enteredHamming, location, hammingDataLength);

Hamming.generateParity(location, parityData, parityLength, hammingDataLength);

Hamming.errorCalculate(enteredHamming, parityData, parityLength, hammingDataLength);

Hamming.showHammingCode(enteredHamming, hammingDataLength);

}

}




<Hamming.java>

public class Hamming {

static void hammingArrayGeneration(int data[], int hammingData[], int parityLength, int hammingDataLength) {

for(int i = 0; i < hammingDataLength; i++) {

hammingData[i] = 3; //초기화를 제 3의 수로 함

}

for(int i = 0; i < parityLength; i++) {

int cur = (int)Math.pow(2, i) - 1;

hammingData[cur] = 2; //패리티 비트가 들어갈 자리를 값 2로 미리 마킹함

}

for(int i = 0; i < hammingDataLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

if(hammingData[j] == 3) {

hammingData[j] = data[i]; //2로 마킹되지 않은 데이터 비트 자리에 data 배열의 값들을 채워 넣음

break;

}

else continue;

}

}

}

static void hammingArrayCompletion(int hammingDataLength, int[] hammingData, int[] parityData) {

int order_parity = 0;

for(int i = 0; i < hammingDataLength; i++) {

if(hammingData[i] == 2) {

hammingData[i] = parityData[order_parity++];

}

}

}

static void setLocationsToZero(int parityLength, int hammingDataLength, int[][] location) {

for(int i = 0; i < parityLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

location[i][j] = 0;

}

}

}

static void getLocations(int i, int hammingData[], int location[][], int hammingDataLength) {

int step = (int) Math.pow(2, i); //int step : 탐지 범위와 탐지 배제 범위 역할을 동시에 하는 변수

int cur = step - 1; ////변수 cur은 hammingData 배열 위를 돌아다니는 지시자 같은 역할을 하도록 고안함

for(int cur_inner = cur; cur_inner < hammingDataLength;) {

for(int j = 0; j < step; j++) {

if(cur_inner > hammingDataLength - 1) break;

if(hammingData[cur_inner] == 1) {

location[i][cur_inner] = 1;

}

cur_inner++;

}

cur_inner += step;

}

}

static void generateParity(int location[][], int parityData[], int parityLength, int hammingDataLength) {

for(int i = 0; i < parityLength; i++) {

int cnt = 0;

for(int j = 0; j < hammingDataLength; j++) {

if(location[i][j] == 1) {

cnt++;

}

} //System.out.println(i + "번째 cnt : " + cnt);

if(cnt % 2 == 1) { //짝수 패리티를 맞추기 위한 조건문

parityData[i] = 1;

}

else {

parityData[i] = 0;

}

cnt = 0;

}

}

static void errorCalculate(int enteredHamming[], int parityData[], int parityLength, int hammingDataLength) {

int error_total = 0;

for(int i = parityLength - 1; i > -1; i--) {

if(parityData[i] == 1) {

error_total += (int)(Math.pow(2, i)); //2진수인 값들을 10진수로 취합한다

}

}

System.out.println("The " + error_total + " bit is wrongly received\n");

if(enteredHamming[error_total - 1] == 1) { //고쳐야 할 비트가 1일 경우 0으로 0일 경우 1로 정정한다

enteredHamming[error_total - 1] = 0;

}

else {

enteredHamming[error_total - 1] = 1;

}

System.out.println("The correct hamming code is");

}


//////////////////////////////출력함수//////////////////////////////

static void showHammingCode(int hammingData[], int hammingDataLength) { //오류를 수정하고 난 해밍 코드 출력에도 이 함수를 씀

System.out.println("HAMMING CODE ARRAY : ");

for(int i = 0; i < hammingDataLength; i++) {

System.out.print(hammingData[i]);

} System.out.println("\n");

}

static void showDataBit(int numOfDataBits, int[] data) {

System.out.println("Data bits are : ");

for(int i = 0; i < numOfDataBits; i++)

System.out.print(data[i]);

System.out.println("\n");

}

static void showMatrix(int parityLength, int hammingDataLength, int[][] location) {

System.out.println("Location is :");

for(int i = 0; i < parityLength; i++) {

for(int j = 0; j < hammingDataLength; j++) {

System.out.print(location[i][j] + " ");

}

System.out.println();

} System.out.println("");

}

static void showParity(int parityLength, int[] parityData) {

System.out.println("Even Parity : ");

for(int i = 0; i < parityLength; i++) {

System.out.print(parityData[i] + " ");

} System.out.println("\n");

}

}




[안드로이드]OpenGL ES ①

stack overflow/Android 2013. 3. 24. 22:41 posted by Allen Park

뷰 컨테이너 생성

더 좋은 방법은 GLSurfaceView and a GLSurfaceView.Renderer 두 개를 구현

GLSurfaceView는 OpenGL로 그려진 그래픽의 뷰 컨테이너

GLSurfaceView.Renderer는 그 뷰 안에 그려진 것들을 제어

GLSurfaceView는 전체 화면

TextureView는 일부 화면

menifest에 선언 : <uses-feature android:glEsVersion="0x00020000" android:required="true" />

일반 어플과 다르게 GLSurfaceView 추가 (Android 2.2 (API Level 8) or higher)

이벤트 처리를 위해

 

1. menifest에 선언

 

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

 

 

2. class 추가

 

class MyGLSurfaceView extends GLSurfaceView {

    public MyGLSurfaceView(Context context) {
        super(context);

 

        // OpenGL ES 2.0 버전 사용
        setEGLContextClientVersion(2);

 

        // 렌더러를 GLSurfaceView에 세트
        setRenderer(new MyGLRenderer());

 

        // 그리는 값에 변화가 있을 경우에만 렌더링 함
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }
}

 

 

3. 렌더러 클래스 생성 (따로 분리된 java 파일로 생성)

 

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.opengl.GLSurfaceView;
import android.opengl.GLES20;

 

public class MyGLRenderer implements GLSurfaceView.Renderer {

    public void onSurfaceCreated(GL10 unused, EGLConfig config) {


        // 배경색 설정
        GLES20.glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
    }

    public void onDrawFrame(GL10 unused) {


        // 배경 다시 그림
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
    }

    public void onSurfaceChanged(GL10 unused, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
    }
}

 

'stack overflow > Android' 카테고리의 다른 글

[안드로이드]타이틀 바 없애기  (0) 2013.03.20
[안드로이드]Starting an Activity  (0) 2013.01.28
[안드로이드]액티비티란?  (0) 2013.01.28

[안드로이드]타이틀 바 없애기

stack overflow/Android 2013. 3. 20. 22:54 posted by Allen Park

 

1. AndroidMenifest.xml 에서 없애는 방법

 

-제목 표시줄 없애기
<activity android:name=".AAA" android:theme="@android:style/Theme.NoTitleBar" />

-다 없애기
<activity android:name=".AAA" android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

 

 

 

2. Java 소스에서 설정 하는 방법

 

-제목 표시줄 없애기

requestWindowFeature(Window.FEATURE_NO_TITLE);

-상태 바만 없애기

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

 

'stack overflow > Android' 카테고리의 다른 글

[안드로이드]OpenGL ES ①  (0) 2013.03.24
[안드로이드]Starting an Activity  (0) 2013.01.28
[안드로이드]액티비티란?  (0) 2013.01.28

[안드로이드]Starting an Activity

stack overflow/Android 2013. 1. 28. 18:11 posted by Allen Park

안드로이드 트레이닝 페이지 대충 번역

http://developer.android.com/training/basics/activity-lifecycle/starting.html




Starting an Activity


 기존 프로그램들이 main() 함수에 의해 시작되는 일반적인 배경과는 달리 안드로이드는 각 상황에 맞는 특정한 콜백 메소드를 불러들여 액티비티 객체 안의 코드를 수행한다. 다시 말해서 시작부터 종료까지 모든 단계에 따른 각각의 메소드의 시퀸스화 이다. 이 글에서는 그 중 가장 중요한 라이프사이클 메소드와 가장 처음 새로운 액티비티 객체를 생성하는 메소드의 사용법을 소개한다.




Understand the Lifecycle Callbacks


 액티비티의 일생에서 시스템은 다음 그림처럼 피라미드와 같은 일련의 과정을 이루는 라이프사이클 메소드들을 불러온다. 이 피라미드 그림을 따라 동작하며 피라미드의 가장 위야 말로 유저와 본격적인 인터렉트를 할 수 있는 상태라고 할 수 있다. 이 때 유저가 뒤로 가기 등을 눌러 해당 액티비티를 떠나면 액티비티의 상태는 피라미드의 한 계단을 내려오게 된다. 때에 따라서 액티비티가 소멸되지 않고 가려진 상태로 대기를 하는 경우도 있다. 예를 들어 화면 전환과 같은 경우를 말한다. 그림을 보면 쉽게 이해할 수 있다.





그림에 있는 콜백 함수들을 언제나 모두 쓰는 것은 아니지만 각각을 이해하고 구현해두는 것은 어플이 유저의 기대대로 잘 작동하도록 하는 좋은 방법이다. 콜백함수들의 내용들을 잘 구현해두면 다음 이점들을 얻을 수 있다.

  • 유저가 전화를 받거나 다른 어플로 전환하는 등의 경우 어플이 튕기지 않는다.

  • 액티비티가 활성화되지 않은 경우 리소스를 불필요하게 점유하지 않는다.

  • 유저가 액티비티를 떠났다가 돌아와도 그 전까지의 진행상황을 잃어버리지 않는다.

  • 화면이 가로모드나 세로모드로 전환되어도 진행을 잃거나 튕기지 않는다.


포커스를 얻거나 일는 등의 전환 상태가 발생되더라도 다음 세 가지의 상태만은 static(시스템에 잔류) 하다.


Resumed

액티비티가 앞화면에 있어 포커스를 얻고 유저와 인터렉트 한다. (이를 running 상태라고도 한다.)


Paused

부분적으로 가려진 상태를 말하며 작은 창 등에 의해 포커스를 뺏긴 경우이다. 이 때, 유저에 의한 입력을 받을 수 도 없고 어떠한 코드도 수행할 수 없다.


Stopped

액티비티가 완전히 포커스를 잃어 화면에 표시되지 않고 백그라운드에 들어간다. 이 상태에 들어가면 액티비티 객체와 그 멤버변수 값들은 보존되지만 코드를 수행할 수는 없게 된다.


이 외의 Created나 Started 상태는 "일시적" 이다. 예를 들어 onCreate() 함수가 불려오고 나면 onStart() 함수가 재빨리 불려진다.



'stack overflow > Android' 카테고리의 다른 글

[안드로이드]OpenGL ES ①  (0) 2013.03.24
[안드로이드]타이틀 바 없애기  (0) 2013.03.20
[안드로이드]액티비티란?  (0) 2013.01.28

[안드로이드]액티비티란?

stack overflow/Android 2013. 1. 28. 17:33 posted by Allen Park

Activities


 액티비티란 어플리케이션을 이루는 페이지들이라고 보면 되겠다. 보통 화면을 가득 메우지만 중간에 창으로 떠 있을수도 있다. 하나의 어플은 여러개의 액티비티로 이루어져 있고 그중 하나는 어플을 맨 처음 시작할때 띄우는 "main" 액티비티이다. 액티비티들은 기능을 구현하기 위해 서로를 불러올 수 있다. 다른 액티비티를 불러올 경우 화면에서 사라진 액티비티는 스택(back stack)에 쌓여 보존된다. 즉 새로운 액티비티가 시작되면 back stack에 push 되는 것이다. 그리고 나서 포커스를 얻는다. back stack은 기본적인 LIFO 방식에 의해 관리된다. 즉 액티비티의 생성은 push요, 소멸은 pop이다. 만약 새로운 액티비티가 생성되어 기존 액티비티가 비활성화되면 이는 비활성화 되어있는 동안 콜백 메소드에 의해 상태정보를 받게 된다. 콜백 함수들은 상태변화에 따른 적절한 작동을 할 수 있도록 하는 수단이 된다.

'stack overflow > Android' 카테고리의 다른 글

[안드로이드]OpenGL ES ①  (0) 2013.03.24
[안드로이드]타이틀 바 없애기  (0) 2013.03.20
[안드로이드]Starting an Activity  (0) 2013.01.28

[C][math.h] 2차원 방정식 근 구하기

stack overflow/C 2012. 8. 30. 16:04 posted by Allen Park



root_src.cpp






#include <stdio.h>

#include <math.h>



void rooter(double a, double b, double c)

{

double x, pan = (pow(b, 2) - (4 * a * c));


printf("판별식 값 : %lf\n", pan);

if(pan > 0) {

x = (-b + (sqrt(pan))) / (2 * a);

printf("실근 1 : %lf\n", x);

x = (-b - (sqrt(pan))) / (2 * a);

printf("실근 2 : %lf\n", x);

} else if(pan == 0) {

x = (-b + (sqrt(pan))) / (2 * a);

printf("중근 : %lf\n", x);

} else {

double sil, huh;

pan = -pan;

sil = -b / (2 * a);

huh = pan / (2 * a);

printf("허근 1 : %lf + %lfi\n", sil, huh);

printf("허근 2 : %lf - %lfi\n", sil, huh);

}

}



int main()

{

double a, b, c;


while(1) {

printf("2차 방정식의 계수 3개 입력 : ");

scanf("%lf %lf %lf", &a, &b, &c);

rooter(a, b, c);

}


return 0;

}




[C][단순연결리스트] 다항식더하기

stack overflow/C 2012. 8. 10. 04:28 posted by Allen Park


Polynomia_src.cpp












  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <conio.h>



  4. typedef struct node {

  5. int gs;  // 계수

  6. int js;  // 지수

  7. struct node *next;

  8. } NODE;

  9. NODE *start[3] = {NULL};

  10. int cnt[3] = {0};

  11. bool rage_flag = false;



  12. void del(int i);

  13. void init(int i);

  14. void rage();

  15. void insert(int i, int g, int j);

  16. void print();



  17. void init(int i)

  18. {

  19. NODE *del, *cur = start[i];


  20. if(start[i] == NULL)

  21. return;

  22. else {

  23. while(cur->next != NULL) {

  24. del = cur;

  25. cur = cur->next;

  26. free(del);

  27. }

  28. del = cur;

  29. start[i] = NULL;

  30. free(del);

  31. }

  32. }



  33. void del(int i)

  34. {

  35. NODE *del, *cur = start[i];


  36. while(cur->next != NULL) {

  37. if(cur->next->gs == 0) {

  38. del = cur->next;

  39. cur->next = del->next;

  40. free(del);

  41. cnt[i]--;

  42. return;

  43. }

  44. cur = cur->next;

  45. }


  46. if(start[i]->gs == 0) {

  47. del = start[i];

  48. start[i] = start[i]->next;

  49. free(del);

  50. cnt[i]--;

  51. return;

  52. }

  53. }



  54. void rage()

  55. {

  56. int i;

  57. if(start[0] == NULL || start[1] == NULL) {

  58. printf("먼저 A랑 B를 채워\n");

  59. return;

  60. }

  61. init(2);

  62. for(i = 0; i < 2; i++) {

  63. NODE *cur = start[i];

  64. while(cur->next != NULL) {

  65. insert(2, cur->gs, cur->js);

  66. cur = cur->next;

  67. }

  68. insert(2, cur->gs, cur->js);

  69. }

  70. rage_flag = true;

  71. }



  72. void insert(int i, int g, int j)

  73. {

  74. NODE *newnode, *cur;

  75. newnode = (NODE*)malloc(sizeof(NODE));

  76. newnode->next = NULL;

  77. newnode->gs = g;

  78. newnode->js = j;

  79. cur = start[i];

  80. rage_flag = false;


  81. if(start[i] != NULL) {

  82. while(cur->next != NULL) {

  83. if(cur->js == j) {

  84. cur->gs += g;

  85. if(cur->gs == 0)

  86. del(i);

  87. return;

  88. }

  89. cur = cur->next;

  90. }

  91. if(cur->js == j) {

  92. cur->gs += g;

  93. if(cur->gs == 0)

  94. del(i);

  95. return;

  96. }

  97. cur = start[i];

  98. }

  99. if(start[i] == NULL || start[i]->js < newnode->js) {

  100. newnode->next = start[i];

  101. start[i] = newnode;

  102. cnt[i]++;

  103. return;

  104. }


  105. if(cur->js >= newnode->js) {

  106. while(cur->next != NULL) {

  107. if(cur->next->js <= newnode->js) {

  108. newnode->next = cur->next;

  109. cur->next = newnode;

  110. cnt[i]++;

  111. return;

  112. }

  113. cur = cur->next;

  114. }

  115. cur->next = newnode;

  116. cnt[i]++;

  117. }

  118. }



  119. void print()

  120. {

  121. int i, minus;


  122. for(i = 0; i < 3; i++) {

  123. NODE *cur = start[i];


  124. if(i == 0)

  125. printf("A = ");

  126. else if(i == 1)

  127. printf("B = ");

  128. else

  129. printf("C = ");


  130. if(start[i] == NULL) {

  131. if(i == 2) {

  132. printf("아직 합치지 않았어\n");

  133. continue;

  134. }

  135. printf("이 배열은 비어있어\n");

  136. continue;

  137. }

  138. else {

  139. if(i == 2 && !rage_flag) {

  140. printf("다시 합쳐\n");

  141. continue;

  142. }

  143. }

  144. printf("%dX^%d", cur->gs, cur->js);

  145. if(cur->next != NULL)

  146. cur = cur->next;

  147. else{

  148. printf("\n");

  149. continue;

  150. }


  151. while(cur->next != NULL) {

  152. if(cur->gs > 0) {

  153. minus = cur->gs;

  154. printf(" + ");

  155. }

  156. else if(cur->gs < 0) {

  157. minus = -cur->gs;

  158. printf(" - ");

  159. }

  160. printf("%dX^%d", minus, cur->js);

  161. cur = cur->next;

  162. }

  163. if(cur->gs > 0) {

  164. minus = cur->gs;

  165. printf(" + ");

  166. }

  167. else if(cur->gs < 0) {

  168. minus = -cur->gs;

  169. printf(" - ");

  170. }

  171. printf("%dX^%d\n", minus, cur->js);

  172. }

  173. }



  174. int main()

  175. {

  176. int sel, gs, js;


  177. while(1) {

  178. system("cls");

  179. puts("1. Insert A");

  180. puts("2. Insert B");

  181. puts("3. Print");

  182. puts("4. A + B");

  183. puts("5. Initialize");

  184. puts("6. Quit");

  185. printf("골라 : ");

  186. scanf("%d", &sel);

  187. fflush(stdin);


  188. switch(sel) {

  189. case 1:

  190. printf("식 A 입력\n");

  191. printf("계수 : ");

  192. scanf("%d", &gs);

  193. fflush(stdin);

  194. printf("지수 : ");

  195. scanf("%d", &js);

  196. insert(0, gs, js);

  197. printf("식 A에 추가했다\n");

  198. break;

  199. case 2:

  200. printf("식 B 입력\n");

  201. printf("계수 : ");

  202. scanf("%d", &gs);

  203. fflush(stdin);

  204. printf("지수 : ");

  205. scanf("%d", &js);

  206. insert(1, gs, js);

  207. printf("식 B에 추가했어\n");

  208. break;

  209. case 3:

  210. print();

  211. break;

  212. case 4:

  213. if(rage_flag) {

  214. printf("이미 더했어\n");

  215. getch();

  216. continue;

  217. }

  218. rage();

  219. printf("두 식을 더했어\n");

  220. break;

  221. case 5:

  222. init(0);

  223. init(1);

  224. init(2);

  225. printf("모두 초기화했어\n");

  226. break;

  227. case 6:

  228. exit(1);

  229. }

  230. getch();

  231. }

  232. return 0;

  233. }


doubly_linked_list_src.cpp










  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <conio.h>



  4. typedef struct node {

  5. int key;

  6. struct node *prev;

  7. struct node *next;

  8. } DNODE;

  9. DNODE *start = NULL;

  10. int cnt = 0;



  11. void insert()  // 오름차순 정렬삽입

  12. {

  13. DNODE *newnode, *cur;

  14. newnode = (DNODE*)malloc(sizeof(DNODE));

  15. newnode->prev = newnode->next = NULL;

  16. cur = start;


  17. printf("삽입할 정수를 입력해 : ");

  18. scanf("%d", &newnode->key);

  19. fflush(stdin);


  20. if(start == NULL || start->key > newnode->key) {

  21. newnode->next = start;

  22. start = newnode;

  23. printf("맨 앞에 삽입됐다\n");

  24. cnt++;

  25. return;

  26. }


  27. if(cur->key <= newnode->key) {

  28. while(cur->next != NULL) {

  29. if(cur->next->key >= newnode->key) {

  30. newnode->prev = cur;

  31. newnode->next = cur->next;

  32. cur->next->prev = newnode;

  33. cur->next = newnode;

  34. cnt++;

  35. printf("중간에 삽입됐다\n");

  36. return;

  37. }

  38. cur = cur->next;

  39. }


  40. newnode->prev = cur;

  41. cur->next = newnode;

  42. printf("맨 끝에 삽입됐다\n");

  43. cnt++;

  44. }

  45. }



  46. void print()

  47. {

  48. DNODE *cur = start;


  49. if(start == NULL) {

  50. printf("배열이 비어 있어서 삭제못해\n");

  51. return;

  52. }


  53. while(cur->next != NULL) {

  54. printf("%d -> ", cur->key);

  55. cur = cur->next;

  56. }

  57. printf("%d", cur->key);

  58. }



  59. void del()

  60. {

  61. int k;

  62. bool flag = false;

  63. DNODE *del, *cur = start;


  64. if(start == NULL) {

  65. printf("배열이 비어 있어서 출력못해\n");

  66. return;

  67. }


  68. printf("삭제할 정수를 입력해 : ");

  69. scanf("%d", &k);

  70. fflush(stdin);


  71. while(cur->next != NULL) {

  72. if(cur->next->key == k) {

  73. del = cur->next;

  74. cur->next = del->next;

  75. printf("배열의 %d를 삭제한다\n", del->key);

  76. free(del);

  77. cnt--;

  78. flag = true;

  79. }

  80. else

  81. cur = cur->next;

  82. }


  83. if(start->key == k) {

  84. del = start;

  85. start = start->next;

  86. printf("배열의 %d를 삭제한다\n", del->key);

  87. free(del);

  88. cnt--;

  89. flag = true;

  90. }

  91. if(start != NULL)

  92. printf("start 노드의 key 값 : %d\n", start->key);


  93. if(!flag)

  94. printf("%d는 배열에 없어\n", k);

  95. }



  96. int main()

  97. {

  98. int sel;


  99. while(1) {

  100. system("cls");

  101. puts("1. Insert");

  102. puts("2. Print");

  103. puts("3. Delete");

  104. puts("4. Quit");

  105. printf("골라 : ");

  106. scanf("%d", &sel);

  107. fflush(stdin);


  108. switch(sel) {

  109. case 1: insert(); break;

  110. case 2: print();  break;

  111. case 3: del();    break;

  112. case 4: exit(1);

  113. }


  114. getch();

  115. }


  116. return 0;

  117. }






linked_list_src.cpp










  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <conio.h>



  4. typedef struct node {

  5. int key;

  6. struct node *next;

  7. }NODE;

  8. NODE *start = NULL;

  9. int cnt = 0;



  10. void insert()

  11. {

  12. NODE *newnode, *cur;

  13. newnode = (NODE*)malloc(sizeof(NODE));


  14. printf("\n\t정수를 입력해 : ");

  15. scanf("%d", &newnode->key);

  16. fflush(stdin);

  17. newnode->next = NULL;  // 맨 뒤에 붙으므로 넥스트는 NULL


  18. if(start == NULL) {

  19. start = newnode;

  20. printf("\n\t배열이 비어 있어 첫 원소로 %d 삽입했어.\n", newnode->key);

  21. }

  22. else {

  23. cur = start;

  24. while(cur->next != NULL) {

  25. cur = cur->next;

  26. }

  27. cur->next = newnode;

  28. printf("\n\t배열의 맨 뒤에 %d 삽입했어.\n", newnode->key);

  29. }


  30. cnt++;  // 추가된 갯수 업데이트

  31. }



  32. void print()

  33. {

  34. NODE *cur;

  35. if(start == NULL) {

  36. printf("\n\t배열이 비어 있어서 출력할게 없어.\n");

  37. return;

  38. }

  39. cur = start;

  40. printf("\n\t");

  41. while(cur->next != NULL) {

  42. printf("%d -> ", cur->key);

  43. cur = cur->next;

  44. }

  45. printf("%d\n\t총 %d개야.", cur->key, cnt);

  46. }



  47. void sort()

  48. {

  49. int i, j;

  50. NODE *cur, **arr, *temp;

  51. arr = (NODE**)malloc(cnt * sizeof(NODE*));


  52. if(cnt <= 0) {

  53. printf("\n\t배열이 비어 있어 정렬할게 없어.\n");

  54. return;

  55. }


  56. cur = start;

  57. for(i = 0; i < cnt; i++) {

  58. arr[i] = cur;

  59. cur = cur->next;

  60. }


  61. for(i = 0; i <cnt; i++) {

  62. printf("%d ", arr[i]->key);

  63. }

  64. for(i = 0; i < cnt - 1; i++) {

  65. for(j = i + 1; j < cnt; j++) {

  66. if(arr[i]->key <= arr[j]->key) {

  67. temp = arr[i];

  68. arr[i] = arr[j];

  69. arr[j] = temp;

  70. }

  71. }

  72. }


  73. for(i = 0; i < cnt; i++) {

  74. printf("%d ", arr[i]->key);

  75. }


  76. cur = start;

  77. for(start = arr[0], cur = start, i = 1; i < cnt; i++, cur = cur->next)

  78. cur->next = arr[i];

  79. cur->next = NULL;


  80. printf("\n\t배열이 내림차순으로 정렬되었어.\n");


  81. free(arr);

  82. }



  83. int main()

  84. {

  85. int sel;


  86. while(1) {

  87. system("cls");

  88. puts("MENU");

  89. puts("1. Insert");

  90. puts("2. Print");

  91. puts("3. Sort");

  92. puts("4. Quit");

  93. printf("선택해 : ");

  94. scanf("%d", &sel);

  95. fflush(stdin);


  96. switch(sel) {

  97. case 1: insert(); break;

  98. case 2: print();  break;

  99. case 3: sort();   break;

  100. case 4: exit(1);

  101. }

  102. getch();

  103. }

  104. return 0;

  105. }



bingo_src.cpp








  1. #include <stdio.h>

  2. #include <stdlib.h>

  3. #include <time.h>



  4. void init_shuffle(int (*user1)[5], int (*user2)[5]) //2차원 배열 넘기기 (Call by reference)

  5. {

  6. srand((unsigned)time(NULL));

  7. int i, j, k, w = 0, tmp, picked[25] = {0}; //picked 배열에 선택 된 수를 저장

  8. bool flag = false; //picked 배열에 이미 저장된 숫자가 뽑힐 경우 true


  9. for(i = 0; i < 5; i++) { //user1 빙고판 생성

  10. for(j = 0; j < 5; j++) {

  11. while(1) {

  12. tmp = (rand() % 50) + 1;

  13. for(k = 0; k < 25; k++) {

  14. if(tmp == picked[k]) flag = true;

  15. }

  16. if(flag) {

  17. flag = false;

  18. continue; //중복이면 다시 while 첫 부분으로

  19. }

  20. else {

  21. picked[w++] = user1[i][j] = tmp;

  22. break;    //안중복이면 뽑힌거 저장하고 while 이탈

  23. }

  24. }

  25. }

  26. }


  27. w = 0;

  28. for(i = 0; i < 25; i++) {

  29. picked[i] = 0;

  30. }


  31. for(i = 0; i < 5; i++) {

  32. for(j = 0; j < 5; j++) {

  33. while(1) {

  34. tmp = (rand() % 50) + 1;

  35. for(k = 0; k < 25; k++) {

  36. if(tmp == picked[k]) flag = true;

  37. }

  38. if(flag) {

  39. flag = false;

  40. continue;

  41. }

  42. else {

  43. picked[w++] = user2[i][j] = tmp;

  44. break;

  45. }

  46. }

  47. }

  48. }

  49. }



  50. void prnt_map(int (*user1)[5], int (*user2)[5])

  51. {

  52. int i, j;


  53. system("cls");

  54. for(i = 0; i < 5; i++) {

  55. for(j = 0; j < 5; j++) {

  56. if(user1[i][j] == 0) printf("\t*");

  57. else printf("\t%d", user1[i][j]);

  58. }

  59. printf("\n");

  60. }

  61. printf("\n\n\n");

  62. for(i = 0; i < 5; i++) {

  63. for(j = 0; j < 5; j++) {

  64. if(user2[i][j] == 0) printf("\t*");

  65. else printf("\t%d", user2[i][j]);

  66. }

  67. printf("\n");

  68. }

  69. }



  70. int check_bingo(int user[5][5]) //2차원 배열 넘기기 (Call by value)

  71. {

  72. int i, j, sum = 0, bingo = 0;;


  73. for(i = 0; i < 5; i++) {

  74. for(j = 0; j < 5; j++) {

  75. sum += user[i][j];

  76. }

  77. if(sum == 0) {

  78. bingo++;

  79. }

  80. else         sum = 0;

  81. }


  82. for(j = 0; j < 5; j++) {

  83. for(i = 0; i < 5; i++) {

  84. sum += user[i][j];

  85. }

  86. if(sum == 0) {

  87. bingo++;

  88. }

  89. else         sum = 0;

  90. }

  91. sum = 0;

  92. for(i = 0; i < 5; i++) {

  93. sum += user[i][i];

  94. }

  95. if(sum == 0) {

  96. bingo++;

  97. }

  98. else         sum = 0;


  99. sum = 0;

  100. for(i = 4, j = 0; i > -1, j < 5; i--, j++) {

  101. sum += user[i][j];

  102. }

  103. if(sum == 0) {

  104. bingo++;

  105. }


  106. return bingo;

  107. }



  108. void call_number(int (*user1)[5], int (*user2)[5])

  109. {

  110. int i, j, num;

  111. bool flag = false;


  112. while(!flag) {

  113. printf("입력해라 : ");

  114. scanf("%d", &num);


  115. for(i = 0; i < 5; i++) {

  116. for(j = 0; j < 5; j++) {

  117. if(num == user1[i][j]) {

  118. user1[i][j] = 0;

  119. flag = true;

  120. }

  121. }

  122. }

  123. if(!flag) printf("없는 숫자다.\n");

  124. else {

  125. for(i = 0; i < 5; i++) {

  126. for(j = 0; j < 5; j++) {

  127. if(num == user2[i][j]) user2[i][j] = 0;

  128. }

  129. }

  130. }

  131. }

  132. }



  133. void computers_revange(int (*user)[5], int (*followed)[5])

  134. {

  135. int i, j, ind, tmp_cmp, tmp_gst, AIpick, cnt = 0, compr[12] = {0}, ghost[12];


  136. for(i = 0; i < 12; i++) {

  137. ghost[i] = i;

  138. }


  139. for(i = 0; i < 5; i++) {

  140. for(j = 0; j < 5; j++) {

  141. if(user[i][j] == 0) {

  142. compr[cnt]++;

  143. }

  144. }

  145. cnt++;

  146. }

  147. for(j = 0; j < 5; j++) {

  148. for(i = 0; i < 5; i++) {

  149. if(user[i][j] == 0) {

  150. compr[cnt]++;

  151. }

  152. }

  153. cnt++;

  154. }


  155. for(i = 0; i < 5; i++) {

  156. if(user[i][i] == 0) {

  157. compr[cnt]++;

  158. }

  159. }

  160. cnt++;


  161. for(i = 4, j = 0; i > -1, j < 5; i--, j++) {

  162. if(user[i][j] == 0) {

  163. compr[cnt]++;

  164. }

  165. }


  166. for(i = 0; i < 11; i++) {

  167. for(j = i + 1; j < 12; j++) {

  168. if(compr[i] < compr[j]) {

  169. tmp_cmp = compr[i];

  170. tmp_gst = ghost[i];

  171. compr[i] = compr[j];

  172. ghost[i] = ghost[j];

  173. compr[j] = tmp_cmp;

  174. ghost[j] = tmp_gst;

  175. }

  176. }

  177. }

  178. for(i = 0; i < 12; i++) printf("%d ", compr[i]);


  179. for(i = 0; i < 12; i++) {

  180. if(compr[i] < 5) {

  181. ind = ghost[i];

  182. break;

  183. }

  184. else continue;

  185. }


  186. if(ind >=0 && ind < 5) {

  187. for(i = 0; i < 5; i++) {

  188. if(user[ind][i] != 0) {

  189. AIpick = user[ind][i];

  190. user[ind][i] = 0;

  191. break;

  192. }

  193. else continue;

  194. }

  195. }

  196. else if(ind >= 5 && ind < 10) {

  197. for(i = 0; i < 5; i++) {

  198. if(user[i][ind - 5] != 0) {

  199. AIpick = user[i][ind - 5];

  200. user[i][ind - 5] = 0;

  201. break;

  202. }

  203. else continue;

  204. }

  205. }

  206. else if(ind == 10) {

  207. for(i = 0; i < 5; i++) {

  208. if(user[i][i] != 0) {

  209. AIpick = user[i][i];

  210. user[i][i] = 0;

  211. break;

  212. }

  213. else continue;

  214. }

  215. }

  216. else {

  217. for(i = 4, j = 0; i > -1, j < 5; i--, j++) {

  218. if(user[i][j] != 0) {

  219. AIpick = user[i][i];

  220. user[i][j] = 0;

  221. break;

  222. }

  223. else continue;

  224. }

  225. }


  226. for(i = 0; i < 5; i++) {

  227. for(j = 0; j < 5; j++) {

  228. if(followed[i][j] == AIpick) {

  229. followed[i][j] = 0;

  230. }

  231. }

  232. }

  233. }



  234. int main()

  235. {

  236. int user1[5][5];

  237. int user2[5][5];

  238. int a = 0;


  239. init_shuffle(user1, user2); //빙고 판 생성

  240. prnt_map(user1, user2);


  241. while(check_bingo(user1) <= 4 && check_bingo(user2) <= 4) {

  242. call_number(user1, user2);

  243. computers_revange(user2, user1);

  244. prnt_map(user1, user2);

  245. printf("내 빙고 = %d\t적 빙고 = %d\n", check_bingo(user1), check_bingo(user2));

  246. }

  247. if(check_bingo(user1) == check_bingo(user2)) printf("비겼다\n");

  248. else if(check_bingo(user1) > check_bingo(user2)) printf("이겼다\n");

  249. else printf("졌다\n");


  250. return 0;

  251. }






아 미친 못 이김