2023. 7. 15. 13:47ㆍlanguage : p_study/c language
7월 2주차 학습 할 C언어 study 목차는 다음과 같다.
1. 배열
2. 함수
1. 배열
현재까지 학습하였던 변수는 오직 하나의 값만을 저장할 수 있었는데, 복잡한 응용 프로그램에서는 더 많은 값을 한꺼번에 저장할 수 있는 저장 장소가 필요하고 그 필요에 의해 만들어진 것이 배열이다.
int s[10];
int는 자료형을 뜻하고 s는 배열의 이름을 뜻하며 10은 배열의 크기를 뜻한다.
변수선언이 단독 주택이라면, 배열은 아파트 단지라고 할 수 잇다.
왜 배열이 필요할까?
만약 5명의 학생의 평균을 계산하기 위해 5개의 변수가 필요하다고 가정해보자.
우리는 아래와 같이 변수를 선언할 것이다.
int s0,s1,s2,s3,s4;
하지만 5명의 학생이 아닌 10000명의 학생이라면 이렇게 일일이 변수를 선언하는 것은 매우 비효율적이다.
따라서 보다 손쉽게 대량의 데이터를 저장할 수 있는 공간을 만들 수 있어야하고 이 데이터들을 손쉽게 처리할 수 있는 방법이 필요하다. 그래서 배열이 만들어지게 된것이다.
위 코드를 배열로 바꾸면 아래와 같이 간단히 사용할 수 있다.
int s[5];
- 배열(array)은 동일한 타입의 데이터가 여러 개 저장되어 있는 데이터 저장 장소이다.
- 배열 안에 들어있는 각각의 데이터들은 번호에 의해 식별된다.
- 그 번호를 인덱스(index) 라고 한다.
- 배열에 저장된 데이터를 배열 요소라고 한다.
- 우리는 인덱스를 이용하여 배열 요소에 접근할 수 있는데, 예를 들어 첫번째 요소는 s[0]이다.
- 첫번째요소가 s[1]이아닌 s[0]인 것도 매우 중요한 점이니 꼭 기억하자.
- 또한 배열을 이용하면 여러개의 값을 하나의 이름으로 처리할 수 있다.
배열의 선언은 다음과 같다.
- 배열을 사용하려면 가장 먼저 배열을 선언해야한다.
- 배열의 선언을 통해 컴파일러에게 배열요소의 개수가 몇 개이고, 각 요소의 자료형이 무엇인지를 알려야한다.
- 배열을 선언하기 위해 자료형을 먼저 지정하고, 배열의 이름을 쓰고, 대괄호안에 배열의 크기를 적어서 붙이면 된다.
int s[10];
int 자료형 s 배열이름 [] 대괄호 10 배열크기
⁜ 참고
배열의 크기를 나타낼 때는 항상 정수 상수를 사용하여야한다. 변수나 음수, 0, 실수를 사용하면 모두 컴파일 오류이다.
배열 요소 접근
배열 요소에 접근하려면 scores[n]와 같은 대괄호 안에 요소의 인덱스를 적어주면 된다.
첫번째 배열의 요소는 scores[0]이고 마지막 배열 요소는 scores[n-1]이다.
scores[0] = 80; // 0번째 요소에 80을 저장한다.
scores[3] = scores[2]; // 2번째 요소에 3번째 요소로 복사한다.
scores[k] = 100; // k번째 요소에 100을 저장한다.
배열의 초기화
배열은 초기화를 어떻게 할까? 배열은 여러개의 변수가 모인 것이기때문에 초기값도 하나가 아니고 배열의 요소의 개수만큼이 필요하다.
int scores[5]={10,20,30,40,50};
s[0]=10, s[1]=20...차례대로 값이 대입된다.
- 만약 초기값의 개수가 배열 요소의 개수보다 많은 경우에는 컴파일 오류가 된다.
- 반면, 초기값의 개수가 요소들의 개수보다 적은 경우에는 앞에 있는 요소들만 초기화되고, 나머지 배열 요소는 0으로 초기화된다.
- 초기화만하고 배열의 크기를 비워놓으면 컴파일러가 자동으로 초기값들의 개수만큼 배열 크기를 잡는다.
아래와 같은 경우가 그 예시이고, 이런 경우에는 크기가 5인 배열이 만들어지는 것이다.
int scores[]={10,20,30,40,50};
만약 초기값이 주어지지 않는다면 일반 변수와 마찬가지로 아무 의미없는 쓰레기 값이 들어가게 된다.
배열을 이용한 간단한 코딩을 해보자.
→ 가장 싼 물건찾기
아래와 같은 콘솔창이 뜨도록 코딩해볼 것이다.
[ 12 4 18 3 5 7 19 21 ]
최솟값은 3입니다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE8
int main(){
int prices[SIZE}={12, 4, 18, 3, 5, 7, 19, 21};
int i, min;
printf("[");
for(i=0; i<SIZE; i++){
printf("%d",prices[i]);
}
printf("]");
min=prices[0];
for(i=1; i<SIZE; i++)
{
if(prices[i]<min){
min=prices[i];
}
printf("최솟값은 %d입니다.\n,min);
return 0;
}
코드 설명을 덧붙이자면,
- 우선 정수형 int를 통해 가격인 prices변수를 (주어진 8) SIZE 크기로 선언한다.
- 반복문을 위해 쓰일 i 와 최솟값을 저장할 min변수도 함께 선언해준다.
- printf를 통해 대괄호 형태를 만들어주고 열린 대활호 안에 for 을 통해 i=0부터 i가 8크기보다 작을때까지 반복해서
- 배열의 요소들을 괄호안에 넣어준다.
- 그리고 다시 printf를 통해 대괄호 닫는 모양을 넣어준다.
- 최솟값을 구하기위해 우선 최솟값을 저장한 min에 prices[0]번째 요소를 최솟값으로 가정한다.
- 그리고 다시 for을 통해 반복하면서 만약 배열의 0번째요소보다 i번빼 요소의 값이 더 작다면 min(최솟값)이 새롭게 정의되도록해준다.
만약 최댓값을 구하고 싶다면?
변수이름을 max(자유롭게)로 바꾸고, 최솟값을 점검하는 if문에서 <이 표시만 >이렇게 바꿔주면 되겠다.
버블정렬
배열과 관련하며 흥미로운 주제 중 하나가 바로 정렬인데, 정렬은 물건을 크기순으로 나열하는 것을 의미한다.
총 n-1번의 비교가 이루어지게 되는데,
만일 왼쪽이 더 크면 오른쪽이랑 교환하는 시스템이다.
결국 마지막에는 8이 자리잡을 것이다.
이미 자리가 정해진 8을 제외한 총 n-2번의 비교가이루어지게 된다.
마지막에는 5가 자리 잡을 것이다.
총 n-3번의 비교가 이루어지게 된다.
4가 자리잡게된다.
총 n-4번의 비교가 이루어지게 된다.
3이 자리잡게된다.
총 n-5번의 비교가 이루어지게 된다.
2가 자리잡게된다.
이제 더이상 비교할 게 없으므로 정렬이 다 이루어졌다.
간단히 말하자면 인접한 블록2개를 비교하여 순서대로 되어있지 않으면 계속해서 위치를 바꾼다고 생각하면 된다.
for (k=0; k<SIZE; k++){
for(i=0; i<SIZE; i++){
if(list[i]>list[i+1]){
int tmp=list[i];
list[i]=list[i+1];
list[i+1]=tmp;
}
}
}
위 코드가 버블 정렬의 형태를 나타낸 것인데 간단히 살펴보자면,
- 반복문을 통해 k가 0부터 정해진 SIZE크기보다 작을때까지 반복할 것이다.
- 또 반복문 i를 통해 SIZE크기보다 (비교대상을 제외) 하나 작은 만큼 박복할 것이다.
- 만약 list[i]가 list[i+1]보다 크다면 tmp를 통해 교환할 것이다.
다차원 배열
생김새를 알아보자.
int s[10]; //1차원 배열
int s[3][10]; //2차원 배열
int s[5][3][10]; //3차원 배열
2차원 배열
(가로가 열, 세로가 행)
s[0][0] | s[0][1] | s[0][2] | s[0][3] |
s[1][0] | s[1][1] | s[1][2] | s[1][3] |
s[2][0] | s[2][1] | s[2][2] | s[2][3] |
2차원 배열의 초기화는 다음과 같이 할 수 있다.
int s[3][5]={
{0,1,2,3,4}, // 첫번째 행의 요소들의 초기값
{10,11,12,13,14}, // 두번째 행의 요소들의 초기값
{20,21,22,23,24} // 세번째 행의요소들의 초기값
};
배열에 대해 간단히 학습했으니 codeup을 통해 문제를 풀어보자.
<1402:거꾸로 출력하기 3>
간단히 코드를 설명해보자면,
- 위에 정수형 변수들을 선언해주고 데이터를 저장할 index배열을 선언해준다.
- 처음에 배열을 선언할때 대괄호안에 n을 넣었는데 생각해보니 괄호안에 크기는 정수만 되기 때문에 변수는 되지않고 최대 크기인 100으로 선언해주었다.
- 그리고 for반복문을 통해 n보다 작을 때까지 값을 n만큼 입력받는다.
- 반복문을 통해 내림차순으로 정리해줄 것인데 부등호 방향에 주의를 해야한다.
- 정렬한 후 printf를 통해 값을 출력한다.
✅ mini project
“사용자로부터 5개의 정수를 입력받아서 1차원 배열에 저장한다.
1차원 배열에서 최대값과 최소값을 계산하여서 출력해보자..”
< 콘솔창 예시 >
예시)
데이터 개수: 5
정수를 입력하시오
: 10
정수를 입력하시오
: 20
정수를 입력하시오
: 30
정수를 입력하시오
: 40
정수를 입력하시오
: 50
최대값=50 ,최소값=10
< 내코드 >
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int index[100]; // 최대 크기로 100으로 선언
int n, i;
int min, max;
printf("데이터 개수: ");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("정수를 입력하시오: ");
scanf("%d", &index[i]);
}
max = index[0];
for (i = 1; i < n; i++) {
if (index[i] > max) {
max = index[i];
}
}
min = index[0];
for (i = 1; i < n; i++) {
if (index[i] < min) {
min = index[i];
}
}
printf("최대값 = %d, 최소값 = %d\n", max, min);
return 0;
}
< 콘솔창 >
'language : p_study > c language' 카테고리의 다른 글
7월 3 , 4주차_C Study 계획서 (0) | 2023.07.20 |
---|---|
7월 2주차_C Study 2. 함수 (0) | 2023.07.15 |
7월 2주차_C Study 계획서 (0) | 2023.07.10 |
7월 1주차_C Study 계획서 (0) | 2023.07.10 |
7월 1주차_C Study 4. 반복문 (0) | 2023.07.09 |