Post

c 공부 2024.04.03

아스키코드

아스키코드는 컴퓨터에서 문자를 나타내기 위한 표준 인코딩 방식 중 하나.

예를 들어, 키보드에서 ‘9’를 입력하면 컴퓨터는 해당 문자에 대응하는 아스키코드 값인 0x39를 처리. ‘0x’는 16진수를 나타내는 접두사임.

이제 0x39를 2진수로 변환해보기:

1
0x39 = 0011 1001

위의 예시에서와 같이 각 자릿수를 2진수로 변환하여 나타낸다. 이때, 각 자릿수는 4비트로 표현됨.

또한, 아스키코드는 대소문자 간의 관계도 표현할 수 있다. 예를 들어, 대문자 ‘G’를 소문자로 변환하려면 아스키코드 값에 32를 더해주면 된다.

아래는 주어진 코드의 설명과 함께 마크다운으로 작성된 코드:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main()
{
    char small, cap = 'G'; // 소문자와 대문자를 담을 변수 선언, 대문자 변수에 'G'를 할당
    
    // 대문자인지 확인하는 조건문 시작
    if ((cap >= 'A') && (cap <= 'Z')) {
        small = cap + ('a' - 'A'); // 대문자를 소문자로 변환하여 소문자 변수에 할당
    }
    
    printf("대문자 : %c %c", cap, '\n'); // 대문자 출력
    printf("소문자 : %c", small); // 소문자 출력
    
    return 0;
}

위의 코드를 실행하면 대문자 ‘G’와 이에 해당하는 소문자가 출력됨.

scanf

scanf는 입력문자를 1바이트 공간에 저장됨. 그래서 int변수 사용하면 나머지 3바이트에 잇는 쓰레기 값으로 인해서 문자의 아스키 코드 값을 바로 사용이 불가능하게 됨

getchar & putchar

getchar() 함수와 putchar() 함수는 C 언어에서 표준 입력(stdin)에서 문자를 읽고 표준 출력(stdout)에 문자를 출력하는 데 사용됨.

  1. getchar():
    • getchar() 함수는 표준 입력(stdin)에서 한 문자를 읽어와서 반환함.
    • 반환된 값은 읽은 문자의 ASCII 코드 값.
    • EOF(End of File)를 만나면 파일의 끝을 나타내는 -1을 반환.

예시:

1
2
char ch;
ch = getchar(); // 표준 입력에서 문자를 읽어와 변수 ch에 저장
  1. putchar():
    • putchar() 함수는 표준 출력(stdout)에 한 문자를 출력.
    • 함수의 인자로 출력할 문자의 ASCII 코드 값을 전달.
    • 출력이 성공하면 출력된 문자를 반환하고, 실패하면 EOF를 반환.

예시:

1
2
char ch = 'A';
putchar(ch); // 표준 출력에 변수 ch에 저장된 문자 'A'를 출력

이러한 함수들은 특히 프로그램에서 문자 단위로 입력을 받거나 출력을 할 때 유용하게 사용.

현역에선 scanf보다 get ,put을 많이 씀 get char1

get char2

  1. 확인문제
    get char3
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main()
{
    int ch;
    printf("문자 입력 : ");
    ch = getchar(); // 사용자로부터 문자를 입력받아 ASCII 값으로 ch에 저장
    printf("%c문자의 아스키 코드 값 : %d\n", ch,ch); // ch에 저장된 ASCII 값을 정수 형태로 출력
    return 0;
}

버퍼

scan이나 getchar은 키보드로부터 데이터 입력할때 버퍼를 거쳐 입력함. 따라서 버퍼를 알아야 제대로 이해가능

stack & heap

택 메모리와 힙 메모리의 주요 차이점은 :

  1. 스택은 선형 데이터 구조이지만, 힙은 계층 구조를 가진다.

  2. 스택 메모리는 결코 조각화되지 않는 반면, 힙 메모리는 메모리 블록이 먼저 할당된 다음 해제됨에 따라 조각화될 수 있다.

  3. 스택은 지역 변수에만 액세스하는 반면 힙은 변수에 전역적으로 액세스할 수 있다.

  4. 스택 변수는 크기를 조정할 수 없지만 힙 변수는 크기를 조정할 수 있다.

  5. 스택 메모리는 연속된 블록에 할당되는 반면 힙 메모리는 임의의 순서로 할당.
    스택에서는 변수 할당 해제가 필요하지 않지만 힙에서는 할당 해제가 필요.

  6. 스택 할당 및 할당 해제는 컴파일러 명령에 의해 수행되는 반면 힙 할당 및 할당 해제는 프로그래머에 의해 수행.
    스택과 힙 메모리 -차이점

스택 힙

스택 힙2

문자열과 포인터

문자는 a, p,p, l, e 이렇게 나눠지지만 숫자는 한 공간에 0 에서 255 중 숫자 하나가 들어갈 수 있다.

문자열은 배열구조를 저렇게 가짐

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h> // 프로그램이 작동하기 위한 기본 도구들을 가져옴.

int main() // 모든 프로그램은 main이라는 곳에서 시작.
{
    // "apple" 단어가 컴퓨터 메모리의 어디에 시작되는지 보여줌.
    printf("apple이 저장된 시작 주소 값 : %p\n", "apple");
    
    // "apple" 단어의 두 번째 글자가 어디에 있는지 주소를 보여줌.
    printf("두 번째 문자의 주소 값 : %p\n", "apple" + 1);
    
    // "apple" 단어의 첫 번째 글자를 보여줌.
    printf("첫 번째 문자 : %c\n", *"apple");
    
    // "apple" 단어의 두 번째 글자를 보여줌.
    printf("두 번째 문자 : %c\n", *("apple" + 1));
    
    // "apple" 단어의 세 번째 글자를 배열처럼 접근해서 보여줌.
    printf("배열로 표현한 세 번째 문자 : %c\n", "apple"[2]);
    
    return 0;
}
  1. %c:
    • %c는 문자(character)를 출력할 때 사용.
    • printf() 함수에서 %c를 사용하면 문자의 ASCII 코드 값에 해당하는 문자가 출력됨.
    • 예를 들어, printf("%c", 'A');는 문자 ‘A’를 출력.
  2. %p:
    • %p는 포인터(pointer)를 출력할 때 사용.
    • printf() 함수에서 %p를 사용하면 포인터 변수의 주소를 출력.
    • 주소는 일반적으로 16진수로 표시.
    • 예를 들어, int *ptr = NULL; printf("%p", (void *)ptr);는 포인터 변수 ptr의 주소를 출력.
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>

int main(void)
{
    char *dessert = "apple"; // dessert 변수를 선언하고 "apple" 문자열의 주소를 할당합니다.
    printf("오늘 후식은 %s입니다.\n", dessert); // dessert 변수에 저장된 문자열을 출력합니다.
    dessert = "banana"; // dessert 변수에 "banana" 문자열의 주소를 재할당합니다.
    printf("내일 후식은 %s입니다.\n", dessert); // dessert 변수에 저장된 문자열을 출력합니다.
    return 0;
}

puts, fputs 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>

int main(void)
{
    char str[80] = "apple juice"; // 문자열을 담을 수 있는 길이가 80인 배열 str을 선언하고 "apple juice"로 초기화합니다.
    char *ps = "banana"; // 문자열 "banana"의 첫 번째 문자에 대한 포인터를 선언하고 초기화합니다.
    
    puts(str); // str 배열에 저장된 문자열을 출력합니다.
    fputs(ps, stdout); // ps 포인터가 가리키는 문자열을 stdout에 출력합니다.
    puts("milk"); // "milk" 문자열을 출력합니다.
    return 0;
}

put() 함수와 fputs() 함수는 모두 문자열을 표준 출력에 출력하는 함수. 그러나 두 함수에는 몇 가지 차이점이 있다.

  1. put() 함수:
    • put() 함수는 하나의 문자(character)를 표준 출력에 출력.
    • 개행 문자(‘\n’)를 자동으로 출력하지 않는다.
    • 반환 값은 출력된 문자의 ASCII 코드 값이며, 성공하면 출력된 문자를 반환하고 실패하면 EOF(-1)를 반환.

예시:

1
2
char ch = 'A';
put(ch); // 'A'를 출력
  1. fputs() 함수:
    • fputs() 함수는 문자열을 표준 출력에 출력.
    • 개행 문자(‘\n’)를 자동으로 출력하지 않는다.
    • 반환 값은 성공하면 음수가 아닌 값을, 실패하면 EOF(-1)를 반환.

예시:

1
2
3
char *str = "Hello, world!";
fputs(str, stdout); // "Hello, world!"를 출력

따라서 put() 함수는 문자 하나를 출력하는 데 사용되고, fputs() 함수는 문자열을 출력하는 데 사용된다.

정보처리기사 문제

c언어

  1. 문제
    정처기문제1
1
2
3
4
5
6
7
8
9
#include <stdio.h>int main()
{
    int n = 0, t = 0; // 변수 n과 t를 선언하고 초기값을 0으로 설정합니다.
    do { // do-while 루프 시작
        t += n; // t에 n 값을 더합니다.
        printf("%d, %d\n", n++, t); // n과 t를 출력하고, n을 증가시킵니다.
    } while (n < 10); // n이 10보다 작은 동안 루프를 반복합니다.
    return 0;
}
  1. 문제
    정처기문제2

일단 사용시간은 대기시간 전까지 더하고 거기에서 대기시간을 빼주면 답이 나온다

정리 :
도착시간은 일단 손님이 온 시간 처음 손님이 들어가고 나서, 그리고 cpu사용시간은 그 전에 손님들이 밥을 먹은 시간인데 거기서 내가 도착한 시간만 빼면 대기시간이다 그리고 대기시간을 더한사람에 모든 손님의 수로 나눠주면 평균이 나온다.

java언어

정처기문제3

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 'Connection' 클래스는 컴퓨터가 전화 연결하는 것처럼, 하나의 연결만 가지고 있어요.
class Connection {
    // 여기서 '_inst'는 우리가 만든 유일한 연결을 저장해요. 'null'은 아직 연결이 없다는 거에요.
    private static Connection _inst = null;
    
    // 'count'는 몇 번 연결했는지 세는 카운터예요.
    private int count = 0;
    
    // 'get'은 연결을 얻는 방법이에요. 만약 연결이 없으면 새로 만들고, 이미 있으면 그거를 줘요.
    public static Connection get() {
        if (_inst == null) {
            _inst = new Connection();
        }
        return _inst;
    }

    // 'count' 메소드는 연결했다는 걸 세는 거에요. 버튼 누르는 것처럼요.
    public void count() { count++; }
    
    // 'getCount'는 지금까지 몇 번 연결했는지 알려주는 메소드예요.
    public int getCount() { return count; }
}

// 'Main' 클래스는 프로그램이 시작하는 곳이에요.
public class Main {
    public static void main(String[] args) {
        // 여기서 'conn1'은 연결을 하나 얻어요.
        Connection conn1 = Connection.get();
        // 그리고 연결했다고 세요.
        conn1.count();
        
        // 'conn2'도 같은 연결을 얻어요, 모두 같은 연결이기 때문이에요.
        Connection conn2 = Connection.get();
        // 이것도 연결했다고 세요.
        conn2.count();
        
        // 'conn3'도 똑같아요.
        Connection conn3 = Connection.get();
        // 연결했다고 세요.
        conn3.count();
        
        // 마지막으로 'conn1.getCount()'는 우리가 몇 번 연결했는지 화면에 보여줘요.
        // 여기서는 '3'이라는 숫자가 나올 거예요, 왜냐하면 세 번 세었으니까요.
        System.out.print(conn1.getCount()); // 이건 '3'을 화면에 출력해요.
    }
}
This post is licensed under CC BY 4.0 by the author.