Programming/빡공(Nefus)

170322(수)

Jubil 2017. 3. 22. 20:25
반응형

C언어



-자료형과 서식 지정자

(int, unsigned int, char, float, double),  (%d, %u, %c, %f, %lf)


-if, else if , else


-for문과 전역 변수 지역 변수 그리고 for(;;)


-while문


-break문


-continue문


-codeup 문제 풀이 1353 ~ 1361



꿀팁


-변수명과 들여쓰기 증감식은 전위 연산자


-Alt + Shift + 방향키(Visual Studio에서만 가능)


-함수명 + Tab 자동 완성(Visual Studio에서만 가능)



Linux


-절대경로와 상대경로



-------------------------------------------------------------------------------------------

C언어

1. 자료형과 서식 지정자


1) 정수형 (int, unsigned int)


정수는 소수점이 없는 수이다.


int형은 4byte의 크기가 할당된다.

unsigned int도 같은 4byte지만 음수 표현은 불가한 대신에 양수 표현 범위가 2배가 된다.


int signed / -2,147,483,648 ~ 2,147,483,647

int unsigned / 0 ~ 4,294,967,295


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main() {
    int i = -2147483648;
    unsigned int ui = 4294967295;
 
    printf("%d \n", i);
    printf("%u \n", ui);
 
    return 0;
}

cs


서식 지정자는

int -> %d

unsigned int ->%u


실행 결과



그대로 출력된다.




2) 문자형 (char)


문자는 영어 1글자, 기호문자 1글자를 뜻한다.


char형은 1byte의 크기가 할당된다.


문자를 변수에 넣기 위해서는 작은따옴표(' ') 안에 작성해야 한다.


1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main() {
    char c = 'A';
 
    printf("%c \n", c);
    printf("%d \n", c);
 
    return 0;
}

cs


서식 지정자는

char -> %c    가 기본이지만

문자에는 각각 ASCII 코드값이 매칭된다.


그리하여 %d, %o(8진수), %x(16진수)로도 출력 할 수 있다.


위 코드에서는 %d로만 출력해 보았다.


실행 결과



문자 A와 그 문자의 ASCII 코드값 65가 출력된다.




3) 실수형 (float, double)


실수는 소수점이 있는 수이다.


float형은 4byte의 크기가 할당된다.

double형은 8byte의 크기가 할당된다.


float / 1.2E-38 ~ 3.4E+38 / 소수점 이하 6자리

double / 2.3E-308 ~ 1.7E+308 / 소수점 이하 15자리


(참고로 long double은 12byte에 소수점 이하 19자리까지 표현 가능)


1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main() {
    float f = 20.123456;
    double d = 100.123456789012345;
 
    printf("%.6f \n", f);
    printf("%.15lf \n", d);
 
    return 0;
}
cs


서식 지정자는

float -> %f

double -> %lf 


하지만 소수점 n+1번째 자리를 반올림해서

n번째 자리까지 출력하고 싶을때는 각각


%.nf

%.nlf


이렇게 써주면 된다.


실행 결과



약간의 오차가 있는것 같다.






2. if, else if, else


if문은 조건문이다.


if(조건식){

조건식이 참일 때 실행할 명령;

}                                     


생긴건 이렇게 생겼다.


조건식이 성립할 때 실행할 명령이 한 줄이면 {} 생략 가능하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
int main() {
    int condition, score;
    condition = 1;
 
    scanf("%d"&score);
    if (score == 100 && condition == 1) {
        printf("Perpect \n");
        condition--;
    }
    if (score >= 90 && condition == 1) {
        printf("Great \n");
        condition--;
    }
    if (score >= 80 && condition == 1) {
        printf("Good \n");
        condition--;
    }
    if (score >= 70 && condition == 1) {
        printf("Not bad \n");
        condition--;
    }
    if (score < 70 && condition == 1
        printf("Bad \n");
 
    return 0;
}
cs


내가 원하는대로 값이 나오긴 하지만

코드가 굉장히 길어지고 받은 score 값에 100이 입력되면

그 밑에 의미 없는 조건식을 검사한다.

(사실 이럴땐 switch문이..ㅎ)


이런 비효율적인 식을 바로잡아 주는게 else if()이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
int main() {
    int score;
 
    scanf("%d"&score);
    if (score == 100) {
        printf("Perpect \n");
    }
    else if (score >= 90) {
        printf("Great \n");
    }
    else if (score >= 80) {
        printf("Good \n");
    }
    else if (score >= 70) {
        printf("Not bad \n");
    }
    else if (score < 70) {
        printf("Bad \n");
    }
 
    return 0;
}

cs


훨씬 가독성이 좋다.


여기서 조금 더 줄인다면


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
    int score;
 
    scanf("%d"&score);
    if (score == 100printf("Perpect \n");
    else if (score >= 90printf("Great \n");
    else if (score >= 80printf("Good \n");
    else if (score >= 70printf("Not bad \n");
    else if (score < 70printf("Bad \n");
    
 
    return 0;
}

cs


이렇게도 가능 할 것이다.


하지만 마지막 조건식은 위 조건들이 아닐때 무조건 실행하게 되어있다!

(물론 입력값이 0~100으로 정해져있을때)


그럴때는 else를 써주면 더 간결해진다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main() {
    int score;
 
    scanf("%d"&score);
    if (score == 100printf("Perpect \n");
    else if (score >= 90printf("Great \n");
    else if (score >= 80printf("Good \n");
    else if (score >= 70printf("Not bad \n");
    else printf("Bad \n");
    
 
    return 0;
}
cs


이렇게 쓰면 간결한 코드가 된다.




3. for문과 전역 변수 지역 변수 그리고 for(;;)


for문은 반복문으로 보통


for(선언 및 초기화; 조건식; 증감식) {

반복할 내용

}                                   


이렇게 생겼고 실행 순서는


선언 및 초기화 -> 조건식 -> 반복할 내용 -> 증감식

이고 선언 및 초기화는 맨 처음 반복문을 돌렸을때만 실행 된다.



반복문 시작 - > int i = 0 -> i < 5(참) -> printf("Nefus!\n") -> i++ -> i < 5(참) -> printf("Nefus!\n") -> i++ -> i < 5(참) -> printf("Nefus!\n") -> i++ -> i < 5(참) -> printf("Nefus!\n") -> i++ -> i < 5(참) -> printf("Nefus!\n") -> i++ -> i < 5(거짓) -> 반복문 끝


1
2
3
4
5
int i;
 
for (i = 0; i < 5; i++)    {
    ~~~~
}
cs


이렇게 선언 해주면 i가 전역 변수가 되고,


1
2
3
for (int i = 0; i < 5; i++)    {
    ~~~~
}

cs


이렇게 선언 해주면 i가 지역 변수가 된다.




이 두 예제로 알 수 있듯이


전역 변수는 어디서나 쓸 수 있고

지역 변수는 같은 중괄호 안과 그보다 더 하위 중괄호 안에서 쓰일 수 있다.


하지만 어디서나 잘나가는 전역 변수보다 그 지역에서는 지역 변수가 더 쎄다는것ㅎ



for ( ; ; )

안에는 선언 및 초기화 조건식 증감식 전혀 없다.

조건이 없다는 것 = 무조건


무조건 = 무한 루프(infinite loop)



일해라 컴퓨터!를 시전했다.

아아 아름다워라~


4. while문


while문도 반복문으로 보통


선언 및 초기화


while(조건식) {

반복할 내용

증감식

}                 


이렇게 쓴다.



이 코드는 1부터 10까지 더한 수를 구하는 코드이다.

i가 10일때 while문에서 ++i;를 만나고 i가 11이 되고

 i <= 10 이라는 조건에 부합하지 않아서 while문을 탈출하고 11 line부터 실행한다.


그렇기 때문에 i는 11이 출력된다.


5. break문


break문을 기준으로 위로 올라갔을때 가장 가까운 반복문을 탈출하는 명령어이다.

for문이던 while문이던 다 빠져나온다.

(반복을 끝낸다)


-for

-while



i의 최종 값이 딱 break문과 만났을 때의 i 값과 같다.





6. continue문


continue문을 기준으로 위로 올라갔을때 가장 가까운 반복문의 다음 반복을 실행한다.

(반복을 끝내지 않는다 <- 이게 중요)

.

for문이면 증감부에 있는 식이 실행되고 조건 검사

while문이면 바로 조건 검사 단계로 뛰어 넘는다.


-for

4가 출력이 안되고 뛰어넘지만 최종 값은 변하지 않는다.

(if문 조건이 i == 5 였어도 최종 값은 6)



-while

while문과 continue를 이용해서 짝수일때 건너뛰게 했다.

그래서 홀수만 출력 되었다.




7. codeup 문제 풀이 1353 ~ 1361



1) 1353 - 삼각형 출력하기 1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int i, j, num;
 
    scanf("%d"&num);
 
    for (i = 1; i <= num; ++i)
    {
        for (j = 1; j <= i; ++j)
            printf("*");
 
        printf("\n");
    }
}
cs



num을 scanf()로 받고

i = 1, j = 1로 초기화 해준 다음

바깥 for문으로 num줄을 출력하고

안쪽 for문 조건식을 j <= i로 해서 1 ~ num까지 순차적으로 출력했다.



2) 1354 - 삼각형 출력하기 2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
 
int main()
{
    int i, j, num;
 
        scanf("%d"&num);
 
        for (i = 1; i <= num; ++i)
        {
            for (j = num; j >= i; --j)
                printf("*");
            
            printf("\n");
        }
}
cs



num을 scanf()로 받고

i = 1로 초기화를 해준 다음

바깥 for문으로 num줄을 출력하고

안쪽 for문으로 j에 num을 대입하고 i가 늘어날수록 *의 출력이 감소한다.



3) 1355 - 삼각형 출력하기 3


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int main(){
    int i, j, k, num;
 
    scanf("%d"&num);
 
    for (i = 1; i <= num; ++i) {
        for (j = 1; j < i; ++j)
            printf(" ");
 
        for (k = num; k >= i; --k)
            printf("*");
 
        printf("\n");
    }
 
    return 0;
}
cs



num을 scanf()로 받고

바깥 for문으로 num줄을 출력하고


처음 안쪽 for문으로 공백을 첫 줄에는 출력이 안 되게 하고

i가 늘어남에 따라 공백을 출력하는 반복이 늘어나게 했다.


두 번째 안쪽 for문으로 *을 num개부터 1개까지 출력하게 했다.

i가 늘어남에 따라 *을 출력하는 반복이 줄어들게 했다.



4) 1356 - 사각형 출력하기 2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
 
int main() {
    int i, j, k, l, num;
 
    scanf("%d"&num);
 
    for (i = 0; i < num; ++i)
        printf("*");
 
    printf("\n");
 
    for (j = 0; j < num - 2++j) {
        printf("*");
 
        for (k = 0; k < num - 2++k)
            printf(" ");
 
        printf("*\n");
    }
 
    for (l = 0; l < num; ++l)
        printf("*");
 
    printf("\n");
 
    return 0;
}
cs



num을 scanf()로 받고

*을 num만큼 출력하고

for문으로 num - 2 만큼 반복한다.

반복 내용 : * 출력, for문으로 num - 2 만큼 공백 출력, *\n 출력


반복문이 종료되고 다시 *을 num만큼 출력하고 \n으로 마무리 해준다.



5) 1357 - 삼각형 출력하기 4


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() {
    int i, j, num, n;
 
    scanf("%d"&num);
 
    n = num * 2 - 1;
 
    for (i = 1; i <= n; ++i) {
        if (i <= num) {
            for (j = 0; j < i; ++j)
                printf("*");
        }
        else {
            for (j = i; j <= n; ++j)
                printf("*");
        }
        printf("\n");
    }
    return 0;
}
cs



num을 scanf()로 받고

num * 2 - 1 줄을 출력해야 하니 변수 n에 담아 준다.

바깥 for문은 num * 2 - 1 줄을 출력하는 반복을 하고


1 ~ num 번째 줄까지는 if문이 참이 되어 if문 안에 있는 반복문을 실행하고


num + 1 ~ num * 2 - 1 번째 줄은 if문이 거짓이 되어

else문 안에 있는 반목문을 실행한다.



6) 1358 - 삼각형 출력하기 5


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
 
int main() {
    int i, j, num, n;
    int twice = 1;
 
    scanf("%d"&num);
 
    n = num / 2 + 1;
 
    for (i = 1; i <= n; ++i) {
        for (j = n; j > i; --j)
            printf(" ");
 
        for (j = 1; j <= twice; ++j)
            printf("*");
 
        twice += 2;
        printf("\n");
    }
    return 0;
}
cs



num을 scanf()로 받고

num / 2 + 1 줄을 출력해야 하니 변수 n에 담아 준다.

twice라는 변수는 1부터 시작해서 2씩 증가하는 변수로 쓰인다.


바깥 for문은 num / 2 + 1 줄을 출력하는 반복을 하고


처음 안쪽 for문은 공백을 출력하는데 마지막 n줄에서는 공백을 출력하지 않는다.


두 번째 안쪽 for문은 바깥 for문이 끝날 때까지 j -> j += 2 -> j += 4 -> j += 6...개의

*을 출력한다.



7) 1359 - 숫자 피라미드 1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main() {
    int i, j, num;
 
    scanf("%d"&num);
 
    for (i = 1; i <= num; ++i) {
        for (j = 1; j <= i; ++j)
            printf("%d ", j);
 
        printf("\n");
    }
    return 0;
}
cs



num을 scanf()로 받고


바깥 for문으로 num줄만큼 출력하고

안쪽 for문으로 j가 i보다 작거나 같으면 j가 1씩 증가하면서 출력이 반복된다.



8) 1360 - 숫자 피라미드 2


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
 
int main() {
    int i, j, k, num;
 
    scanf("%d"&num);
    
    k = num;
 
    for (i = 1; i <= num; ++i) {
        for (j = num; j >= i; --j)
            printf("%d ", k);
 
        --k;
        printf("\n");
    }
    return 0;
}
cs



num을 scanf()로 받고

k에 num을 대입한다. (k는 출력이 될 변수이다)


바깥 for문으로 num줄만큼 출력하고

안쪽 for문으로 i가 1 증가하면 반복 횟수가 1 줄어드는 반복문을 만들고

k를 출력한다.


그리고 바깥 for문으로 나와서 --k; 를 만나고 k는 1이 줄어든다.



9) 1361 - 별 계단 만들기


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main() {
    int i, j, num;
 
    scanf("%d"&num);
 
    for (i = 0; i < num; ++i) {
        for (j = 0; j < i; ++j)
            printf(" ");
 
        printf("**\n");
    }
    return 0;
}
cs



num을 scanf()로 받고


바깥 for문으로 num줄만큼 출력하고

안쪽 for문으로 i가 0일때(첫 반복)는 조건에 부합하지 않아서 공백을 출력하지 않고

i가 1 증가하면 공백 출력이 1개 더 많아지는 반복문이다.


그리고 바깥 for문으로 나와서 **\n을 출력한다.





---------------------------------------------------------------------------------------------

꿀팁


1. 변수명과 들여쓰기 증감식은 전위 연산자


변수명은 그 변수가 무엇을 가르키는지 알려 줄 수 있는 이름을 지어준다.

(모르면 영단어 찾아서라도)



들여쓰기는 코드의 가독성에서 많이 중요하다.

모르는게 있어서 코드를 들고 찾아갈 때 화를 입지 않게 잘 지켜주도록 하자.

망했을땐 Ctrl + k + f (Visual Studio에서만 가능) 



반복문에서의 증감식에서 전위 연산이 후위 연산보다 빠르기 때문에

전위 연산자를 쓰는 것이 나중에 긴 코드를 만들 때 가볍고 빠른 프로그램이 된다.

하지만 나는 아직도 i++이 무의식적으로 튀어나온다..

얼른 고쳐야겠다!



2. Alt + Shift + 방향키



이건 그냥 혁명 그 자체이다.

크오오오오오오오



3. 함수명 + Tab 자동 완성



이렇게 함수 이름을 치고 Tab을 누르면



가장 단순하고 기초적인 틀을 잡아준다.


1
2
3
for ( ; ; ) {
    ~~~~~
}
cs


하지만 나는 이런 모양으로 사용하기 때문에

익숙해지기 전에는 잘 쓰지 않을 것 같다.



---------------------------------------------------------------------------------------------

Linux


1. 절대경로와 상대경로


1) 절대경로


절대경로는 내가 지금 어느 디렉터리에 있던 변하지 않는 (절대적) 경로이다.

내가 어디에 위치해 있는지에 간섭 받지 않고 같은 결과가 나온다.

최상위 디렉터리에서부터 목적지까지 접근하는 것이다.

어느 파일이 어느 디렉터리에 있는지 알면 접근하기 쉬운 방법이다.



윈도우에서 실습해봤다.



여기서 보면 알 수 있듯이

내 위치가 어디던지 똑같은 위치로 이동이 가능하고

경로 앞에는 꼭 최상위 디렉터리 -> \ 가 붙어야 한다. (안 그러면 못 찾더라고요..)



2) 상대경로


상대경로는 현재 자신이 있는 디렉터리에 기준하여 움직이는 경로이다.

'현재 자신이 있는 위치'는 으로 표기한다.

'이전 디렉토리'는 .. 으로 표기한다.



이렇게 쓸 수 있고

내 위치가 C:\uesrs\uesr 이기 때문에 .\Intel\gp 라는 상대경로로 찾으면

C:\users\user 하위에 없기 때문에 찾지 못 한다.









(http://egloos.zum.com/vincero/v/876443

vi 명령어 설명 제일 간단명료)

반응형

'Programming > 빡공(Nefus)' 카테고리의 다른 글

2017.07.25(화) - 웹 과제  (0) 2017.07.25
2017.05.21(일) - 게임 프로젝트 보고서  (0) 2017.05.21
170329(수)  (0) 2017.03.29
170324(금)  (0) 2017.03.25
170320(월)  (0) 2017.03.20