티스토리 뷰
(문제1) 다음 화면과 같이 sum=100으로 시작해서 입력된 수를 빼서 정확히 sum=0 이면 끝나는 프로그램을 작성하시오.
<실행화면 캡쳐>
<프로그램 코드>
// 프로그래밍랩
// 1주 - C 언어 복습
// Lab01-1 100에서 빼기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int n, sum = 100;
while (1)
{
printf("sum=%d ", sum);
if (sum == 0)
break;
printf("뺄 값 입력: ");
scanf_s("%d", &n);
sum -= n;
}
}
(문제2) oddsum1(n), oddsum2(n), oddsum3(n) 함수는 1 ~ n 까지 홀수만 더하여 그 값을 return 하는 함수이다. 주어진 main() 프로그램을 활용하여 (1) ~ (4) 까지 완성하시오.
(1) for 문만 사용해서 oddsum1() 구현
(2) while 문만 사용해서 oddsum2() 구현
(3) 재귀함수로 oddsum3() 구현
(4) 구현한 oddsum1() 함수를 이용하여 다음의 합 SUM 을 구하는 프로그램을 작성하시오
SUM = 1 + (1 + 3) + (1 + 3 + 5) + (1 + 3 + 5 + 7) + ............ + (1 + 3 + 5 + ..... + 99) = oddsum1(1) + oddsum1(3) + oddsum1(5) + ..... + oddsum1(99) |
---|
<실행화면>
<프로그램 코드>
// Lab01-2 홀수 합 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int oddsum1(int n)
{
int out = 0;
for (int i = 1; i <= n; i++)
if (i % 2 == 1)
out += i;
return out;
}
int oddsum2(int n)
{
int out = 0;
int i = 1;
while (i <= n)
{
if (i % 2 == 1)
out += i;
i++;
}
return out;
}
int oddsum3(int n)
{
if (n == 0)
return 0;
if (n % 2 == 1)
return n + oddsum3(n - 1);
else
return oddsum3(n - 1);
}
void main()
{
int n = 100;
int SUM = 0;
printf("(1) for oddsum1(%d) = %d\n", n, oddsum1(n));
printf("(2) while oddsum2(%d) = %d\n", n, oddsum2(n));
printf("(3) 재귀 oddsum3(%d) = %d\n", n, oddsum3(n));
// SUM 을 구한다.
for (int i = 1; i <= 99; i++)
{
if (i % 2 == 1)
SUM += oddsum1(i);
}
printf("(4) SUM = %d\n", SUM);
}
(문제3) 1월 1일이- 화면과 같이 월을 입력하면 그 달의 달력을 출력하는 프로그램을 작성하시오. (1월 ~ 12월 = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
<실행화면>
<프로그램 코드>
// Lab01-3
// 1월 1일이 월요일이라고 가정하고
// 입력한 월의 달력을 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int startday, i, month;
i = 1;
int m[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("출력 월을 입력 : ");
scanf_s("%d", &month);
int dayCalendar[12][5][7] = { 0 };
for (int z = 0; z < month; z++) // n월을 month까지 계산
{
startday = 1; // 매월 1일을 의미
for (int y = 0; y < 5; y++) // n주를 의미
{
for (int x = 0; x < 7; x++) // n요일을 의미
{
if (startday == 1) // 첫날 i좌표 입력
x = i;
dayCalendar[z][y][x] = startday++;
if (startday == m[z] + 1) // 해당월의 날을 초과할 시
{
i = ++x; // 다음 첫날의 요일좌표 i에 입력
break;
}
}
}
}
// 출력기
printf("일 월 화 수 목 금 토\n");
for (int y = 0; y < 5; y++)
{
for (int x = 0; x < 7; x++)
{
if (dayCalendar[month - 1][y][x] == 0)
printf(" ");
else
printf("%2d ", dayCalendar[month - 1][y][x]); // Q. 경고 C6385가 나오는데 이유를 모르겠습니다! <- 값이 없는 부분을 참조하기 때문.
}
printf("\n");
}
}
(문제4) 화면과 같이 두 정수를 교환하도록 swap() 함수를 작성하고 결과가 나오도록 프로그램을 완성하시오.
<실행화면>
<프로그램 코드>
// Lab01-4 x, y 서로 교환
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int* x, int* y)
{
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
void main()
{
int x = 100, y = 200;
printf("swap() 호출 전 x=%d y=%d\n", x, y);
swap(&x, &y);
printf("swap() 호출 후 x=%d y=%d\n", x, y);
}
(문제5) 주민등록번호의 앞부분 6자리를 문자열로 입력하여 년, 월, 일을 분리해서 출력하는 프로그램을 작성하시오. (단, 년도 2자리 기준은 다음과 같다)
00 ~ 21 : 2000년 ~ 2021년 (예: 000203 --> 2000년 2월 3일, 211225 --> 2021년 12월 25일)
22 ~ 99 : 1922년 ~ 1999년 (예: 220314 --> 1922년 3월 14일, 991203 --> 1999년 12월 3일)
<실행화면>
<프로그램 코드>
// 프로그래밍랩
// 1주 - C 언어 복습
// Lab01-5 : 생년월일 출력
// 년도가 00~21 --> 2000년 ~ 2021년
// 그렇지 않은 경우 1922년 ~ 1999년
// 입력 : 210720
// 출력 : 2021년 7월 20일
// 입력 : 221003
// 출력 : 1922년 10월 3일
// 입력 : 990102
// 출력 : 1999년 1월 2일
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int birthy, birthm, birthd;
char num[7];
while (true) {
printf("주민번호 앞자리 : ");
scanf("%s", num);
birthy = 10 * (num[0] - '0') + (num[1] - '0');
birthm = 10 * (num[2] - '0') + (num[2] - '0');
birthd = 10 * (num[4] - '0') + (num[5] - '0');
if (birthy >= 22 && birthy <= 99)
birthy += 1900;
else
birthy += 2000;
printf("%d년 %d월 %d일생입니다.\n", birthy, birthm+1, birthd);
}
return 0;
}
(문제6) 화면과 같이 (1) str1, str2를 입력하면 (2) str1과 str2를 교환하고 (3) str3에 str2를 복사하고 (4) str3에 빈칸을 포함해서 str1과 “ Computer Engineering”을 이어 붙이고 (5) str3를 str4로 뒤집어서 복사한 뒤 출력하는 프로그램을 string.h 함수들을 이용해서 완성하시오. len1 ~ len4 는 각각의 문자열의 길이 변수로 확인 차원에서 출력을 할 것. (주의: reverse() 함수는 문자열을 뒤집어 주기만 하며 그 안에서 프린트를 하지는 않는다. 한글 처리는 필요하지 않음)
<실행화면>
<프로그램 코드>
// Lab01-5 문자열 처리 strcpy, strcat 이용하고 reverse 만들기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void reverse(char *str4, char *str3) // 완성할 것
{
int i;
int len = strlen(str3);
for (i = 0; i < len; i++)
{
str4[i] = str3[len - i -1];
}
str[i] = NULL;
}
void main()
{
char str1[100];
char str2[100];
char str3[200];
char str4[100];
char temp[100];
int len1, len2, len3, len4;
//(1) 입력 scanf() 사용
printf("(1) 입력 str1: ");
scanf("%s", str1);
printf(" 입력 str2: ");
scanf("%s", str2);
//(2) 교환 후 출력 strcpy 사용
strcpy(temp, str1);
strcpy(str1, str2);
strcpy(str2, temp);
printf("(2) 교환 str1=%s str2=%s\n", str1, str2);
//결과 화면에 나온 길이 개수 출력
len1 = strlen(str1);
len2 = strlen(str2);
printf("len1=%d len2=%d\n", len1, len2);
//(3) 복사 후 출력 strcpy 사용
strcpy(str3, str2);
printf("(3) 복사 str3=%s\n", str3);
//(4) 이어 붙이기 후 출력 strcat 사용
strcat(str3, " ");
strcat(str3, str1);
strcat(str3, " Computer Engineering");
printf("(4) 이어붙이기 str3=%s\n", str3);
//결과 화면에 나온 길이 개수 출력
len3 = strlen(str3);
printf("len3=%d\n", len3);
//(5) 뒤집기 reverse(str4, str3) str3을 뒤집어서 str4에 저장받고 출력
reverse(str4, str3);
printf("(5) 뒤집기 str4=%s\n", str4);
//결과 화면에 나온 길이 개수 출력
len4 = strlen(str4);
printf("len4=%d\n", len4);
}
(문제7) 정수 x를 입력 받고 그 수를 뒤집은 수 y를 구하고 z는 y의 2배수(y*2)를 구해서 다음 화면과 같이 출력하는 프로그램을 작성하시오.
(주의, 문자열로 처리 하지 말 것, 출력만 하는 것이 아니라 y를 계산해야 함)
<실행화면>
<프로그램 코드>
// Lab01-7 숫자 뒤집고 2배수 구하기
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int x, y=0, z;
printf("정수 x 입력 : ");
scanf("%d", &x);
int len = 0;
for (int i = 1; i <= x; i*=10)
{
len = i;
}
for (int i = 1; i <= len; i*=10)
{
y += (x / (len/i)) * i;
x -= (x / (len / i)) * (len / i);
}
printf("\n");
z = 2 * y;
printf("뒤집은 수 y = %d 그 수의 2배 수 z = %d\n", y, z);
}
(문제8) 다음과 같이 배열 arr[10]에 데이터가 있다. print_array(), compute_avg(), find_max(), find_min() 함수는 각각 배열을 출력, 평균값을 계산해서 return, 배열의 최대값과 최소값을 구해서 return 하는 함수들이다. 함수들을 완성하여 화면과 같이 출력되도록 하시오.
<실행화면>
<프로그램 코드>
// Lab01-8 배열 처리 함수
#define _CRT_SECURE_NO_WARNINGS
#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)
{
double avg = 0.;
for (int i = 0; i < n; i++)
avg += arr[i];
avg /= n;
return avg;
}
int find_max(int* arr, int n)
{
int max = arr[0];
for (int i = 0; i < n; i++)
if (arr[i] >= max)
max = arr[i];
return max;
}
int find_min(int* arr, int n)
{
int min = arr[0];
for (int i = 0; i < n; i++)
if (arr[i] <= min)
min = arr[i];
return min;
}
void main() {
int arr[10] = { 12, 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));
}
(문제9) 프로그램에서처럼 구조체를 선언하여 N개의 점들의 좌표가 주어졌다. 그 점들을 둘러싸는 최소 크기의 사각형의 두 점 좌표 P1, P2를 구하고 사각형의 면적을 구하는 프로그램을 완성하시오.
(주의1) print_point() 함수는 좌표를 출력하는 함수이다. 화면과 main()에서 호출하는 형식을 참조할 것.
(주의2) main() 부분은 주어진 변수만을 이용하여 프로그램 할 것. (변수 추가하지 말 것)
(그림1은 첨부가 안됨)
<실행화면>
<프로그램 코드>
// Lab01-9 구조체
// 주어진 점들을 둘러싸는 최소 크기의 사각형의 좌표 P1, P2 구하고 면적을 출력
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 4
struct Point {
int x;
int y;
};
void print_point(struct Point* p) // 좌표를 (1, 1) 식으로 출력한다. 완성할 것
{
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++) {
// print_point() 사용하여 완성할 것
printf("p[%d]=", i);
print_point(&p[i]);
printf("\n");
}
// P1, P2를 구한다. 주어진 변수만 사용할 것.
P1 = P2 = p[1]; // P1, P2 초기화
for (i = 0; i < N; i++) // P1좌표 계산
{
if (p[i].x <= P1.x)
P1.x = p[i].x;
if (p[i].y <= P1.y)
P1.y = p[i].y;
}
for (i = 0; i < N; i++) // P2좌표 계산
{
if (p[i].x >= P2.x)
P2.x = p[i].x;
if (p[i].y >= P2.y)
P2.y = p[i].y;
}
for (i = 0; i < N; i++) // P2좌표 계산
{
if (p[i].x >= P2.x)
P2.x = p[i].x;
if (p[i].y >= P2.y)
P2.y = p[i].y;
}
printf("P1="); print_point(&P1); // 호출 형식을 참조해서 print_point() 함수를 완성할 것
printf(" P2="); print_point(&P2);
// 면적을 계산한다.
area = (P2.x - P1.x) * (P2.y - P1.y);
printf(" 면적=%d\n", area);
}