대학교/프로그래밍랩

[프로그래밍 랩] 1주차 - C언어 복습 1

CodeJin 2021. 9. 10. 18:17

문제 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.

11일이 월요일이라고 가정하고 다음과 같이 월을 입력하면 그 달의 달력을 출력하는 프로그램을 작성하시오. (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 --> 200023, 211225 --> 2021122 5)

22 ~ 99 : 1922~ 1999(: 220314 --> 1922314, 991203 --> 1999123)

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) str1str2를 교환하고 (3) str3str2를 복사하고 (4) str3에 빈칸을 포함해서 str1“ Computer Engineering”을 이어 붙이고 (5) str3str4로 뒤집어서 복사한 뒤 출력하는 프로그램을 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를 구하고 zy2배수(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);
}