[2005년 기말 6번] 성적 처리 - 구조체
1. 목적
- 구조체를 자유롭게 다룰줄 안다.
2. 문제 (점수 : 30 점)
- 학생의 이름과 성적 학점을 맴버로 가지는 구조체를 만들어라.
- 세 사람의 이름과 성적을 키보드로 입력받아 학점을 판단하여 화면에 출력하라.
- 판단 기준 : 90점 이상 / A . 70 ~ 90점 / B . 50 ~ 70점 / C . 50점 이하 / F
- 출력 화면
세 학생의 성적을 입력하세요 : 98.7 76.5 54.3
이순신 의 학점 : A
홍길동 의 학점 : B
임꺽정 의 학점 : C
Press any key to continue
3. 이해
- 구조체를 이해하고 맴버 변수를 자유롭게 쓸줄 아는가?
4. 코드
#include <stdio.h>
int main()
{
typedef struct student
{
char name[255];
float scr;
char grade;
};
int i = 0;
struct student Stu[3];
struct student* pStu;
pStu = Stu;
printf("세 학생의 이름을 입력하세요 : ");
scanf("%s %s %s", Stu[0].name, Stu[1].name, Stu[2].name);
printf("세 학생의 성적을 입력하세요 : ");
scanf("%f %f %f", &(pStu->scr), &((pStu+1)->scr), &(pStu+2)->scr);
while(i<3)
{
if(pStu->scr >= 90) pStu->grade = 'A';
if(pStu->scr >= 70 && pStu->scr < 90) pStu->grade = 'B';
if(pStu->scr > 50 && pStu->scr < 70) pStu->grade = 'C';
if(pStu->scr <= 50) pStu->grade = 'F';
printf("%s 의 학점 : ",pStu->name);
putchar(pStu->grade);
putchar('\n');
pStu++;
i++;
}
pStu = NULL;
return 0;
}
5. 해설
- 구조체를 선언하고 포인터로 맴버 변수를 가리키게 만들어서 접근을 용이하게 만들었습니다.
- -> 연산자는 원래 (*pStu).grade 를 pStu->grade 로 만들어 괄호를 없애기 위해 만들었었습니다. 우선순위가 * < . 입니다. 따라서 괄호를 두어서 dereference (역참조) 하게 했습니다.
- 포인터를 한단계 더한다는 의미는 그 자료형에 맞게 주소를 한자리 더한다는 의미 입니다. 따라서 배열을 기준으로 하나 상승한다는 의미가 의미가 됩니다.
- 마지막 부분에 pStu = NULL 은 주소를 지우는 의미일뿐 그 이상 역할을 하지 않습니다. 동적 할당과는 관계가 없습니다.
6. 참고
- http://winapi.co.kr/clec/cpp1/10-1-3.htm : 포인터 연산
- 유사 문제