본문 바로가기
c

4. 배열

by it_jangyee 2020. 1. 22.

배열은 집합 데이터를 저장하기 위해 사용

 

int a; //변수 하나에는 값을 하나만 저장
int b[3];   //하나의 배열에 크기 만큼 값 저장

 

배열의 특징

  • 지정한 타입의 값만 저장. 
  • 크기 선언할 때 정함.
  • 각 방이 인접

 

1. 생성

int a[크기];

void main(){
    int a[5];
    a[0]=1;
    a[1]=2;
    a[2]=3;
    a[3]=4;
    a[4]=5;

    printf("a[0]=%d\n", a[0]);
    printf("a[1]=%d\n", a[1]);
    printf("a[2]=%d\n", a[2]);
    printf("a[3]=%d\n", a[3]);
    printf("a[4]=%d\n", a[4]);
}
void main(){
    int a[5];
    int i;

    for(i=0;i<5;i++){
        a[i]=i+1;
    }

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

2. 초기화

void main(){
    int a[3]={1,2,3};//배열 초기화
    int b[]={10, 20};//배열 초기화 시 크기 생략.
                    //초기화 값의 개수만큼 방만듬.
    int i;
    //배열 a출력
    for(i=0;i<3;i++){
        printf("a[%d]=%d\n", i, a[i]);
    }
    //배열 b출력
    for(i=0;i<2;i++){
        printf("b[%d]=%d\n", i, b[i]);
    }
}

3. 배열 키보드 입력

void main(){
    int a[5];
    int i;
    printf("숫자 5개를 입력하라");
    for(i=0;i<5;i++){
        scanf("%d", &a[i]);
    }

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

4. 예제

수학점수 3개를 입력받아 총점, 평균 출력 형변환
void main(){
    int score[3];
    int i, sum=0;
    float avg;

    printf("점수 3개를 입력하라");
    for(i=0;i<3;i++){
        scanf("%d", &score[i]);
        sum+=score[i];
    }
    //sum = score[0]+score[1]+score[2];
    avg = (float)sum/3;
    printf("sum:%d, avg=%f\n", sum, avg);
    
}

#자동형변환

   int+int: int 
    float+float: float 
    int+float: float //자동형변환


#강제형변환
    int a=10; 
    float b = (float)a;//강제형변환 

1~100사이의 짝수 저장1 1~100사이의 짝수 저장2
void main(){
    int a[50];
    int i, cnt=2;
    for(i=0;i<50;i++){//배열의 인덱스
        a[i]=cnt;
        cnt+=2;
    }

    for(i=0;i<50;i++){
        printf("%d\t", a[i]);
    }
}
void main(){
    int a[50];
    int i, cnt=0;//cnt:배열에 입력 시 사용할 인덱스
    for(i=1;i<101;i++){//만들 숫자 범위
        if(i%2==0){//i가 짝수이면
            a[cnt]=i;
            cnt++;
            if(cnt==50){
                printf("배열이 꽉찼다.\n");
                break;
            }
        }
    }

    for(i=0;i<50;i++){
        printf("%d\t", a[i]);
    }
}
최대, 최소, 합 구하기

void main(){
    int a[10];
    int i, max, min, sum;

    printf("숫자 10개를 입력하라\n");
    for(i=0;i<10;i++){
        scanf("%d", &a[i]);
    }

    printf("전체 요소\n");
    for(i=0;i<10;i++){
        printf("%d\t", a[i]);
    }

    max=a[0];//max:최대값
    for(i=1;i<10;i++){
        if(max<a[i]){
            max=a[i];
        }
    }

    printf("max:%d\n", max);

    min=a[0];//max:최대값
    for(i=1;i<10;i++){
        if(min>a[i]){
            min=a[i];
        }
    }

    printf("min:%d\n", min);

    sum = 0;
    for(i=0;i<10;i++){
        sum+=a[i];
    }
    printf("sum:%d\n", sum);
}
실수 타입 배열 및 초기화

void main(){
    float a[2]={3.45f};
    int b[3]={1};
    float c[]={3.45f, 45.567f};
    int i;

    for(i=0;i<2;i++){
        printf("a[%d]=%f\t", i, a[i]);
    }
    printf("\n");

    for(i=0;i<3;i++){
        printf("b[%d]=%d\t", i, b[i]);
    }
    printf("\n");

    for(i=0;i<2;i++){
        printf("c[%d]=%f\t", i, c[i]);
    }
    printf("\n");
}
실수 타입 배열 입력 받아서 요소 할당

void main(){
    float arr[3];
    int i;

    for(i=0;i<3;i++){
        scanf("%f", &arr[i]);
    }

    for(i=0;i<3;i++){
        printf("%.3f\t", arr[i]);
    }
}
배열 활용

void main(){
    //3명의 국, 영, 수 점수를 처리(총점, 평균)

    int kor[]={56,87,67};
    int eng[] = {78,90,56};
    int math[] = {45,85,96};

    //<total[0]:국어총합/total[1]:영어총합/total[2]:수학총합>
    int total[3]={0};

    //<avg[0]:국어평균/avg[1]:영어평균/avg[2]:수학평균>
    float avg[3];

    int i;

    for(i=0;i<3;i++){
        total[0]+=kor[i];
        total[1]+=eng[i];
        total[2]+=math[i];
    }

    for(i=0;i<3;i++){
        avg[i]=(float)total[i]/3;
    }

    for(i=0;i<3;i++){
        printf("total:%d, avg=%f\n", total[i], avg[i]);
    }
}
문자 배열

void main(){
    //문자:스펠링 하나. 문자하나.'a'=>char
    //문자열:문자의 나열. "asdfsdf"
    //'\0': 널문자. 문자열의 끝을 인식시킨다.
    char a[6]={'h','e','l','l','o','\0'};
    char b[10]="hello";//'\0'는 자동으로 들어감
    int i;
    for(i=0;i<6;i++){
        printf("%c", a[i]);
    }
    printf("\n");
    //%s: 문자열 출력 서식
    printf("a=%s\n", a);

    for(i=0;i<5;i++){
        printf("%c", b[i]);
    }
    printf("\n");
    printf("b=%s\n", b);
}
문자 배열 입력받아 초기화
void main(){
    char name[10];
    printf("name:");
    //%s 문자열 입력 서식
    scanf("%s", name);

    printf("당신의 이름은 %s이다.\n", name);
}
과제-성적처리 프로그램
void main(){
    char name[10];
    int score[5];//번호, 국,영,수,총
    float avg;
    int i, j;

    printf("name:");
    scanf("%s", name);
    printf("num, kor, eng, math를 순서대로 입력하라\n");
    score[4]=0;//총점방을 0으로 초기화
    for(i=0;i<4;i++){
        scanf("%d", &score[i]);
        if(i!=0){//번호를 제외한
            score[4]+=score[i];//국,영,수를 총점방에 누적
        }
    }
    avg = (float)score[4]/3;//평균계산

    printf("name\tnum\tkor\teng\tmath\ttotal\tavg\n");
    printf("%s\t", name);
    for(i=0;i<5;i++){
        printf("%d\t", score[i]);
    }
    printf("%f\n", avg);

}

5. 2차원 배열

2차원 배열 선언 / 값 할당 / 값 일기
void main(){
    int a[2][3];//2줄 3칸
    int i;

    a[0][0]=1;
    a[0][1]=2;
    a[0][2]=3;
    a[1][0]=4;
    a[1][1]=5;
    a[1][2]=6;

    printf("%d\t", a[0][0]);
    printf("%d\t", a[0][1]);
    printf("%d\n", a[0][2]);
    printf("%d\t", a[1][0]);
    printf("%d\t", a[1][1]);
    printf("%d\n", a[1][2]);

}
2줄3칸 배열에 1~6 저장 및 읽기
void main(){
    int a[2][3];//2줄 3칸
    int i, j, cnt=1;

    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            //a[i][j]=3*i+j+1;
            a[i][j]=cnt++;
        }
    }

    for(i=0;i<2;i++){
        for(j=0;j<3;j++){
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}
2차원 배열 초기화
void main(){
    int a[2][4]={{1,2,3,4}, {5,6,7,8}};
    int b[][4]={{10,20,30,40}, {50,60,70,80}};
    int c[][4]={{1,}, {5,6},{23,5,8}};
    int i, j;

    for(i=0;i<2;i++){
        for(j=0;j<4;j++){
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<2;i++){
        for(j=0;j<4;j++){
            printf("%d\t", b[i][j]);
        }
        printf("\n");
    }
    for(i=0;i<3;i++){
        for(j=0;j<4;j++){
            printf("%d\t", c[i][j]);
        }
        printf("\n");
    }
}
2차원 배열 키보드 입력으로 초기화
void main(){
    int a[2][2];
    int i, j;

    for(i=0;i<2;i++){
        printf("숫자 2개를 입력하라\n");
        for(j=0;j<2;j++){
            scanf("%d", &a[i][j]);
        }
    }

    for(i=0;i<2;i++){
        for(j=0;j<2;j++){
            printf("%d\t", a[i][j]);
        }
        printf("\n");
    }
}
3명의 번호, 국,영,수를 입력받아 총점과 평균을 출력하시오 
void main(){
    int score[3][5];
    float avg[3];
    int i, j;

    for(i=0;i<3;i++){
        printf("num,kor,eng,math입력\n");
        score[i][4]=0;
        for(j=0;j<4;j++){
            scanf("%d", &score[i][j]);
            if(j!=0){
                score[i][4]+=score[i][j];
            }
        }
        avg[i]=(float)score[i][4]/3;
    }

    printf("num\tkor\teng\tmath\ttotal\tavg\n");
    for(i=0;i<3;i++){
        for(j=0;j<5;j++){
            printf("%d\t", score[i][j]);
        }
        printf("%f\n", avg[i]);
    }
}
문자열 1개 저장
void main(){
    //배열 1줄에 문자열 한개 밖에 저장 안됨
    char str1[10]={'a', 'b', 'c', '\0'};//문자열 1개 저장
    char str2[10]="abc";
    char str3[10];
    printf("문자열 입력하라\n");
    scanf("%s", str3);

    printf("str1:%s\n", str1);
    printf("str2:%s\n", str2);
    printf("str3:%s\n", str3);
}
문자열 여러 개 저장
void main(){
    char str1[3][10]={{'a','a','a','\0'},
    {'b','b','b','\0'},{'c','c','c','\0'}};

    char str2[3][10]={"abc", "def", "ghi"};
    char str3[2][10];
    int i;

    printf("문자열 2개 입력\n");
    for(i=0;i<2;i++){
        scanf("%s", str3[i]);
    }

    for(i=0;i<3;i++){
        printf("str1[%d]:%s\n",i, str1[i]);
    }
    for(i=0;i<3;i++){
        printf("str2[%d]:%s\n",i, str2[i]);
    }
    for(i=0;i<2;i++){
        printf("str3[%d]:%s\n",i, str3[i]);
    }
}
3명의 이름, 번호, 국,영,수를 입력받아 총점과 평균을 출력하시오 
void main(){
    char name[3][10];
    //번호,국,영,수,총
    int score[3][5];
    //평균 3개
    float avg[3];

    int i, j, k;
    char title[7][10]={"이름", "번호", "국어", "수학", "영어",
    "총점", "평균"};

    for(i=0;i<3;i++){
        k=0;
        printf("%s:", title[k++]);
        scanf("%s", name[i]);
        score[i][4]=0;
        for(j=0;j<4;j++){
            printf("%s:", title[k++]);
            scanf("%d", &score[i][j]);
            if(j!=0){
                score[i][4]+=score[i][j];
            }
        }
        avg[i] = (float)score[i][4]/3;
    }

    for(i=0;i<7;i++){
        printf("%s\t", title[i]);
    }
    printf("\n");

    for(i=0;i<3;i++){
        printf("%s\t", name[i]);
        for(j=0;j<5;j++){
            printf("%d\t", score[i][j]);
        }
        printf("%f\n", avg[i]);
    }
}
4명의 이름, 학과, 학년을 입력받고 출력
void main(){
    char name[4][10];
    char dept[4][20];
    int grade[4];
    int i;

    for(i=0;i<4;i++){
        printf("name:");
        scanf("%s", name[i]);
        printf("dept:");
        scanf("%s", dept[i]);
        printf("grade:");
        scanf("%d", &grade[i]);
    }

    for(i=0;i<4;i++){
        printf("%s\t%s\t%d\n", name[i], dept[i], grade[i]);
    }

}

6. 상수

1) 매크로 상수

#include <stdio.h>
#define MAX 100     //매크로 상수=>치환
#define SIZE 6      //매크로 상수
void main(){
    int x = 20; //변수
    int arr[SIZE]; //매크로 상수로 배열의 크기 지정
    //MAX=500;  에러. 상수는 값 변경 안됨
    printf("MAX:%d\n", MAX);
    printf("SIZE:%d\n", SIZE);
    if(x>MAX){
        printf("x는 %d 보다 크다\n", MAX);
    }else{
        printf("x는 %d 보다 크지 않다\n", MAX);
    }
    printf("숫자 %d개 입력:", SIZE);
    for(x=0;x<SIZE;x++){
        scanf("%d", &arr[x]);
    }
    for(x=0;x<SIZE;x++){
        printf("%d\t", arr[x]);
    }
    printf("\n");
}

2) const 상수

#include <stdio.h>
#define STR "HELLO" //매크로는 타입 지정 없음
#define SIZE2 10
void main(){
    const int MAX = 100;    //타입을 지정하여 상수정의
    const int SIZE = 3;
    const char STR2[SIZE2]="hello2";
    int x;
    int arr[SIZE];

    printf("MAX:%d\n", MAX);
    printf("SIZE:%d\n", SIZE);
    printf("STR:%s\n", STR);
    printf("STR2:%s\n", STR2);

    for(x=0;x<SIZE;x++){
        arr[x]=x+1;
    }

    for(x=0;x<SIZE;x++){
        printf("%d\t", arr[x]);
    }

    //MAX=400;  //상수이므로 변경불가
}

7. 배열 활용

1)버블정렬

#include <stdio.h>
#define SIZE 10
void main(){
    int a[]={8,3,6,9,5,10,4,1,2,7};

    int i, j, tmp;

    //버블정렬. 오름차순
    for(i=0;i<SIZE-1;i++){
        for(j=0;j<SIZE-1-i;j++){
            if(a[j]>a[j+1]){
                tmp = a[j];
                a[j] = a[j+1];
                a[j+1] = tmp;
            }
        }
    }

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

2)삽입정렬

#include <stdio.h>
#define SIZE 10 
void main(){ 
    int a[]={8,3,6,9,5,10,4,1,2,7}; 

    int i, j, tmp; 

    //insert sort
    for(i=1;i<SIZE;i++){
        tmp = a[i];
        j=i-1;
        while(j>=0 && a[j]>tmp){
            a[j+1]=a[j];
            j--;
        }
        j++;
        a[j]=tmp;
    }

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

3)선택정렬

#include <stdio.h>
#define SIZE 10 
void main(){ 
    int a[]={8,3,6,9,5,10,4,1,2,7}; 

    int i, j, tmp;
    int min;


    for(i=0;i<SIZE-1;i++){
        min=i;
        for(j=i+1;j<SIZE;j++){
            if(a[min]>a[j]){
                min=j;
            }
        }
        if(min!=i){
            tmp = a[min];
            a[min] = a[i];
            a[i] = tmp;
        }
    }

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

4)순차탐색

#include <stdio.h>
#define SIZE 10
void main(){
    int a[]={8,3,6,9,5,10,4,1,2,7};
    int i, j=1, tmp;

    printf("검색할 숫자를 입력하라");
    scanf("%d", &tmp);

    for(i=0;i<SIZE;i++){
        if(tmp==a[i]){
            printf("%d방에 있다\n", i);
            //j=0;
            break;
        }
    }

    if(i==10){
        printf("없다");
    }

    /*
    if(j==1){
        printf("없다");
    }
    */
}

5)이진탐색

이진 탐색은 먼저 정렬이 선행되어야 함

#include <stdio.h>
void main(){
    int a[]={1,2,3,4,5,6,7,8,9,10};
    int i, j, f=0, l=9, mid;
    printf("검색할 값:");
    scanf("%d", &j);
    while(f<=l){
        mid=(f+l)/2;
        if(j==a[mid]){
            printf("%d위치에 있음\n", mid);
            break;
        }else if(j>a[mid]){
            f = mid+1;
        }else{
            l = mid-1;
        }
    }
    if(f>l){
        printf("not found\n");
    }
}

8. 배열의 단점

객체를 구현 하면 복잡도 올라감

#include <stdio.h>
#include <string.h>

void main(){
    char name[3][10];
    int score[3][5]={{0,},{0,},{0,}};
    float avg[3];
    char title[][10]={"name", "num", "kor", "eng","math",
                    "total", "avg"};
    int i,j,cnt=0, tmp_i;
    float tmp_f;
    char tmp_c[10];

    for(i=0;i<3;i++){
        cnt=0;
        printf("%s:", title[cnt++]);
        scanf("%s", name[i]);
        for(j=0;j<4;j++){
            printf("%s:", title[cnt++]);
            scanf("%d", &score[i][j]);
            if(j!=0){
                score[i][4]+=score[i][j];
            }
        }


        avg[i]=(float)score[i][4]/3;
    }

    for(i=0;i<2;i++){
        for(j=0;j<2-i;j++){
            if(score[j][4]<score[j+1][4]){
                //이름 swap
                strcpy(tmp_c, name[j]);
                strcpy(name[j], name[j+1]);
                strcpy(name[j+1], tmp_c);

                //score swap
                for(cnt=0;cnt<5;cnt++){
                    tmp_i = score[j][cnt];
                    score[j][cnt] = score[j+1][cnt];
                    score[j+1][cnt] = tmp_i;
                }

                //avg swap
                tmp_f = avg[j];
                avg[j] = avg[j+1];
                avg[j+1] = tmp_f;
            }
        }
    }

    for(i=0;i<7;i++){
        printf("%s\t", title[i]);
    }
    printf("\n");
    for(i=0;i<3;i++){
        printf("%s\t", name[i]);
        for(j=0;j<5;j++){
            printf("%d\t", score[i][j]);
        }
        printf("%f\n", avg[i]);
    }
}

배열 장점:집합데이터를 처리. 메모리인접. 포인터에 비해 접근속도 빠르다
배열 단점: 한 타입저장. 크기가 정해있다.


배열로 객체 표현 힘듦=>보완=>구조체


구조체: 타입 정의
1)타입정의
struct 타입명{
   변수들...
};

struct Student{
  int num; //멤버변수
  char name[10]; //멤버변수
};

2)변수선언
struct 타입명 변수명;
struct Student s1, s2;
s1.num=10;
strcpy(s1.name, "aaa");

#include <stdio.h>
#include <string.h>

//타입 정의. 기본 타입으로만 객체 묘사 어려움.
struct Student{
    int num;
    char name[10];
};

void main(){
    struct Student s1, s2;
    s1.num = 1;
    strcpy(s1.name, "aaa");

    s2.num = 2;
    strcpy(s2.name, "bbb");

    printf("s1.num=%d, s1.name=%s\n", s1.num, s1.name);
    printf("s2.num=%d, s2.name=%s\n", s2.num, s2.name);
}

'c' 카테고리의 다른 글

6. 포인터  (0) 2020.02.17
5. 함수  (0) 2020.02.12
3. 제어문  (3) 2020.01.08
2. 변수와 연산자  (0) 2020.01.05
1. 개발환경구축 - 코드블럭설치  (0) 2019.12.21

댓글