티스토리 뷰

(문제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);

}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함