본문 바로가기
Computer Science/Data Structure

[자료구조] 1장 C언어 리뷰 (2)

by na1-4an 2023. 9. 10.

1. 세 개의 숫자 중에 가장 큰 수 찾기

– 세 개의 숫자를 키보드로 입력 받음

– 가장 큰 숫자를 찾아 화면으로 출력

: if문 사용 or 삼항 연산자 사

#include <stdio.h>

int main()
{
    int a, b, c;
    int max;
    
    scanf("%d %d %d", &a, &b, &c);
    max = ((a>b) & (a>c)) ? a : ((b>a) & (b>c)) ? b : c;
    printf("%d", max);
    return 0;
}

2. 입력받은 수를 역순으로 만들기

– 12345 → 54321

– while() 문장 사용

#include <stdio.h>

int main()
{
    int N;
    int r = 0;
    scanf("%d", &N);
    
    while(N != 0){
        r *= 10;
		r += N % 10;
		N /= 10;
    }
    
    printf("%d", r);
}

3. 두 수 사이의 소수 찾기

– 두개의 수를 입력 받음

– 두 수 사이의 소수를 화면에 출력

#include <stdio.h>
 
int main() {
    int low, high, i, flag;
    scanf("%d %d", &low, &high);
    if(low > high){
        int temp = low;
        low = high;
        high = temp;
    }
    printf("%d 와 %d 사이의 소수: ", low, high);
    
    while (low < high) {
        flag = 0;
        
        if (low <= 1) {
            ++low;
            continue;
        }
        
        for (i = 2; i <= low / 2; ++i) {
            if (low % i == 0) {
                flag = 1;
                break;
            }
        }
        
        if (flag == 0)
            printf("%d ", low);
        ++low;
    }
    
    return 0;
}

4. 두 행렬의 곱 구하기

– 두 행렬의 row, column을 입력 받음

– 두 행렬을 구성하는 요소의 값을 입력 받음

– 두 행렬을 곱하고 결과를 화면에 출력

– 배열 사용

#include <stdio.h>

int main() {
    int m, n, p, q;

    scanf("%d %d", &m, &n);

    scanf("%d %d", &p, &q);

    if (n != p) {
        printf("두 번째 행렬의 행 크기가 첫 번째 행렬의 열 크기와 일치해야 함.\n");
        return 1;
    }

    int matrix1[m][n], matrix2[p][q], result[m][q];

    printf("첫 번째 행렬 요소 입력\n");
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &matrix1[i][j]);
        }
    }

    printf("두 번째 행렬 요소 입력력\n");
    for (int i = 0; i < p; i++) {
        for (int j = 0; j < q; j++) {
            scanf("%d", &matrix2[i][j]);
        }
    }

    // 행렬 곱 계산
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < q; j++) {
            result[i][j] = 0;
            for (int k = 0; k < n; k++) {
                result[i][j] += matrix1[i][k] * matrix2[k][j];
            }
        }
    }

    printf("두 행렬의 곱 결과:\n");
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < q; j++) {
            printf("%d ", result[i][j]);
        }
        printf("\n");
    }

    return 0;
}

5. 문장에서 특정 문자의 출력 빈도 계산하기

– 문장을 입력 받음 (ex. English Advanced learner’s dictionary)

– 찾을 문자를 입력 받음 (ex. ‘a’) – 결과 출력 (ex. 3)

–배열을 사용하여 문장 저장할 것

#include <stdio.h>
#include <string.h>

int main() {
    char sentence[1000]; 
    char targetChar;
    int count = 0;

    printf("문장 입력: ");
    scanf("%99[^\n]", sentence); 

    printf("찾을 문자 입력: ");
    scanf(" %c", &targetChar); 
    
    for (int i = 0; i < strlen(sentence); i++) {
        if (sentence[i] == targetChar) {
            count++;
        }
    }

    printf("'%c' 문자의 출력 빈도: %d\n", targetChar, count);

    return 0;
}

6. 작성한 프로그램 소스 코드를 그대로 출력하는 프로그램 만들기

– 수행되는 프로그램의 소스 코드를 그대로 화면에 출력하기

#include <stdio.h>

int main() {
    FILE *file;
    char ch;

    file = fopen(__FILE__, "r");

    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    printf("현재 프로그램의 소스 코드:\n");

    while ((ch = fgetc(file)) != EOF) {
        putchar(ch);
    }

    fclose(file);

    return 0;
}

7. 배열의 원소를 포인터를 사용하여 접근하기

– 배열의 원소를 초기화

– 포인터를 사용하여 전체 원소 출력

#include <stdio.h>

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int *ptr = arr; // 배열의 첫 번째 원소를 가리키는 포인터


    printf("배열의 원소: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", *ptr);
        ptr++; 
    }
    printf("\n");

    return 0;
}

8. 함수 포인터를 사용하여 입력된 두 문자, 두 숫자 또는 두 문자열을 비교하 라

– 세 형태의 비교를 수행하는 함수 구현

– 세 함수를 함수 포인터로 선언하여 프로그램 초기화시 함수 포인터 연결

– 두 개의 문자, 숫자 또는 문자열을 입력 받음

– 타입에 따라 함수 포인터를 이용하여 적절한 비교 함수 호출

– 결과 출력

#include <stdio.h>
#include <string.h>

// 문자열 비교 함수
int compareStrings(const char *str1, const char *str2) {
    return strcmp(str1, str2);
}

// 숫자 비교 함수
int compareNumbers(int num1, int num2) {
    if (num1 < num2) return -1;
    else if (num1 > num2) return 1;
    else return 0;
}

// 문자 비교 함수
int compareChars(char char1, char char2) {
    if (char1 < char2) return -1;
    else if (char1 > char2) return 1;
    else return 0;
}

int main() {
    int choice;
    printf("(1: 문자열, 2: 숫자, 3: 문자): ");
    scanf("%d", &choice);

    if (choice == 1) {
        char str1[100], str2[100];
        printf("두 문자열 입력:\n");
        scanf("%s %s", str1, str2);

        // 함수 포인터를 문자열 비교 함수에 연결
        int (*compare)(const char *, const char *) = compareStrings;

        int result = compare(str1, str2);
        if (result < 0) printf("첫 번째 문자열이 작습니다.\n");
        else if (result > 0) printf("두 번째 문자열이 작습니다.\n");
        else printf("두 문자열이 같습니다.\n");
    } else if (choice == 2) {
        int num1, num2;
        printf("두 숫자를 입력하세요:\n");
        scanf("%d %d", &num1, &num2);

        // 함수 포인터를 숫자 비교 함수에 연결
        int (*compare)(int, int) = compareNumbers;

        int result = compare(num1, num2);
        if (result < 0) printf("첫 번째 숫자가 작습니다.\n");
        else if (result > 0) printf("두 번째 숫자가 작습니다.\n");
        else printf("두 숫자가 같습니다.\n");
    } else if (choice == 3) {
        char char1, char2;
        printf("두 문자를 입력하세요:\n");
        scanf(" %c %c", &char1, &char2);

        // 함수 포인터를 문자 비교 함수에 연결
        int (*compare)(char, char) = compareChars;

        int result = compare(char1, char2);
        if (result < 0) printf("첫 번째 문자가 작습니다.\n");
        else if (result > 0) printf("두 번째 문자가 작습니다.\n");
        else printf("두 문자가 같습니다.\n");
    } else {
        printf("잘못된 선택입니다.\n");
    }

    return 0;
}

9. 두 문자열을 입력 받아 연결 후 출력하기

– 배열 사용

#include <stdio.h>
#include <string.h>

int main() {
    char str1[100], str2[100], result[200]; // 두 입력 문자열과 연결 결과를 저장할 배열

    printf("첫 번째 문자열을 입력하세요: ");
    scanf("%s", str1);

    printf("두 번째 문자열을 입력하세요: ");
    scanf("%s", str2);

    // 두 문자열을 연결하여 result 배열에 저장
    strcpy(result, str1); // 첫 번째 문자열 복사
    strcat(result, str2); // 두 번째 문자열 연결

    printf("연결된 문자열: %s\n", result);

    return 0;
}

10. 시간을 표현하는 구조체를 선언하고 시간 차이 계산하기

– 마이크로 초(us), 밀리 초(ms)으로 구성된 시간 구조체 선언

– 두 개의 구조체 포인터 변수 선언

– 두 개의 구조체를 위해 동적 메모리 할당

– 프로그램을 시간할 때 시작 시간 구조체 초기화

– while(1000000); 백만번 빈 루프 수행

– 프로그램 종료 전에 종료 시간 구조체 세팅

– 시작과 종료사이에 걸린 시간을 계산해서 출력

– 사용이 끝난 동적 메모리 해제

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 시간을 저장하는 구조체 선언
struct Time {
    long us; // 마이크로 초
    long ms; // 밀리 초
};

int main() {
    // 두 개의 구조체 포인터 변수 선언
    struct Time *start_time, *end_time;

    // 두 개의 구조체를 위해 동적 메모리 할당
    start_time = (struct Time *)malloc(sizeof(struct Time));
    end_time = (struct Time *)malloc(sizeof(struct Time));

    if (start_time == NULL || end_time == NULL) {
        printf("메모리 할당 오류\n");
        return 1;
    }

    // 프로그램 시작 시간 구조체 초기화
    struct timespec start;
    clock_gettime(CLOCK_REALTIME, &start);
    start_time->us = start.tv_nsec / 1000;
    start_time->ms = start_time->us / 1000;

    // 백만번 빈 루프 수행
    long i;
    for (i = 0; i < 1000000; i++) {
        // 루프 내용은 비어있음
    }

    // 프로그램 종료 시간 구조체 세팅
    struct timespec end;
    clock_gettime(CLOCK_REALTIME, &end);
    end_time->us = end.tv_nsec / 1000;
    end_time->ms = end_time->us / 1000;

    // 시작과 종료 사이에 걸린 시간 계산
    long elapsed_us = end_time->us - start_time->us;
    long elapsed_ms = end_time->ms - start_time->ms;

    // 결과 출력
    printf("시작 시간: %ld us, %ld ms\n", start_time->us, start_time->ms);
    printf("종료 시간: %ld us, %ld ms\n", end_time->us, end_time->ms);
    printf("경과 시간: %ld us, %ld ms\n", elapsed_us, elapsed_ms);

    // 사용이 끝난 동적 메모리 해제
    free(start_time);
    free(end_time);

    return 0;
}

'Computer Science > Data Structure' 카테고리의 다른 글

[자료구조] 8장 BST  (0) 2023.12.16
[자료구조] 4장 스택  (0) 2023.10.16
[자료구조] 3장 Linked List  (0) 2023.10.15
[자료구조] 2장 자료구조 소개  (0) 2023.10.15
[자료구조] 1장 C언어 리뷰 (1)  (0) 2023.09.10