본문 바로가기
관/솔직한 c 언어 공부

c언어 기초 공부 10.(배열2)

by 4차원 박스 2019. 12. 16.

배열의 사용새를 다시 상기하면
1. 반복
2. 문자열 

이런 방식으로 사용된다.


이번 포스팅은 2번 방식인 문자열의 사용 방식에 대하여
먼저 알아본다.


문자열을 표현하는법은 쌍따옴표를 사용한다.

" " 를 사용함
문자열의 마지막은 항상 널값을 준다. 널을 주는방법은 \0 을 사용한다.
따라서 문자열은 5개를 적겠다고 선언을 하려면 6개를 선언해주어야 5개를 
적을수 있다.  이를 지키지 않으면 오류가 나타난다.

선언 방식은 다음과 같다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문자 자료형(=string) 변수이름 [개수] ;

char                      str         [4]  ;

str[3]=\0; 으로 반드시 처리해준다. (이것이 가장 중요하다!!!!!)
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ



문자열의 초기화 방식은 여러가지 있다
(초기화란 변수에 값을 넣어주는것 을 말한다)

char str[4]={'a','b','c','\0'};
char str[4]="abc";      (이건 자동으로 마지막처리가 된다.)
char str[4]="abcdef";   (이건 그릇 보다 커지므로 안된다.)

char str[4]="";            (널값들로 저절로 그릇이 초기화 되어있다)
char str[]="abc";          (쌉가능, 물론 널값도 저절로 된다.)


문자열의 입출력
printf와 scanf에서 %s를 통해 입출력한다
단! scanf에서는 &를 사용하지 않는다(문자열 의 변수를 넣는다면.)


다음 예제들로 파악 해본다.

문자열의 마지막은 널값임을 실감해보는 예제
int main()
{
int i;
char a[4];

a[0]='a';
a[1]='s';
a[2]='d';
a[3]='\0';

i=0;
while(a[i]!='\0')
{
printf("%c",a[i]);
i++;
}

printf("\n");
return 0;
}

이 결과
asd

이래 나옴

다음은 문자열의 입출력을 보여주는 예제이다.

int main()
{
char q[]="my name is wow?(y/n)";
char answer[100];

printf("%s",q);
scanf(" %s",answer);

if(answer[0]=='y')
{
printf("맞음 \n");
}
else
{
printf("틀림 \n");
}

printf("\n");
return 0;
}

그 결과
my name is wow?(y/n)y
맞음

이래 나옴


다음은 널값을 제외한 문자열의 길이를 계산하는 프로그램이다.

int main()
{
char s[10];
int i=0;

printf("문자열을 입력하시오:");
scanf("%s",s);

while(s[i]!='\0')
{
i++;
}

printf("문자열의 길이: %d",i);

printf("\n");
return 0;
}

결과
문자열을 입력하시오:wow
문자열의 길이: 3

이래 나온다.


이것을 함수로 만들어서 프로그램을 만들어보면 다음과 같다.

int strnum();

int main()
{
int i;
i=strnum();
printf("문자열 길이는:%d",i);
printf("\n");
return 0;
}

int strnum()
{
char s[100];
int i=0;

printf("문자열을 입력하시오:");
scanf("%s",s);

while(s[i]!='\0')
{
i++;
}

return i;
}

이 결과

문자열을 입력하시오:owoooow
문자열 길이는:7

이래 나온다.

물론 이것말고도 다르게 함수를 만들어서 간단하게 사용할 수 있지만
그것은 개인차이므로 다른방식으로도 해보는것을 추천한다.
함수를 만든다는 의미는 메인이 일을 시켜서 보조을 해준다는 의미 라는것을
다시 생각하여 만들어보자.

int strnum(char a[]);

int main()
{
char s[100];
int i;
printf("문자열을 입력하시오:");
scanf("%s",s);

i=strnum(s);
printf("문자열 길이는:%d",i);
printf("\n");
return 0;
}

int strnum(char a[])#문자열을 받는 함수임.
{
int i=0;

while(a[i]!='\0')
{
i++;
}

return i;
}

이렇게 메인함수와  만든함수가 서로의 부족한 면을 채워주는 분담형식의 역할을 하게 된다.

이런 방식이 잘 만든 함수 라고 할 수 있다.


여기서 글자수가 100자로 제한이 되어 있는데 이것의 제한을 없애는 방법은
나중에 배울 포인터의 개념으로 할 수 있다.

참고로 
while(s[i]!='\0') 에서 '\0' 를 "\0" 같이 쌍따옴표로 바꾸면 에러가 난다.


이제 배열을 응용하는 예제들을 해본다


배열의 최소값 최대값 구하는 방법

int main()
{
//srand(time(NULL));
//int r=rand();
int s[size]={12,1,2,3,4,5,6,0,10};
int i;
int min;

min=s[0];
for(i=0;i<size;i++)
{
if(s[i]<min)
{
min=s[i];
}
}

printf("최솟값은 %d입니다", min);

printf("\n");
return 0;
}


이 결과
최솟값은 0입니다
이래 나옴


이번엔 랜덤으로 배열을 만들고 최대값 까지 출력해본다.
#include  <stdlib.h>
#include  <time.h>
으로 랜덤을 부른다.

다음과 같다.

#define size 10

int main()
{
int s[size];
int i;
int min;
int max;
srand(time(NULL));
printf("랜덤으로 만든 배열:\n");
for(i=0;i<size;i++)
{
s[i]=rand();
printf(" %d ",s[i]);
}
min=s[0];
max=s[0];
for(i=0;i<size;i++)
{
if(s[i]<min)
{
min=s[i];
}
if(s[i]>max)
{
max=s[i];
}
}
printf("\n");
printf("최솟값은 %d입니다 \n", min);
printf("최대값은 %d입니다 \n", max);

printf("\n");
return 0;
}

결과는
랜덤으로 만든 배열:
 31331  8871  24751  12304  23477  10460  14547  11159  4228  31359
최솟값은 4228입니다
최대값은 31359입니다

이래 나온다.



이번엔 어느 배열에서 자신이 입력한 값이 몇번째 자리에 있는지 확인하는 프로그램이다.
int main()
{
int key,i;
int list[size]={1,2,3,4,5,6,7,8,9};

printf("자리수를 알고싶은 값 입력:");
scanf("%d",&key);

for(i=0;i<size;i++)
{
if(list[i]==key)
{
printf("키값은 %d번째 배열에 위치함 \n",i);
}
}

printf("\n");
return 0;
}

이 결과로
자리수를 알고싶은 값 입력:5
키값은 4번째 배열에 위치함

이래 나온다.


이번엔 어느 배열에서 같은 키값의 개수가 몇개인지 알려주는 프로그램을 만들어본다.

int main()
{
int key,i;
int list[size]={1,2,3,3,3,3,3,8,9};
int sum=0;

printf("몇개가 있는지를 알고싶은 값 입력:");
scanf("%d",&key);

for(i=0;i<size;i++)
{
if(list[i]==key)
{
sum+=1;
}
}

printf("%d은 %d개가 존재함",key,sum);
printf("\n");
return 0;
}

이 결과

몇개가 있는지를 알고싶은 값 입력:3
3은 5개가 존재함

이래 나온다.


이번엔 n번째 후보가 몇개의 표를 얻었는지 보여주는 프로그램을 만들어 본다.

#define size 11
int main()
{
int fre[size]={0}; //0으로 배열 전부 초기화
int i,person;

while(1)
{
printf("몇번째 후보자를 선택 하시겠습니까? (종료=100) ");
scanf("%d", &person);
if (person==100)
{
break;
}
fre[person]+=1;
}

printf("후보번호      투표결과 \n");

for(i=1;i<size;i++)
{
printf("%3d             %3d \n",i,fre[i]);
}

printf("\n");
return 0;
}

이 결과
몇번째 후보자를 선택 하시겠습니까? (종료=100) 1
몇번째 후보자를 선택 하시겠습니까? (종료=100) 1
몇번째 후보자를 선택 하시겠습니까? (종료=100) 1
몇번째 후보자를 선택 하시겠습니까? (종료=100) 2
몇번째 후보자를 선택 하시겠습니까? (종료=100) 2
몇번째 후보자를 선택 하시겠습니까? (종료=100) 100
후보번호      투표결과
  1               3
  2               2
  3               0
  4               0
  5               0
  6               0
  7               0
  8               0
  9               0
 10               0

이래 나온다.

이번엔 후보의 값이 아니라 후보의 이름을 출력하는 코드이다.
int main()
{
int fre[5]={0}; //0으로 배열 전부 초기화
char per[5][10]={"aaaa","bdfdfd","csdsd","dasas","eqwqw"};
int i,j,person;

while(1)
{
printf("어느 후보자를 선택 하시겠습니까? (종료=100) ");
scanf("%d", &person);
if (person==100)
{
break;
}
fre[person]+=1;
}

printf("후보이름      투표결과 \n");


for(i=0;i<5;i++)
{
for(j=0;j<10;j++)
{
printf("%c",per[i][j]);
}
printf("       %d \n",fre[i]);
}

printf("\n");
return 0;
}


다음은 2차원 배열이다

2차원 배열은 행렬과 같게 보면 이해하기 쉽다

행은 ㅡㅡㅡㅡㅡㅡㅡㅡㅡ 이것이고
열은






 이렇게 된것으로 생각한다

int a[][] ; 이런 방식으로 사용한다.

초기화방식은 아까 사용한방법과 비슷한데
[] 한번더 사용하는것의 차이가 난다.

보통 2차원배열에서는 for문 2번 사용하는 방식으로 진행된다.



행렬의 덧셈을 해본다.

#define row 3
#define col 5

int main()
{
int a[row][col]={{1,1,1,1,1},{2,2,2,2,2},{3,3,3,3,3}};
int b[row][col]={{4,4,4,4,4},{5,5,5,5,5},{6,6,6,6,6}};

int c[row][col];
int i,j;

for(i=0;i<row;i++)
for(j=0;j<col;j++)
{
c[i][j]=a[i][j]+b[i][j];
}

for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("%d",c[i][j]);
}
printf("\n");
}

printf("\n");
return 0;
}

이 결과
55555
77777
99999

이래 나온다.

' > 솔직한 c 언어 공부' 카테고리의 다른 글

C언어 간단공부(2020ver).  (2) 2020.07.28
c언어 기초 공부 11.(총 복습)  (3) 2019.12.16
c언어 기초 공부 09.(배열)  (0) 2019.11.12
c언어 기초 공부 08.  (0) 2019.11.09
c언어 기초 공부 07.  (0) 2019.11.07

댓글