2011년7월7일_임베디드C 9장.구조체 예제p9-4~8 분석(구조체배열, 구조체포인터, 구조체 함수로 전달하는 법(멤버 각자의 값/구조체전체의 값(call by value), 구조체의 주소(call by reference)), 양날의 검 == 포인터, 기억력

 

 

구조체예제 p9-4~8까지 소스코드 분석



● 예제p9-4.c

   1:  // 5명의 학생의 정보를 입력받아 "d9-4.dat" 파일에 기록하는 프로그램
   2:  #include <stdio.h>
   3:   
   4:  typedef struct {
   5:      char name[15];
   6:      char country[20];
   7:      int age;
   8:  } STUDENT;
   9:   
  10:  int main()
  11:  {
  12:      FILE *fp;        //FILE *는 고수준파일입출력시 사용하는 구조체 주소를 보관.?    
  13:      STUDENT st[5];   //구조체배열 5개선언.
  14:      int i;
  15:   
  16:      if((fp = fopen("d9-4.dat", "w")) == NULL)        //fopen은 고수준 파일 열기함수
  17:      {
  18:          printf("File open error...\n");
  19:          return -1;
  20:      }
  21:   
  22:      for(i = 0 ; i < 5 ; i++)        //5번 반복``
  23:      {
  24:          printf("Enter name & country & age : ");
  25:          //구조체배열의 0~4번까지 각 멤버를 입력받아 메모리(stack)에 저장.
  26:          scanf("%s %s %d", st[i].name, st[i].country, &st[i].age);        
  27:          //메모리(stack)에 저장된 구조체배열의 각 멤버를 파일에 기록.
  28:          fprintf(fp, "%s %s %d\n", st[i].name, st[i].country, st[i].age);
  29:      }
  30:   
  31:      fclose(fp);        //fopen()으로 열었으니 고수준 파일 닫기 함수인 fclose()로 닫음.
  32:   
  33:      return 0;
  34:  }
  35:   


이 소스코드는 구조체배열과 고수준 파일입출력을 연습할 수 있는 예제이다.


image


//설명


image

//설명




● 예제p9-5.c

   1:  // 데이터 파일에서 몸무게와 키를 읽어 비만을 체크하는 프로그램
   2:  #include <math.h>        //sin()사용
   3:  #include <stdio.h>
   4:   
   5:  typedef struct {
   6:      char name[20];
   7:      float height;
   8:      float weight;
   9:  } STUDENT;
  10:   
  11:  int main()
  12:  {
  13:      FILE *fp;
  14:      STUDENT st, *sp;
  15:      int i = 0;
  16:   
  17:      if((fp = fopen("d9-5.dat", "r")) == NULL)
  18:      {
  19:          printf("File Open Error!\n");
  20:          return -1;
  21:      }
  22:   
  23:      sp = &st;        //sp이 구조체 변수 st의 주소를 갖는다.
  24:   
  25:      while(!feof(fp))
  26:      {
  27:          //구조체포인터를 사용해 각 멤버의 주소를 건네 키입력 받음.
  28:          fscanf(fp, "%s %f %f", sp->name, &sp->height, &sp->weight);
  29:          //구조체포인터를 사용해 name배열의 주소를 건네 문자열을 출력.
  30:          printf("student name: %s\n", sp->name);
  31:          //구조체포인터를 사용해 height, weight의 값을 출력.
  32:          printf("Height: %3.1f\nWeight : %3.1f\n", sp->height, sp->weight);
  33:   
  34:          //비만도 체크 조건문.
  35:          if((sp->height - 109) + 10 <= sp->weight)
  36:              printf("You are fat.. You need diet!!!\n\n");
  37:          else if((sp->height - 109) - 10 >= sp->weight)
  38:              printf("You are thin.. You need more food!!!\n\n");
  39:          else
  40:              printf("You are normal...Keep your shape!!!\n\n");
  41:      }
  42:   
  43:      fclose(fp);
  44:   
  45:      return 0;
  46:  }
  47:   





image

//설명…변수의 주소를 확인할 것.



● 예제p9-6.c


image



● 예제p9-7.c

image



● 예제p9-8.c

image 



//예제 p9-6 ~ p9-8까지 인수전달법을 종합정리하여 도식과 설명을 추가할 것.







양날의 검..포인터


C언어는 포인터만 잘 알면 메모리를 누빌 수 있으나 JAVA는 더 고급언어라 기계와 멀어 메모리를 누빌 수 없다.
JAVA는 포인터와 비슷한게 있으나 사용하면 객체가 통째로 나온다.

포인터 중 가장 효용성이 높은 것은 unsigned char *이다. byte단위로 읽고 쓸 수 있어 활용도가 높다.
C언어는 포인터를 쓸 수 있어 메모리를 볼 수 있고 쓸 수 있는 장점이 있으나 잘 못 쓰면 위험해 처할 수 있다.
프로그래밍을 잘 못 하면 운영체제의 영역을 침범할 수 있다.
JAVA는 그런 문제가 없다.

포인터를 알고 어떻게 쓸 것인가?
도구는 도구일 뿐 어떻게 쓰느냐에 따라 좋고 나쁨이 갈린다.
포인터를 잘 못 쓰면 프로그램이 개판이 된다.

아래의 그림은 JAVA와 C언어의 차이를 보여준다.

image

//설명



기억력

 

image

인간은 기존지식 + 새로운지식이 들어오면 쉬우나, 새롭게 처음부터 시작하면 어렵다.
기억이 되지 않고 소멸된다.

기억하는 법의 예로 기억력 좋은 할아버지는 숫자를 그림에 대입해 기억해 낸다.
머리 속에 양,말,개가 있고 동물에 숫자를 대입한 뒤에 동물을 연상(?)해서 숫자를 기억해 낸다?

//몰라 ㅠㅠ






참조(Reference)

 

DSCN3523 DSCN3524 DSCN3522