#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){
srand(time(NULL));
int n, r, st, en, sum = 0;
printf("난수의 개수: ");
scanf("%d", &n);
printf("시작과 끝 : ");
scanf("%d %d", &st, &en);
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
printf("%d ", r);
sum += r;
}
printf("\n");
printf("sum=%d ", sum);
printf("avg=%d\n", sum / n);
}
(Lab 9-2)(1): 확률 계산(주사위)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){
srand(time(NULL));
int i, n, sum[7] = { 0 };
int r, st, en;
printf("주사위 횟수 : ");
scanf("%d", &n);
st = 1, en = 6;
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
sum[r]++;
}
for (i = 1; i < sizeof(sum)/sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i]*100./n); // %표시 -> %%
}
}
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){
srand(time(NULL));
int i, n, sum[7] = { 0 };
int r, st, en;
printf("주사위 횟수 : ");
scanf("%d", &n);
printf("정상적인 주사위\n");
st = 1, en = 6;
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
sum[r]++;
}
for (i = 1; i < sizeof(sum) / sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i] * 100. / n);
}
printf("\n이상한 주사위\n");
for (i = 0; i < sizeof(sum) / sizeof(int); i++) {
sum[i] = 0;
}
st = 0, en = 99; // 범위 0~99for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
if (r <= 9) r = 1;
elseif (r <= 19) r = 2;
elseif (r <= 29) r = 3;
elseif (r <= 39) r = 4;
elseif (r <= 49) r = 5;
else r = 6;
sum[r]++;
}
for (i = 1; i < sizeof(sum) / sizeof(int); i++) {
printf("%d : %d (%.2f%%)\n", i, sum[i], sum[i] * 100. / n);
}
}
(Lab 9-3): 모의 성적 데이터 발생1
- 단순히 0~100을 동일한 확률로 발생 -> 테스트 데이터로 적합하지 않음
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#include<time.h>intmain(){
int i, n, sum[9] = { 0 };
int r, st, en, hap = 0;
char* score[] = { "A+","A","B+","B","C+","C", "D+","D", "F" };
srand(time(NULL));
printf("학생 수 : ");
scanf("%d", &n);
st = 0, en = 100; // 100점은?for (i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
// r = rand() % 101;printf("%d ", r);
if (r >= 95) r = 0; //A+elseif (r >= 90) r = 1; //Aelseif (r >= 85) r = 2; //B+elseif (r >= 80) r = 3; //Belseif (r >= 75) r = 4; //C+elseif (r >= 70) r = 5; //Celseif (r >= 65) r = 6; //D+elseif (r >= 60) r = 7; //Delse r = 8; // F
sum[r]++;
hap += r;
}
printf("\n\n");
printf("n = %d 평균 = %.2f\n", n, (double)hap / n);
for (i = 0; i < 9; i++) {
printf("%-3s: %5d (%6.2f%%)\n",score[i], sum[i], sum[i] * 100. / n); // 형식 지정자 주의
}
}
(Lab 9-4):모의 성적 데이터 발생2 (성적 분포가 주어졌을 때 모의 데이터 발생시키기)
- 문자열을 앞에서부터 하나씩 보면서 '('와')'의 개수를 비교할 때 (의 개수가 항상 많거나 같아야 한다.
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<ctype.h>intmain(){
char buf[51];
int t, i, j, k, result = 1;
int c;
scanf("%d", &t);
//getchar();for (i = 0; i < t; i++) {
//gets(buf);// 이전에 getchar() 버퍼 비우기//gets_s(buf,sizeof(buf)); // 이전에 getchar()로 버퍼 비워야함scanf(" %[^\n]s", buf); // %앞에 공백 두어서 공백문자 무시해야함 or getchar()로 버퍼 비우기//scanf("%s", buf); // 이전에 버퍼 비울 필요 없음
result = 1;
k = 0;
for (j = 0; buf[j] != '\0'; j++) {
if (buf[j] == '(')
k++;
elseif (buf[j] == ')')
k--;
if (k < 0) {
result = 0;
break;
}
}
if (k != 0)
result = 0;
if (result)
printf("YES\n");
elseprintf("NO\n");
}
}
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<windows.h>#define MESG_LEN 100#define DELAY 50voiddelayPrint(char mesg[]){
for (int i = 0; i < strlen(mesg); i++) {
fprintf(stdout, "%c", mesg[i]);
fflush(stdout);
Sleep(DELAY); // milliseconds
}
printf("\n");
}
voidmain(){
char mesg[MESG_LEN];
printf("Type the message to be displayed in drawing a character: ");
gets(mesg);
if (strlen(mesg) < 2)
strcpy(mesg, "Welcome to the delayed printing world!");
delayPrint(mesg);
}
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int nplates[3]; // 탑에 몇개의 원판이 있는지 변수int tower[3][100]; // 어떤 원판들이 있는지 보관int count = 0;
//타워의 내용 초기화, start 위치에 n개의 원판(n~1)이 있다.voidinit_tower(int n, char start){
int i, tower_no;
//탑의 번호 A, B, C -> 0,1,2
tower_no = start - 'A';
//tower[][] 내용과 nplates[]를 초기화 한다// nplates[]에 원판의 수를 저장함for (i = 0; i < 3; i++) {
nplates[i] = 0;
if (i == tower_no)
nplates[i] = n;
}
//tower[0][0] ~ [0][3] = 4, 3, 2, 1 식으로 기억시킨다.for (i = n; i > 0; i--) {
tower[tower_no][n - i] = i;
}
}
//탑의 현재 상태 표시voidprint_tower(){
//tower[][] 내용을 보여준다 for (int i = 0; i < 3; i++) {
printf("%c: ", 'A' + i);
for (int j = 0; j < nplates[i]; j++)
printf("%d ", tower[i][j]);
printf("\n");
}
printf("\n");
printf("다음 Enter :");
getchar();
fflush(stdin); // 버퍼 완전히 비우기
}
voidmove_one(int n, char from, char to){
printf("\n원판 %d을 %c에서 %c로 옮긴다.\n", n, from, to);
// nplates[] 와 tower[][] 내용을 수정한다// from에서는 제일 위의 원판을 빼고// to 에는 제일 끝에 원판을 추가하고// nplates[] 값ㅇ르 감소/증가 한다.// 이동이 발생할 때 마다 print_tower() 호출int f = from - 'A';
int t = to - 'A';
tower[t][nplates[t]] = tower[f][nplates[f] - 1];
nplates[t]++;
nplates[f]--;
count++;
print_tower();
}
voidhanoi_tower(int n, char from, char tmp, char to){
if (n == 1)
move_one(1, from, to);
else {
hanoi_tower(n - 1, from, to, tmp);
move_one(n, from, to);
hanoi_tower(n-1, tmp, from, to);
}
}
voidmain(){
init_tower(4, 'A');
printf("초기 상태\n");
print_tower();
hanoi_tower(4, 'A', 'B', 'C');
printf("원판을 모두 옮겼습니다. \n");
printf("원판을 옮긴 횟수: %d\n", count);
}
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intfibo(int n){
int a, b, c;
a = 0;
b = 1;
if (n <= 1) {
return n;
}
else {
for (int i = 2; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
}
voidprint_fibo(int* p, int count){
for (int i = count; i >= 0; i--)
printf("%d ", p[i]);
printf("\n");
}
voidmain(){
int t, n, sum, j;
int size = 10, count;
int* p;
scanf("%d", &t);
for (int i = 0; i < t; i++) {
sum = 0;
count = 0;
size = 10;
p = (int*)malloc(sizeof(int) * size);
scanf("%d", &n);
while (sum != n) {
j = 0;
while (fibo(j) <= (n - sum) )
j++;
j--;
if (count >= size) {
size *= 2;
p = (int*)realloc(p, sizeof(int)*size);
}
p[count++] = fibo(j);
sum += fibo(j);
}
print_fibo(p, count-1);
}
}
(Lab 7- ACM2(1))
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>voidfind_henry(int a, int b);
intmain(){
int nT, a, b;
scanf("%d", &nT);
for (int i = 0; i < nT; i++) {
scanf("%d %d", &a, &b);
find_henry(a, b);
}
}
voidfind_henry(int a, int b){
if (a == 1) {
printf("%d\n", b);
return;
}
else {
int x = (b + a - 1) / a;
a = a * x - b;
b = b * x;
find_henry(a, b);
}
}
(Lab 7- ACM2(2))
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>voidfind_henry(int a, int b);
intmain(){
int nT, a, b;
scanf("%d", &nT);
for (int i = 0; i < nT; i++) {
scanf("%d %d", &a, &b);
printf("%d/%d = ", a, b);
find_henry(a, b);
}
}
voidfind_henry(int a, int b){
if (a == 1) {
printf("1/%d\n", b);
return;
}
else {
int x = (b + a - 1) / a;
printf("1/%d + ", x);
a = a * x - b;
b = b * x;
find_henry(a, b);
}
}
intisPrime(int n){
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return0;
return1;
}
(Lab 5-1) 화면과 같이 2 ~ 100 까지 수 중에서 솟수(1과 자기 자신 외에 약수가 없는 수)를 모두 출력하고, 그 소수들의 합을 구하는 프로그램을 작성하시오. 솟수인지 아닌지 판단하는 함수 isPrime(int n)을 작성해서 이용할 것. isPrime(int n) 는 n이 솟수이면 1, 솟수가 아니면 0을 return 한다.
#include<stdio.h>intisPrime(int n){
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return0;
return1;
}
voidmain(){
int i, sum = 0;
for (i = 2; i <= 100; i++) {
if (isPrime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("sum=%d\n", sum);
}
+범위를 입력받을경우
입력받은 값이 2보다 작을 경우 기존 함수의 경우 ~ 1 도 소수 인정하기 때문에 if ( n < 2) return 0; 을 추가해야함
n1 > n2일 경우 n1과 n2의 값을 바꿔줘야 함
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>voidswap(int* a, int* b);
intisPrime(int n);
voidmain(){
int i, sum = 0, n1, n2, temp;
printf("소수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예: 2 100): ");
scanf("%d %d", &n1, &n2);
if (n1 > n2) { // n1의 값이 n2의 값보다 클 경우swap(&n1, &n2);
}
for (i = n1; i <= n2; i++) {
if (isPrime(i)) {
printf("%d ", i);
sum += i;
}
}
printf("\n");
printf("sum((%d ~ %d)의 소수 합)=%d\n", n1, n2, sum);
}
voidswap(int* a, int* b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
intisPrime(int n){
if (n < 2) return0; // n이 2보다 작으면 소수가 아니므로 0을 반환for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return0;
return1;
}
01-1.합성수 구하기 (<-> 소수)
합성수: 약수가 3개 이상인 자연수, 즉 1과 자기 자신 외에도 다른 약수를 가지는 자연수
intisComposite(int n){
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return1;
return0;
}
02. 완전수 찾기 (+ 동적 할당 활용해보기)
완전수: 자기 자신을 제외한 약수(진 약수)의 합이 자기 자신과 같은 자연수
과정
1~ n/2 사이의 수 중에서 n의 약수이면 sum에 더한다
sum == n 이면 완전수 임
어떤 수가 완전수인지 판단하는 것 + 완전수의 공약수 출력 문제: 화면과 같이 출력하려면? 6 = 1+2+3 ->약수들을 int divisors[]에 보관한다.
(Lab 5-2) 완전수란 어떤 정수의 약수를 모두 더했을 때 자기 자신과 같은 수를 말한다. 예를 들어 6의 약수 1, 2, 3을 더하면 6으로 정수 자신이 되는 수이다. 다음 화면과 같이 1 ~ 10,000 사이의 수 중에서 완전수를 구해서 출력하는 프로그램을 작성하시오. (화면과 같이 나와야 함)
#include<stdio.h>#define SIZE 100voidprint_array(int divisor[], int count);
voidmain(){
int i, j, sum, temp;
int divisor[SIZE], count = 0;
for (i = 1; i <= 10000; i++) {
sum = 0;
for (j = 1; j <= i / 2; j++) {
if (i % j == 0){
sum += j;
}
}
if (i == sum) {
for (j = 1, count = 0; j <= i / 2; j++) {
if (i % j == 0)
divisor[count++] = j;
}
printf("%d = ", i);
print_array(divisor, count);
}
}
}
voidprint_array(int divisor[], int count){
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력printf("+ ");
}
printf("\n");
}
함수로 정리
#include<stdio.h>#define SIZE 100intsum_properdivisor(int n);
intinsert_divisor(int* divisor, int n);
voidprint_array(int divisor[], int count);
voidmain(){
int i, j, sum, temp;
int divisor[SIZE], count = 0;
for (i = 1; i <= 10000; i++) {
sum = sum_properdivisor(i);
if (i == sum) {
count = insert_divisor(divisor, i);
printf("%d = ", i);
print_array(divisor, count);
}
}
}
intsum_properdivisor(int n){
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum;
}
intinsert_divisor(int* divisor, int n){
int count = 0;
for (int i = 1; i <= n / 2; i++)
if (n % i == 0)
divisor[count++] = i;
return count;
}
voidprint_array(int divisor[], int count){
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력printf("+ ");
}
printf("\n");
}
+범위를 입력 받는 경우
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#define SIZE 100voidswap(int* a, int* b);
voidprint_array(int divisor[], int count);
voidmain(){
int i, j, sum, temp;
int n1, n2;
int divisor[SIZE], count = 0;
printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
scanf("%d %d", &n1, &n2);
if (n1 < 1 || n2 < 1) { // 값이 1미만일 경우return;
}
if (n1 > n2) { //n1의 값이 n2의 값보다 클 경우swap(&n1, &n2);
}
for (i = n1; i <= n2; i++) {
sum = 0;
for (j = 1; j <= i / 2; j++) {
if (i % j == 0){
sum += j;
}
}
if (i == sum) {
for (j = 1, count = 0; j <= i / 2; j++) {
if (i % j == 0)
divisor[count++] = j;
}
printf("%d = ", i);
print_array(divisor, count);
}
}
}
voidswap(int* a, int* b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
voidprint_array(int divisor[], int count){
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력printf("+ ");
}
printf("\n");
}
함수로 정리
#include<stdio.h>#define SIZE 100voidswap(int* a, int* b);
intsum_properdivisor(int n);
intinsert_divisor(int *divisor, int n);
voidprint_array(int *divisor, int count);
voidmain(){
int i, j, sum;
int n1, n2;
int divisor[SIZE], count;
printf("완전수를 구할 정수의 범위를 작은 수와 큰 수의 순서로 입력(예:1 10000): ");
scanf("%d %d", &n1, &n2);
if (n1 < 1 || n2 < 1) // 값이 1미만일 경우return;
if (n1 > n2) {
swap(&n1, &n2); //n1의 값이 n2의 값보다 클 경우
}
for (i = n1; i <= n2; i++) {
sum = sum_properdivisor(i);
if (i == sum) {
count = insert_divisor(divisor, i);
printf("%d = ", i);
print_array(divisor, count);
}
}
}
voidswap(int* a, int* b){
int temp;
temp = *a;
*a = *b;
*b = temp;
}
intsum_properdivisor(int n){
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
intinsert_divisor(int* divisor, int n){
int count = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
divisor[count++] = i;
}
return count;
}
voidprint_array(int *divisor, int count){
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1) // 마지막을 제외하고 + 출력printf("+ ");
}
printf("\n");
}
+ 동적할당
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>voidprint_array(int* divisor, int count);
intget_sum(int n);
voidmain(){
int i, j, sum, count;
int size = 10; // 초기 크기 설정int* divisor;
divisor = (int*)malloc(size * sizeof(int)); //for (i = 1; i <= 10000; i++) {
sum = get_sum(i);
if (i == sum) {
for (j = 1,count = 0; j <= i / 2; j++) {
if (i % j == 0) {
if (count >= size) { //
size *= 2;
divisor = (int*)realloc(divisor, size * sizeof(int));
}
divisor[count++] = j;
}
}
printf("%d = ", i);
print_array(divisor, count);
}
}
free(divisor);
}
intget_sum(int n){
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
voidprint_array(int* divisor, int count){
for (int i = 0; i < count; i++) {
printf("%d ", divisor[i]);
if (i < count - 1)
printf("+ ");
}
printf("\n");
}
03. e^x 근사치 계산하기
Lab 5-3) e^x 는 수학적으로 다음과 같이 기술할 수 있다.
n 값을 증가시키면서 의 근사치를 구하는 myexp(int x) 함수를 작성하시오. 의 근사값 오차 범위는 1/10,000,000 로 정하고 값을 구하시오. 즉, (n)번째 합과 (n-1)번째 합의 차이가 0.0000001 이하일 때 까지 n 값을 증가하면서 합을 구한다 (n>12~25 정도에서 끝남). 화면과 같이 ~ 값을 math.h 의 exp(x) 값을 호출하여 출력하고 myexp(x) 값을 출력하여 비교하시오.
#include<stdio.h>#include<math.h>doublemyexp(int x){
int i;
double term, sum, oldsum;
oldsum = 0.0;
sum = 1.0;
term = 1.0;
for (int i = 1; (sum - oldsum) > 0.0000001; i++) { // (sum – oldsum) > 0.0000001 일 때 까지 i를 증가시키면서
term *= (double)x / i; // term = 을 구한다.
oldsum = sum; // oldsum = sum 으로 기억하고
sum += term; // sum = sum + term 으로 누적 값을 구한다.
}
return sum;
}
voidmain(){
int i;
printf(" exp() : ");
for (i = 1; i <= 5; i++)
printf("%lf ", exp((double)i));
printf("\n");
printf("myexp() : ");
for (i = 1; i <= 5; i++)
printf("%lf ", myexp(i));
printf("\n");
}
04. 파일을 이용한 데이터 입/출력
2가지 방법이 있음
(커맨드 창) C:\>program < input.txt > output.txt
(Visual Studio) 에서 설정 방법: 속성 - 디버그 - 명령 인수 => < input.txt > output.txt
(Lab 5-4) 파일을 이용한 입/출력 처리. 두 정수를 입력받아 합과 곱을 출력하는 프로그램을 입력은 input.txt, 츨력은 output.txt 를 이용하여 처리. (입력/출력이 1 set 인 경우)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>voidmain(){
int x, y;
scanf("%d %d", &x, &y);
printf("%d %d\n", x + y, x * y);
}
(Lab 5-5) 파일 이용 입/출력, TEST CASE 가 T set인 경우, TEST 마다 입력 DATA는 1 set 인 경우.
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>voidmain(){
int i, n_test, x, y;
scanf("%d", &n_test);
for (i = 0; i < n_test ; i++) {
scanf("%d %d", &x, &y);
printf("%d %d\n", x + y, x * y);
}
}
(Lab 5-6) 정수 배열을 입력받아 총점, 최대값, 최소값을 출력하는 프로그램을 작성하시오. 입력과 출력은 다음과 같다. input.txt로 T 개의 test set 이 입력으로 주어지고 각각의 test case 에는 다시 k개의 정수가 주어진다. output.txt에는 매 test 마다 한줄씩 총점, 최대값, 최소값을 출력한다. (Hint: k개의 data를 입력받기 위해 malloc(k * sizeof(int)) 로 메모리를 할당 받고, free로 메모리를 반환하여야 함)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intfind_max(int* p, int n);
intfind_min(int* p, int n);
voidmain(){
int n_test, n_data, sum, min, max;
int* p = NULL;
scanf("%d", &n_test);
for (int i = 0; i < n_test; i++) {
sum = 0;
scanf("%d", &n_data);
p = (int*)malloc(sizeof(int)* n_data);
for (int j = 0; j < n_data; j++) {
scanf(" %d", &p[j]);
sum += p[j];
}
max = find_max(p, n_data);
min = find_min(p, n_data);
printf("%d %d %d\n", sum, max, min);
free(p);
}
}
intfind_max(int* p, int n){
int max = p[0];
for (int i = 1; i < n; i++) {
if (max < p[i])
max = p[i];
}
return max;
}
intfind_min(int* p, int n){
int min = p[0];
for (int i = 1; i < n; i++) {
if (min > p[i])
min = p[i];
}
return min;
}
(Lab 5-7) ACM 프로그래밍 대회 2014 예선문제. 호텔 객실 배정 프로그램. T 개의 입력, H, W, N 입력 (H: Hotel의 층수, W: 층당 객실수, N 번째 도착한 손님). 출력은 각 입력에 해당되는 방 번호.(별지참조)
(방법 1)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>intmain(){
int T, H, W, N;
int x, y;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &H, &W, &N);
if (W * H <= N) {
printf("수용 인원을 넘어섰습니다. \n");
continue;
}
y = N % H;
x = (N / H) + 1;
if (y == 0) {
y = H;
x = N / H;
}
printf("%d%02d\n", y, x);
}
}
(방법 2)
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>intmain(){
int T, H, W, N;
int** p = NULL;
int y, x;
scanf("%d", &T);
for (int i = 0; i < T; i++) {
scanf("%d %d %d", &H, &W, &N);
p = (int**)malloc(sizeof(int*) * H);
for (int j = 0; j < H; j++) {
p[j] = (int*)malloc(sizeof(int) * W);
}
for (int j = 0; j < H; j++) {
for (int k = 0; k < W; k++)
p[j][k] = (j + 1) * 100 + (k + 1);
}
y = (N - 1) % H;
x = (N - 1) / H;
printf("%d\n", p[y][x]);
for (int j = 0; j < H; j++) {
free(p[j]);
}
free(p);
}
}
01. 다음과 같이 배열 arr[10]에 데이터가 있다. print_array(), compute_avg(), find_max(), find_min() 함수는 각각 배열을 출력, 평균값을 계산해서 return, 배열의 최대값과 최소값을 구해서 return 하는 함수들이다. 함수들을 완성하여 화면과 같이 출력되도록 하시오.
#include<stdio.h>voidprint_array(int arr[], int n){
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
doublecompute_avg(int arr[], int n){
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return (double)sum / n;
}
intfind_max(int arr[], int n){
int max = arr[0];
for (int i = 1; i < n; i++) {
if (max < arr[i])
max = arr[i];
}
return max;
}
intfind_min(int arr[], int n){
int min = arr[0];
for (int i = 1; i < n; i++) {
if (min > arr[i])
min = arr[i];
}
return min;
}
voidmain(){
int arr[10] = { 10, 30, 5, 20, 44, 3, 100, 88, 9, 101 };
print_array(arr, 10);
printf("평균 = %lf\n", compute_avg(arr, 10));
printf("최대 = %d\n", find_max(arr, 10));
printf("최소 = %d\n", find_min(arr, 10));
}
02. 프로그램에서처럼 구조체를 선언하여 N개의 점들의 좌표가 주어졌다. 그 점들을 둘러싸는 최소 크기의 사각형의 두 점 좌표 P1, P2를 구하고 사각형의 면적을 구하는 프로그램을 완성하시오. (주의1) print_point() 함수는 좌표를 출력하는 함수이다. 화면과 main()에서 호출하는 형식을 참조할 것. (주의2) main() 부분은 주어진 변수만을 이용하여 프로그램 할 것. (변수 추가하지 말 것)
#include<stdio.h>#define N 4#define ABS(x) (((x)>0)?(x): -(x)) structPoint {int x;
int y;
};
voidprint_point(struct Point *p){
printf("(%d, %d)", (*p).x, p->y);
}
voidmain(){
structPointp[N] = { {1,2}, {6, 1}, {3,4}, {4,5} };
structPointP1, P2;int area; // 면적int i;
for (i = 0; i < N; i++) {
printf("p[%d] =", i);
print_point(&p[i]);
printf("\n");
}
P1.x = p[0].x;
P1.y = p[0].y;
P2.x = p[0].x;
P2.y = p[0].y;
for (int i = 1; i < N; i++) {
if (P1.x > p[i].x)
P1.x = p[i].x;
elseif (P2.x < p[i].x)
P2.x = p[i].x;
if (P1.y > p[i].y)
P1.y = p[i].y;
elseif (P2.y < p[i].y)
P2.y = p[i].y;
}
printf("P1="); print_point(&P1);
printf(" P2="); print_point(&P2);
area = (P2.x - P1.x) * (P2.y - P1.y);
printf(" 면적=%d\n", area);
}
01. 2차원 배열(2DNum)에 정수가 저장되어 있다고 가정한다. 우리가 가지고 있는 단 하나의 함수는 1차원 배열에 저장된 정수의 합을 구하는 int get_1Dsum(int array[], int size)라고 가정하자. 2차원 배열의 각 행에 대하여 get_1Dsum()을 호출하여 각 행의 합을 구한 후에, 이것들을 모두 합쳐서 전체 2차원 배열에 저장된 정수들의 합을 구하는 프로그램을 작성하시오. 2DNum 배열은 5x10 크기이며, 아래와 같이 정수가 저장되어 있다.
#include<stdio.h>#define ROWS 5#define COLS 10intget_1Dsum(int array[], int size){
int sum = 0;
for (int i = 0; i < size; i++) {
sum += array[i];
}
return sum;
}
intmain(){
int _2DNum[][COLS] = {
{10,21,32,43,54,65,76,87,98,109},
{20,31,42,53,64,75,86,97,108,119},
{30,41,52,63,74,85,96,107,118,129},
{40,51,62,73,84,95,106,117,128,139},
{50,61,72,83,94,105,116,127,138,149}
};
int sum_1D[ROWS], sum = 0;
for (int i = 0; i < ROWS; i++)
sum_1D[i] = get_1Dsum(_2DNum[i], COLS); // _2DNum[i]: i번째 열의 배열for (int i = 0; i < ROWS; i++)
sum += sum_1D[i];
printf("%d", sum);
}
02. 문자열의 배열을 인수로 받아서 아래와 같이 저장된 3개 문자열들(msgString)을 전부 출력하는 pr_str_array() 함수를 작성하여 프로그램을 완성하시오, pr_str_array 함수는 void pr_str_array(char **dp); 원형을 지닌다고 가정한다. A bad shearer never had a good sickle. A bad workman (always) balmes his tools. A bad thing never dies.
#include<stdio.h>voidpr_str_array(char** dp);
intmain(){
char* msgString[] = {
{"A bad shearer never had a good sickle."},
{"A bad workman (always) balmes his tools."},
{"A bad thing never dies."} };
pr_str_array(msgString);
}
voidpr_str_array(char** dp){
for (int i = 0; i < 3; i++) {
printf("%s\n", dp[i]); // *(dp+i)도 가능;
}
}