본문 바로가기
C/☞

[55]-A. 가변 배열 컨트롤러

by TR. 2020. 7. 27.

Ver1.

    int *p = 0;
    int cnt = 0;

    while(1){
        printf("-- CONTROLLER --\n");
        printf("(cnt : %d)\n", cnt);
        for(int i=0; i<cnt; i++){
            printf("%d ", p[i]);
        }
        printf("\n");
        printf("----------------\n");
        printf("1) 추가\n2) 삭제\n3) 삽입\n4) 종료\n");
        printf("----------------\n");
        int sel;
        scanf("%d", &sel);

        if(sel == 1){
            if(cnt == 0){
                p = new int[1];
            } else {
                int *temp = p;
                p = new int[cnt+1];
                for(int i=0; i<cnt+1; i++){
                    p[i] = temp[i];
                }
            }
            printf("추가하는 숫자 입력 : ");
            int data;
            scanf("%d", &data);
            p[cnt] = data;
            cnt += 1;
        }
        else if(sel == 2){
            if(cnt != 0){
                int del_idx = -1;
                int data;
                printf("삭제할 값 입력 : ");
                scanf("%d", &data);

                // check del_idx
                for(int i=0; i<cnt; i++){
                    if(data == p[i]){
                        del_idx = i;
                    }
                }
                if(del_idx != -1){
                    int *temp = p;
                    p = new int[cnt-1];

                    int j = 0;
                    for(int i=0; i<cnt; i++){
                        if(i != del_idx){
                        p[j] = temp[i];
                        j += 1;
                        }
                    }
                    cnt -= 1;
                } else { printf("존재하지 않는 값입니다.\n"); }
            }
        }
        else if(sel == 3){
            printf("삽입할 인덱스 입력 : ");
            int insert_idx;
            scanf("%d", &insert_idx);
            if(insert_idx < cnt){
                printf("추가할 값 입력 : ");
                int data;
                scanf("%d", &data);

                int *temp = p;
                p = new int[cnt +1];
                for(int i=0; i<cnt+1; i++){
                    if(i < insert_idx){
                        p[i] = temp[i];
                    }
                    else if(i > insert_idx){
                        p[i] = temp[i-1];
                    }
                    p[insert_idx] = data;
                }
                cnt += 1;
            } else { printf("존재하지 않는 인덱스입니다.\n"); }
        }
        else if(sel == 4){
            printf("종료합니다.\n");
            break;
        }

    }

Ver2.
1차원 배열 컨트롤러

//# include <windows.h>
# include <stdio.h>

void print_arr(int* arr, int size){
    printf("total : %d\n", size);
    for(int i=0; i<size; i++){
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void add_data(int** arr, int *size){
    int data;
    printf("data : ");
    scanf("%d", &data);

    int* temp = NULL;
    if((*size) > 0){
        printf("enter\n");
        temp = *arr;
        *arr = new int[(*size) +1];
        for(int i=0; i<(*size); i++){
            (*arr)[i] = temp[i];
            printf("arr[i] : %d\n", (*arr)[i]);
        }
        (*arr)[(*size)] = data; //
    } else{

    }
    printf("**arr : %d\n", **arr);
    (*size) ++;
}

void run(int **arr, int *size)
{
    printf("[1]add\n[2]delete\n[3]insert\nselect : ");

    int sel;
    scanf("%d", &sel);

    if (sel == 1)
    {
        add_data(arr, size);
    }
}

int main(){
    // Vector Controller

    int size = 10;
    int* datas = new int[size];

    for(int i=0; i<size; i++){
        datas[i] = i+1;
    }

    while(true){
        print_arr(datas, size);
        run(&datas, &size);
    }
    





    return 0;
}

Ver2. 
2차원 배열 컨트롤러

#include <stdio.h>
#include <stdlib.h>

void print_arr(int *size, int ***arr)
{
    printf("total : %d\n", *size);
    if (*size != 0)
    {
        for (int i = 0; i < *size; i++)
        {
            printf("{%d:", (*arr)[i][0]);
            printf("%d} ", (*arr)[i][1]);
        }
        printf("\n");
    }
}

void cat_itoa(int **arr, int data)
{
    int digit = 0;
    while (data % 10 > 0)
    {
        int *temp = *arr;
        *arr = new int[digit + 1 + 1];
        for (int j = 0; j < digit + 1; j++)
        {
            (*arr)[j + 1] = temp[j];
        }
        (*arr)[0] = data % 10;
        data /= 10;
        digit++;
        delete[] temp;
    }
}

int par_atoi(int** arr){
    int idx = 0;
    int digit = 0;
    for(int i=0; (*arr)[i] != '\0'; i++){
        digit ++;
    }
    // printf("digit : %d\n", digit);
    for(int i=1; i<digit; i++){
        idx += (*arr)[i] * (digit - i - 1 -1 == 0 ? 1 : pow(10, digit - i - 1 -1));
    }
    // printf("del_idx : %d\n", idx);
    return idx;
}

    int *check(int id, int pw, int *size, int ***arr)
{
    int *result = new int[1];
    result[0] = 'f';

    for (int i = 0; i < *size; i++)
    {
        if ((*arr)[i][0] == id)
        {
            result[0] = 't';
            if ((*arr)[i][1] == pw)
            {
                cat_itoa(&result, i);
            }
        }
    }
    return result;
}

void join(int *size, int ***arr)
{
    int id, pw;
    printf("id & pw 입력: \n");
    scanf("%d", &id);
    scanf("%d", &pw);

    int *find = check(id, pw, size, arr);
    if (find[0] == 'f')
    {
        if (*size == 0)
        {
            *arr = new int *[1];
            (*arr)[0] = new int[2];
        }
        else
        {
            // 기존 데이터를 지켜줄 temp 배열이 필요
            int **temp = *arr;
            *arr = new int *[(*size) + 1];
            for (int i = 0; i < (*size) + 1; i++)
            {
                (*arr)[i] = new int[2];
                if (i != *size)
                {
                    (*arr)[i][0] = temp[i][0];
                    (*arr)[i][1] = temp[i][1];
                    delete[] temp[i];
                }
            }
            delete[] temp;
        }
        (*arr)[*size][0] = id;
        (*arr)[*size][1] = pw;
        (*size)++;
    }
    else
    {
        printf("이미 가입한 회원입니다.\n");
    }
}

void leave(int *size, int ***arr)
{
    int id, pw;
    printf("탈퇴할 id & pw 입력:\n");
    scanf("%d", &id);
    scanf("%d", &pw);

    int *find = check(id, pw, size, arr);

    if(find[0] == 't'){
        int del_idx = par_atoi(&find);
        int** temp = *arr;

        int arr_idx = 0;
        *arr = new int*[(*size)-1];
        for(int i=0; i<*size; i++){
            if(i != del_idx){
                (*arr)[arr_idx] = new int[2];
                (*arr)[arr_idx][0] = temp[i][0];
                (*arr)[arr_idx][1] = temp[i][1];
                arr_idx ++;
            }
            delete temp[i];
        }
        (*size)--;
        delete[] temp;
    } else{
        printf("존재하지 않는 회원입니다.\n");
    }
}

void run(int *size, int ***arr)
{
    int run = 1;
    while (run)
    {
        print_arr(size, arr);

        int sel;
        printf("1)가입\n2)탈퇴\n");
        scanf("%d", &sel);

        if (sel == 1)
        {
            join(size, arr);
        }
        else if (sel == 2)
        {
            leave(size, arr);
        }
        else
        {
            continue;
        }
    }
}

int main()
{
    // 회원가입 -> {{1,1},{2,2},...}
    // 1. 가입
    // 2. 탈퇴

    int cnt = 0;
    int **member; // 2차원 배열로 동적할당 (가변)

    run(&cnt, &member);

    return 0;
}

*  itoa & atoi 함수 구현

'C > ' 카테고리의 다른 글

[57] 연습문제 : 더블 포인터  (0) 2020.07.27
[56] 더블 포인터  (0) 2020.07.27
[55] 가변 배열 컨트롤러  (0) 2020.07.27
[54] 동적할당 기본  (0) 2020.07.27
[52] 문자열 함수  (0) 2020.07.27

댓글