본문 바로가기

C언어

논리야 놀자 #3

논리 9 : 어떤 배열에 대해서 역순 배열 만들기

A[] = { 10, 20, 30, 40, 50 };

B[] = { 50, 40, 30, 20, 10 };

 

의사 코드

i  <- 0부터 4까지

R[4-i] <- A[i]  

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int A[5] = { 10, 20, 30, 40, 50 };
	int B[5], i;

	for (i = 0; i < 5; i++)
		B[i] = A[5 - 1 - i];

	for (i = 0; i < 5; i++)
		printf("%d ", B[i]);

	return 0;
}

 

논리10 : 두 개의 배열이 같은가를 판별

처음에는 일단 같다고 설정.

일단 크기가 다르면, 다르다

크기가 같다면

  첫 번째, 두 번째... 마지막 원소를 비교하다가 다른 것이 발견되면, 다르다

  다름을 발견하면 스톱

 

*같다는 판단을 하려면 끝까지 비교해야 안다

 

의사코드

same = 1;

if 크기가 다르면

  same = 0;

else

  for( i <- 0 부터 크기 -1까지)

    다른 것이 발견되면 same = 0; 하고 빠져나온다.

 

if  (same) 같다

else 다르다

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ASIZE 5
#define BSIZE 5

int main(void) {
	int A[ASIZE], B[BSIZE];
	int i, same = 1;

	printf("A배열의 요소들을 입력하세요: ");
	for (i = 0; i < ASIZE; i++) {
		scanf("%d", &A[i]);
	}
	printf("B배열의 요소들을 입력하세요: ");
	for (i = 0; i < BSIZE; i++) {
		scanf("%d", &B[i]);
	}

	//두 배열 판별하기
	if (ASIZE != BSIZE)
		same = 0;
	else
		for (i = 0; i < ASIZE; i++)
			if (A[i] != B[i]) {
				same = 0;
				break;
			}

	if (same)
		printf("같다");
	else
		printf("같지 않다");
}
//두 번째 방법 사용자 정의 함수 사용

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define ASIZE 3
#define BSIZE 4

int isSameArray(int a[], int b[], int aSize, int bSize);

int main(void) {
	int A[ASIZE] = { 10, 20, 30 }, B[BSIZE] = { 10, 20, 30, 40 };

	if (isSameArray(A, B, ASIZE, BSIZE))
		printf("같다");
	else
		printf("같지 않다");

	return 0;
}

int isSameArray(int a[], int b[], int aSize, int bSize) {
	
	if (aSize != bSize)
		return 0;
	else
		for (int i = 0; i <= aSize; i++)
			if (a[i] != b[i])
				return 0;

	return 1;
}

scanf는 공백이 있으면 오류가 생긴다. scanf("%d")로 적을 것.

사용자 정의 함수를 매개변수로 줄 때 배열은 a[10]이런 꼴로 쓰는 것이 아니라 배열 이름만 써야 한다. 아오!

define으로 상수를 정의할 때는 ;를 사용하지 않는다.

그리고 배열의 요소 개수 구하는 거 교수님께서 설명해주셨는데, 까먹었다. 다음 시간에 꼭 여쭤보자.

 

논리 12 : 탐색하기

배열에서 어떤 값을 가진 원소가 있는가를 판별

1. 있다 없다 2. 몇 번째에 있다 3. 여러 개인 경우에는 첫 번째 것으로

 

의사코드

searchKey를 발견하면 스톱,

없는 것은 끝까지 봐야 안다

SIZE를 배열의 크기라고 가정

 

int a[SIZE] = {11, 22, 33, 44, 55, 66, 11, 22, 33, 44, 55, 66};

 

//버전1 : same을 이용하여 키 값이 있을 경우 반복문을 빠져나옴.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5

int main(void) {
	int a[SIZE] = { 1, 2, 3, 4, 5 };
	int searchKey, i, same = 0;

	printf("찾고 싶은 숫자는 : ");
	scanf("%d", &searchKey);

	for (i = 0; i < SIZE; i++) {
		if (a[i] == searchKey) {
			same = 1;
			break;
		}
	}

	if (same)
		printf("%d는 %d번째에 있다", searchKey, i + 1);
	else
		printf("%d는 없다", searchKey);

}
//버전2

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5

int searchKeyInArray(int a[], int size, int searchKey);

int main(void) {
	int A[SIZE] = { 1, 2, 3, 4, 5 };
	int Key;

	printf("찾고 싶은 숫자는 : ");
	scanf("%d", &Key);

	if (searchKeyInArray(A, SIZE, Key) != -1)
		printf("%d는 %d번째에 있다", Key, searchKeyInArray(A, SIZE, Key));
	else
		printf("%d", -1);
}

int searchKeyInArray(int a[], int size, int searchKey) {
	int i;

	for (i = 0; i < size; i++)
		if (searchKey == a[i])
			return i+1;

	return -1;
}

 

논리13 : 어떤 특정한 값을 갖는 원소들을 모아 배열에 넣는다.

예 : 정수를 101개 읽으면서 홀수이면 배열 odd에 넣고 짝수이면 배열 even에 넣는다.

 

의사코드

oddIndex <- 0;

evenIndex <- 0;

10번 반복한다

  수를 읽는다.

  그 수가 홀수이면,

    odd[oddIndex] <-그 수

  그렇지 않으면 (짝수이면)

    even[evenIndex] <-그 수

      evenIndex++;

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int odd[10], even[10], number[10];
	int i, num, oddIndex = 0, evenIndex = 0;

	for (i = 0; i < 10; i++)
		odd[i] = 0;
	
	for (i = 0; i < 10; i++)
		even[i] = 0;

	printf("숫자 10개를 입력하시오 : ");
	for (i = 0; i < 10; i++) {
		scanf("%d", &num);
		number[i] = num;
	}

	for (i = 0; i < 10; i++) {
		if (number[i] % 2 == 0)
			even[evenIndex++] = number[i];
		else
			odd[oddIndex++] = number[i];
	}

	printf("홀수는 : ");
	for (i = 0; i < oddIndex; i++)
		printf("%d ", odd[i]);

	printf("\n");

	printf("짝수는 : ");
	for (i = 0; i < evenIndex; i++)
		printf("%d ", even[i]);
}

==와 = 를 혼동하지 않도록 하자. ==는 같다의 표시 = 는 대입의 표시이다.

 

논리 14: 두 수의 값을 바꾼다

a <= 5, b <- 10dlfEo

a <- -> b 는 어떻게 하나?

 

의사코드

int a = 5, b = 10;

int temp;

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int a = 5, b = 10, temp;

	printf("처음 a는 %d, b는 %d\n", a, b);

	temp = a;
	a = b;
	b = temp;

	printf("바꾸면 a는 %d, b는 %d", a, b);
}

 

논리 15: 배열을 역순배열로 바꾼다

만약 int a[5] = {1, 2,3 4, 5}일 때

a[0] <-> a[4]

a[1] <-> a[3]

a[2] <-> a[2]

이렇게 할 필요가 없다.

 

의사코드

for (i=0; i < SIZE/2; i++)

  a[i] <-> a[ ? ];

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 5

int main(void) {
	int a[SIZE] = { 1, 2, 3, 4, 5 };
	int i, temp;

	for (i = 0; i < SIZE / 2; i++) {
		temp = a[i];
		a[i] = a[SIZE - 1 - i];
		a[SIZE - 1 - i] = temp;
	}

	for (i = 0; i < SIZE; i++) {
		printf("%d ", a[i]);
	}

}

'C언어' 카테고리의 다른 글

3주차 복습  (0) 2023.09.16
2021 학기말고사  (0) 2023.09.11
논리야 놀자 #2  (0) 2023.09.08
논리야 놀자 #1  (0) 2023.09.08
혼공C 도전실전 예제 내 풀이  (0) 2023.08.17