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

Posted by 카켈



1. 목적

  - 필요한 만큼 자료를 정의 하는 동적 할당에 대해 이해한다.
  - 구조체에 따른 자료 구조를 이해한다.

2. 문제 (점수 : 40 점)

 - 학생에 대한 정보(이름,성적)을 구조체로 하여 성적을 입력후 평균을 구하는 프로그램을 작성한다.
  - 키보드로 학생 정보를 입력받는다.
  - 실행화면

학생의 수 : 4
1 번째 학생의 이름과 성적 : 홍길동 67.89
2 번째 학생의 이름과 성적 : 장길산 46.75
3 번째 학생의 이름과 성적 : 너바보 23.79
4 번째 학생의 이름과 성적 : 나잘난 99.84

입력된 학생들에 대한 정보
홍길동 : 67.89
장길산 : 46.75
너바보 : 23.79
나잘난 : 99.84

학생들의 평균 성적 : 59.57
Press any key to continue

3. 이해
  - 구조체를 정확히 이해하는가?
  - 동적할당을 할수 있는가?
 
4. 코드

#include <stdio.h>
#include <stdlib.h>

int main()
{
 struct stu_data
 {
  char name[6];
  float score;
 };

 int i,count;
 float total;
 struct stu_data* stu = NULL;
 
 i = 1;
 count = 0;
 total = 0.0;
 
 printf("학생의 수 : ");
 scanf("%d", &count);

 stu = calloc(count, sizeof(stu));
 while(i<=count)
 {
  printf("%d 번째 학생의 이름과 성적 : ", i);
  scanf("%s %f", stu[i-1].name, &(stu[i-1].score));
  i++;

 }
 
 i = 0;
 
 printf("\n입력된 학생들에 대한 정보\n");
 while(i<count)
 {
  printf("%s : %0.2f\n",stu[i].name, stu[i].score);
  total += stu[i].score;
  i++;
 }

 printf("\n학생들의 평균 성적 : %0.2f\n", total/count);

 stu = NULL;
 free(stu);

 return 0;
}

5. 해설
  - calloc 함수는 C 언어에서 메모리를 할당 받아 변수에게 주는 함수 입니다. malloc 과 유사합니다.
  - while 문으로 자료를 입력 받고 출력합니다.
  - NULL 로 맞춘후에 free 함수로 비우게 합니다.

6. 참고
  - http://www.winapi.co.kr/clec/cpp1/10-3-4.htm : 재할당(malloc, calloc 연관)
  - 네이버 지식인
  - 유사 문제

Posted by 카켈
이전페이지 1 다음페이지