본문 바로가기

카테고리 없음

2024000066 15주차 수업시간과제

출처-한성현 교수님의 수업ppt

c언어를 하려면 4가지를 알아야한다.

연선자는 우선순위와 결합성이 있는데,여러 연산자가 있을떄 우선으로 처리하는 연산자. 왼쪽에서 오른쪽으로감.

구두점은 10가지 정도가 있고, c언어의 토큰을 구분하는 역할을 한다.

여기서 문제가 나옴. 선언.호출,정의의 영어이름도 외워야한다. parameter, argument, prototype 등

c언어 기본적인틀

10 출력 *기본

c언어 기본.  규칙, 리터럴, 자료형, 변수등

#include <stdio.h>
int main(void)
{
int num1, num2;
num1 = 100;
num2 = 95;
printf("두 수의 합은 %d입니다.\n", num1 + num2);
return 0;
}

두 수의 합

#include <stdio.h>
int main(void)
{
int num1, num2, sum;
double avg;
num1 = 100;
num2 = 95;
sum = num1 + num2;
avg = sum / 2.0; //자동 형변환, 2로 나누면?
printf("합: %d, 평균: %lf\n", sum, avg); //%.2f
return 0;
}(자동형변환, 나누기)

자동형 변환-> 자료형이 다를떄는 두 수중 더 큰 자료형으로 자동으로 바뀌게 된다.

키보드로 2개의 수를 받아 작동시키는것. 중요한것은 앞에 #define 선언을 하고, scanf에 & (주소연산자) 를 써야한다.

성적처리 예제, 2가지를 키보드로 받고, 합과 평균을 내는 소스이다.

2명의 각 과목의 총점, 평균, 과목별 평균 소스이다.

변수, 배열

배열을 쓸떄는 7번까지라면, 1번방이 0이기에, 6번까지 인다.(n-1)

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int i, num[5], kor[5], eng[5], mat[5], total[5];
double avgkor = 0.0, avgeng = 0.0, avgmat = 0.0;
double avg[5];
for (i = 0; i < 5; i++) {
printf("%d번째 학생의 학번=", i + 1);
scanf("%d", &num[i]);
printf("국어 점수="); scanf("%d", &kor[i]);
printf("영어 점수="); scanf("%d", &eng[i]);
printf("수학 점수="); scanf("%d", &mat[i]);
total[i] = kor[i] + eng[i] + mat[i]; //각 학생의 총점
avg[i] = total[i] / 3.0; //각 학생의 평균
avgkor = avgkor + kor[i]; //국어 점수 누적
avgeng = avgeng + eng[i]; //영어 점수 누적
avgmat = avgmat + mat[i]; //수학 점수 누적
}
printf(" 학번 국어 영어 수학 총점 평균\n");
for (i = 0; i < 5; i++) {
printf("%8d %6d %6d %6d %6d %7.2f\n", num[i], kor[i], eng[i], mat[i], total[i], avg[i]);
}
printf(" 국어 평균: %7.2f\n 영어 평균: %7.2f\n 수학 평균: %7.2f\n", avgkor / 5., avgeng / 5., avgmat / 5.);
return 0;
}

 

배열을 추가한 위쪽의 소스

컨트롤h를 누루면, 내가 바꾸고싶을떄 명 수를 바꿀수 있다. (모두 바꾸기가능.)5명인데->3명으로 바꿀 수 있다. 배열크기변경.

배열은 같은형의 자료형만 저장할 수 있지만, 구조체는 서로다른 자료형을 저장할 수 있는 가장 고급 문법이다(좋은거)

구조체 라는것은 내가 원하는 자료형을 만들어서 사용하는것이다.

구조체 만들떈, struct 변수이름{}; 

이렇게쓴다.

구조체로 자료형 만들기. 항상 struct 뒤에 마지막 세미클론 잊지 않기(struct{};)

구조체의 멤버와, 구조체 선언 명칭.

{}; 안에 들어가는것이 멤버,  struct Man 이 선언.

 

구조체도 자료형이기에, 배열로 만들 수 있다.

구조체 초기화.구조체도 순서대로 초기화 되다가, 순서가 이상해지면 0으로 초기화 된다.

구조체의 장점= 멤버들을 다 복사하여 편리하다.

구조체에서 대입을 하면 모두 복사가 된다(시험에 나온다.)

이소스 제대로 보기. 가장 중요하고, 배점이크다

구조체를 활용한 배열은 한번만 쓰면된다. man[i]에서 i에0~4까지 누적하며 하나씩 찍힌다.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

// 학생의 성적을 저장할 구조체 정의
struct Grade {
    int num;        // 학번
    int kor;        // 국어 점수
    int eng;        // 영어 점수
    int mat;        // 수학 점수
    int total;      // 총점
    double avg;     // 평균 점수
};

int main(void) {
    int i;
    struct Grade man[5]; // 5명의 학생 성적을 저장할 배열
    double avgkor = 0.0, avgeng = 0.0, avgmat = 0.0; // 과목별 점수 누적 변수

    // 5명의 학생 정보를 입력받음
    for (i = 0; i < 5; i++) {
        printf("%d번째 학생의 학번=", i + 1);
        scanf("%d", &man[i].num); // 학번 입력
        printf("국어 점수="); scanf("%d", &man[i].kor); // 국어 점수 입력
        printf("영어 점수="); scanf("%d", &man[i].eng); // 영어 점수 입력
        printf("수학 점수="); scanf("%d", &man[i].mat); // 수학 점수 입력

        man[i].total = man[i].kor + man[i].eng + man[i].mat; // 각 학생의 총점 계산
        man[i].avg = man[i].total / 3.0; // 각 학생의 평균 점수 계산

        avgkor = avgkor + man[i].kor; // 국어 점수 누적
        avgeng = avgeng + man[i].eng; // 영어 점수 누적
        avgmat = avgmat + man[i].mat; // 수학 점수 누적
    }

    // 학생들의 성적 출력
    printf(" 학번 국어 영어 수학 총점 평균\n");
    for (i = 0; i < 5; i++) {
        printf("%8d %6d %6d %6d %6d %7.2f\n",
            man[i].num, man[i].kor, man[i].eng, man[i].mat, man[i].total, man[i].avg);
    }

    // 과목별 평균 점수 출력
    printf(" 국어 평균: %7.2f\n 영어 평균: %7.2f\n 수학 평균: %7.2f\n",
        avgkor / 5., avgeng / 5., avgmat / 5.);

    return 0; // 프로그램 종료
}

챗 gpt에게 주석을 달아 설명해달라고 해봤다.

 

rand= 랜덤

위의 소스는 매번다른 숫자가 발생하게함.

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

// 환영 메시지를 출력하는 함수
void print_welcome_message() {
    printf("숫자 맞추기 게임에 오신 것을 환영합니다!\n");
    printf("1부터 100까지의 숫자 중 하나를 맞추세요.\n");
}

// 난이도를 선택하는 함수
int select_difficulty() {
    int difficulty;
    printf("난이도를 선택하세요 (1: 쉬움, 2: 보통, 3: 어려움): ");
    // 사용자로부터 난이도 입력 받음
    scanf("%d", &difficulty);
    return difficulty;
}

// 난이도에 따른 최대 시도 횟수를 반환하는 함수
int get_max_attempts(int difficulty) {
    switch (difficulty) {
        case 1: return 15; // 쉬움 난이도일 때 최대 시도 횟수 15회
        case 2: return 10; // 보통 난이도일 때 최대 시도 횟수 10회
        case 3: return 5;  // 어려움 난이도일 때 최대 시도 횟수 5회
        default: return 10; // 잘못된 입력일 경우 기본값은 보통 난이도
    }
}

int main() {
    int guess; // 사용자가 입력한 숫자
    int random; // 랜덤으로 생성된 정답 숫자
    int count = 1; // 시도 횟수
    int difficulty, max_attempts, score = 100, score_decrement;
    int hint_threshold, hint_given = 0;

    // 랜덤 숫자를 생성하기 위한 시드 설정
    srand((unsigned int)time(NULL));
    random = rand() % 100 + 1; // 1부터 100 사이의 랜덤 숫자 생성

    print_welcome_message(); // 환영 메시지 출력
    difficulty = select_difficulty(); // 난이도 선택
    max_attempts = get_max_attempts(difficulty); // 선택한 난이도에 따른 최대 시도 횟수 설정
    score_decrement = 100 / max_attempts; // 최대 시도 횟수에 따라 점수 감소량 설정
    hint_threshold = max_attempts / 2; // 힌트를 제공할 시도 횟수를 설정

    printf("최대 시도 횟수는 %d회입니다.\n", max_attempts);

    do {
        // 사용자로부터 숫자 입력 받음
        printf("[ %02d회 ] 1~100까지 숫자 하나를 입력하세요: ", count);
        scanf("%d", &guess);

        if (guess == random) {
            // 정답을 맞췄을 경우
            printf(" => 빙고! 축하합니다! 정답을 맞추셨습니다.\n");
            printf("최종 점수: %d\n", score);
            break;
        } else if (guess > random) {
            // 입력한 숫자가 정답보다 클 경우
            printf(" => 더 작은 수를 입력하세요.\n");
        } else {
            // 입력한 숫자가 정답보다 작을 경우
            printf(" => 더 큰 수를 입력하세요.\n");
        }

        if (count == hint_threshold && !hint_given) {
            // 정답이 무엇인지 힌트를 제공
            hint_given = 1;
            if (random % 2 == 0) {
                printf("힌트: 정답은 짝수입니다.\n");
            } else {
                printf("힌트: 정답은 홀수입니다.\n");
            }
        }

        count++; // 시도 횟수 증가
        score -= score_decrement; // 시도할 때마다 점수 감소

        if (count > max_attempts) {
            // 최대 시도 횟수를 초과한 경우
            printf(" => 아쉽지만, 최대 시도 횟수를 초과했습니다. 정답은 %d였습니다.\n", random);
            printf("최종 점수: 0\n");
            break;
        }
    } while (guess != random);

    return 0;
}

소스작성.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> // printf(), scanf()
#include <stdlib.h> // rand()
#include <time.h> // time()
#include <conio.h> // getch()
#include <ctype.h> // toupper()

#define NUM_DIGITS 3

void intro(); // 함수 선언
void final(int count); // 함수 선언
void generateRandomNumbers(int arr[], int size); // 함수 선언
void getUserInput(int arr[], int size, int count); // 함수 선언
void calculateStrikeAndBall(int com[], int user[], int size, int* strike, int* ball); // 함수 선언

int main(void)
{
    int com[NUM_DIGITS], user[NUM_DIGITS];
    int strike, ball, count;
    char key;

    srand((unsigned int)time(NULL));

    do {
        count = 1;
        intro(); // 함수 호출
        generateRandomNumbers(com, NUM_DIGITS);

        for (int i = 0; i < NUM_DIGITS; i++) {
            printf("%d ", com[i]);
        }
        printf("\n");

        do {
            getUserInput(user, NUM_DIGITS, count);
            calculateStrikeAndBall(com, user, NUM_DIGITS, &strike, &ball);
            printf("[ %d Strike %d Ball ]\n", strike, ball);
            count++;
        } while (strike < NUM_DIGITS);

        final(count); // 함수 호출
        printf("게임을 다시 하겠습니까(Y/N): ");
        key = _getch();
    } while (key == 'y' || key == 'Y');

    return 0;
} // main() 끝

void intro() // 함수 정의
{
    puts("\n");
    puts("-------------------------------");
    puts(" 숫자야구게임 ");
    puts("-------------------------------");
}

void final(int count) // 함수 정의
{
    if (count <= 5) {
        puts("축하합니다. 당신은 천재군요!");
    } else if (count <= 10) {
        puts("당신의 집중력은 보통입니다.");
    } else if (count <= 15) {
        puts("심하다~~~~");
    } else {
        puts("삶이 그대를 속일지라도 슬퍼하거나 노하지 말라!");
    }
}

void generateRandomNumbers(int arr[], int size)
{
    do {
        for (int i = 0; i < size; i++) {
            arr[i] = rand() % 9 + 1;
        }
    } while (arr[0] == arr[1] || arr[0] == arr[2] || arr[1] == arr[2]);
}

void getUserInput(int arr[], int size, int count)
{
    printf("[%2d번째] 숫자 %d개를 입력: ", count, size);
    while (scanf("%d%d%d", &arr[0], &arr[1], &arr[2]) != 3) {
        while (getchar() != '\n'); // 입력 버퍼를 비운다
        printf("잘못된 입력입니다. 다시 입력해주세요: ");
    }
    while (getchar() != '\n'); // 입력 버퍼를 비운다
}

void calculateStrikeAndBall(int com[], int user[], int size, int* strike, int* ball)
{
    *strike = 0;
    *ball = 0;
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            if (com[i] == user[j]) {
                if (i == j) {
                    (*strike)++;
                } else {
                    (*ball)++;
                }
            }
        }
    }
}

챗 gpt에게 야구게임 리팩토링해달고 했다(기능은 같지만, 소스를 고급지고, 보기 편하게 해달라고하는것.)

이런식으로 질문하여 챗gpt에게 소스를 작성, 설명하게하여 공부 할 수있다.