728x90

문제1)가로의 길이가 9, 세로의 길이가 3인 int형 2차원 배열을 선언하여 구구단 중 2단,3단, 4단을 다음과 같이 저장하자.

  1열 2열 3열 4열 5열 6열 7열 8열 9열
1행 2 4 6 8 10 12 14 16 18
2행 3 6 9 12 15 18 21 24 27
3행 4 8 12 16 20 24 28 32 36

그리고 제대로 저장이 되었는지 확인하기 위한 출력을 진행하는 예제를 작성해보자

#include <stdio.h>
int main(void){
    int arr[3][9]={{2,4,6,8,10,12,14,16,18},
                   {3,6,9,12,15,18,21,24,27},
                   {4,8,12,16,20,24,28,32,36}
                   };
    for(int i=0;i<3;i++){
        for(int j=0;j<9;j++){
            printf("%d ", arr[i][j] );
        }
        printf("\n");
    }

}

2차원 배열의 형태를 기억하는게 중요할 것 같다. 앞은 줄 갯수 뒤에가 안에 있는 숫자의 개수라는것을....

이것을 처음에 헷갈려서 반대로 쓰고 있었다. 그대ㅗㄹ 입력하는 것이라서 크게 어렵지 않는 것 같다.

 

 


문제2) 아래그림과 관련하여 문제를 제시할테니 그림에서 제시하는 배열 A와 배열 B를 유심히 관찰하자

1 2 3 4
5 6 7 8
1 5
2 6
3 7
4 8

 

위에 것이 배열A이고 아래것이 배열 B

#include <stdio.h>
int main(void){
    int arr1[2][4]={{1,2,3,4},
                    {5,6,7,8}
                    };
    int arr2[4][2];
    for(int i=0;i<4;i++){
        for(int j=0;j<2;j++){
            arr2[i][j]=arr1[j][i];
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<2;j++){
            printf("%d ", arr2[i][j]);
        }
        printf("\n");
    }
}

이것도 배열을 안다면 크게 어렵지 않다. 배열A는 배열 입력해주면 되고 B만 초기화 단계에서 해결하기 어렵다. 배열A를 이용해서 하라고 했다. 그래서 for문으로 각각의 과정을 넣어주었고 이 표들을 보니 서로 반대로 숫자가 되어있다는 것을 발견하였다. i,j라면 j,i형태로 되어있었다. 그래서 arr2에서 i,j배열일떼 arr1은 j,i배열이라고 선언해주었다.

출력과정은 arr2 입력넣을 때랑 같고, 똑같이 만들기 위해 줄바꾸는 것을 잊지 않는 것이 좋을 것 같다.

 

 


문제3) 성적 관리 프로그램을 작성하자. 과목은 국어, 영어, 수학, 국사 이렇게 네과목이고 학생은 철희, 철후,영희, 영수 이렇게 네사람이다. 프로그램 사용자로부터 이 네사람의 네과목 점수를 입력 받는 다 .그리고 미리 선언해 놓은 배열에 다음의 형태로 그 값을 저장해야 한다. 저장이 끝났다면, 개인별 총점과 과목별 총점을 계산해서 다음그림에서 보이는 배열의 위치에 저장해야 한다. 그리고 마지막에는 저장된 값의 검증을 위한 출력을 보여야한다.

  국어 영어 수학 국사 총점
철희 5 4 6 5 20
철수 3 9 6 3 21
영희 4 8 2 7 21
영수 3 8 9 7 27
과목별 총점 15 26 26 22 89
#include <stdio.h>
int main(void){
    int arr[5][5]={0};
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            scanf("%d", &arr[i][j]);
        }
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            arr[i][4]+=arr[i][j];
            
        }//세로
    }
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            arr[4][j]+=arr[i][j];
        }
    }//가로
    for(int i=0;i<4;i++){
        printf("%d\n", arr[4][4]);
        arr[4][4]+=arr[i][4];
    }//이건 마지막자리
    for(int i=0;i<5;i++){
        for(int j=0;j<5;j++){
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }

}

이 문제는 그렇게 어렵지 않은데 최종 부분이 안풀려서 한참을 헤멨던 문제였다. 그 이유를 반복해서 알아본 결과 초기화의 문제라고 보았고 시작에서 선언 시 0으로 초기화를 하고 값을 넣어주었다. 그리고 선언해준 것보다 하나 적게 해서 마지막 칸에 넣어주어야 한다. for문 마지막 것을 안에 넣을 수도 있을 것 같은데 일단 바깥으로 뺐다. 빼서 그 자리를 마지막 칸에 숫자를 넣을 수 있도록 만들었다. 가로 세로는 똑같은 원리이므로 문제는 없다.

여기서 얻은 교훈은 초기화를 잘하자!!

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈C 문제풀이 24  (0) 2021.08.12
[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12
[C] 열혈C 문제풀이 13-1 1번,3번  (0) 2021.08.12
[C]열혈C 문제풀이 12-1 2번  (0) 2021.08.12
728x90

문제1) 변수 num에 저장된 값의 제곱을 계산하는 함수를 정의하고, 이를 호출하는 main함수를 작성해보자. 단, 여기서는 다음 두가지 형태로 함수를 정의해야한다.

* Call-by-value 기반의 SquareByValue 함수

* Call-by-reference 기반의 SquareByReference함수

 

SquareByValue함수는 인자로 전달된 갑의 제곱을 반환해야하며, SquareByReference 함수는 정수가 저장되어있는 변수의 주소값을 인자로 받아서 해당 변수에 저장된 값의 제곱을 그 변수에 다시 저장해야 한다.

#include <stdio.h>
void number(int num1){
    printf("%d", num1*num1);
}
int main(void){
    int num;
    scanf("%d", &num);
    number(num);
    return 0;
}
#include <stdio.h>
void number(int *num1){
    printf("%d", *num1 * *num1 );
}
int main(void){
    int num;
    scanf("%d", &num);
    number(&num);
    return 0;
}

음. 이건 내가 하는 방식이 맞는지는 잘 모르겠다. 첫번째 것은 호출하는데 단순히 number()형태로 호출하는 방식을 구현하였고 두번째는 포인터를 써보았다. 처음엔 main에서 출력할 수 있도록 하려했는데 잘안돼서 그냥 함수에서 출력을 넣어버리기. *가 많이 들어가니 이상해 보인다. 위에거랑 다른점은 함수 호출할 때 부르는게 다르다는 것? 첫번째것은 그냥 변수를 호출한다고 하면 아래 것은 주소값을 넘기는 것이라고 볼 수 있다.

 


문제2) 세 변수에 저장된 값을 서로 뒤바꾸는 함수를 정의해보자. 예를 들어서 함수의 이름이 Swap3라 하면 다음의 형태로 함수가 호출되어야 한다.

Swap3(&num1, &num2, &num3);

그리고 함수호출의 결과로 num1에 저장된 값은 num2에, num2에 저장된 값은 num3에, 그리고 num3에 저장된 값은 num1에 저장되어야 한다.

#include <stdio.h>
int temp;
void Swap3(int *num11, int *num12, int *num13){
    temp=*num13;
    *num13=*num12;
    *num12=*num11;
    *num11=temp;
}
int main(void){
    int num1, num2, num3;
    scanf("%d %d %d", &num1, &num2, &num3);
    Swap3(&num1, &num2, &num3);
    printf("%d %d %d", num1, num2, num3);
}

위에 것을 연습했고 이 단원을 제대로 봤다면 비슷한 문제이기에 캐치하기 쉬운 것 같다. temp를 이용해서 하는 것은 익숙하고 이를 함수안에 넣어주는 것, 그리고 포인터 변수를 이용한다는 것이 핵심인 것 같다. 함수 호출 방식이 &변수 였기 때문이다. 이외에는 입력받고 return없이 main에서 바로 숫자를 호출하면 제대로 나온다는 것만 확인을 하면 될 것 같다.

 

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 13-1 1번,3번  (0) 2021.08.12
[C]열혈C 문제풀이 12-1 2번  (0) 2021.08.12
[C] 열혈C 문제풀이 11-2  (0) 2021.08.12
728x90

문제1) 길이5인 int형 배열 arr을 선언하고 이를 1,2,3,4,5로 초기화 한 다음, 이 배열의 첫번째 요소를 가르키는 포인터 변수 ptr를 선언한다. 그 다음 포인터 변수 ptr에 저장된 값을 증가시키는 형태의 연산을 기반으로 배열요소에  접근하면서 모든 배열요소의 값을 2씩 증가시키고, 정상적으로 증가가 이루어졌는지 확인하는 예제를 작성해보자

#include <stdio.h>
int main(void){
    int arr[5]={1,2,3,4,5};
    int *ptr=arr;
    int i=0;
    while(i<5){
        *(ptr+i)+=2;
        printf("%d ", (*ptr+i));
        i++;
    }
    
}

문제3) 길이가 5인 int형 배열 arr을 선언하고 이를 1,2,3,4,5로 초기화한 다음, 이 배열의 마지막 요소를 가르키는 푄터 변수 ptr을 선언한다. 그 다음 포인터 변수 ptr에 저장된 값을 감소시키는 형태의 연산을 기반으로 모든 배열요소에 접근하여, 배열에 저장된 모든 정수를 더하여 그 결과를 출력하는 프로그램을 작성해보자

#include <stdio.h>
int main(void){
    int arr[5]={1,2,3,4,5};
    int *ptr=&arr[4];
    int i=0;
    int total=0;
    while(i<5){
        total+=*(ptr--);
        i++;
    }
    printf("%d ", total);
}
728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12
[C]열혈C 문제풀이 12-1 2번  (0) 2021.08.12
[C] 열혈C 문제풀이 11-2  (0) 2021.08.12
[C] 열혈C 문제풀이 11-1 1번  (0) 2021.08.12

+ Recent posts