본문 바로가기

C

[C언어 문법] part04 C언어의 깊은 이해

728x90

교재 : 열혈 C 프로그래밍

 

 20장 도전 프로그래밍 문제 풀어보는데 야구게임.. 재밌더라

 

 

여러분도 한 번 맞춰보세용~~

 

21장 문자와 문자열 관련 함수

1. getchar함수와 putchar함수
2. 소문자->대문자, 대문자->소문자
3. 알파벳 이외는 에러 메세지
#include <stdio.h>

int main(void){
    int ch;
    printf("문자 입력 : ");
    ch = getchar();

    if ((int)ch >= 65 && (int)ch <= 90) {  //대문자 65~90, 소문자 97~122
        ch =(int)ch + 32;
    } else if ((int)ch >= 97 && (int)ch <= 122) {
        ch = (int)ch - 32;
    }else {
        puts("뭐여~");
    }

    putchar(ch);

    return 0;
}
getchar 한 글자만 입력받음
putchar 한 글자만 출력함

 

 대문자와 소문자가 32씩 차이나는 거. 아스키 코드값을 잘 외워두면 조타~~


1. 문자열을 입력받음
2. 문자열 속의 숫자의 합 계산
#include <stdio.h>
#include <string.h>

int main(void){
    char str[50];
    int len;
    int sum = 0;
    int diff = 1 - '1';  //★★★★

    printf("문자열 입력 : ");
    fgets(str, sizeof(str), stdin);
    len = strlen(str);

    for (int i = 0; i < len; i++) {
        if ('1' <= str[i] && str[i] <= '9') { //★★★★
            sum += (str[i] + diff);   //★★★★
        }
    }

    printf("숫자의 총 합 : %d \n", sum);

    return 0;
}

 

22장~23장 구조체와 사용자 정의 자료형 

구조체 정의
종업원 이름 / 주민등록번호 / 급여 정보
#include <stdio.h>

struct employee {
    char name[20];
    char pid[20];
    int salary;
};

int main(void){
    struct employee arr[3];
    
    for (int i = 0; i < 3; i++) {
        printf("이름 : ");
        scanf_s("%s", arr[i].name, 20); //문자열은 버퍼 크기 정해주기!
        printf("주민번호 : ");
        scanf_s("%s", arr[i].pid, 20);
        printf("급여 : ");
        scanf_s("%d", &arr[i].salary);
    }

    for (int i = 0; i < 3; i++) {
        printf("이름 : %s \n", arr[i].name);
        printf("주민번호 : % s \n", arr[i].pid);
        printf("급여 : %d \n", arr[i].salary);
    }

    return 0;
}

 구조체 정의 정돈 간단~

 


두 구조체의 값 바꿔주기
#include <stdio.h>

typedef struct point {
    int xpos;
    int ypos;
}point;

void swap(point* ptr1, point* ptr2) {
    point temp = *ptr1;
    *ptr1 = *ptr2;
    *ptr2 = temp;
}

int main(void){
    point pos1 = { 2,4 };
    point pos2 = { 5,7 };

    swap(&pos1, &pos2);

    printf("[%d %d] \n", pos1.xpos, pos1.ypos);
    printf("[%d %d] \n", pos2.xpos, pos2.ypos);

    return 0;
}

 


1. 구조체 xpos, ypos
2. 구조체의 변수를 인자로 받아 직사각형의 넓이 구하는 함수
3. 네 점의 좌표 정보를 출력하는 함수
#include <stdio.h>

typedef struct point {
    int xpos;
    int ypos;
}point;

typedef struct rectangle {
    point ul;   //좌상단
    point lr;   //우하단
}rectangle;

void showArea(rectangle rec) {
    printf("넓이 : %d \n", (rec.lr.xpos - rec.ul.xpos) * (rec.lr.ypos - rec.ul.ypos));
}

void showPos(rectangle rec) {
    printf("좌 상단 : [%d, %d] \n", rec.ul.xpos, rec.ul.ypos);
    printf("좌 하단 : [%d, %d] \n", rec.ul.xpos, rec.lr.ypos);
    printf("우 상단 : [%d, %d] \n", rec.lr.xpos, rec.ul.ypos);
    printf("우 하단 : [%d, %d] \n", rec.lr.xpos, rec.lr.ypos);
}

int main(void){
    rectangle rec = { {1,1},{4,4} };
    showArea(rec);
    showPos(rec);

    return 0;
}

 

25장 메모리 관리와 메모리의 동적 할당

코드 영역 코드가 저장되는 메모리 공간
데이터 영역 전역 변수, static 변수
스택 영역 지역 변수, 매개 변수
힙 영역 프로그래머가 관리하는 공간

 

1. 최대길이 정보, 문자열 입력 받기
2. 단어를 역으로 출력
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(void){
    int maxlen;

    printf("문자열의 최대 길이 입력: ");
    scanf_s("%d", &maxlen);
    getchar(); //\n 문자의 삭제
    char* str = (char*)malloc(sizeof(char) * (maxlen + 1));

    printf("문자열 입력 : ");
    fgets(str, maxlen + 1, stdin);
    str[strlen(str) - 1] = 0;  //\n 문자의 삭제
    int len = strlen(str);

    for (int i = len; i > 0; i--) {
        if (str[i] == ' ') {
            printf("%s ", &str[i + 1]);
            str[i] = 0;
        }
    }

    printf("%s", &str[0]);
    free(str);

    return 0;
}


1. -1이 정수 입력될 때까지 계속 입력받기
2. 길이가 5인 배열을 힙에 할당
3. 배열이 꽉 찰 때마다 길이를 3씩 증가
4. 순서대로 정수 출력
#include <stdio.h>
#include <stdlib.h>

int main(void){
    int arrlen = 5;
    int idx = 0;
    int* arr = (int*)malloc(sizeof(int) * arrlen);

    while (1) {
        printf("정수 입력 : ");
        scanf_s("%d", &arr[idx]);
        if (arr[idx] == -1) break;

        if (arrlen == idx + 1) {
            arrlen += 3;
            arr = (int*)realloc(arr, sizeof(int) * arrlen);  //★★★★★
        }
        idx++;
    }

    for (int i = 0; i < idx; i++) printf("%d ", arr[i]);
    free(arr);

    return 0;
}

 

 중요포인트!!!!

1. realloc 사용법 및 메모리 상태

arr = (int*)realloc(arr, sizeof(int) * arrlen);

 - 전

 

- 후


뭔가 빠진게 있어보이지 않는가? 잘 모르겠다면 위의 내용을 유심히 살펴보아라...

 

.

.

.

.

 

 

 맞다 24장 파일 입출력이 빠져있다!!!!! 지금 시험 공부가 산더미라서.. 다음에 시간나면.. 아니 난 평생 안 볼 거다.

아디오스!!