달리기 기록측정 C
in Study on Coding Test
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()함수를 통해서 포인터로 선언하지 않고 배열로 선언하더라도 코드가 올바르게 동작하도록 할 수 있다.