728x90

문제2) int 형 벼수 num1과 num2를 선언과 동시에 각각 10과 20으로 초기화하고,int형 포인터 변수 ptr1과 ptr2를 선언하여 각각num1과 num2를 가르키게 하자. 그리고 이 상태에서 포인터 변수 ptr1과 ptr2를 이용해서 num1의 값을 10 증가시키고, num2 값을 10 감소시키자.

이제 두 포인터 변수 ptr1과 ptr2가 가르키는 대상을 서로 바꾸자. 즉, 포인터 변수 ptr1이 num2를 가르키게 하고, 포인터 변수 ptr2가 num1을 가르키게 하자. 그리고 마지막으로 ptr1과 ptr2가 가르키는 변수에 저장된 값을 출력하자

#include <stdio.h>
int main(void){
    int num1=10;
    int num2=20;
    int *ptr1=&num1;
    int *ptr2=&num2;
    (*ptr1)+=10;
    (*ptr2)-=10;
    int temp=(*ptr1);
    (*ptr1)=(*ptr2);
    (*ptr2)=temp;
    printf("%d %d", *ptr1, *ptr2);
}

일단 num1과 num2를 초기화 하면서 10과 20을 넣는다. 그리고 포인터 변수를 만들어서 각각의 주소값을 선언해준다. 이후에 10을 더하고 10을 빼주면서 만들어 준다. 그리고 temp를 선언하여 메모리 공간을 각각 바꾸어준 다음에 이를 출력하면 된다. 이때에는 ptr1과 ptr2를 포인터로 가르켜야지 num1과 num2를 가르킬 수 있다.

728x90
728x90

문제1) 프로그램 사용자로부터 하나의 영단어를 입력받아서 입력받은 영단어의 길이를 계산항여 출력하는 프로그램을 작성해보자. 예를 들어서 Array라는 단어가 입력되며 5가 출력되어야한다.

#include <stdio.h>
int main(void){
    char word[10];
    int num=0;
    scanf("%s",word);
    while(word[num]!='\0'){
        num++;
    }
    printf("%d", num);
}

이 문제 솔직히 sizeof로 풀려고 생각을 했다. 하지만 이 단원에서는 뒤에 널 문자 활용법을 배웠으므로 이를 활용하기로 했다. 배열 없이 출력은 불가해서 임의로 10 정도 넣었고 문자열이므로 %s로 입력을 받았다. while문을 돌리는데 널문자 나오기 전까지 num 즉, 갯수 출력을 올려주다가 탈출하면 num이 출력되도록 하였다.


문제2) 프로그램 사용자로부터 영단어를 입력받아서 char형 배열에 저장한다. 그 다음 배열에 저장된 영단어를 역순으로 뒤집는다. 물론 이때에 널문자의 위치를 변경해서는  안된다. 뒤집고 나서는 제대로 뒤집혀졌는지 확인하기 위해서 출력해보자

#include <stdio.h>
int main(void){
    char word[100];
    int i;
    int num=0, temp;
    scanf("%s", word);
    while(word[num]!='\0'){
        num++;
    }
    for(i=0;i<num/2;i++){
        temp=word[i];
        word[i]=word[(num-i)-1];
        word[(num-i)-1]=temp;
    }
    printf("%s", word);
}

나 혼자 짜볼려고 한참을 끙끙거리다가 하지를 못했다. 여기서는 널문자 건드리면 안되므로 그것까지 더해준다. 그리고 for문에서는 num에서 2를 나누어주는데 그이유는 반으로 나누어서 바꾸어줘야하기 때문이다. 만약 /2를 해주지 않으면 2번 바꿔주어 제자리로 돌아오게 된다. temp는 저장 원리를 알면 쉽게 풀리는데 갯수는 1부터 배열은 0부터이므로 1을 빼주어서 비교를 해주는 것이 필요하다. 그리고 한줄로 출력하므로 이렇게 그대로 %s를 이용해 출력하면 된다.

 

 


문제3) 프로그램 사용자로부터 영단어를 입력받는다. 그리고 나서 입력받은 영단어를 구성하는 문자 중에서 아스키 코드의 값이 가장 큰 문자를 찾아서 출력하는 프로그램을 작성해보자. 예를 들어서 입력된 단어가 'LOVE'라면 이 중에서 아스키 코드 값이 가장 큰 문자는 V이므로 V가 출력되어야 한다.

#include <stdio.h>
int main(void){
    char word[10];
    int big=0;
    int num=0;
    scanf("%s",word);
    while(word[num]!='\0'){
        num++;
    }
    for(int i=0;i<num;i++){
        if(big<=word[i]){
            big=word[i];
        }
    }
    printf("%c", big);
}

나는 처음에 %s로 입력받아서 %d로 내보내거나 %d로 문자열을 받아서 %s 나 %c로 내보내야 한다고 생각했다.  그럴 필요가 없었다. 어짜피 컴퓨터는 인식을 알아서 하기 때문에 상관이 없다. 또 주의해야 하는게 num의 설정이다. 처음에는 10공간이니 끝까지 해줘야 겠다고 생각했는데 그것이 아니라 문자열 받은 만큼을 세서 해주어야 한다는 것이다. big에 설정해주는 것은 앞에서 많이 했으므로 넘어가고....

%c는 문자를 출력하는 것이므로 이렇게 해도 된다.

728x90
728x90

문제1) 길이가 5인 int형 배열을 선언해서 프로그램 사용자로부터 총 5개의 정수를 입력받자. 그리고 입력이 끝나면 다음의 내용을 출력하도록 예제를 작성해보자

  • 입력된 정수 중에서 최댓값
  • 입력된 정수 중에서 최솟값
  • 입력된 정수의 총 합

단 반드시 입력을 완료한 상태에서 최댓값과 최솟값 그리고 총합을 계산해야한다. 참고로 배열을 대상으로 scanf문을 구성할 때에는 다음과 같이 해야 한다.

scanf("%d", &arr[2]); //3번째 배열요소에 정수 값 입력받음

변수를 대상으로 &연산자를 부텽주듯이 배열요소를 대상으로 할 때에도 &연산자를 붙여야 한다.

#include <stdio.h>
int main(void){
    int num[5];
    int total=0;
    int max=0,min=0;
    int i=0;
    for(int i=0;i<5;i++){
        scanf("%d", &num[i]);
    }
    max=min=total=num[0];
    for(int i=0;i<5;i++){
        if(max<=num[i]){
            max=num[i];
        }
        if(min>=num[i]){
            min=num[i];
        }
    }
        total+=num[i];
    
    printf("최댓값: %d \n최솟값: %d \n총 합: %d \n", max,min,total);

}
728x90

+ Recent posts