소프트웨어/C

[2005년 기말 6번] 성적 처리 - 구조체

카켈 2007. 2. 21. 23:51




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 : 포인터 연산
  - 유사 문제