donchanee

동적할당에 대한 4문제 본문

프로그래밍/C언어

동적할당에 대한 4문제

donchanee 2018. 12. 7. 13:35
728x90


#include <stdio.h>

#include <string.h>

#include <stdlib.h>


void compareString(char p[], char q[]);


int main() {

    

    char *p=NULL, *q=NULL;

    

    p = (char *)malloc(50*sizeof(char)); // 문자열 1번 동적할당 받는다.

    if(p==NULL) return -1;

    q = (char *)malloc(50*sizeof(char)); // 문자열 2번 동적할당 받는다.

    if(q==NULL) return -1;

    

    gets(p);

    gets(q); // 공백을 포함하는 문자열을 입력받는다.

    

    compareString(p, q); // 두 문자열을 비교하는 함수, 출력값대로 출력한다.

    

    free(p);

    free(q); // 동적할당된 메모리를 해제해준다.

    

    return 0;

}


void compareString(char p[], char q[]) {

    

    if(strcmp(p, q) == 0) {

        printf("identical"); // 두 문자열이 같으면 identical 출력

    }

    else

        printf("different"); // 아니라면 different 출력

}




#include <stdio.h>

#include <string.h>

#include <stdlib.h>


typedef struct st {

    char *str;

    int cnt;

}stu; // 문제에 나온대로 구조체 선언한다.


int main() {

    

    int N, i, j, count;

    unsigned long leng;

    char **p=NULL;

    stu *q, tmp;

    

    scanf("%d" , &N);

    

    p = (char **)malloc(N*sizeof(char *)); // 문자열 배열을 동적할당 받는다.

    if ( p==NULL )

        return -1;

    for(i=0; i<N; i++) {

        p[i] = (char *)malloc(101*sizeof(char)); // 문자열 배열의 배열부분 동적할당

        if(p==NULL)

            return -1;

    }

    

    q = (stu *)malloc(N*sizeof(stu)); // 구조체를 동적할당 받는다.

    

    for(i=0;i<N;i++) {

        scanf("%s", p[i]);

        q[i].str = p[i]; // 구조체의 문자열 포인터에 문자열을 연결시킨다.

        leng = strlen(p[i]);

        count = 0; // 자음의 개수를 셀 변수이다.

        for(j=0; j<leng; j++) {

            if(!(p[i][j] == 'a' || p[i][j] == 'e' || p[i][j] == 'i' || p[i][j] == 'o' || p[i][j] == 'u' ||

                 p[i][j] == 'A' || p[i][j] == 'E' || p[i][j] == 'I' || p[i][j] == 'O' || p[i][j] == 'U')) {

                count++; // 문자가 모음이 아닐 시, 카운트를 증가시킨다.

            }

        }

        q[i].cnt = count; // 자음의 개수를 각각의 구조체 숫자에 대입시킨다.

    }

    

    for(i=N-1;i>0;i--) { // 버블정렬을 사용해야 검사하지 않는 문자열이 없다.

        for(j=0;j<i;j++) { // 선택정렬을 사용하면 검사하지 않는 빈공간이 생긴다.

            if(q[j].cnt < q[j+1].cnt) { // 검사하려는 문자열 바로 뒤의 문자열과 비교.

                tmp = q[j];

                q[j] = q[j+1];

                q[j+1] = tmp;

            }

        }

    }

    

    for(i=0; i<N; i++) {

        printf("%s\n", q[i].str); // 출력한다.

    }

    

    for(i=0;i<N;i++) {

        free(p[i]); // 동적할당 해제한다.

    }

    free(p);

    free(q); // 마찬가지로 동적할당을 해제해준다.

    

    return 0;

}




#include <stdio.h>

#include <string.h>

#include <stdlib.h>


int main() {

    

    int N, M, **p, i, j, cnt=0, avg;

    

    scanf("%d %d", &N, &M); // 행과 열을 입력받음.

    

    p = (int **)malloc(N*sizeof(int *)); // 동적할당 받는다.

    if(p==NULL) return -1;

    for(i=0;i<N;i++) {

        p[i] = (int *)malloc(M*sizeof(int)); // 이차원 배열 동적할당.

        if(p[i]==NULL) return -1;

    }

    

    for(i=0;i<N;i++) {

        for(j=0;j<M;j++) {

            scanf("%d", &p[i][j]); // 입력받는다.

            cnt += p[i][j]; // 평균을 바로 구하기 위해 입력받을 때마다 더해놓는다.

        }

    }

    avg = cnt / (N*M); // 정수연산으로 평균을 구한다.

    

    for(i=0;i<N;i++) {

        for(j=0;j<M;j++) {

            if(p[i][j] < avg)

                p[i][j] = 0; // 평균보다 작으면 0으로 바꾸고

            printf("%d ", p[i][j]); // 출력한다.

        }

        printf("\n"); // 행이 바뀔때 개행한다.

    }

    

    for(i=0;i<N;i++) {

        free(p[i]); // 동적할당 해제한다.

    }

    free(p);

    

    return 0;

}



#include <stdio.h>

#include <string.h>

#include <stdlib.h>


int createMatrix (int ***p ,int N); // 2차원 배열 생성함수 부분

void freeMatrix (int **p, int N); // 2차원 배열 동적할당 해제 부분


int main() {

    

    int N, **p=NULL, **q=NULL, **r=NULL, i, j, o;

    

    scanf("%d", &N);

    createMatrix(&p, N);

    createMatrix(&q, N);

    createMatrix(&r, N); // 행렬의 곱 결과값을 저장할 배열을 생성한다.

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            scanf("%d", &p[i][j]); // 첫번째 이차원 배열 입력받는다.

        }

    }

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            scanf("%d", &q[i][j]); // 두번째 이차원 배열 입력받는다.

        }

    }

    

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            for(o=0;o<N;o++) {

                r[i][j] += p[i][o] * q[o][j]; // 행렬의 곱을 구한다.

            }

        }

    }

    

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            printf("%d ", r[i][j]); // 행렬의 곱을 출력한다.

        }

        printf("\n");

    }

    

    freeMatrix(p, N);

    freeMatrix(q, N);

    freeMatrix(r, N); // 동적할당을 해제한다.

    

    return 0;

}


int createMatrix (int ***p ,int N) {

    

    int i;

    

    *p = (int **) malloc(N * sizeof(int *)); // 삼중 포인터를 사용하여 함수를 만들었다.

    if(p==NULL) return -1;

    for(i=0;i<N;i++) {

        (*p)[i] = (int *) malloc(N * sizeof(int)); // 이차원 배열을 동적할당 받고 있다.

        if((*p)[i] == NULL) return -1;

    }

    

    return 0;

}


void freeMatrix (int **p, int N) { // 동적할당을 해제하는 함수

    

    int i;

    

    for(i=0;i<N;i++) {

        free(p[i]);

    }

    free(p);

}




#include <stdio.h>

#include <string.h>

#include <stdlib.h>


int createMatrix (int ***p ,int N);

void freeMatrix (int **p, int N); // 4-2에서 사용한 것과 같음.


int main() {

    

    int N, **p=NULL, **q=NULL, **r=NULL, i, j, o;

    

    scanf("%d", &N);

    createMatrix(&p, N);

    createMatrix(&q, N);

    createMatrix(&r, N); // 역시나 4-2와 같음.

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            scanf("%d", &p[i][j]); // 입력부분

        }

    }

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            scanf("%d", &q[i][j]); // 입력부분

        }

    }

    

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            for(o=0;o<N;o++) {

                r[i][j] += p[i][o] * q[o][j]; // 행렬의 곱 연산

            }

        }

    }

    

    

    o=0; // o 인자에 최종결과값을 저장하기 위해 초기화시킨다.

    

    for(i=0;i<N;i++) {

        printf("%d ", r[i][i]); // 왼쪽부터 오른쪽 대각선을 출력하고

        o += r[i][i]; // 즉시 최종결과값을 위해 더해놓는다.

    }

    printf("\n");

    for(i=0;i<N;i++) {

        j=N-i-1; // 오른쪽부터 왼쪽 대각선을 출력하기 위해 j값을 정하고,

        printf("%d ", r[i][j]); // 출력하고,

        o -= r[i][j]; // 최종결과값을 위해 빼준다.

    }

    printf("\n");

    if(o>0)

        printf("%d", o); // 최종결과값이 양수라면 그대로 출력

    else

        printf("%d", -o); // 음수라면 부호를 바꿔서 출력한다.

    

    freeMatrix(p, N);

    freeMatrix(q, N);

    freeMatrix(r, N); // 동적할당 해제

    

    return 0;

}


int createMatrix (int ***p ,int N) { // 4-2에서 사용한 함수와 같은 2차원 배열 생성함수

    

    int i, j;

    

    *p = (int **) malloc(N * sizeof(int *));

    if(p==NULL) return -1;

    for(i=0;i<N;i++) {

        (*p)[i] = (int *) malloc(N * sizeof(int));

        if((*p)[i] == NULL) return -1;

    }

    

    for(i=0;i<N;i++) {

        for(j=0;j<N;j++) {

            (*p)[i][j] = 0;

        }

    }

    

    return 0;

}


void freeMatrix (int **p, int N) { // 동적할당 해제 함수

    

    int i;

    

    for(i=0;i<N;i++) {

        free(p[i]);

    }

    free(p);

}



'프로그래밍 > C언어' 카테고리의 다른 글

합병정렬에 대한 문제.  (0) 2018.12.07
구조체에 대한 5문제  (0) 2018.12.07
문자열에 대한 3문제  (0) 2018.12.07
포인터에 대한 4문제  (0) 2018.10.02
배열 문제 #7.  (0) 2018.05.22