문제 1.
sum = 100에서 시작하여 입력받은 정수를 빼서 정확히 sum = 0이면 끝나는 프로그램을 작성하시오.
while문 + if문 조건을 통한 break
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main() {
int n, sum = 100;
while (1) {
printf("sum=%d ", sum);
if (sum == 0) {
break;
} else {
printf("뺄 값 입력: ");
scanf("%d", &n);
sum -= n;
}
}
}
문제 2.
oddsum1(n), oddsum2(n), oddsum3(n) 함수는 1 ~ n 까지 홀수만 더하여 그 값을 return 하는 함수이다. (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)
oddsum3 -> 짝수 입력시 홀수로 변환하여 재귀한다. (이 강의에서 계속 나올 테크닉이니 매우 중요)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int oddsum1(int n) // for loop
{
int sum = 0;
for (int i = 1; i <= n; i += 2) {
sum += i;
}
return sum;
}
int oddsum2(int n) // while loop
{
int i = 1, sum = 0;
while (i <= n) {
sum += i;
i += 2;
}
return sum;
}
int oddsum3(int n) // recursion
{
if (n == 1) return 1;
if (n % 2 == 0) --n;
return n + oddsum3(n - 2);
}
void main()
{
int n = 100;
int SUM = 0;
int i;
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 (i = 1; i <= n; i += 2) {
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)
seven_count가 7이 되면 개행한다. (일~월 -> 0~6이라고 생각하면 이해하기 쉽다.)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int startday = 0;
int i, month;
int seven_count = 0;
int m[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
printf("출력 월을 입력 : ");
scanf("%d", &month);
if (month == 1)
startday = 1;
else {
for (i = 0; i < month - 1; i++) {
startday += m[i];
}
startday = (startday + 1) % 7;
}
seven_count = startday;
printf("일 월 화 수 목 금 토 \n");
for (int i = 0; i < startday; i++) {
printf(" ");
}
for (i = 1; i <= m[month - 1]; i++) {
printf("%2d ", i);
if (++seven_count == 7) {
printf("\n");
seven_count = 0;
}
}
}
문제 4.
두 정수를 교환하는 swap()함수를 구현하시오.
포인터 변수로 받아야 한다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void swap(int * a, int * b)
{
int temp = *a;
*a = *b;
*b = 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월 2 5일)
22 ~ 99 : 1922년 ~ 1999년 (예: 220314 --> 1922년 3월 14일, 991203 --> 1999년 12월 3일)
atoi()를 통한 문자열 -> 정수 변환도 중요하지만, 아스키코드를 통한 변환 방법도 알아두자.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int birthy, birthm, birthd;
char num[7];
printf("주민번호 앞자리 : ");
scanf("%s", num);
birthy = (num[0] - '0') * 10 + (num[1] - '0');
birthm = (num[2] - '0') * 10 + (num[3] - '0');
birthd = (num[4] - '0') * 10 + (num[5] - '0');
if (birthy >= 22 && birthy <= 99)
printf("19%d년 ", birthy);
else
printf("20%d년 ", birthy);
printf("%d월 %d일생입니다.", birthm, birthd);
}
문제 6.
다음과 같이 (1) str1, str2를 입력하면 (2) str1과 str2를 교환하고 (3) str3에 str2를 복사하고 (4) str3에 빈칸을 포함해서 str1과 “ Computer Engineering”을 이어 붙이고 (5) str3를 str4로 뒤집어서 복사한 뒤 출력하는 프로그램을 string.h 함수들을 이용해서 완성하시오. len1 ~ len4 는 각각의 문자열의 길이 변수로 확인 차원에서 출력을 할 것. (주의: reverse() 함수는 문자열을 뒤집어 주기만 하며 그 안에서 프린트를 하지는 않는다. 한글 처리는 필요하지 않음)
string.h의 사용법을 복습하는 문제. 나아가 string.h의 주요 함수를 포인터를 통해 구현해보아야 한다. (시험에 꽤 나옴)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void reverse(char* c1, char* c2, int len) // 완성할 것
{
for (int i = 0; i < len; i++)
c1[i] = c2[len - 1 - i];
c1[len] = '\0';
}
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);
len1 = strlen(str1);
len2 = strlen(str2);
printf("(2) 교환 str1=%s str2=%s\n", str1, str2);
printf("len1=%d len2=%d\n", strlen(str1), strlen(str2));
//(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, strlen(str3));
printf("(5) 뒤집기 str4=%s\n", str4);
len4 = strlen(str4);
printf("len4=%d", len4);
}
문제 7.
정수 x를 입력 받고 그 수를 뒤집은 수 y를 구하고 z는 y의 2배수(y*2)를 구해서 다음 화면과 같이 출력하는 프로그램을 작성하시오.
(주의, 문자열로 처리 하지 말 것, 출력만 하는 것이 아니라 y를 계산해야 함)
10으로 나눈 나머지를 통해 숫자를 뒤집는 테크닉
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void main()
{
int x, y = 0, z;
printf("정수 x 입력 : ");
scanf("%d", &x);
y = x % 10;
x /= 10;
while (x != 0) {
y = 10 * y + x % 10;
x /= 10;
}
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 하는 함수들이다. 함수들을 완성하여 다음과 같이 출력되도록 하시오.
반복문을 통해 배열의 처음부터 끝까지 돌면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void print_array(int* arr, int len)
{
for (int i = 0; i < len; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
double compute_avg(int* arr, int len)
{
double avg = 0;
for (int i = 0; i < len; i++) {
avg += arr[i];
}
return avg / len;
}
int find_max(int* arr, int len)
{
int max = -1 * 2147483647;
for (int i = 0; i < len; i++) {
max = max < arr[i] ? arr[i] : max;
}
return max;
}
int find_min(int* arr, int len)
{
int min = 2147483647;
for (int i = 0; i < len; i++) {
min = min > arr[i] ? arr[i] : min;
}
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));
}
문제 9.
프로그램에서처럼 구조체를 선언하여 N개의 점들의 좌표가 주어졌다. 그 점들을 둘러싸는 최소 크기의 사각형의 두 점 좌표 P1, P2를 구하고 사각형의 면적을 구하는 프로그램을 완성하시오.
(주의1) print_point() 함수는 좌표를 출력하는 함수이다. 화면과 main()에서 호출하는 형식을 참조할 것.
(주의2) main() 부분은 주어진 변수만을 이용하여 프로그램 할 것. (변수 추가하지 말 것)
구조체로 좌표를 만든다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define N 4
typedef struct Point {
int x;
int y;
}pt;
void print_point(pt * p) // 좌표를 (1, 1) 식으로 출력한다. 완성할 것
{
pt a = *p;
printf("(%d, %d)", a.x, a.y);
}
void main()
{
pt p[N] = { {1, 2}, {6, 1}, {3, 4}, {4, 5} };
pt P1 = { 10,10 }, P2 = { -1, -1 };
int area; // 면적
int i;
// 모든 점들을 출력한다.
for (i = 0; i < N; i++) {
printf("p[%d]=", i);
print_point(&p[i]);
printf("\n");
}
// P1, P2를 구한다. 주어진 변수만 사용할 것.
for (i = 0; i < N; i++) {
P1.x = P1.x < p[i].x ? P1.x : p[i].x;
P2.x = P2.x > p[i].x ? P2.x : p[i].x;
P1.y = P1.y < p[i].y ? P1.y : p[i].y;
P2.y = P2.y > p[i].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);
}
'대학교 > 프로그래밍랩' 카테고리의 다른 글
[프로그래밍 랩] 6주차 - 행렬, 구조체, 포인터 (0) | 2021.10.07 |
---|---|
[프로그래밍 랩] 5주차 - 난수, 확률, 통계 (0) | 2021.09.30 |
[프로그래밍 랩] 4주차 - 재귀 (0) | 2021.09.26 |
[프로그래밍 랩] 3주차 - 실행 시간 (0) | 2021.09.18 |
[프로그래밍 랩] 2주차 - C언어 복습 2 (0) | 2021.09.11 |