프로그래밍 공부를 하는데 알고스팟이랑 백준 온라인 저지를 풀기로 했다.

https://algospot.com/judge/problem/read/DRAWRECT


#include<stdio.h>

#include<stdlib.h>


int rect_xy(int num);


int main()

{

int test_num = 0;

scanf("%d", &test_num);

rect_xy(test_num);

system("pause");

return 0;

}


int rect_xy(int num)

{

int i=0;

int left[3] = {0,};

int right[3] = {0,};

int CheckLeft = 0;

int CheckRight = 0;

while(num--)

{

scanf("%d %d", &left[0], &right[0]);

scanf("%d %d", &left[1], &right[1]);

scanf("%d %d", &left[2], &right[2]);

CheckLeft = left[0];

CheckRight = right[0];

   //left[0] == left[1] 이면 left[2]에 있는 값이 사각형의 다른부분의 왼쪽좌표

if(CheckLeft == left[1]) CheckLeft = left[2];

else if(CheckLeft == left[2]) CheckLeft = left[1];


//right[0] == right[1] 이면 right[2]에 있는 값이 사각형의 다른부분의 오른쪽좌표

if(CheckRight == right[1]) CheckRight = right[2];

else if(CheckRight == right[2]) CheckRight = right[1];


printf("%d %d\n", CheckLeft, CheckRight);

}


return 0;

}


이런식으로 풀었다. 

그리고 심심해서 내가 짠 코드를 ollydbg로 열어서 소스코드 복원을 해보려고 했는데 안열린다 ㅡㅡ

64bit 사용할 수 있게 플러그인을 깔아도 안되네 이건 이유를 모르겠으니 패스

다시 리버싱 공부나 해야겠다.

Posted by muscle-fairy muscle-fairy

Example1

위의 코드의 문제점?

- 가독성

- 성능

 




개선된 코드

조금 더 최적화 가능한가?





위의 코드에서 개선된 점은?

- 보기가 쉬움

- 계산 횟수 줄어서 성능 좋아짐




switch문이 if문 보다 성능이 좋은 이유는?

- 비교, 분기 횟수가 적다

if =-> else if =-> else if =-> else if 이렇게 비교하며 분기를 한다.

switch문은 switch =-> case x: 로 가기 때문에 성능이 좋다.





분기문 최적화 : 케이스가 많은 if

                 최적화 이전                               최적화 이후(binary breakdown)




분기문 최적화 : 케이스가 많은 switch

왼쪽 코드의 문제점은?

- case가 너무 많아지면 코드가 길어지고 가독성이 떨어진다.


Posted by muscle-fairy muscle-fairy

집합원소의 효율적인 저장방법 : Array index 활용1



- 오른쪽 코드의 2가지 장점은?

    1. 코드가 짧아서 메모리를 적게 먹는다.

    2. 분기문이 없어서 훨씬 빠르다.

 




집합원소의 효율적인 저장방법 : Array index 활용2


  

오른쪽 코드의 장점은?

    1. 코드가 짧아서 메모리를 적게 먹는다.

    2. 분기문이 없어서 훨씬 빠르다.


여기서 p는 함수포인터를 저장하는 배열이며,

이때 함수들은 매개변수는 없고 반환형이 void인 함수들을 저장한다.

 

 

 

 

집합원소의 효율적인 저장방법 : 구조체의 padding bit 줄이기



- 두 프로그램의 실행 결과는? 그 이유는?

    case1 = 16byte,    case2 = 12byte



구조체의 padding bit 줄이기

    1. 데이터 타입 별로 메모리에 저장될 수 있는 주소가 달라진다.

    2. char : 어느 주소나 가능, short : 2의 배수, int : 4의 배수


                          struct case1                                            struct case2


1. 기본적으로 CPU32bit(4byte) 단위로 정렬하므로 case2가 메모리를 4byte아낌.

2. CPU가 메모리에서 데이터를 읽을 때 한번에 32bit(4byte)씩 읽는데 case14, case23번 읽음

 

Posted by muscle-fairy muscle-fairy





Copy.cpp


Posted by muscle-fairy muscle-fairy
File Listing Program


파일 이름을 입력 받아서 파일 내용을 1byte씩 읽어오는 프로그램이다.

C/C++로 둘다 짰다.

학교 과제.




File Listing Program.c


File Listing Program.cpp




Posted by muscle-fairy muscle-fairy

컴파일 Dev-C++ 4.9.9.2


#include<stdio.h>

#include<conio.h>    //getch()쓰려고 

#include<stdlib.h>


int main()

{

    while(1)

    {

        int input = 0;

        input = getch(); //getch()함수는 키보드로 부터 하나의 문자를 입력받는 함수다.

    

        printf("%#x\n", input);  //%#x는 %x는 16진수 출력인데 앞에 #을 붙이면 0x를 붙여줌  

        

        if(input == 0x1b)      //ESC의 16진수 값은 0x1b이다. 종료하고 싶을 때. 

        {

            break;

        } 

    }


    system("pause");

    return 0;

}

 


16진수 값 구하기.cpp


16진수 값 구하기.exe


Posted by muscle-fairy muscle-fairy

필요한 헤더 =-> #include<windows.h>


gotoxy


void gotoxy(int x,int y)

{

COORD pos={x,y};

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); 

}


필요한 헤더 =-> #include<windows.h>


SetColor


enum 

{

    BLACK,          // 0  검정색 

    DARK_BLUE,      // 1  어두운 파랑색 

    DARK_GREEN,     // 2  어두운 초록색 

    DARK_SKY_BLUE,  // 3  어두운 하늘색 

    DARK_RED,       // 4  어두운 빨간색 

    DARK_VOILET,    // 5  어두운 보라색

    DARK_YELLOW,    // 6  어두운 노란

    GRAY,           // 7  회색

    DARK_GRAY,      // 8  어두운 회색

    BLUE,           // 9  파란색 

    GREEN,          // 10 초록색

    SKY_BLUE,       // 11 하늘색 

    RED,            // 12 빨간색 

    VOILET,         // 13 보라색 

    YELLOW,         // 14 노란색 

    WHITE,          // 15 흰색

};


void SetColor(int color)

{

 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),color);

}


필요한 헤더 =-> #include<stdlib.h>

system("cls");

=-> 화면을 깨끗이 지운다.


system("mod con: cols=c lines=l");

창의 크기를 결정함

c자리에 가로의 크기

l자리에 세로의 크기를 입력하면 된다.


system("title KOREA");

command 창의 title을 설정함


system("time/t");

시간을 출력

system("time");

이것은 시간을 변경 함


system("date/t");

날짜를 출력

system("date");

이것은 날짜를 변경함


system("color f2");

기본 배경색과 문자색을 지정함

0 = 검정색   8 = 회색

1 = 파란색   9 = 연한 파랑색

2 = 초록색   A = 연한 초록색

3 = 옥색      B = 연한 옥색

4 = 빨간색   C = 연한 빨간색

5 = 자주색   D = 연산 자주색

6 = 노란색   E = 연한 노랑색

7 = 흰색      F = 밝은 흰색


Posted by muscle-fairy muscle-fairy