C - 배열

배열

동일한 일련의 데이터 타입들을 연속적으로 나열한 것.

배열의 선언

int a[10] // 크기가 10인 정수 배열 a 선언

배열의 크기 가져오기

sizeof() 연산자: 메모리에서 차지하는 공간의 크기를 가져오는 연산자

#include<stdio.h>

main() {
 	int a[10];
	 printf("%d",sizeof a);
}

또는

#include<stdio.h>

main() {
 	int a[10];
	 printf("%d",sizeof(a));
}

sizeof() 연산를 이용하여 배열의 크기를 구할 수 있다.

#include<stdio.h>

main() {
 	int a[10];
	 printf("%d",sizeof(a)/sizeof(int));
}

배열을 이용한 for 문

#include<stdio.h>

main() {
  int s[10] = {10,14,3,5,9,20,7,2,5,4};
  int i;
  int count = 0;
  for(i=0;i<(sizeof(s)/sizeof(int));i++) {
    printf("s[%d]=%d",i,s[i]);
	}
  }
  printf("count = %d",count);
}

예시

합계 구하기, 평균 구하기

#include<stdio.h>

main() {
  int s[10] = {10,14,3,5,9,20,7,2,5,4};
  int i, sum = 0; // 합계를 저장할 변수 sum 선언
  float avr; // 평균을 저장할 변수 avr 선언
  int s_length = (sizeof(s)/sizeof(int)
  for(i=0;i<s_length);i++) {
  	sum += s[i]; // 배열 s의 모든 정수 값들을 sum에 더하기
  }
  avr = (float) sum / s_length // 평균 구하기
  printf("sum = %d, avr = %d",sum,avr);
}

최소값 구하기

#include<stdio.h>

main() {
  int s[10] = {10,14,3,5,9,20,7,2,5,4};
  int i, min = s[0];
  for(i=0;i<(sizeof(s)/sizeof(int));i++) {
    if(min>s[i]) {
    	min = s[i];
	}
  }
  printf("min = %d",min);
}

짝수 개수 구하기

#include<stdio.h>

main() {
  int s[10] = {10,14,3,5,9,20,7,2,5,4};
  int i;
  int count = 0;
  for(i=0;i<(sizeof(s)/sizeof(int));i++) {
    if(s[i] % 2 == 0) {
    	count++;
	}
  }
  printf("count = %d",count); // count = 5
}

버블 정렬(Bubble sort)

#include <stdio.h>

main() {

	int x[]={10,17,22,14,19,4,25,12,35,9};

	int t,i,k;
	// t = temp : 두 데이터의 값을 교환(swap)해줄 때 사용. 
	
	printf("\n");

	for(k=(sizeof (x)/sizeof (int));k>1;k--) {
		for(i=0;i<k;i++) {
			if(x[i]>x[i+1]) { // 큰 값이 뒤쪽(오른쪽)으로 가도록 함. 
				// swap : 두 데이터의 값을 교환해줌. 
				t = x[i];
				x[i] = x[i+1];
				x[i+1] = t;
			} 
		}	
	}

	for(i=0;i<10;i++) {
		printf("%d ",x[i]); 
	}
}	

위처럼 nested for 문 (for문 안에 for문)을 사용하여 순차

달력 만들기

한 달 예시로 출력

#include <stdio.h>
main() {
  int day_cnt;
  for(day_cnt=1;day_cnt<=31;day_cnt++) {
     if(day_cnt%7==1 && day_cnt != 1)
        printf("\n");
     printf("%2d ",day_cnt);       
  }
}

2월이 28일이라 가정했을 때

#include <stdio.h>

main() {

int day_cnt,month_cnt;
// day_cnt : 각 달마다 숫자를 찍어냄. ex. 1월의 경우 31일까지 있으므로, 1,2,..,31 
// month_cnt : 일년동안 각 달의 일수를 요소로 담고 있는 month 배열의 인덱스 값을 저장하기 위함. 
// ex. 2월에 대해서 출력하고 싶을 경우 month[month_cnt] 값은 28이다. 
int temp = 0;
// 달력의 가로 폭에 맞춰서 요일에 대응하는 날짜에 숫자를 찍기 위한 값. 
// 예를 들어, 이번 달이 수요일에 끝나고 다음 달이 목요일부터 시작한다고 할때 
// 이번달 마지막 주에 날짜를 출력한 횟수를 temp에 저장해두고, 다음 달에 temp만큼 공백을 찍어준다. 
int i;
// 공백을 출력해주기 위한 임시 변수. 
int month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
   for(month_cnt = 0;month_cnt<sizeof (month)/sizeof (int);month_cnt++) {
      printf("<<%d월>>\n",month_cnt + 1); // month_cnt는 배열의 인덱스로 사용할 값이지만, +1 을 해주면 현재 달의 숫자와 같다. 
	  printf("월 화 수 목 금 토 일\n");
	        
      for(i=0;i<temp;i++) {
         printf(" ");
      } 
	  // 달 마다 1일이 월요일부터 시작되는 문제를 막기 위해서 
	  // 해당 달이 시작되고서 저번 달에 진행된 요일의 다음 요일부터 1일을 시작하도록 함. 
      
      for(day_cnt=1;day_cnt<=month[month_cnt];day_cnt++) {
         if(temp == 21) {
            printf("\n");
            temp = 0;
         }
         
         printf("%2d ",day_cnt);
         temp += 3;
      }
      
// 해당 달에 대해서 날짜 수를 모두 출력했으면 점선을 출력한다. 
      printf("\n------\n");
   }
}

2차원 배열

부호 절대치 sign magnitude

보수

k에 대한 n의 보수 -> k가 n이 되기 위해 보충해준 수. k에 대한 n-1의 보수 -> k가 n-1이 되기 위해 보충해준 수.

9의 보수 개념

8 - (2) = 6 8 + (7) = 15 => 5 => 5+1 => 6

10의 보수 개념

1의 보수

표현 범위 : -(2^(n-1)-1) ~ +(2^(n-1)-1)

2의 보수

표현 범위 : -(2^(n-1)) ~ +(2^(n-1)-1)

오버플로우

태그:

업데이트:

댓글남기기