윤성우의 열혈 C 프로그래밍 - 도전! 프로그래밍 2

Yumin Jung·2023년 8월 1일
0

이번 도전2는 포인터에 대한 문제를 직접적으로 제시하지는 않았지만, 포인터를 최대한 응용하는 연습을 하기 위해 억지로 써보겠다.

도전 1 (세모)

# include <stdio.h>

void odd(int* ptr);
void even(int* ptr);

int main(void) {
	int arr[10];
	int* ptr = arr;
	printf("10개의 정수를 입력하세요: ");
	for (int i = 0; i < 10; i++)
		scanf_s("%d", &arr[i]);

	even(arr);
	odd(arr);

	return 0;
}

void even(int* ptr) {
	printf("홀수 출력: ");
	for (int j = 0; j < 10; j++) {
		if (*(ptr + j) % 2 != 0)
			printf("%d ", *(ptr + j));
	}
	printf("\n");
}

void odd(int* ptr) {
	printf("짝수 출력: ");
	for (int i = 0; i < 10; i++) {
		if (*(ptr + i) % 2 == 0)
			printf("%d ", *(ptr + i));

	}
}

정상적으로 실행되었다.

하지만 책에서처럼 마지막 결과에서 콤마를 붙히지 않도록 하는게 어려웠다.

ex) 홀수 출력 : 1, 3, 5, 7, 9
이런식으로 여기서 마지막 9에 콤마를 뗄 수 있는 방법이 난제였다.

재도전

한 블로그를 참조하고, 익혔음. 내일 다시 풀기 ^^

도전 2 (O)

c언어에서 2진수로 변환하는 서식문자는 8진수, 16진수와 달리 없다.

#include <stdio.h>

int main(void) {
	int num, a, count = 0;
	int arr[30];
	int* ptr = arr;
	printf("2진수 변환 프로그램입니다. 10진수 정수를 입력하세요 : ");
	scanf_s("%d", &num);

	while (num != 0) {
		a = num % 2;
		*(ptr+count) = a;
		num /= 2;
		count++;
	}
	count -= 1;
	
	while (count >= 0) {
		printf("%d ", *(ptr + count));
		count--;
	}
}

너무 헷갈렸던 문제이다. 자꾸 결과 값이 제대로 나오지 않았다. 차근차근 다시 생각하며 해냈다.

도전 3 (O)

#include <stdio.h>

void OddEvenJudge(int* param);
int main(void) {
	int arr[10];
	printf("입력하세요 : ");
	for (int i = 0; i < 10; i++)
		scanf_s("%d", &arr[i]);
	OddEvenJudge(arr);
}

void OddEvenJudge(int * param) {
	int newarr[10];
	int a = 9, b = 0;
	for (int i = 0; i < 10; i++) {
		if (*(param+i)%2 == 0)
			newarr[a--] = *(param + i);
		else
			newarr[b++] = *(param + i);
	}

	for (int i = 0; i < 10; i++)
		printf("결과 : %d ", newarr[i]);
}

배열에 입력한 후 새로운 배열로 짝수 홀수를 구분 지었다. 배열을 인자로 전달할 때 매개변수는 포인터 형이어야 한다.

도전 4 (X)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Judge(char* a);
int main(void) {
	char str[30];
	printf("회독 판독기입니다.\n\n--------------------\n\n단어를 입력하세요 : ");
	scanf("%s", str);
	Judge(str);
}

void Judge(char* a) {
	int Len = sizeof(a);
	for (int i = 0; i < Len; i++) {
		if (a[i] == a[Len - i - 1])
			printf("회독입니다.");
		else
			printf("회독이 아닙니다.");
	}
}

위와 같이 판독기를 제대로 구현하지 못하였다. 회문이라면 '회문입니다' 회문이 아니라면 '회문이 아닙니다'를 나타내도록 구현해야 하는데, for문 안에 넣어버리면 판독할 때마다 printf가 구현된다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Judge(char* a);
int main(void) {
	char str[30];
	printf("회독 판독기입니다.\n\n--------------------\n\n단어를 입력하세요 : ");
	scanf("%s", str);
	Judge(str);
}

void Judge(char* a) {
	int Len = sizeof(a);
	int count=0;
	for (int i = 0; i < Len; i++) {
		if (a[i] == a[Len - i - 1])
			count++;
		else
			break;
	}

	if (count == 0)
		printf("\n\n회문이 아닙니다");
	else
		printf("\n\n회문입니다");
}

실상은 문자열 길이를 반환하는 함수도 제대로 구현하지 못했다.
for문의 문제는 해결하였다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void Judge(char* a);

int main(void) {
	char str[30];
	printf("회독 판독기입니다.\n\n--------------------\n\n단어를 입력하세요 : ");
	scanf("%s", str);
	Judge(str);
}

void Judge(char* a) {
	int Len = 0;
	while (a[Len] != '\0')
		Len++;

	int count=0;
	for (int i = 0; i < Len/2; i++) {
		if (a[i] == a[Len - i - 1])
			count++;
		else
			break;
	}

	if (count == 0)
		printf("\n\n회문이 아닙니다.");
	else
		printf("\n\n회문입니다.");
}

블로그를 조금 참고하여 해결하였다. 기본기가 아직까지 부족함을 다시 한 번 느낀다.

도전 5 (O)

일단, 버블정렬을 구현해보았다. (오름차순)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 버블정렬 알고리즘 - 과정이 마치 거품이 일어나는 모습과 유사
void bubble(int* a);
int swap(int* change1, int* change2);

int main(void)
{
    int arr[5];
    int* ptr = arr;
    printf("정렬할 숫자 5개를 입력하세요(오름차순 입니다) : ");
    for (int i = 0; i < 5; i++)
        scanf("%d", arr + i);
    bubble(arr);
}

void bubble(int* b)
{
    for (int f = 0; f < 5; f++) {
        for (int j = 0; j < 4; j++) {
            if (*(b + j) > *(b + j + 1))
                swap((b + j), (b + j + 1));
        }
    }
    printf("\n\n\n\n\n-----------------\n\n버블정렬의 결과는 ");
    for (int r = 0; r < 5; r++) {
        printf(" %d", *(b + r));
    }
 }

int swap(int* change1, int* change2)
{
    int temp = *change2;
    *change2 = *change1;
    *change1 = temp;
    return * change1, * change2;
}

(사용자에게 정렬할 숫자 개수를 한계 없이 제공하는 방법을 몰라 애를 썼다. 결국 5개라는 개수를 제시하였다.)
정정 : 배열의 크기를 미리 지정해두고 실행하는 것이 아니라 프로그램을 실행한 후 사용자의 입력에 따라 배열의 크기를 정하고 싶을 경우의 구현을 어떻게 해야하는지 몰라 애를 썼다.

추가 : 이게 바로 동적 할당이었다. 포인터와 malloc를 사용해야 함을 인터넷 검색을 통해서 알았다.

(진짜 문제) 길이가 7인 int형 배열을 선언하여 프로그램 사용자로부터 7개의 정수를 입력 받고, 내림차순 버블정렬을 하는 문제이다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 버블정렬 알고리즘 - 과정이 마치 거품이 일어나는 모습과 유사
void bubble(int* a);
int swap(int* change1, int* change2);

int main(void)
{
    int arr[7];
    int* ptr = arr;
    printf("정렬할 숫자 7개를 입력하세요(내림차순 입니다) : ");
    for (int i = 0; i < 7; i++)
        scanf("%d", arr + i);
    bubble(arr);
}

void bubble(int* b)
{
    for (int f = 0; f < 7; f++) {
        for (int j = 0; j < 6; j++) {
            if (*(b + j) < *(b + j + 1))
                swap((b + j), (b + j + 1));
        }
    }
    printf("\n\n\n\n\n--------------------------------\n\n버블정렬의 결과는 ");
    for (int r = 0; r < 7; r++) {
        printf(" %d", *(b + r));
    }
 }

int swap(int* change1, int* change2)
{
    int temp = *change2;
    *change2 = *change1;
    *change1 = temp;
    return * change1, * change2;
}
profile
문과를 정말로 존중해

0개의 댓글