카테고리 없음

02 기본 자료구조 -1. 배열 (3)

홍콩판다 2019. 5. 6. 14:01

연습문제 Q1

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int minof(const int a[], int n)
{
	int i;
	int min = a[0];
	for (i = 1; i < n; i++)
	{
		if (a[i] < min)
		{
			min = a[i];
		}
	}
	return min;
}

int main()
{
	int *height;
	int n, i;
	printf("n 입력 : ");
	scanf("%d", &n);
	height = calloc(n, sizeof(int));

	srand((int)time(NULL));
	for (i = 0; i < n; i++)
	{
		height[i] = 140 + (rand() % 50);
		printf("%d ", height[i]);
		if ((i+1) % 5 == 0)
			printf("\n");
	}
	
	printf("\n 이 중 최솟값은 %d 입니다.", minof(height, n));

	return 0;
}

/*
n 입력 : 10
145 171 148 156 155
183 180 164 171 154

 이 중 최솟값은 145 입니다.
C:\Users\c\Study\Debug\ch02.exe(8164 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.

*/

Q2 합계 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int sumof(const int a[], int n)
{
	int i, sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += a[i];
	}
	return sum;
}

int main()
{
	int *height;
	int n, i;
	printf("n 입력 : ");
	scanf("%d", &n);
	height = calloc(n, sizeof(int));

	srand((int)time(NULL));
	for (i = 0; i < n; i++)
	{
		height[i] = 140 + (rand() % 50);
		printf("%d ", height[i]);
		if ((i+1) % 5 == 0)
			printf("\n");
	}
	
	printf("\n합계는 %d 입니다.", sumof(height, n));

	return 0;
}
/*
n 입력 : 10
154 155 162 156 179
164 141 186 151 145

합계는 1593 입니다.
C:\Users\c\Study\Debug\ch02.exe(7364 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.
*/

Q3 평균 구하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


double aveof(const int a[], int n)
{
	int i, sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += a[i];
	}
	return (double)sum / n;
}

int main()
{
	int *height;
	int n, i;
	printf("n 입력 : ");
	scanf("%d", &n);
	height = calloc(n, sizeof(int));

	srand((int)time(NULL));
	for (i = 0; i < n; i++)
	{
		height[i] = 140 + (rand() % 50);
		printf("%d ", height[i]);
		if ((i+1) % 5 == 0)
			printf("\n");
	}
	
	printf("\n평균은 %lf 입니다.", aveof(height, n));

	return 0;
}

/*
n 입력 : 10
143 177 182 175 148
154 159 173 189 173

평균은 167.300000 입니다.
C:\Users\c\Study\Debug\ch02.exe(2400 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.
*/

Q4 사람 수도 난수(5~20)로 생성하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>


double aveof(const int a[], int n)
{
	int i, sum = 0;
	for (i = 0; i < n; i++)
	{
		sum += a[i];
	}
	return (double)sum / n;
}

int main()
{
	int *height;
	int n, i;
	//printf("n 입력 : ");
	//scanf("%d", &n);
	srand((int)time(NULL));
	n = rand() % 15 + 5;
	printf("%d개의 키를 출력합니다.\n", n);
	height = calloc(n, sizeof(int));

	
	for (i = 0; i < n; i++)
	{
		height[i] = 140 + (rand() % 50);
		printf("%d ", height[i]);
		if ((i+1) % 5 == 0)
			printf("\n");
	}
	
	printf("\n평균은 %lf 입니다.", aveof(height, n));

	return 0;
}
/*
16개의 키를 출력합니다.
188 154 142 179 168
157 174 189 176 172
189 177 174 166 142
176
평균은 170.187500 입니다.
C:\Users\c\Study\Debug\ch02.exe(3436 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.
*/

Q5 배열을 역순으로 정렬하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define swap(type,x,y) do{type t=x;x=y;y=t;}while(0)

void ary_reverse(int a[], int n)
{
	int i,j;
	for (i = 0; i < n/2; i++)
	{
		printf("a[%d]=%d과 a[%d]=%d를 교환합니다.\n", i,a[i], n - i-1,a[n-i-1]);
		for (j = 0; j < n; j++)
		{
			printf("%d ", a[j]);
			
		}
		printf("\n");
		//swap(int, a[i], a[n - i]); 
		//i=0일때 a[n]은 존재하지 않아서 쓰레기값이 들어갔다
		swap(int, a[i], a[n - i-1]);

	}
}

int main()
{
	int *height;
	int n, i;
	//printf("n 입력 : ");
	//scanf("%d", &n);
	srand((int)time(NULL));
	n = rand() % 15 + 5;
	printf("%d개의 키를 출력합니다.\n", n);
	height = calloc(n, sizeof(int));

	
	for (i = 0; i < n; i++)
	{
		height[i] = 140 + (rand() % 50);
		printf("%d ", height[i]);
		if ((i+1) % 5 == 0)
			printf("\n");
	}
	printf("\n");
	
	ary_reverse(height, n);
	

	return 0;
}
/*
10개의 키를 출력합니다.
180 163 185 151 145
187 184 166 147 168

a[0]=180과 a[9]=168를 교환합니다.
180 163 185 151 145 187 184 166 147 168
a[1]=163과 a[8]=147를 교환합니다.
168 163 185 151 145 187 184 166 147 180
a[2]=185과 a[7]=166를 교환합니다.
168 147 185 151 145 187 184 166 163 180
a[3]=151과 a[6]=184를 교환합니다.
168 147 166 151 145 187 184 185 163 180
a[4]=145과 a[5]=187를 교환합니다.
168 147 166 184 145 187 151 185 163 180

C:\Users\c\Study\Debug\ch02.exe(7332 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.

7개의 키를 출력합니다.
189 169 140 155 140
157 179
a[0]=189과 a[6]=179를 교환합니다.
189 169 140 155 140 157 179
a[1]=169과 a[5]=157를 교환합니다.
179 169 140 155 140 157 189
a[2]=140과 a[4]=140를 교환합니다.
179 157 140 155 140 169 189

C:\Users\c\Study\Debug\ch02.exe(5488 프로세스)이(가) 0 코드로 인해 종료되었습니
다.
이 창을 닫으려면 아무 키나 누르세요.

*/

Q6 card_conv함수를 수정해서 배열을 윗자리부터 저장하는 함수

: 기존 방식으로 배열을 만든 뒤에 역순으로 재배열하는 방법..?

#include <stdio.h>
#define swap(type,a,b) do{type t=a;a=b;b=t;}while(0)

int card_convr(unsigned x, int n, char d[])
{
	char dchar[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int digits = 0;//
	if (x == 0)
	{
		d[digits++] = dchar[0];
	}
	else
	{
		while (x)
		{
			d[digits++] = dchar[x%n]; //n으로 나눈 나머지를 저장 
			x /= n; //n으로 나누기  
		}
	}

	int i;
	for (i = 0; i < digits / 2; i++)
	{
		swap(int, d[i], d[digits - i - 1]);
	}

	return digits;//자릿수를 반환(배열에 저장된 길이)
}

int main()
{
	int i;
	unsigned no;
	int cd;
	int dno;
	char cno[512];
	int retry;
	puts("10진수를 기수 변환합니다.");
	do {
		printf("변환할 음이 아닌 정수 : ");
		scanf_s("%u", &no);
		do {
			printf("어떤 진수로 변환할까요?(2-36)");
			scanf_s("%d", &cd);
		} while (cd < 2 || cd>36);
		dno = card_convr(no, cd, cno);//자릿수
		printf("%d진수로 변환하면 ", cd);

		//0부터 나열하도록 변경
		for (i = 0; i < dno; i++)
		{
			printf("%c", cno[i]);
		}
		printf("입니다.\n");
		printf("한 번 더 할까요?(1---예/0---아니오) : ");
		scanf_s("%d", &retry);
	} while (retry == 1);

	return 0;
}