순천향대학교컴퓨터공학과이상정 1 학습내용 구조체 (structure) 구조체선언, 멤버참조 구조체초기화, 인수전달 자기참조구조체, 연결리스트 공용체 (union) 비트필드 (bit field) 순천향대학교컴퓨터공학과 2
구조체란? 구조체는하나의변수명으로여러개의상이한자료를한꺼번에다루려고할때사용 구조체선언 struct 태그명 ; 멤버리스트 순천향대학교컴퓨터공학과 3 구조체변수선언 1 구조체를선언한후이를이용하여구조체변수를선언한예 struct man char name[20]; char gender; int age; ; struct man teacher, student[60], *ptr; 순천향대학교컴퓨터공학과 4
구조체변수선언 2 구조체의선언과구조체변수의선언을동시에한예 struct man char name[20]; char gender; int age; teacher, student[60], *ptr; 순천향대학교컴퓨터공학과 5 구조체변수선언 3 태그명을붙이지않고구조체변수선언 struct char name[20]; char gender; int age; teacher, student[60], *ptr; 순천향대학교컴퓨터공학과 6
구조체변수메모리할당 teacher 20 바이트 1 바이트 4 바이트 student[0] student[1] student[2] student[59] 순천향대학교컴퓨터공학과 7 구조체멤버참조 연산자 설명. 구조체변수의멤버지정 -> 포인터가지시하는구조체변수의멤버지정 teacher.age = 30; teacher.gender = M ; student[15].age = 19; ptr = &teacher; ptr->age = 40; 순천향대학교컴퓨터공학과 8
구조체멤버참조예 #include <stdio.h> ptr -> age = 40; struct man char name[20]; char gender; int age; ; int main( ) struct man teacher, *ptr; printf("name : %s, ",ptr -> name); printf("gender : %c, ",ptr -> gender); printf("age : %d n",ptr -> age); return 0; ptr = &teacher; strcpy(teacher.name, "Kim"); teacher.gender = 'm'; teacher.age = 30; printf("name : %s, ",teacher.name); printf("gender : %c, ",teacher.gender); printf("age : %d n",teacher.age); 순천향대학교컴퓨터공학과 9 구조체초기화예 : 프로그램의미는? #include <stdio.h> struct char bell; int width; int lines; crt = ' 7', 80, 24 ; int pause(int *so_far); int main() char c; int num_lines; num_lines =1; for(;;) if (num_lines == 1) putchar(crt.bell); printf("print something on the screen. n"); ++num_lines; 순천향대학교컴퓨터공학과 10 c = pause(&num_lines); if (c == '#') break; return 0; int pause(int *so_far) char c; if (*so_far!= crt.lines-2) return(0); printf(" n t Pressanykeytocontinue"); printf("or # key to end"); c = getchar( ); *so_far = 1; return(c);
구조체인수전달예 #include <stdio.h> struct man char name[20]; char gender; char age; ; void disp1(struct man stud); void disp2(struct man *stud); int main( ) struct man student=" 홍길동 ", 'm', 20; void disp1(struct man stud) printf("%s : %c : %d n",stud.name,stud.gender,stud.age); void disp2(struct man *stud) printf("%s : %c : %d n",stud->name,stud->gender,stud->ag e); disp1(student); disp2(&student); return 0; 순천향대학교컴퓨터공학과 11 #include <stdio.h> struct man char name[10]; char gender; int age; ; struct man setstud(char name[], char gender, int age) ; void disp(struct man stud); int main( ) struct man student; student = setstud("kim",'m',20); disp(student); student = setstud("lee",'f',19);, disp(student); 순천향대학교컴퓨터공학과 12 return 0; 구조체반환예 struct man setstud(char name[], char gender, int age) struct man dt; strcpy(dt.name, name); dt.gender = gender; dt.age = age; return(dt); void disp(struct man stud) printf("%s : %c : %d n",stud.name,stud.gender, stud.age);
#include <stdio.h> struct class char name[20]; int kor, mat,eng; int total; float avg; student[] =" 홍민식 ",90,83,85, 85 " 전인국 ",90,85,94, 94 " 남운영 ",88,81,85, " 하상오,85,90,80, "",-1 ; void calculation(struct l class *st); void disp(struct class *st); int main() calculation(student); disp(student); return 0; 순천향대학교컴퓨터공학과 13 성적계산예 void calculation(struct class *st) while (st->kor!= -1) st->total = st->kor + st->mat + st->eng; st->avg = (float)st->total/3; st++; void disp(struct class *st) printf(" 이름국어수학영어총점평균 n"); printf("-------------------------------- n"); while (st->kor!= -1) printf("%4s %4d %4d %4d %5d %4.1f n", st->name,st->kor,st->mat,st->eng, st->total, st->avg); st++; 소켓주소구조체 (1) 통신객체 ( 클라이언트또는서버 ) 의인터넷주소를표현 주소체계 (address family) AF_INET ( 인터넷 ), AF_UNIX, AF_NS IP 주소 : 4 바이트 포트번호 : 2 바이트 C 언어에서소켓주소는구조체 sockaddr 로정의 struct sockaddr u_short sa_family; /* 주소체계, unsigned short*/ char sa_data[14]; /* 주소 */ ; 순천향대학교컴퓨터공학과 14
소켓주소구조체 (2) sockaddr 는 IP 주소와포트가구분이되지않아서불편 다음과같이 sockaddr_in 으로재정의하여사용 struct in_addr u_long s_addr; /* 32비트의 IP 주소를저장할구조체 */ ; struct sockaddr_in short sin_family; il /* 주소체계 */ u_short sin_port; /* 16비트포트번호 */ struct in_addr sin_addr; /* 32 비트 IP 주소 */ char sin_zero[8]; /* 전체크기를 16바이트로맞추기위한 dummy */ ; 순천향대학교컴퓨터공학과 15 소켓주소구조체사용예 클라이언트연결부분예 struct sockaddr_in serveraddr;... if ((s = socket(pf_inet, SOCK_STREAM, 0)) < 0) printf("can't create socket n"); exit(1); /* 서버의소켓주소구조체 serveraddr 을 ' 0' 으로초기화 */ bzero((char *)&serveraddr, sizeof(serveraddr)); /* serveraddr 의주소지정 */ serveraddr.sin_family = AF_INET; inet_pton(af_inet, "220.78.22.45", &servaddr.sin_addr); serveraddr.sin_port = htons(9000); /* 연결요청 */ if (connect(s, (struct sockaddr *)&server_addr, sizeof(serveraddr)) < 0) printf("can't connect. n"); exit(1);... 순천향대학교컴퓨터공학과 16
과제 4-1 다음프로그램의실행결과를보이고, 각결과가출력되는과정을분석하라. 실행시에러가발생하면원인을찾고수정하라. #include <stdio.h> typedef struct int num; char name[20]; char phone[8]; person; void set(person *pp, int num, char *name, char *phone); 순천향대학교컴퓨터공학과 17 int main() person p; printf("size of person record = %d n", sizeof(person)); set(&p, 1208, " 송준기 ", "687-7735"); printf("%4d [%-8s] TEL. %s n", p.num, p.name, p.phone); return 0; void set(person *pp, int num, char *name, char *phone) int i; pp->num = num; i= 0; while(*name) pp->name[i++]= *name++; pp->name[i]= ' 0'; for(i = 0; *phone; i++) pp->phone[i] = *phone++; pp->phone[i] phone[i] = 0x00; 순천향대학교컴퓨터공학과 18
과제 4-2 앞의성적계산프로그램을다음과같이수정하라. 각학생의수를먼저입력받은후학생의이름과성적을학생수대로입력받아구조체배열에저장하는함수 input() 을작성 student를인수로받고, 학생인원을반환 성적순서대로정렬하는함수 sort() 작성 성적순서대로출력 순천향대학교컴퓨터공학과 19 구조체의구조체 struct point int x; int y; ; struct rect struct point pt1; struct point pt2; ; struct rect screen; screen.pt1.x = 2; screen.pt1.y = 3; screen.pt2.x = 5; screen.pt2.y = 10; y. (x,y) pt1 (2,3) pt2 (5,10) x 순천향대학교컴퓨터공학과 20
자기참조구조체 구조체내부에자기자신의구조체를지시하는포인터를갖는것을자기참조구조체라한다. 동일한형의구조체를연결하여연결리스트 (linked list) 구조를만드는데많이사용 연결리스트구조는자료의삽입이나삭제가자료실체의이동이없이내부의포인터의값만을변경하여줌으로써가능 struct node ; int data; struct node* next; 순천향대학교컴퓨터공학과 21 간단한연결리스트예 (1) #include <stdio.h> struct list char name[20]; char gender; int age; struct list *next; a = "Kim",'m',36, b = "Lee",'f',33, c = "Park",'m',44, *ptr; int main( () a.next = &b; b.next = &c; c.next = ' 0'; for (ptr = &a; ptr; ptr = ptr->next) printf("%-8s %c %2d n",ptr->name,ptr->gender,ptr->age); return 0; 순천향대학교컴퓨터공학과 22
간단한연결리스트예 (2) a Kim m 36 b Lee f 33 c Park m 44 0 순천향대학교컴퓨터공학과 23 공용체 (union) 공용체에서는모든멤버들을동일기억공간에중복되게할당 멤버중가장큰바이트크기를갖는공간을확보하고다른모든멤버들은동일한번지에할당 구조체는각멤버를연속되는기억공간에각각할당 공용체의선언은구조체의선언과같고단지선언자가 struct 가아닌 union 인점만이다름 순천향대학교컴퓨터공학과 24
공용체의메모리배치예 union test char a; short int b; long int c; u; 1000 번지 => 멤버 a,b,c 는모두같은번지에할당 1001 번지 1002 번지 1003 번지 u.a (char) ub(int) u.b uc(long) u.c 순천향대학교컴퓨터공학과 25 공용체사용예 (1) #include <stdio.h> union u_tag char c; short s; long l; u_val; int main() u_val.l = (long)0x12345678; printf("%lx n",u,u_val.l); printf("%x n",u_val.s); printf("%x n",u_val.c); return 0; 순천향대학교컴퓨터공학과 26
공용체사용예 (2) u_val 0x78 0x56 0x34 0x12 u_val.c u_val.s u_val.l 순천향대학교컴퓨터공학과 27 비트필드 (bit field) 정수의개개의비트를지정하고조작하기위해사용 struct 태그명.. 자료형멤버명 : 비트폭 ;.. 순천향대학교컴퓨터공학과 28
비트필드사용예 (1) #include <stdio.h> #define ON 1 #define OFF 0 struct reg unsigned bit_0 : 1; unsigned bit_1 : 1; unsigned bit_2 : 1; unsigned bit_3 : 1; unsigned bit_4 : 1; unsigned bit_5 : 1; unsigned bit_6 : 1; unsigned bit_7 : 1; hex, *ps; int main() ps = &hex; hex.bit_0 = hex.bit_2 = hex.bit_6 = hex.bit_7 = ON; hex.bit_1 = hex.bit_3 = hex.bit_4 = hex.bit_5 = OFF; printf(" %x n", *(int *)ps); if (hex.bit_7 == ON) printf("msb = 1 n"); else printf("msb = 0 n"); return 0; 순천향대학교컴퓨터공학과 29 비트필드사용예 (2) 실행결과 c5 MSB = 1 MSB LSB 7 6 5 4 3 2 1 0 ps hex 1 1 0 0 0 1 0 1 순천향대학교컴퓨터공학과 30
typedef typedef 는새로운자료형의이름을작성 기존의자료형에별도의이름 ( 동의어 ) 부여 typedef 는보통구조체의형을선언하는데많이사용 typedef int Word; Word n; Word 가 int 의동의어로선언 여기서 Word n; 은 int n; 과같은의미 순천향대학교컴퓨터공학과 31 typedef 예 (1) struct man ; char name[20]; char gender; int age; typedef struct man Man_t; Man_t teache, student[60]; struct man 을 Man_t 로선언하여이후 Man_t 는 struct man 과같은의미를갖는다. 순천향대학교컴퓨터공학과 32
typedef 예 (2) Typedef int *Intptr; Intptr p1, p2; p1, p2 는다음과같이선언한것과같다 int *p1, *p2; 순천향대학교컴퓨터공학과 33 과제 4-3 아래의두구조체를이용하여 x-y 평면상의 2 개의점의좌표를입력받아이두점을대각꼭지점으로하는직사각형을구성할때이직사각형의면적을구하는프로그램을작성하여라. struct point int x; int y; ; struct rect struct point pt1; struct point pt2; ; 순천향대학교컴퓨터공학과 34
과제 4-4 4 다음구조체를이용하여생년월일과오늘의날짜를입력받아오늘이생후몇일째인지계산하는프로그램을작성하라. struct int leap[13]; int common[13]; daytab = 366, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 365, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31; 순천향대학교컴퓨터공학과 35 특별과제 과제 4-3 을수정하여임의의 5 개의점을입력받고, 임의의두점을대각꼭지점으로하는직사각형을구성할때최대의면적을갖는직사각형의두꼭지점과최대면적을구하는프로그램을작성하라. 5개의점을갖는 struct point dot[5] 배열을선언하고, 각두점의사각형경우의수 ( 이중루프 ) 에대해면적을구한후최대면적인경우조사하여해당좌표를 struct rect screen 에저장 순천향대학교컴퓨터공학과 36