#include <stdio.h>
#include <string.h>

typedef enum conticode {asia, africa, america, europe, oseania} cc;
typedef struct {char cnm[30]; double lsz; cc ctnt; double preci;} ctrytype;

char conti_names[5][30] = {"asia", "africa", "america", "europe", "oseania"};
int convert_cname_ccode (char name[]);

void main () {

사용자 삽입 이미지

 ctrytype nations[200] = {
  {"Korea", 44.5, asia, 1534.7},
  {"Naizria", 6.7, africa, 675.9},
  {"USA", 203.4, america, 1230.4},
  {"Japan", 103.5, asia, 1590.7}
 };
 
 
 int i, ccode;
 char cname[30];
 do{
 
  printf("대륙이름을 입력하시오> ");
  scanf("%s", cname);
  ccode = convert_cname_ccode(cname);
  if(ccode == -1)
   printf("그런 대륙은 존재하지 않습니다. \n");
  else
   for (i=0; i<4; i++){
    if(nations[i].ctnt == ccode)
     printf("국가=%s, 강수량=%8.2f \n", nations[i].cnm, nations[i].preci);
   }
 }while(cname[0]!='$');
}

int convert_cname_ccode (char name[]){
 int i;
 for(i=0;i<5;i++)
  if(strcmp(conti_names[i], name) == 0) return i;
 return -1;
}


제 9장: 포인터

[포인터]: 메모리의 주소
- 변수의 포인터 = 변수의 주소
  변수를 선언하면 메모리 공간이 할당됨
  변수의 포인터: 변수의 값이 저장되는 메모리의 주소(시작주소)

- 주소연산자 &

사용자 삽입 이미지

  &v : 변수 v의 주소

  일반적으로 하나의 □ 당 4byte

[예} 주소 출력하기
- 변수의 주소를 출력
  #include <stdio.h>
  int p, q = 100;
  main()
  {
      int a, b;
      printf("address of a, b = %p, %p\n", &a, &b);      .... 지역변수
      printf("address of p, q = %x, %x\n", &p, &q);      .... 전역변수
      printf("address of of a string = %x\n", "univ");    … 문자열상수
   }

   형식 지정자 %p : 포인터 출력용 (16진수로 출력)
   포인터 출력은  부호 없는 정수 출력용인  %x, %o, %u를 사용해도 됨

[포인터 변수]: 포인터(메모리 주소)를 저장하는 변수
사용자 삽입 이미지

- 포인터 변수 선언: 포인터 변수는 가리키는 곳에 저장된 자료형을 함께 선언함
   int *p; .... 정수에 대한 주소의 자료형이 p라는 변수에 저장된다.
   char *q;
   double *r;

   보통 자료형과 함께 선언 가능
   int a, p*;
사용자 삽입 이미지

   (변수 a와 p를 잡는다. a는 int자료형, p는 int*형(정수를 저장하는 공간에 대한 주소))

   자료형(data type)    자료를 저장한 공간      변수
   int                          92486                        a (a라는 공간안의 값은 정수형)
   char                       'm'
     
[간접 연산자 *]
- 간접 연산자
  *p : 포인터 변수가 가리키는 곳에 저장된 값(간접참조)
  (cf) 단순 변수 a는 변수에 저장된 값을 나타냄 (직접 참조)
  간접연산자 *는 주소연산자 &의 반대 역할

   int a,  *p;
   …
   p = &a;  … p에 변수 a의 주소 저장
   이 때에 *p의 값은 a와 같음  
사용자 삽입 이미지







[포인터 변수의 초기화]
사용자 삽입 이미지

- 포인터 변수는 초기화 한 후에 간접연산자를 사용해야 함
   int a=100, b=200;
   int *p;

   a = *p;  … 잘못됨 
   *p = b;  … 잘못됨

   p = &a;  … 포인터변수 초기화
   b = *p;  … b = a 와 같음
   *p = b;  … a = b 와 같음

- NULL 포인터
   p = NULL;  … 포인터 p가 가리키는 곳이 없음을 명시함
                        NULL은 <stdio.h>에서 0으로 정의된 기호 상수



invalid-file

수업내용 약간 첨가한 ppt파일



주말과제:
학사정보:

학생정보:
  학생 한명: 이름(char sname[30]),
      수강과목:

교과목정보:
  과목 1개: 이름(char cname[20]),
            학정번호: enum hak {c0, c1, c2, c3, c5, c5})
            강사(char iname[30]),
            학점수: int(1~4)

typedef enum ec{c0,c1,c2,c3,c4,c5} hakjung;

typedef struct {char sname[30];
                hakjung courses[4];} stutype;

typedef struct {char cname[20]; hakjung hcode;
               char iname[30]; int credit; } coursetype;

// 학생들
stutype students[20] ={
   {"park", {c0,c3,c5}},
   {"kim", {c1,c2,c4}},
   .....
   }; //13명 정도를 넣을 것

coursetype courses[6] = {
  {"math1", c0, "tom", 4},
  ...
  }; // c0~c5까지 넣을 것

문제1: 학생의 이름을 입력 받는다
          이 사람이 듣는 과목의 강사명들을 모두 출력한다

문제2:  이 학생과 같이 과목을 듣는 모든 학생의 이름을 출력

by Joe & Soohy 2007. 1. 12. 09:57