'배열'에 해당되는 글 3건

  1. 2020.12.07 다차원 배열과 포인터 배열
  2. 2020.12.04 배열
  3. 2020.06.06 배열(Array)

2차원 배열의 필요성

- 2차원 배열은 굉장히 많은 목적으로 사용됨

- 행렬 데이터를 표현할 때, 그래프 알고리즘을 처리할 때, 다수의 실생활 데이터를 처리할 때 등

- 흔히 우리가 보는 표 구조가 2차원 배열과 흡사함

 

이름        영어 성정       수학 성적       국어 성적

가나다          85                 97                 79

라마바        100                 89                98

사아자         99                  77                99

차카타         89                 70                78

파하            95                 98                 98

 

2차원 배열의 초기화

- 2차원 배열은 1차원 배열이 중첩되었다는 의미로 [](대괄호)를 두 번 연속하여 사용

- 초기화하고 싶은 값이 있다면 괄호를 두 번씩 중첩해서 사용하는 방식으로 초기화가 가능

 

자료형 배열 이름 [행] [열] = {{값, 값, 값, ...}, {값, 값, 값, ...}, ...}

int a[10][10];

 

- 2차원 배열 또한 기본적으로 0 인덱스부터 시작

A[0(행)][0(열)]  A[0][1]  A[0][2]

A[1][0]  A[1][1]  A[1][2]

A[2][0]  A[2][1]  A[2][2]

A[3][0]  A[3][1]  A[3][2]

A[4][0]  A[4][1]  A[4][2]

 

* 2차원 배열은 2중 for문과 함께 많이 사용됨

#include <stdio.h>
#include <stdlib.h>

int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

int main(void){
    int i, j;
    for (i = 0; i < 3; i++){
        for (j = 0; j < 3; j++) {
            printf("%d", a[i][j]);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

 

다차원 배열

- 2차원 배열 이상의 다차원 배열 또한 사용할 수 있음

- 컴퓨터는 기본적으로 화면에 2차원 형태만 출력할 수 있음

 

* 3차원 배열 다루기

#include <stdio.h>
#include <stdlib.h>

int a[2][3][3] = { { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
                   { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } } };

int main(void){
    int i, j, k;
    for (i = 0; i < 2; i++){
        for (j = 0; j < 3; j++) {
            for (k = 0; k < 3; k++) {
                printf("%d ", a[i][j][k]);
            }
            printf("\n");
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

 

포인터 배열의 구조 분석

- 배열은 포인터와 동일한 방식으로 동작함

- 배열의 이름은 배열의 원소의 첫 번째 주소가 됨

- 유일한 차이점이라고 하면 포인터는 변수이며 배열의 이름은 상수

 

* 배열의 이름이 변수인지 상수인지 확인해보기

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a = 10;
    int b[10];
    b = &a; // 배열 이름 자체는 상수이기 때문에 다른 주소 값으로 넣어줄 수 없음
    system("pause");
    return 0;
}

 

* 포인터를 배열처럼 사용하기

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[5] = { 1, 2, 3, 4, 5 };
    int *b = &a;
    printf("%d\n", b[2]);
    system("pause");
    return 0;
}

 

* 배열의 이름은 배열의 첫 번째 원소의 주소라는 것을 기억하는 게 중요

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[5] = { 1, 2, 3, 4, 5 };
    int *b = &a[0];
    printf("%d\n", b[2]);
    system("pause");
    return 0;
}

 

포인터 배열의 구조 분석

1.

- 포인터는 연산을 통해 자료형의 크기만큼 이동함

- 따라서 정수(int) 형 포인터는 4바이트(Bytes)씩 이동함

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[5] = { 1, 2, 3, 4, 5 };
    int i;
    for (i = 0; i < 5; i++) {
        printf("%d", a[i]);
    }
    system("pause");
    return 0;
}

 

* 크기가 10인 double형(각각의 원소는 8바이트) 배열을 선언했을 때 배열의 시작 주소가 X(마지막 원소까지 9칸을 뛰어야 함)라고 한다

이때 배열의 마지막 원소의 주소는 몇인가 (8 x 9를 해서 72만큼 시작 주소에서 떨어져 있는 거니까 정답은 x + 72라고 할 수 있음)

#include <stdio.h>
#include <stdlib.h>

int main(void){
    double b[10];
    printf("%d %d\n", b, b + 9);
    return 0;
}

 

* 배열을 포인터처럼 사용해 각 원소에 접근할 수도 있음

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[5] = { 1, 2, 3, 4, 5 };
    int i;
    for (i = 0; i < 5; i++) {
        printf("%d", *(a + i));
    }
    system("pause");
    return 0;
}

 

* 다음 프로그램의 결과는? 1, 3, 5

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[5] = { 1, 2, 3, 4, 5 };
    int *p = a;
    printf("%d\n", *(p++));
    printf("%d\n", *(++p));
    printf("%d\n", *(p + 2));
    system("pause");
    return 0;
}

 

* 2차원 배열 또한 포인터로 처리할 수 있음

#include <stdio.h>
#include <stdlib.h>

int main(void){
    int a[2][5] = { { 1, 2, 3, 4, 5 },
        { 6, 7, 8, 9, 10 } };
    int (*p)[5] = a[1];
    int i;
    for (i = 0; i < 5; i++) {
        printf("%d ", p[0][i]);
    }
    system("pause");
    return 0;
}

 

 

- 2차원 배열 이상을 표현할 수 있음

- C언어의 배열은 내부적으로 포인터와 동일하므로 포인터 연산으로 배열을 대체할 수 있음

'C언어' 카테고리의 다른 글

함수 포인터  (0) 2020.12.08
동적 메모리 할당  (0) 2020.12.08
컴퓨터가 변수를 처리하는 방법  (0) 2020.12.07
문자열  (0) 2020.12.05
문자  (0) 2020.12.04
Posted by khon98
,

배열

C언어 2020. 12. 4. 14:25

배열을 사용하는 이유

- 3개의 숫자가 있을 때 가정 큰 숫자를 구하는 프로그램을 작성

- 기본적으로 변수의 이름을 a, b, c로 설정하면 된다는 것을 예상할 수 있음

- 비효율적이긴 하지만 변수 100개를 만들어서 선언할 수는 있음

- 하지만 숫자가 10000000개라면 이 때는 일일이 변수를 만들어서 처리할 수 없음

- 동일한 자료형을 여러 개 담는 기술이 바로 배열

- 배열을 사용하면 동일한 성격의 데이터를 다수 표현할 수 있음

 

인덱스 0 1 2 3 4 5 6 7 8 9

데이터 6 5 4 3 9 8 0 1 2 7

 

배열의 선언과 초기화

자료형 배열명[배열의 크기] = {초기화 값};

                                       초기화 값은 없을 수도 있음

 

* 배열에선 기본적으로 특정한 데이터에 접근하고자 할 때 중괄호를 넣어주고 중괄호 안에는 인덱스가 들어감

이 인덱스에 해당하는 원소에 접근하겠다는 뜻

만약에 차례대로 a배열에 0 1 2가 들어가 있을 때 a배열에 인덱스 2는 값이 2가 됨

 

* 배열을 만들고 배열을 초기화 한 이후에 각각의 원소에 접근하는 방법

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	int a[10] = { 6, 5, 4, 3, 9, 8, 0, 1, 2, 7 };
	int i;
	for (i = 0; i < 10; i++) {
		printf("%d ", a[i]);
	}
	system("pause");
	return 0;
}

- 전체 원소가 초기화되게 하고 싶으면 {0, }를 하면 됨

 

* 배열의 원소 중에서 최댓값 찾기

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>
#include<limits.h> // 다양한 자료형들의 최솟값이나 최댓값 즉 그 한 개에 해당하는 값들을 포함 하고 있음

int main(void) {
	int a[10] = { 6, 5, 4, 3, 9, 8, 0, 1, 2, 7 };
	int i, maxValue = INT_MIN; // INT_MIN은 상수
	for (i = 0; i < 10; i++) {
		if (maxValue < a[i]) maxValue = a[i];
	}
	printf("%d ", maxValue);
	system("pause");
	return 0;
}

INT_MIN

- INT_MIN은 최댓값을 구하기 위해 자주 사용되는 기능

- <limits.h> 헤더 파일에 정의가 되어 있는 것으로 int형 범위의 최솟값을 반환함(약 -20억)

- INT_MAX 또한 사용할 수 있음

 

 

문자열과 배열

1.

- 원시적인 C언어는 기본적으로 자체적인 문자열 자료형을 제공하지 않음

- 따라서 C언어에서는 문자(character)를 여러 개 묶어 놓는 형태로 문자열을 표현함

- C++에서는 이러한 불편함을 알고 있기 때문에 자체적으로 string 자료형을 제공함

 

2.

- C언어에서는 하나의 문자는 1바이트만을 담으므로 다음과 같이 문자의 배열을 사용

- 다시 말해 문자열은 사실 배열이라고 할 수 있음

 

char a[20] = "Hello World"

 

3.

- 기본적으로 문자열을 선언할 때는 문자열의 크기보다 배열의 크기가 크도록 해야 함

- 문자열을 입력받을 때 및 출력할 때는 %s라는 형식 지정자를 사용함

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	char a[20];
	scanf("%s", &a);
	printf("%s\n", a);
	system("pause");
	return 0;
}

 

4.

- C언어는 특정한 인덱스의 문자에 바로 접근할 수 있다는 장점이 있음

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	char a[20] = "Hello World";
	a[4] = ',';
	printf("%s\n", a);
	system("pause");
	return 0;
}

 

* 문자열에 포함된 l의 개수 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<cstdlib>

int main(void) {
	char a[] = "Hello World";
	int count = 0;
	for (int i = 0; i <= 10; i++) {
		if (a[i] == 'l') count++;
	}
	printf("%d\n", count);
	system("pause");
	return 0;
}

 

 

- 배열을 이용하면 많은 양의 데이터를 쉽게 처리할 수 있음

- C언어에서의 문자열은 내부적으로 문자의 배열임

'C언어' 카테고리의 다른 글

문자  (0) 2020.12.04
포인터  (0) 2020.12.04
함수  (0) 2020.12.04
반복문  (0) 2020.12.04
조건문  (0) 2020.12.03
Posted by khon98
,

배열(Array)

자바 2020. 6. 6. 17:25

배열

- 프로그래밍을 하다 보면 같은 형태의 자료형을 수십, 수백 개를 사용할 때가 많다 이러한 변수들 중에서 같은 목적으로 사용하는 변수들을 하나의 이름으로 관리할 수 있다면 편한 부분이 많아지게 된다

 

- 배열은 자료형이 같은 무수히 많은 변수를 하나의 이름으로 관리하고자 할 때 사용하며 반복문과 더불어 사용할 수 있다

 

- 자바에서는 배열을 객체로 취급하며 배열을 사용하기 위해서는 먼저 기억 공간을 할당(객체 생성과 비슷)하는 작업을 해줘야만 한다

 

배열의 차수

- 배열의 차수는 배열을 사용하는 개발자 입자에서 배열에 담기는 데이터를 효율적으로 관리하기 위한 목적으로 이용되는 부분이다

 

- 예를 들어 학생의 이름을 관리하는 배열을 만든 경우 배열에 담기는 데이터가 학생 하나 이므로 1차원 배열을 이용할 수 있다

 

- 학생의 이름과 주소를 관리하는 배열이라고 한다면 학생 한 명당 두 개의 데이터가 필요하므로 2차원 배열을 이용할 수 있다

 

- 2차원 배열과 같이 차수가 1차가 아닌 배열을 다차원 배열이라고 부른다

 

배열의 생성

- 배열의 생성은 다음과 같이 한다

  자료형 [ ] 배열명 = new 자료형 [개수]; 

  자료형 배열명 [ ] = new 자료형 [개수];

 

- 창조 변수를 선언할 때 [ ]의 위치는 관계가 없으나 자바에서는 [ ]가 중간에 들어가는 것을 더 많이 사용한다

 

배열의 초기화

- 배열은 선언과 동시에 초기화를 할 수 있다

 

- 이때 배열에 넣어주는 데이터의 개수만큼 자동으로 배열이 생성된다

 

- int [ ] array = {1, 2, 3, 4, 5};     5개짜리 배열 생성

 

배열의 접근

- 배열은 만들어진 변수의 순서대로 인덱스 번호가 붙게 된다

 

- int [ ] array {1, 2, 3, 4, 5}인 경우 5개의 변수가 생성이 되며 0부터 1씩 증가되는 인덱스 번호를 갖게 된다

 

- array[0]은 첫 번째 변수, array[1]은 두 번째 변수에 접근을 하며 [ ]안의 숫자를 첨자라고 부른다

  

  array[0]  array[1]  array[2]  array[3]  array[4]

 

다 차원 배열

- 다 차원 배열은 1차원 배열과 같은 방법으로 접근을 하지만 첨자를 배열의 차수만큼 작성해서 접근을 한다

 

- 아래는 array [3][2] 배열의 예이다

 

array[0] > array[0][0]

          > array[0][1]

 

array[1] > array[1][0]

          > array[1][1]

 

array[2] > array[2][0]

          > array[2][1]

 

-----------------------------------------------------------------------------------------------------

int [ ] a1 = new int [10];

int a2 [ ] = new int [10]; 

 

//배열의 개수

System.out.pritntln("a1의 개수 : " + a1.length);

System.out.pritntln("a2의 개수 : " + a2.length);

 

int [ ] a3 = {1, 2, 3};

System.out.pritntln("a3의 개수 : " + a3.length);

 

for(int i = 0; i < a3.length ; i++){

    System.out.printf("a3[%d] = %d\n", i, a3[i]);

}

 

int [ ] a4 [ ] = new int [3][5];

int a5 [ ] [ ] = new int [3][5];

System.out.pritntln("a4의 개수 : " + a4.length);

System.out.pritntln("a4[0]의 개수 : " + a4[0].length);

 

int [ ][ ] a6 = {

        {1, 2, 3},

        {4, 5, 6},

        {7, 8, 9}

};

 

for(int i = 0 ; i < a6.length ; i++){

    for(int k = 0 ; k < a6[i].length ; k++){

        System.out.pritnf("a6[%d][%d] = %dn", i, k, a6[i][k]);

-----------------------------------------------------------------------------------------------------

 

예제

-----------------------------------------------------------------------------------------------------

import java.io.BufferedReader

 

try {

    // 키보드 입력용 도구 생성

    InputStreamReader ir = new InputStreamReader(System.in);

    BufferedReader br = new BufferedReader(ir);

    

    // 학생수

    System.out.print("학생수를 입력해 주세요 : ");

    int stuCnt = Integer.parseInt(br.readLine( ));

 

    // 과목 이름 배열

    String [ ] str = {"국어", "영어", "수학"};

 

    // 각 점수를 담을 변수 선언

    int [ ] [ ] point = new int[stuCnt][str.length];

 

    // 각 정수를 입력받는다

    int [ ] tot = new int[stuCnt];

    int [ ] avg = new int[styCnt];

    for(int i= 0 ; i < stuCnt ; i++) {

        tot[i] = 0;

        for(int k = 0 ; k < str.length ; k++) {

            System.out.printf("%d번째 학생 %s 점수 : ", i + 1, str[i]);

            point[i][k] = Integer.parseInt(br.readLine( ));

            tot[i] = tot[i] + point[i][k];

        }

        avg[i] = tot[i] / str.length;

    }

    int alltot = 0;

    int avgtemp = 0;

    int allavg = 0;

    for(int i = 0 ; i < stuCnt ; i++) {

        alltot = alltot + tot[i];

        avgtemp = avgtemp +avg[i];

    }

    allavg = avgtemp / stuCnt;

    for(int i = 0 : i < stuCnt ; i++) {

        System.out.printf("%d번째 학생 : ", i + 1);

        for(int k = 0 ; k < str.length ; k++) {

            System.out.printf("%d ", point[i][k]);

        }

        System.out.printf("%d %d\n", tot[i], avg[i]);

    }

    System.out.printf("%d %d\n", alltot, allavg);

}catch(Exception e) { }

}

-----------------------------------------------------------------------------------------------------

'자바' 카테고리의 다른 글

생성자(constructor)  (0) 2020.06.16
args  (0) 2020.06.16
Package  (0) 2020.06.03
클래스의 멤버 변수  (0) 2020.05.29
Class Member Method  (0) 2020.05.29
Posted by khon98
,