[c] 알고리즘 - 배열과 구조체

mj·2022년 4월 23일
0

[C] 알고리즘

목록 보기
4/20

1. 배열 요소의 최댓값 구하기

/* 배열 요소의 최댓값을 구합니다(값을 입력합니다). */
#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;
}




2. 배열 요소를 역순으로 정렬

/* 배열 요소를 역순으로 정렬합니다. */
#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;
}




3. 기수 변환

/* 정수를 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. 1000 이하의 소수의 나열

  • 소수의 정의
    1과 자기 자신만으로 나누어 떨어지는 1보다 큰 양의 정수

https://velog.io/@from-minju/c-소수-구하기-알고리즘




5. 한 해의 지난 날 수를 계산하는 프로그램

  • 윤년이란?
    : 4년에 한 번씩 2월 29일이 생김, 실제로 지구가 태양을 한 바퀴 도는데 정확히 365.2422일이 걸리기 때문.

  • 윤년의 주기

  1. 연수가 4로 나누어 떨어지는 해는 윤년
  2. 연수가 100으로 나누어 떨어지는 해는 평년
  3. 연수가 400으로 나누어 떨어지는 해는 윤년
  • 윤년을 구하는 방법
    - 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;
}




6. 구조체

  • 구조체란?
    타입이 다른 데이터를 하나로 묶는 것!

  • 구조체의 배열
    구조체를 배열로 묶음

/* 신체검사 데이터용 구조체 배열 */
#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;
}
profile
일단 할 수 있는걸 하자.

0개의 댓글