/* 배열 요소의 최댓값을 구합니다(값을 입력합니다). */
#include <stdio.h>
#include <stdlib.h>
/*--- 요솟수가 n인 배열 a의 요소의 최댓값을 구합니다. ---*/
int maxof(const int a[], int n)
{
int i;
int max = a[0]; /* 최댓값 */
for (i = 1; i < n; i++)
if (a[i] > max) max = a[i];
return max;
}
int main(void)
{
int i;
int *height; /* 배열의 첫 번째 요소의 포인터 */
int number; /* 인원 = 배열 height의 요소 개수 */
printf("사람 수 : ");
scanf("%d", &number);
height = calloc(number, sizeof(int)); /* 요솟수가 number개인 배열을 생성 */
printf("%d 사람의 키를 입력하세요.\n", number);
for (i = 0; i < number; i++) {
printf("height[%d] : ", i);
scanf("%d", &height[i]);
}
printf("최댓값은 %d입니다.\n", maxof(height, number));
free(height); /* 배열 height를 해제 */
return 0;
}
/* 배열 요소를 역순으로 정렬합니다. */
#include <stdio.h>
#include <stdlib.h>
/*--- type형의 x와 y 값을 교환 ---*/
#define swap(type, x, y) do { type t = x; x = y; y = t;} while (0)
/*--- 요소 개수가 n인 배열 a의 요소를 역순으로 정렬 ---*/
void ary_reverse(int a[], int n)
{
int i;
for (i = 0; i < n / 2; i++)
swap(int, a[i], a[n - i - 1]);
}
int main(void)
{
int i;
int *x; /* 배열 첫 번째 요소의 포인터 */
int nx; /* 배열 x의 요소 개수 */
printf("요소 개수 : ");
scanf("%d", &nx);
x = calloc(nx, sizeof(int)); /* 요소 개수가 nx인 int형 배열 x를 생성 */
printf("%d개의 정수를 입력하세요.\n", nx);
for (i = 0; i < nx; i++) {
printf("x[%d] : ", i);
scanf("%d", &x[i]);
}
ary_reverse(x, nx); /* 배열 x의 요소를 역순으로 정렬 */
printf("배열의 요소를 역순으로 정렬했습니다.\n");
for (i = 0; i < nx; i++)
printf("x[%d] = %d\n", i, x[i]);
free(x); /* 배열 x를 해제 */
return 0;
}
/* 정수를 2진수 ~ 36진수로 기수 변환 */
#include <stdio.h>
/*--- 정수 값 x를 n진수로 변환하여 배열 d에 아랫자리부터 저장 ---*/
int card_convr(unsigned x, int n, char d[])
{
char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int digits = 0; /* 변환 후 자릿수 */
if (x == 0) /* 0이면 */
d[digits++] = dchar[0]; /* 변환 후에도 0 */
else
while (x) {
d[digits++] = dchar[x % n]; /* n으로 나눈 나머지를 저장 */
x /= n;
}
return digits;
}
int main(void)
{
int i;
unsigned no; /* 변환하는 정수 */
int cd; /* 기수 */
int dno; /* 변환 후 자릿수 */
char cno[512]; /* 변환한 값의 각 자리의 숫자를 저장하는 문자 배열 */
int retry; /* 한 번 더? */
puts("10진수를 기수 변환합니다.");
do {
printf("변환하는 음이 아닌 정수 : ");
scanf("%u", &no);
do {
printf("어떤 진수로 변환할까요? (2-36) : ");
scanf("%d", &cd);
} while (cd < 2 || cd> 36);
dno = card_convr(no, cd, cno); /* no를 cd진수로 변환 */
printf("%d진수로는", cd);
for (i = dno - 1; i >= 0; i--) /* 윗자리부터 차례로 출력 */
printf("%c", cno[i]);
printf("입니다.\n");
printf("한 번 더 할까요? (1 … 예 /0 … 아니오) : ");
scanf("%d", &retry);
} while (retry == 1);
return 0;
}
윤년이란?
: 4년에 한 번씩 2월 29일이 생김, 실제로 지구가 태양을 한 바퀴 도는데 정확히 365.2422일이 걸리기 때문.
윤년의 주기
윤년을 구하는 방법
- 4의 배수에서 100의 배수를 제외
- 여기에 다시 400의 배수를 포함
한 해의 지난 날 수를 계산
ex) 2017년 4월 15일의 경우
1월 + 2월 + 3월 + 15 => 105일 째
/* 한 해의 지난 날 수를 구합니다. */
#include <stdio.h>
/*- 각 달의 날 수 -*/
int mdays[][12] = {
{ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 },
{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
};
/*--- year년이 윤년인가? ---*/
int isleap(int year)
{
return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}
/*--- y년 m월 d일의 그 해 지난 날 수를 구합니다. ---*/
int dayofyear(int y, int m, int d)
{
int i;
int days = d; /* 날 수 */
for (i = 1; i < m; i++)
days += mdays[isleap(y)][i - 1];
return days;
}
int main(void)
{
int year, month, day; /* 년, 월, 일 */
int retry; /* 다시? */
do {
printf("년 : "); scanf("%d", &year);
printf("월 : "); scanf("%d", &month);
printf("일 : "); scanf("%d", &day);
printf("%d년의 %d일째입니다.\n", year, dayofyear(year, month, day));
printf("다시 할까요? (1 … 예/0 … 아니오) : ");
scanf("%d", &retry);
} while (retry == 1);
return 0;
}
구조체란?
타입이 다른 데이터를 하나로 묶는 것!
구조체의 배열
구조체를 배열로 묶음
/* 신체검사 데이터용 구조체 배열 */
#include <stdio.h>
#define VMAX 21 /* 시력 최대 2.1 × 10 */
/*--- 신체검사 데이터형 ---*/
typedef struct {
char name[20]; /* 이름 */
int height; /* 키 */
double vision; /* 시력 */
} PhysCheck;
/*--- 키의 평균값을 구합니다. ---*/
double ave_height(const PhysCheck dat[], int n)
{
int i;
double sum = 0;
for (i = 0; i < n; i++)
sum += dat[i].height;
return sum / n;
}
/*--- 시력 분포를 구합니다. ---*/
void dist_vision(const PhysCheck dat[], int n, int dist[])
{
int i;
for (i = 0; i < VMAX; i++)
dist[i] = 0;
for (i = 0; i < n; i++)
if (dat[i].vision >= 0.0 && dat[i].vision <= VMAX / 10.0)
dist[(int)(dat[i].vision * 10)]++;
}
int main(void)
{
int i;
PhysCheck x[] = {
{ "박현규", 162, 0.3 },
{ "함진아", 173, 0.7 },
{ "최윤미", 175, 2.0 },
{ "홍연의", 171, 1.5 },
{ "이수진", 168, 0.4 },
{ "김영준", 174, 1.2 },
{ "박용규", 169, 0.8 }
};
int nx = sizeof(x) / sizeof(x[0]); /* 사람 수 */
int vdist[VMAX]; /* 시력 분포 */
puts("■ □ ■ 신체검사 표 ■ □ ■");
puts(" 이름 키 시력 ");
puts("----------------------------");
for (i = 0; i < nx; i++)
printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision);
printf("\n 평균 키 : %5.1f cm\n", ave_height(x, nx));
dist_vision(x, nx, vdist); /* 시력 분포를 구합니다. */
printf("\n 시력 분포\n");
for (i = 0; i < VMAX; i++)
printf("%3.1f ~ : %2d명\n", i / 10.0, vdist[i]);
return 0;
}