#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
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>
int main() {
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); // %표시 -> %%
}
}
(Lab 9-2)(2): 주사위 확률 조작
r = rand() % 100;
if (r <= 9) dice = 1;
else if (r <= 19) dice = 2;
else if (r <= 29) dice = 3;
else dice = 6;
- 확률을 조작하는 방법
1, 2, 3, 4, 5, 6을 구간으로 변경한다
1: 0~9
2: 10~19
3: 20~29
4: 30~39
5: 40~49
6: 50~99 (6: 50% 이상)
특정 확률로 조작하려는 값을 else 부분에 배치한다
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
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~99
for (int i = 0; i < n; i++) {
r = st + rand() % (en - st + 1);
if (r <= 9) r = 1;
else if (r <= 19) r = 2;
else if (r <= 29) r = 3;
else if (r <= 39) r = 4;
else if (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>
int main() {
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+
else if (r >= 90) r = 1; //A
else if (r >= 85) r = 2; //B+
else if (r >= 80) r = 3; //B
else if (r >= 75) r = 4; //C+
else if (r >= 70) r = 5; //C
else if (r >= 65) r = 6; //D+
else if (r >= 60) r = 7; //D
else 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>
int nplates[3]; // 탑에 몇개의 원판이 있는지 변수
int tower[3][100]; // 어떤 원판들이 있는지 보관
int count = 0;
//타워의 내용 초기화, start 위치에 n개의 원판(n~1)이 있다.
void init_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;
}
}
//탑의 현재 상태 표시
void print_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); // 버퍼 완전히 비우기
}
void move_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();
}
void hanoi_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);
}
}
void main() {
init_tower(4, 'A');
printf("초기 상태\n");
print_tower();
hanoi_tower(4, 'A', 'B', 'C');
printf("원판을 모두 옮겼습니다. \n");
printf("원판을 옮긴 횟수: %d\n", count);
}
(Lab7-ACM1)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
void find_fibos(int n);
int find_max_fibo(int n);
void main() {
int nT, num;
scanf("%d", &nT);
for (int i = 0; i < nT; i++) {
scanf("%d", &num);
find_fibos(num);
}
}
void find_fibos(int n) {
if (n == 1) {
printf("%d ", n);
return;
}
else {
int f;
f = find_max_fibo(n);
if (f == n) {
printf("%d ", f);
return;
}
else {
find_fibos(n - f);
printf("%d ", f);
}
}
}
int find_max_fibo(int n) {
int n0 = 0, n1 = 1, n2 = n0 + n1;
if (n == 0) return n0;
else if (n == 1) return n1;
else {
while (n2 <= n) {
n0 = n1;
n1 = n2;
n2 = n0 + n1;
}
return n1;
}
}
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int fibo(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;
}
}
void print_fibo(int* p, int count) {
for (int i = count; i >= 0; i--)
printf("%d ", p[i]);
printf("\n");
}
void main() {
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>
void find_henry(int a, int b);
int main() {
int nT, a, b;
scanf("%d", &nT);
for (int i = 0; i < nT; i++) {
scanf("%d %d", &a, &b);
find_henry(a, b);
}
}
void find_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>
void find_henry(int a, int b);
int main() {
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);
}
}
void find_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);
}
}
ctime()는 문자열 내에 '\n'을 포함시켜 자동 줄바꿈이 됨 -> 추가로 printf()에 '\n'을 적을 필요 없음
time_t 자료형(정수형)- 시간을 나타내는 변수를 사용할때 사용
clock_t 자료형(정수형)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <time.h>
int main() {
char* wday[] = { "일","월","화","수","목","금","토" };
time_t now;
time(&now); // 1970년 이후 1초 단위로 증가
printf("now = %llu\n", now);
//char* ctime(&now); // 시간을 문자열로 반환
printf("ctime() : %s", ctime(&now));
//struct tm* localtime(const time_t*);
struct tm* tp = localtime(&now);
printf("%d년 %d월 %d일 %s요일 %d시 %d분 %d초\n", tp->tm_year+1900, tp->tm_mon+1, tp->tm_mday,wday[tp->tm_wday], tp->tm_hour, tp->tm_min, tp->tm_sec);
}
#if 0
struct tm { /* a broken-down time */
int tm_sec; /* seconds after the minute: [0 - 60] */
int tm_min; /* minutes after the hour: [0 - 59] */
int tm_hour; /* hours after midnight: [0 - 23] */
int tm_mday; /* day of the month: [1 - 31] */
int tm_mon; /* months since January: [0 - 11] */
int tm_year; /* years since 1900 */
int tm_wday; /* days since Sunday: [0 - 6] */
int tm_yday; /* days since January 1: [0 - 365] */
int tm_isdst; /* daylight saving time flag: <0, 0, >0 */
};
#endif
int mystrlen(char* str) {
char* s = str;
while (*s)
s++;
return (s - str);
}
int mystrlen(char* str) {
char* s = str;
int count = 0;
while (*str++ != '\0') {
count++;
}
return count;
}
int mystrlen(char* str) {
char* s = str;
int len = 0;
while (s[len] != '\0')
len++;
return len;
}
int mystrcmp(char* s1, char* s2) {
unsigned char *p1 = (unsigned char *)s1; // 한글 고려 안하면 unsigned 빼면됨
unsigned char *p2 = (unsigned char *)s2; // unsigned char* 선언 대신, (unsigned char)*s1 방식 사용 가능
while (*p1 || *p2) {
if (*p1 < *p2)
return -1;
else if (*p1 > *p2)
return 1;
p1++;
p2++;
}
return 0;
}
int mystrcmp(char* s1, char* s2) // 한글 고려시, (unsigned char)s1[i]과 같은 방법 쓰면 됨
{
int len1, len2, i;
len1 = mystrlen(s1);
len2 = mystrlen(s2);
for (i = 0; i <= len1 && i <= len2; i++) {
if (s1[i] > s2[i])
return 1;
else if (s1[i] < s2[i])
return -1;
}
return 0;
}
char* mystrcpy(char* to, char* from) {
int i, len;
len = mystrlen(from);
for (i = 0; i <= len; i++) {
to[i] = from[i];
}
return to;
}
char* mystrcpy(char* to, char* from) {
char* fp = from;
char* tp = to;
while (*fp) {// *fp != '\0'도 가능
*tp++ = *fp++;
}
*tp = '\0';
return to;
}
char* mystrcat(char* to, char* from) {
while (*to) {
to++;
}
while (*from) {
*to++ = *from++;
}
*to = '\0';
}
char* mystrcat(char* to, char* from) {
int i, len1, len2;
len1 = mystrlen(to);
len2 = mystrlen(from);
for (i = 0; i <= len2; i++) {
to[len1 + i] = from[i];
}
}
void reverse(char to[], char from[]) {
unsigned char* p1 = (unsigned char *)to;
unsigned char* p2 = (unsigned char *)from;
int len = mystrlen(p2);
for (int i = 0; i < len; i++) {
if (p2[len - 1 - i] >= 0x80 && p2[len - 2 - i]) {
p1[i] = p2[len - 2 - i];
p1[i + 2] = p2[len - 1 - i];
i++;
}
else
p1[i] = p2[len - 1 - i];
}
}
void reverse(char* to, char* from)
{
char* p;
p = from + mystrlen(from) - 1; // from 의 끝으로 이동
while (p >= from) {
if (*p & 0x80) { // 한글인 경우
*to = *(p - 1); // two bytes씩 copy
*(to + 1) = *p;
to += 2; // two byte 씩 이동
p -= 2;
}
else { // 영문인 경우
*to = *p;
to++;
p--;
}
}
*to = '\0';
}
int isPrime(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
(Lab 5-1) 화면과 같이 2 ~ 100 까지 수 중에서 솟수(1과 자기 자신 외에 약수가 없는 수)를 모두 출력하고, 그 소수들의 합을 구하는 프로그램을 작성하시오. 솟수인지 아닌지 판단하는 함수 isPrime(int n)을 작성해서 이용할 것. isPrime(int n) 는 n이 솟수이면 1, 솟수가 아니면 0을 return 한다.
#include <stdio.h>
int isPrime(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
void main() {
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>
void swap(int* a, int* b);
int isPrime(int n);
void main() {
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);
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int isPrime(int n) {
if (n < 2) return 0; // n이 2보다 작으면 소수가 아니므로 0을 반환
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 0;
return 1;
}
01-1.합성수 구하기 (<-> 소수)
합성수: 약수가 3개 이상인 자연수, 즉 1과 자기 자신 외에도 다른 약수를 가지는 자연수
int isComposite(int n) {
for (int i = 2; i <= n / 2; i++)
if (n % i == 0)
return 1;
return 0;
}
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 100
void print_array(int divisor[], int count);
void main() {
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);
}
}
}
void print_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 100
int sum_properdivisor(int n);
int insert_divisor(int* divisor, int n);
void print_array(int divisor[], int count);
void main() {
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);
}
}
}
int sum_properdivisor(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
sum += i;
}
}
return sum;
}
int insert_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;
}
void print_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 100
void swap(int* a, int* b);
void print_array(int divisor[], int count);
void main() {
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);
}
}
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
void print_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 100
void swap(int* a, int* b);
int sum_properdivisor(int n);
int insert_divisor(int *divisor, int n);
void print_array(int *divisor, int count);
void main() {
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);
}
}
}
void swap(int* a, int* b) {
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int sum_properdivisor(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
int insert_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;
}
void print_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>
void print_array(int* divisor, int count);
int get_sum(int n);
void main() {
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);
}
int get_sum(int n) {
int sum = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0)
sum += i;
}
return sum;
}
void print_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>
double myexp(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;
}
void main()
{
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>
void main() {
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>
void main()
{
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>
int find_max(int* p, int n);
int find_min(int* p, int n);
void main(){
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);
}
}
int find_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;
}
int find_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>
int main() {
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>
int main() {
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>
void print_array(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
double compute_avg(int arr[], int n) {
int sum = 0;
for (int i = 0; i < n; i++) {
sum += arr[i];
}
return (double)sum / n;
}
int find_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;
}
int find_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;
}
void main() {
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))
struct Point {
int x;
int y;
};
void print_point(struct Point *p)
{
printf("(%d, %d)", (*p).x, p->y);
}
void main()
{
struct Point p[N] = { {1,2}, {6, 1}, {3,4}, {4,5} };
struct Point P1, 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;
else if (P2.x < p[i].x)
P2.x = p[i].x;
if (P1.y > p[i].y)
P1.y = p[i].y;
else if (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 10
int get_1Dsum(int array[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += array[i];
}
return sum;
}
int main() {
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>
void pr_str_array(char** dp);
int main() {
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);
}
void pr_str_array(char** dp) {
for (int i = 0; i < 3; i++) {
printf("%s\n", dp[i]); // *(dp+i)도 가능;
}
}