논리 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 |