달리기 기록측정 C

C의 문자열의 나열


문제

출처 링크 : 네이버 카페 혀니C의 프로그래밍

3명 학생의 100m 달리기 3회 기록 정보를 저장하여 출력하는 프로그램을 작성해보자.

① 3회 입력 평균이 11초 이하면 합격, 초과면 불합격이다.
② 100m 평균을 비교하여 1등을 출력한다.
​

[1번 학생 기록 등록]
이름 : 김라라
100m 기록(3회 입력 공백 구분) : 11 12 12


[2번 학생 기록 등록]
이름 : 이순신
100m 기록(3회 입력 공백 구분) : 8 9 8


[3번 학생 기록 등록]
이름 : 장보고
100m 기록(3회 입력 공백 구분) : 10 9 8

*** 100m 달리기 평가 보고서 ***

-------------------------------------------------------
번호 이름 100m기록평균 평가결과
-------------------------------------------------------
1 김라라 11.67초 불합격
2 이순신 8.33초 합격
3 장보고 9.00초 합격
-------------------------------------------------------
100m 평균 기록 1등은 이순신 입니다.
-------------------------------------------------------


제출코드

#include <stdio.h>
#include <stdlib.h> //system
#include <string.h>
#define NAME_LEN 20
#define STUDENT_NUM 3   //학생수

typedef struct student
{
    int no;
    char name[NAME_LEN];
    int s1, s2, s3;
    double total;
    double avr;
    int highest;
    char* pf;

}student;

void remove_enter(int len, char* in);
int higher(int s1, int s2, int s3);

int main()
{
    student s[STUDENT_NUM]; //구조체 배열
     
    //학생정보 입력
    for(int i = 0; i < STUDENT_NUM; i++)
    {
        system("clear");  //화면지우기
        printf("\n\n\t\t***학생정보 입력***\n\n");
        s[i].no = i;
        printf("[%d번 학생 기록 등록]\n", s[i].no + 1);
       
        printf("이름 : ");
        fgets(s[i].name, NAME_LEN - 1, stdin);
        remove_enter(strlen(s[i].name), s[i].name);

        printf("100m 기록(3회 입력 공백 구분) : ");
        scanf("%d %d %d", &s[i].s1, &s[i].s2, &s[i].s3);
        while (getchar() != '\n');

        s[i].highest = higher(s[i].s1, s[i].s2, s[i].s3);
        s[i].total = s[i].s1 + s[i].s2 + s[i].s3;
        s[i].avr = s[i].total / 3;
        
        if (s[i].avr > 11) {
            s[i].pf = "불합격";
        }

        else {
            s[i].pf = "합격";
        }

        
    }
  
    //학생정보 출력
    system("clear");
    printf("--------------------------------------------------------------------------------\n");
    printf("\n\n\t*** 결과 출력 ***\n\n");
    printf("%4s %-20s %8s %8s %10s\n", "번호", "이름", "최고 100m 기록", "평균 100m 기록", "평가 결과");
    printf("--------------------------------------------------------------------------------\n");
 
    for(int i = 0; i < STUDENT_NUM; i++)
    {   
        printf("%4d %-20s %8d %16.2f %10s\n", s[i].no, s[i].name, s[i].highest, s[i].avr, s[i].pf);
    }
    
    int who_win = 0;
    for (int i = 1; i < STUDENT_NUM; i++)
    {   
        if (s[i].avr < s[who_win].avr) {
            who_win = i;
        }
        else if (s[i].avr == s[who_win].avr) {// 평균 기록 동점자 발생 시
            if (s[i].highest < s[who_win].highest) {
            who_win = i;
        }
        }
    }

    printf("--------------------------------------------------------------------------------\n");
    printf("100m 평가 결과 1등은 %s입니다.\n", s[who_win].name);
    printf("--------------------------------------------------------------------------------\n");

    return 0;
}

void remove_enter(int len, char* in) {
    // fgets 사용으로인해 입력된 \n을 \0으로 변환하기 위한 코드
    in[len - 1] = '\0';
}

int higher(int s1, int s2, int s3) {
    if (s1 <= s2 && s1 <= s3) {
        return s1;
    }
    else if (s2 <= s1 && s2 <= s3) {
        return s2;
    }
    else if (s3 <= s2 && s3 <= s1) {
        return s3;
    }
}

위와 같이 제출하였다.

코드 리뷰


pf를 배열로 선언 하신 후 문자열을 저장하면 더 좋을 것.

if (s[i].avr > 11) {
s[i].pf = "불합격";
}

else {
s[i].pf = "합격";
}




char pf[7];를 배열로 선언 후 아래와 같이 수정해볼것

if (s[i].avr > 11) {
strcpy(s[i].pf, "불합격");
}

else {
strcpy(s[i].pf, "합격");
}

즉, 수정하면

#include <stdio.h>
#include <stdlib.h> //system
#include <string.h>
#define NAME_LEN 20
#define STUDENT_NUM 3   //학생수

typedef struct student
{
    int no;
    char name[NAME_LEN];
    int s1, s2, s3;
    double total;
    double avr;
    int highest;
    char pf[7];

}student;

void remove_enter(int len, char* in);
int higher(int s1, int s2, int s3);

int main()
{
    student s[STUDENT_NUM]; //구조체 배열
     
    //학생정보 입력
    for(int i = 0; i < STUDENT_NUM; i++)
    {
        system("clear");  //화면지우기
        printf("\n\n\t\t***학생정보 입력***\n\n");
        s[i].no = i;
        printf("[%d번 학생 기록 등록]\n", s[i].no + 1);
       
        printf("이름 : ");
        fgets(s[i].name, NAME_LEN - 1, stdin);
        remove_enter(strlen(s[i].name), s[i].name);

        printf("100m 기록(3회 입력 공백 구분) : ");
        scanf("%d %d %d", &s[i].s1, &s[i].s2, &s[i].s3);
        while (getchar() != '\n');

        s[i].highest = higher(s[i].s1, s[i].s2, s[i].s3);
        s[i].total = s[i].s1 + s[i].s2 + s[i].s3;
        s[i].avr = s[i].total / 3;
        
        if (s[i].avr > 11) {
            strcpy(s[i].pf, "불합격");
        }

        else {
            strcpy(s[i].pf, "합격");
        }

        
    }
  
    //학생정보 출력
    system("clear");
    printf("--------------------------------------------------------------------------------\n");
    printf("\n\n\t*** 결과 출력 ***\n\n");
    printf("%4s %-20s %8s %8s %10s\n", "번호", "이름", "최고 100m 기록", "평균 100m 기록", "평가 결과");
    printf("--------------------------------------------------------------------------------\n");
 
    for(int i = 0; i < STUDENT_NUM; i++)
    {   
        printf("%4d %-20s %8d %16.2f %10s\n", s[i].no, s[i].name, s[i].highest, s[i].avr, s[i].pf);
    }
    
    int who_win = 0;
    for (int i = 1; i < STUDENT_NUM; i++)
    {   
        if (s[i].avr < s[who_win].avr) {
            who_win = i;
        }
        else if (s[i].avr == s[who_win].avr) {// 평균 기록 동점자 발생 시
            if (s[i].highest < s[who_win].highest) {
            who_win = i;
        }
        }
    }

    printf("--------------------------------------------------------------------------------\n");
    printf("100m 평가 결과 1등은 %s입니다.\n", s[who_win].name);
    printf("--------------------------------------------------------------------------------\n");

    return 0;
}

void remove_enter(int len, char* in) {
    // fgets 사용으로인해 입력된 \n을 \0으로 변환하기 위한 코드
    in[len - 1] = '\0';
}

int higher(int s1, int s2, int s3) {
    if (s1 <= s2 && s1 <= s3) {
        return s1;
    }
    else if (s2 <= s1 && s2 <= s3) {
        return s2;
    }
    else if (s3 <= s2 && s3 <= s1) {
        return s3;
    }
}

위와 같아진다. 선언부분이랑 합격, 불합격 판정하는 부분을 수정했다.

strcpy()함수를 통해서 포인터로 선언하지 않고 배열로 선언하더라도 코드가 올바르게 동작하도록 할 수 있다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2