이번 포스팅 에선 배열을 알아본다.
배열이 등장한 배경부터 보자.
자료형으로 문자를 사용하고자 할때 담는 그릇이
'문자' 인 char 하나이기 때문에
문자들을 담는 문자열을 담을 필요가 있게 되었고 이것이
배열을 배우게되는 배경이 된다.
다음과 같게 정리 가능하다
자료형
1.숫자형 1-1 정수형(int) 1-2실수형(float)
2.문자형 2-1 문자(char) 2-2 ???배열이 필요하게 된 이유이다.
여기에 컴퓨터의 이점인 반복을 위해서
나온것이 배열이다
따라서 배열의 구성은 다음과 같다
배열 (array)
1. string(문자열)
2. 반복을 사용하기 위해
배열의 나온 배경은 위와 같지만 실제적인 쓰임새는
파이썬의 리스트와 비슷하게 사용이 된다.
즉 배열은 동일한 데이터타입의 데이터가 여러개 저장되어 있는 데이터
저장 장소라고 생각하자.
배열으로 여러개의 값을 하나의 그릇 즉 이름으로 처리할 수 있다.
선형대수학의 행렬의 기본적인 개념과 비슷하다고 볼 수 있다.
사용법은 다음과 같다.
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
자료형 변수이름[넣을 자료형갯수] ;
int s [10] ;
정수형 s에 10개의 데이터를 넣겠다
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
또한 인덱싱과 슬라이싱은 파이썬과 같은 방식으로 이용이 된다
첫번째 데이터값이 0번이다 s[0] 이다.
이렇게 개별적인 값에 접근할 수 있다.
s[20]=s[10]; 이런 식으로 사용가능
s[i+2]=10; 이렇게도 가능
이러한 배열은 선언후에 for문을 이용하여 값에 접근 할수 있다.
(배열의 개수를 선언하기 전에 는 사용을 못한다)
그런데 앞서 본 배경의 문자열의 사용새가 궁금할수도 있다
이는 나중에 알아본다.
먼저 다음 예제들로 배열의 사용법을 알아본다.
매크로변수를 통해 사용할 수 있다. #define 이다.
#include
#define students 5 //이것이 매크로 변수 선언이다.
int main()
{
int i;
int score[students];
score[0]=90;
score[1]=80;
score[2]=70;
score[3]=80;
score[4]=70;
for(i=0;i<students;i++)
{
printf("%d번째 학생 점수는 %d \n",i,score[i]);
}
printf("\n");
return 0;
}
결과로
0번째 학생 점수는 90
1번째 학생 점수는 80
2번째 학생 점수는 70
3번째 학생 점수는 80
4번째 학생 점수는 70
요래 된다.
하지만 매크로변수를 사용하지 않고 자체에서 사용한다면.
int main()
{
int a=5;
int i;
int score[a];
score[0]=90;
score[1]=80;
score[2]=70;
score[3]=80;
score[4]=70;
for(i=0;i<students;i++)
{
printf("%d번째 학생 점수는 %d \n",i,score[i]);
}
printf("\n");
return 0;
}
이렇게하면 오류가 난다
그 차이는 코드를 작성하고 실행파일이 만들어지기 전까지의 과정에서
매크로가 먼저 처리되고 컴파일이 진행되기 때문에
무리없이 매크로를 통해 받아들일수 있다는 것이다.
좀더 자세하게 적어보자면
프로그램코드를 적고 실행하기까지의 단계를 본다
1.~.c 파일을 만든다
2. 전처리과정을 한다(preprocessing) : 매크로처리, 주석을제거하는 처리를 한다
3. 컴파일링 : 코드에 문제가 있는지 유무를 파악하고 오브젝트 파일을 만든다.
4. 링킹: 내장함수와 내가만든 코드파일(오브젝트파일)을 합쳐서 문제유무를 파악하는 검사를한다.
5. ~.exe 완성
즉 매크로를 통하여 students가 5라는 것을 컴파일 이전에 선언 해주었기 때문에
앞서 사용한 코드는 문제 없이 실행이 된것이고,
그것없이 main함수 안에 내가 만든코드는 그것이 아니기때문에 오류가 나는것이다.
(앞서서 배열을 선언할때는 크기를 정해주고 사용해야 한다고 한것이 이 이유이다.
크기를 선언하지 않고 사용하면 배열은 만들어지지 않는다.)
다음은 배열에서 주목할 부분의 개념을 소개한다
exe파일을 하드디스크에 만들고 이것이 메모리로간다
즉 우리가 만든 변수나 배열들은 메모리의 공간을 차지한다
i라는 배열을 만들었다면
i라는 배열은 i[0]의 주소값을 지니고
i는 주소값을 의미한다고 받아 들인다.
i[0], i[1], i[2] 가 m n k 와 같은 개별적인 변수와 같은
어떠한 공간을 차지한다면
배열i가 나타내는 것은 i[0] 라는 것이다.
다시 정리하면 배열의 이름은 그 주소값을 가진다.
(프린트에프로 i 를 출력한다고 주소값이 나오는것이 아니라
그러한 개념으로 받아들인다. 왜냐하면 변수와 배열이 실시간으로 메모리 어느공간에 있는지 변하기에
어느자리에 위치할지 파악하지 못하기 때문이다)
이는 나중에 포인터와 연결이 된다.
배열을 선언하고
scanf를 사용할때 &를 붙이는지 여부
&는 주소를 의미한다 따라서 배열의 이름인i를
여기에 사용할때는 굳이 &를 사용할 필요가 없다
왜냐면 i는 이미 주소값을 가지기 때문이다.
비유로하자면 &배열이름 은
50번지는 몇번지 입니까? 라는 의미로 받아들일수 있다는 것이다.
&i[0]는 i[0]의 주소는 어디 입니까 라는 뜻으로 사용가능하다.
즉 &변수 는 변수가 메모리상 어디에 있는지 모르지만 &를 사용하여
그 주소에 찾아간다는 의미이다.
다음 예제로 본다
int main()
{
int i;
int sum=0;
int score[students];
double avr;
for(i=0;i<students;i++)
{
printf("성적입력:");
scanf("%d", &score[i]); //이거는 변수와 같은 취급이므로 &를 사용한다. score만 할 경우에는 &사용안한다.
}
for(i=0;i<students;i++)
{
sum+=score[i];
}
avr=(double)sum/students;
printf("성적 평균=%f",avr);
printf("\n");
return 0;
}
이 결과
성적입력:90
성적입력:100
성적입력:100
성적입력:100
성적입력:90
성적 평균=96.000000
이렇게 된다.
배열 그릇을 벗어난 범위는 사용못한다.
예를 들어서
int i[3];
i[3]=0; 은 오류난다
그릇은 i[0], i[1], i[2]의 3개만 만들어지기 때문이다.
배열의 초기화 방법 다음과 같다
int i[5]={10,20,30,40,50}
int a[5]={10,20,30} 이건 나머지 2개는 0으로 초기화 된다
아래같이 배열의 크기대신 초기화먼저 해도 된다
int b[]={10,20,3,4,5}
다음 예제로 파악한다.
int main()
{
int i,size;
int score[]={1,2,3,4,5,6,7,8};
size=sizeof(score)/sizeof(score[0]); //배열은 같은 자료형으로 구성되는 점을 사용하여 크기를 비교하여 개수를 파악하는 코드임
for(i=0;i<size;i++)
{
printf("score[%d]=%d \n",i,score[i]);
}
printf("\n");
return 0;
}
이 결과
score[0]=1
score[1]=2
score[2]=3
score[3]=4
score[4]=5
score[5]=6
score[6]=7
score[7]=8
로 나온다.
이제 여러 예제를 연습한다
주사위 랜덤하게 뽑는 예제(알고리즘 기억하기 아이디어 좋다)
#include
#include
#include
#define size 6
int main()
{
int fre[size]={0};
int i;
srand(time(NULL));
for(i=0;i<10000;i++)
{
++fre[rand()%6];
}
printf(".......................... \n");
printf("면 빈도 \n");
printf(".......................... \n");
for(i=0;i<size;i++)
{
printf("%3d 면 %3d \n",i+1,fre[i]);
}
printf("\n");
return 0;
}
결과로
..........................
면 빈도
..........................
1 면 1681
2 면 1630
3 면 1651
4 면 1715
5 면 1636
6 면 1687
이래 나옴
다음은 영화 예약하는 코드이다.
#define seat 10
int main()
{
int s[seat] = { 0 };
while (1)
{
char cho;
printf("좌석 예매를 하시겠습니까?(y/n)");
scanf(" %c", &cho); // %앞에 스페이스 꼭 붙여야 에러 안난다 반드시 생각할것!
if (cho == 'y')
{
int i;
int sn;
printf("원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다. \n");
printf("................................ \n");
printf(" 1 2 3 4 5 6 7 8 9 10 \n");
for (i = 0; i < seat; i++)
{
printf(" %d", s[i]);
}
printf("\n");
printf("................................ \n");
printf("원하는 좌석번호를 입력하세요:");
scanf("%d", &sn);
if (sn < 0 || sn>10)
{
printf("없는 좌석번호 입니다 \n");
continue;
}
if (s[sn - 1] == 0)
{
s[sn - 1] = 1;
printf("예약되었음 \n");
}
else
printf("이미 예약된 자리임 \n");
}
else if (cho == 'n')
{
printf("예매 시스템 종료합니다.");
break;
}
}
printf("\n");
return 0;
}
결과로
좌석 예매를 하시겠습니까?(y/n)y
원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다.
................................
1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0
................................
원하는 좌석번호를 입력하세요:1
예약되었음
좌석 예매를 하시겠습니까?(y/n)y
원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다.
................................
1 2 3 4 5 6 7 8 9 10
1 0 0 0 0 0 0 0 0 0
................................
원하는 좌석번호를 입력하세요:2
예약되었음
좌석 예매를 하시겠습니까?(y/n)y
원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다.
................................
1 2 3 4 5 6 7 8 9 10
1 1 0 0 0 0 0 0 0 0
................................
원하는 좌석번호를 입력하세요:3
예약되었음
좌석 예매를 하시겠습니까?(y/n)y
원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다.
................................
1 2 3 4 5 6 7 8 9 10
1 1 1 0 0 0 0 0 0 0
................................
원하는 좌석번호를 입력하세요:11
없는 좌석번호 입니다
좌석 예매를 하시겠습니까?(y/n)y
원하는 자리를 선택하세요, 0이 예약할 수 있는 좌석입니다.
................................
1 2 3 4 5 6 7 8 9 10
1 1 1 0 0 0 0 0 0 0
................................
원하는 좌석번호를 입력하세요:1
이미 예약된 자리임
좌석 예매를 하시겠습니까?(y/n)n
예매 시스템 종료합니다.
다음과 같이 완벽한 프로그램을 만들었다.
'관 > 솔직한 c 언어 공부' 카테고리의 다른 글
c언어 기초 공부 11.(총 복습) (3) | 2019.12.16 |
---|---|
c언어 기초 공부 10.(배열2) (0) | 2019.12.16 |
c언어 기초 공부 08. (0) | 2019.11.09 |
c언어 기초 공부 07. (0) | 2019.11.07 |
c언어 기초 공부 06. (0) | 2019.11.06 |
댓글