SlideShare ist ein Scribd-Unternehmen logo
1 von 75
-- 自定义数据类型的使用
教学目标 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
基本概念 ,[object Object],身份证的数据成分 : 姓名、 性别、 民族、 出生日期、 住址、 身份证号码、 照片等
基本概念 一组信息 作为 一个逻辑整体,共同描述了一 个 完整 个体。 C 语言 引入一种能集中不同数据类型于一体的构造类型 -- 结构体类型 。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。
8.1  结构体的声明和结构体变量定义 ,[object Object],[object Object],[object Object],[object Object],姓名 ( 字符串 ) 性别 ( 字符 ) 职业 ( 字符串 ) 年龄 ( 整型 ) 身份证号码 ( 字符串 ) 班级 ( 字符串 ) 学号 ( 长整型 ) 姓名 ( 字符串 ) 操作系统 数据结构
8.1.1  结构体的声明 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.1.1  结构体的声明 ,[object Object],[object Object],[object Object],[object Object],[object Object]
8.1.2  结构体变量的声明 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],在程序的任何地方,在先定义后使用的原则下,定义属于该结构体类型的变量。
8.1.2  结构体变量的声明 定义结构体类型同时定义变量 struct student { char name[20];  char sex;  long num;  float score[3];  } stu1,stu2;  /*  定义结构体类型变量   */ 将变量直接定义在结构体类型的定义后,比较紧凑。 但 ,当程序较为复杂时,结构体数据类型通常封装为单独的文件, 此 种定义变量的方式,并不可取。
8.1.2  结构体变量的声明 通过定义无名结构体数据类型定义变量 struct{ char name[20];  char sex;  long num;  float score[3];  } stu1,stu2;  /* 定义该结构体类型变量   */ 无结构体类型 名称 , 导致仅能 直接定义变量外,不能在程序的其他位置定义构体类型变量
8.1.2  结构体变量的声明 ,[object Object],例中, stu1 的存储空间的大小为 53 个字节 ( 不同的操作系统得到的结果可能不一样 ) 。但很多情形下,我们并不针对一种系统设计程序,为了保证程序在不同的系统下都能合理地得到结果,使用 sizeof 运算符,计算出结构体变量的总存储单元。  .name  ????????????? ????? .sex ? .num 0 .score 0.0 0.0 0.0 printf(“%d”,sizeof(stu1));
8.1.2  结构体变量的声明 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],也可以定义为: struct date{ int year; int moth; int day; } struct student{  char name[20]; char sex;  long num;  struct date birthday; }
8.1.3  结构体成员的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],变量 v1 和 v2 各成员的引用形式为: v1.modular,v1.real,v1.imag 和  v2.modular,v2.real,v2.imag
8.1.3  结构体成员的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],元素用 {} 括起
8.1.3  结构体成员的引用 ,[object Object],[object Object],stu.name = "Wangyi" stu.sex = 'f' stu.num= 1308001 stu.score[ 0 ] = 98.5 stu.score[ 1 ] = 97.0 stu.score[ 2 ] = 95.0 Wangyi  ????????? ????????? f 1308001 98.5 97.0 95.0
8.1.3  结构体成员的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.1.3  结构体成员的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],输入:  Wangyi M 1308001L 98.5 97 95 输出:  **************************************** Name  Sex  Num  Score1  Score2  Score3 Wangyi  M  1308001  98.50  97.00  95.00
8.1.4  结构体变量的赋值 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],仅对赋值有效 如: stu1 == stu2; 或者, stu1  < stu2; 如: stu1 == stu2;  或者,  stu1  < stu2;  /*  非法  */
8.2  结构体数组和指向结构体指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.2 结构体数组元素的赋值及引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.2 结构体数组元素的赋值及引用 ,[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.2 结构体数组元素的赋值及引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.3  指向结构体变量的指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],定义指向结构体类型变量的指针变量:   struct Student stu,*p1, *p2 ;
8.2.3  指向结构体变量的指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.3  指向结构体变量的指针 ,[object Object],结构体变量 stu 结构体指针变量 p1 C 语言还提供了一个利用指针形式间接访问成员域的运算符,间接成员域访问运算符表示为 ->( 减号后面紧跟一个大于符号 ) 来表示。其引用形式为: 指针变量  ->  成员;
8.2.3  指向结构体变量的指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
例 8.3( 续 ) /*  指针变量指向一个 Student 类型结构体的存储空间 */ ptr = (struct Student *)malloc(sizeof(struct Student));  scanf(&quot;%s %c&quot;, ptr->name,&ptr->sex); scanf(&quot;%ld&quot;,&ptr->num); for(i = 0; i < 3; i ++) scanf(&quot;%f&quot;,&ptr->score[i]); fflush(stdin); /* 清空输入缓冲区 , 以回车作为上一行数据的输入结束符 */ printf(&quot;*********************************************&quot;); printf(&quot;Name  Sex  Num  Score1  Score2  Score3 &quot;);  printf(&quot;%-8s %-2c %8ld&quot;, ptr->name,ptr->sex,ptr->num); for(i = 0; i < 3; i ++)   printf(&quot;%8.2f&quot;,ptr->score[i]); printf(&quot;&quot;); free(ptr);  /*  释放指针变量所指向的存储空间   */ return 0; }
8.2.3  指向结构体变量的指针 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.2.4  结构体数组和指针的应用 ,[object Object],#include <stdio.h> struct student{  /*  结构体类型定义 */ int  num; char  name[20]; char  sex; int  age; float score; }; int main(){ /*  结构体数组 stu ,结构体变量 student1 定义和初始化 */ struct student stu[3]={{11302,&quot;Wang&quot;,'F',20,483}, {11303,&quot;Liu&quot;,'M',19,503}, {11304,&quot;Song&quot;,'M',19,471.5}}; struct student student1={11301,&quot;Zhang&quot;,'F',19,496.5},*p,*q;
8.2.4  结构体数组和指针的应用 int i; /* p 指向结构体变量 */ p=&student1; /*  访问结构体变量 */ printf(&quot;%s,%c,%5.1f&quot;,student1.name,(*p).sex,p->score);  /* q 指向结构体数组的元素 */ q=stu; for(i=0;  i<3;  i++,q++)  /*  循环访问结构体数组的元素 ( 下标变量 )*/ printf(&quot;%s,%c,%5.1f&quot;,q->name,q->sex,q->score);  return 0; }   运行程序结果: 输出:  Zhang,F, 86.0 Wang,F, 98.0 Liu,M, 90.0 Song,M, 95.0
8.3  结构体变量作为函数参数 ,[object Object],[object Object],[object Object]
8.3.1  结构体变量作为函数参数 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],定义一个函数 complexmodular 实现取模运算,参数是结构体变量,返回值为 float 型数据。 double complexmodular( struct complex_t v ){ double modular = 0.0; modular = sqrt( v.real * v.real + v.imag * v.imag ); return modular ; }
8.3.1  结构体变量作为函数参数 ,[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.3.2  函数的返回值 ,[object Object],[object Object],[object Object],struct complex_t{ double modular; double real, imag; };  程序运行结果: 输入: 输入第一个复数的实部和虚部 ( 空格隔开 ) 2,3 数据读入出错!请重试 1 2 输入第二个复数的实部和虚部 ( 空格隔开 ) 3,4 数据读入出错!请重试 3 4 输出: (1.00 + 2.00i)  +  (3.00 + 4.00i)  =  (4.00 + 6.00i) (1.00 + 2.00i)  × (3.00 + 4.00i)  =  (-5.00 + 10.00i) |(1.00 + 2.00i)|  =  2.24
8.4  链表及其应用 ,[object Object],[object Object]
8.4.1  链表结点的定义 ,[object Object],[object Object]
8.4.1  链表结点的定义 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.4.1  链表结点的定义 ,[object Object],Node *pnode1,*pnode2,*pnode3; pnode1 =(Node *)malloc(sizeof(Node)); strcpy(pnode1->name,”Tom”); pnode1->num = 1308001; pnode1->sex = ‘M’; pnode1->next = NULL;  /* NULL:  表示为空的指针  */ pnode2 =(Node *)malloc(sizeof(Node)); strcpy(pnode2->name,”Jerry”); pnode2->num = 1308002; pnode2->sex = ‘F’;  pnode2->next = NULL;  /* NULL:  表示为空的指针  */
8.4.1  链表结点的定义 ,[object Object],[object Object]
8.4.1  链表结点的定义 ,[object Object],[object Object],[object Object],[object Object]
8.4.1  链表结点的定义 ,[object Object]
8.4.1  链表结点的定义 ,[object Object],[object Object],[object Object],[object Object],[object Object],p1 p2 p3 p1 p2 p3 NULL
8.4.1  链表结点的定义 ,[object Object],[object Object],[object Object],p1 p2 p3 NULL p1 p2 p3 NULL p1->next = p3; free(p2);
8.4.2  链表的建立 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.4.2  链表的建立 ,[object Object],[object Object],[object Object]
8.4.2  链表的建立 ,[object Object],[object Object],[object Object],[object Object],[object Object]
8.4.3  链表的插入 ,[object Object],[object Object],[object Object],List* insert_node(List* head,Node *node){ List *p = head; List *prep = p; if( head == NULL || node == NULL ) return head; while( p->next != NULL ){ if ( p->num < node->num ){ prep = p; p = p->next; } 用于元素的定位,不断移动结点指针找到合适的插入点
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.4.4  链表的删除 ,[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
/*  删除点恰在 head 指针处,须修改 head 指针 */ if ( head == p ) head = p->next; else if ( p->next != NULL) prep->next = p->next; else  /* 删除点恰在最后一结点 , 直接将前一个结点的 next 域置空   */ prep->next = NULL; if ( p == NULL ) printf(“Not exist!”); else  free(p); return head; }
8.5 共用体 ,[object Object],[object Object]
8.5.1 共用体的定义 ,[object Object],[object Object],[object Object],[object Object],[object Object],如 : union data{ int  a ; float  b ; double c ; char  d ; }obj; 共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。
8.5.1 共用体的定义 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],int  main(){ printf(&quot;%d,%d&quot;, sizeof(struct  stud), sizeof(union data)); return 0; } 程序运行结果: 输出:  24 , 8
8.5.1 共用体的定义 ,[object Object],[object Object],d a b c a sizeof(int) b sizeof(float) c sizeof(double) d sizeof(char) a sizeof(double) b c d
8.5.2  共用体变量的引用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],int main() { untest.a = 6; printf(“%d”, untest.a); untest.c = 67.2; printf( “%5.1lf”, untest.c ); untest.d = ‘W’; untest.b = 34.2; printf( “%5.1lf,%c” , untest.b,  untest.d ); printf(“”); return 0; } 先前写入的字符被覆盖了,所以字符的输出是无法得知的,由写入内存的数据决定。 输出:  6 67.2 34.2,?
8.6  枚举型和自定义类型 ,[object Object],[object Object],[object Object]
8.6.1 枚举类型的定义和枚举变量的说明 ,[object Object],[object Object],[object Object],[object Object],[object Object],该枚举名为 Weekday ,枚举值共有 7 个,即一周中的七天。凡被说明为 Weekday 类型变量的取值只能是七天中的某一天。
8.6.1 枚举类型的定义和枚举变量的说明 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.6.2 枚举类型变量的赋值和使用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.6.2 枚举类型变量的赋值和使用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.6.2 枚举类型变量的赋值和使用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.6.2 枚举类型变量的赋值和使用 ,[object Object],[object Object],[object Object],[object Object],[object Object]
8.7  类型定义符 typedef ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
8.7  类型定义符 typedef ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],完全等效于:   STU body1,body2; 完全等效于:   char a1[20],a2[20],s1[20],s2[20]; 可用宏定义来代替 typedef 的功能,但是宏定义是由预处理完成的,而 typedef 则是在编译时完成的,后者更为灵活方便。
8.8  位段 ,[object Object],[object Object]
8.8.1 位域的定义和位域变量的说明 ,[object Object],[object Object],[object Object],[object Object],[object Object],如: struct bitsec { int a:6; int b:2; int c:8; };
8.8.1 位域的定义和位域变量的说明 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],说明 data 为 bitsec 变量,共占两个字节。其中位域 a 占 8 位,位域 b 占 2 位,位域 c 占 6 位。
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],在这个位域定义中 , a 占第一 数 的 4 位,后 4 位填 0 表示不使用 , b 从第二 数 开始 ,   占用 4 位, c 占用 第三个数的 4 位。
8.8.2  位域的使用 ,[object Object],[object Object],[object Object],[object Object]
8.8.2  位域的使用 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],pbit->a=0; pbit->b&=3; pbit->c|=1; printf(&quot;%d,%d,%d&quot;,pbit->a, pbit->b,pbit->c); return 0; }
8.9 结构体的综合应用 ,[object Object],[object Object],[object Object]
小结 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
5.1.1  一维数组的定义 ,[object Object],[object Object],合法标识符 表示元素个数 , 下标从 0 开始不能为变量 []:  数组运算符 优先级 (1), 左结合 , 不能用 ( ) ,[object Object],编译时分配连续内存 数组名表示内存首地址 (address.c); 它是地址常量 a[0] 0 1 4 5 a[1] a[2] a[3] a[4] a[5] 2 3 a ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Weitere ähnliche Inhalte

Was ist angesagt?

07 陣列與字串
07 陣列與字串07 陣列與字串
07 陣列與字串
shademoon
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
Chris Huang
 
Se2009 ch9
Se2009 ch9Se2009 ch9
Se2009 ch9
浒 刘
 
第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
hanmo1988
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
jane2006
 

Was ist angesagt? (20)

07 陣列與字串
07 陣列與字串07 陣列與字串
07 陣列與字串
 
Ch07
Ch07Ch07
Ch07
 
Python程式設計 - 基本資料運算
Python程式設計 - 基本資料運算Python程式設計 - 基本資料運算
Python程式設計 - 基本資料運算
 
Sql培训 (1)
Sql培训 (1)Sql培训 (1)
Sql培训 (1)
 
第5章数组
第5章数组第5章数组
第5章数组
 
Ch08
Ch08Ch08
Ch08
 
Python程式設計 - 分支作業
Python程式設計 - 分支作業Python程式設計 - 分支作業
Python程式設計 - 分支作業
 
第6章指针
第6章指针第6章指针
第6章指针
 
系統程式 -- 第 8 章 編譯器
系統程式 -- 第 8 章 編譯器系統程式 -- 第 8 章 編譯器
系統程式 -- 第 8 章 編譯器
 
一种基于拟合函数的图形识别算法
一种基于拟合函数的图形识别算法一种基于拟合函数的图形识别算法
一种基于拟合函数的图形识别算法
 
C語言列舉與聯合
C語言列舉與聯合C語言列舉與聯合
C語言列舉與聯合
 
5
55
5
 
重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)重構—改善既有程式的設計(chapter 7)
重構—改善既有程式的設計(chapter 7)
 
Se2009 ch9
Se2009 ch9Se2009 ch9
Se2009 ch9
 
Java物件導向
Java物件導向Java物件導向
Java物件導向
 
SCJP ch08
SCJP ch08SCJP ch08
SCJP ch08
 
第9章 transact sql程序设计
第9章   transact sql程序设计第9章   transact sql程序设计
第9章 transact sql程序设计
 
Ch10
Ch10Ch10
Ch10
 
Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版Swift编程语言入门教程 中文版
Swift编程语言入门教程 中文版
 
《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)《Java程序设计》期末考试试题 (六)
《Java程序设计》期末考试试题 (六)
 

Andere mochten auch

881.социализация личности посредством языка познание, понимание, освоение
881.социализация личности посредством языка познание, понимание, освоение881.социализация личности посредством языка познание, понимание, освоение
881.социализация личности посредством языка познание, понимание, освоение
ivanov1566334322
 

Andere mochten auch (7)

8 8-rev1.bprx
8 8-rev1.bprx8 8-rev1.bprx
8 8-rev1.bprx
 
881.социализация личности посредством языка познание, понимание, освоение
881.социализация личности посредством языка познание, понимание, освоение881.социализация личности посредством языка познание, понимание, освоение
881.социализация личности посредством языка познание, понимание, освоение
 
Монетизируем сайт. Часть 8: Первый этап завершен
Монетизируем сайт. Часть 8: Первый этап завершенМонетизируем сайт. Часть 8: Первый этап завершен
Монетизируем сайт. Часть 8: Первый этап завершен
 
8/8
8/88/8
8/8
 
Каталог Faberlic
Каталог FaberlicКаталог Faberlic
Каталог Faberlic
 
8 Comment gérer le personnel lors d'une reprise ?
8 Comment gérer le personnel lors d'une reprise ? 8 Comment gérer le personnel lors d'une reprise ?
8 Comment gérer le personnel lors d'une reprise ?
 
89.ge 06 2009
89.ge 06 200989.ge 06 2009
89.ge 06 2009
 

Ähnlich wie 第8章结构体与共用体

14 hibernate hql查询1
14 hibernate hql查询114 hibernate hql查询1
14 hibernate hql查询1
Zelin Wang
 
软件工程 第二章
软件工程 第二章软件工程 第二章
软件工程 第二章
浒 刘
 
香港六合彩
香港六合彩香港六合彩
第8章 数据完整性
第8章   数据完整性第8章   数据完整性
第8章 数据完整性
hanmo1988
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
Sita Liu
 
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
terry28853669
 
腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析
areyouok
 
腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析
topgeek
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
yiditushe
 

Ähnlich wie 第8章结构体与共用体 (20)

Ch10
Ch10Ch10
Ch10
 
C語言結構與串列
C語言結構與串列 C語言結構與串列
C語言結構與串列
 
14 hibernate hql查询1
14 hibernate hql查询114 hibernate hql查询1
14 hibernate hql查询1
 
C++模板与泛型编程
C++模板与泛型编程C++模板与泛型编程
C++模板与泛型编程
 
软件工程 第二章
软件工程 第二章软件工程 第二章
软件工程 第二章
 
lkdsoew
lkdsoewlkdsoew
lkdsoew
 
香港六合彩
香港六合彩香港六合彩
香港六合彩
 
第8章 数据完整性
第8章   数据完整性第8章   数据完整性
第8章 数据完整性
 
Ch 6
Ch 6Ch 6
Ch 6
 
快速了解PostgreSQL
快速了解PostgreSQL快速了解PostgreSQL
快速了解PostgreSQL
 
1 C入門教學
1  C入門教學1  C入門教學
1 C入門教學
 
Dev307
Dev307Dev307
Dev307
 
Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2Excel函數進階班(北市政府公訓處) 2
Excel函數進階班(北市政府公訓處) 2
 
腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析
 
腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析腾讯大讲堂48 数据库查询优化浅析
腾讯大讲堂48 数据库查询优化浅析
 
Free Marker中文文档
Free Marker中文文档Free Marker中文文档
Free Marker中文文档
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算認識 C++11 新標準及使用 AMP 函式庫作平行運算
認識 C++11 新標準及使用 AMP 函式庫作平行運算
 
腾讯大讲堂42 数据库内核设计思路浅析
腾讯大讲堂42 数据库内核设计思路浅析腾讯大讲堂42 数据库内核设计思路浅析
腾讯大讲堂42 数据库内核设计思路浅析
 
VC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSUVC++ Programming Training Lecture in Control Lab 301 of YSU
VC++ Programming Training Lecture in Control Lab 301 of YSU
 
Ch10 教學
Ch10 教學Ch10 教學
Ch10 教學
 

Mehr von summerfeng

第7章预编译命令
第7章预编译命令第7章预编译命令
第7章预编译命令
summerfeng
 
第3章算法与控制语句
第3章算法与控制语句第3章算法与控制语句
第3章算法与控制语句
summerfeng
 
第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式
summerfeng
 

Mehr von summerfeng (6)

第7章预编译命令
第7章预编译命令第7章预编译命令
第7章预编译命令
 
第4章函数
第4章函数第4章函数
第4章函数
 
第3章算法与控制语句
第3章算法与控制语句第3章算法与控制语句
第3章算法与控制语句
 
第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式第2章数据类型、运算符和表达式
第2章数据类型、运算符和表达式
 
第1章概述
第1章概述第1章概述
第1章概述
 
第9章文件
第9章文件第9章文件
第9章文件
 

第8章结构体与共用体

  • 2.
  • 3.
  • 4. 基本概念 一组信息 作为 一个逻辑整体,共同描述了一 个 完整 个体。 C 语言 引入一种能集中不同数据类型于一体的构造类型 -- 结构体类型 。结构体类型的变量可以拥有不同数据类型的成员,是不同数据类型成员的集合。
  • 5.
  • 6.
  • 7.
  • 8.
  • 9. 8.1.2 结构体变量的声明 定义结构体类型同时定义变量 struct student { char name[20]; char sex; long num; float score[3]; } stu1,stu2; /* 定义结构体类型变量 */ 将变量直接定义在结构体类型的定义后,比较紧凑。 但 ,当程序较为复杂时,结构体数据类型通常封装为单独的文件, 此 种定义变量的方式,并不可取。
  • 10. 8.1.2 结构体变量的声明 通过定义无名结构体数据类型定义变量 struct{ char name[20]; char sex; long num; float score[3]; } stu1,stu2; /* 定义该结构体类型变量 */ 无结构体类型 名称 , 导致仅能 直接定义变量外,不能在程序的其他位置定义构体类型变量
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27. 例 8.3( 续 ) /* 指针变量指向一个 Student 类型结构体的存储空间 */ ptr = (struct Student *)malloc(sizeof(struct Student)); scanf(&quot;%s %c&quot;, ptr->name,&ptr->sex); scanf(&quot;%ld&quot;,&ptr->num); for(i = 0; i < 3; i ++) scanf(&quot;%f&quot;,&ptr->score[i]); fflush(stdin); /* 清空输入缓冲区 , 以回车作为上一行数据的输入结束符 */ printf(&quot;*********************************************&quot;); printf(&quot;Name Sex Num Score1 Score2 Score3 &quot;); printf(&quot;%-8s %-2c %8ld&quot;, ptr->name,ptr->sex,ptr->num); for(i = 0; i < 3; i ++) printf(&quot;%8.2f&quot;,ptr->score[i]); printf(&quot;&quot;); free(ptr); /* 释放指针变量所指向的存储空间 */ return 0; }
  • 28.
  • 29.
  • 30. 8.2.4 结构体数组和指针的应用 int i; /* p 指向结构体变量 */ p=&student1; /* 访问结构体变量 */ printf(&quot;%s,%c,%5.1f&quot;,student1.name,(*p).sex,p->score); /* q 指向结构体数组的元素 */ q=stu; for(i=0; i<3; i++,q++) /* 循环访问结构体数组的元素 ( 下标变量 )*/ printf(&quot;%s,%c,%5.1f&quot;,q->name,q->sex,q->score); return 0; } 运行程序结果: 输出: Zhang,F, 86.0 Wang,F, 98.0 Liu,M, 90.0 Song,M, 95.0
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52. /* 删除点恰在 head 指针处,须修改 head 指针 */ if ( head == p ) head = p->next; else if ( p->next != NULL) prep->next = p->next; else /* 删除点恰在最后一结点 , 直接将前一个结点的 next 域置空 */ prep->next = NULL; if ( p == NULL ) printf(“Not exist!”); else free(p); return head; }
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.

Hinweis der Redaktion

  1. #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #define N 5 struct Student { char name[20]; /* 学生姓名 */ long num; /* 学号 */ float score[3];/* 三科考试成绩 */ float aver; /* 成绩均分 */ }; struct Student stu[N]; /* 定义了一个班级同学的信息 */ static float scoreaver[N]; void InputData() { int i,j; for(i = 0; i &lt; N; i++) { scanf(&amp;quot;%s %ld %f %f %f&amp;quot;,stu[i].name,&amp;stu[i].num, &amp;stu[i].score[0],&amp;stu[i].score[1],&amp;stu[i].score[2]); stu[i].aver = (stu[i].score[0] + stu[i].score[1] + stu[i].score[2])/3; /* 计算平均成绩 */ for(j = 0; j &lt; 3; j++) scoreaver[j] += stu[i].score[j]; /* 计算每门课程的总成绩 */ } } void SortData() { int i,j; struct Student temp; /* 也可以写成 struc Student temp; */ for(i = 0; i &lt; N -1; i++) for(j = i; j &lt; N; j++) if ( stu[i].aver &lt; stu[j].aver ){ temp = stu[i]; /* 使用结构体变量的赋值操作实现元素的交换 */ stu[i] = stu[j]; stu[j] = temp; } } void PrintData() { int i; printf(&amp;quot;***********************************************\\n&amp;quot;); printf(&amp;quot; Name Num Score1 Score2 Score3\\n&amp;quot;); for(i = 0; i &lt; N; i++) printf(&amp;quot;%-10s%8ld%8.2f%8.2f%8.2f\\n&amp;quot;,stu[i].name,stu[i].num, stu[i].score[0],stu[i].score[1],stu[i].score[2]); } void PrintAverage() { int i; printf(&amp;quot;************************************************\\n&amp;quot;); for(i=0; i &lt; 3; i++) printf(&amp;quot;Score%d Average:%8.2f\\n&amp;quot;,i+1,scoreaver[i]/N); } int main() { InputData(); SortData(); PrintData(); system(&amp;quot;Pause&amp;quot;); return 0; }
  2. #include &lt;stdio.h&gt; #include &lt;math.h&gt; struct complex_t{ double modular; double real, imag; }; int scan_complex(struct complex_t *c); void print_complex(struct complex_t c); struct complex_t add_complex(struct complex_t c1, struct complex_t c2); struct complex_t multiply_complex(struct complex_t c1, struct complex_t c2); double modular(struct complex_t c); int main(){ struct complex_t com1, com2; printf(&amp;quot; 输入第一个复数的实部和虚部 ( 空格隔开 )\\n&amp;quot;); while (!scan_complex(&amp;com1)) printf(“ 数据读入出错!请重试 \\n”); printf(&amp;quot; 输入第二个复数的实部和虚部 ( 空格隔开 )\\n&amp;quot;); while (!scan_complex(&amp;com2)) printf(“ 数据读入出错!请重试 \\n”); /* 实现两个复数的加 */ printf(&amp;quot;\\n&amp;quot;); print_complex(com1); printf(&amp;quot; + &amp;quot;); print_complex(com2); printf(&amp;quot; = &amp;quot;); print_complex(add_complex(com1, com2)); /* 实现两个复数的积 */ printf(&amp;quot;\\n&amp;quot;); print_complex(com1); printf(&amp;quot; × &amp;quot;); print_complex(com2); printf(&amp;quot; = &amp;quot;); print_complex(multiply_complex(com1, com2)); /* 取复数的模 */ printf(&amp;quot;\\n|&amp;quot;); print_complex(com1); printf(&amp;quot;| = &amp;quot;); printf(&amp;quot;%.2f&amp;quot;,modular(com1)); printf(&amp;quot;\\n&amp;quot;); return 0; } /* 读入复数 返回 1 : 输入正常 , 0 : 输入错误 , EOF :读入结束标志位 (Ctrl+Z) */ int scan_complex(struct complex_t *c){ int status; fflush(stdin); /* 清空输入缓冲区 */ status = scanf(&amp;quot;%lf%lf&amp;quot;, &amp;c-&gt;real, &amp;c-&gt;imag); if (status == 2) status = 1; else if (status != EOF) status = 0; return (status); } void print_complex(struct complex_t c){ char sign; if (c.imag &lt; 0) sign = &apos;-&apos;; else sign = &apos;+&apos;; printf(&amp;quot;(%.2f %c %.2fi)&amp;quot;, c.real, sign, fabs(c.imag)); } /* c1 + c2 */ struct complex_t add_complex(struct complex_t c1, struct complex_t c2){ struct complex_t csum; csum.real = c1.real + c2.real; csum.imag = c1.imag + c2.imag; return (csum); } /* c1 * c2 */ struct complex_t multiply_complex(struct complex_t c1, struct complex_t c2){ struct complex_t temp; temp.real = c1.real * c2.real - c1.imag * c2.imag; temp.imag = c1.real * c2.imag + c1.imag * c2.real; return (temp); } /* |c| */ double modular(struct complex_t c){ return sqrt(c.real * c.real + c.imag * c.imag); }
  3. #include &lt;stdio.h&gt; struct Node{ char name[20]; long num; Node *next; }; struct Node * create(List *); int visit(struct Node *); int main(){ struct Node *head=NULL; struct Node temp; head = create(head); long num; if ( head == NULL ){ printf(&amp;quot;Create List Error\\n&amp;quot;); exit(0); } visit(head); while (1){ if ( getnewnode(&amp;temp) == 0 ) printf(&amp;quot;Can not generate a new Node\\n&amp;quot;); else break; } head = insert_node(head,&amp;temp); visit(head); printf(&amp;quot;Input a num to delete:\\n&amp;quot;); scanf(&amp;quot;%ld&amp;quot;,&amp;num); head = delete_node(head,num); visit(head); return 0; } struct Node * create(struct Node * head){ Node *newnode; struct Node *p; if ( head != NULL ){ printf(&amp;quot;List already exisit\\n&amp;quot;); return head; } newnode = (Node*)malloc(sizeof(Node)); if ( getnewnode(newnode)== 0 ){ printf(&amp;quot;Can not generate a new Node\\n&amp;quot;); return NULL; } head = p = newnode; while ( newnode-&gt;num != -1 ){ newnode = (Node*)malloc(sizeof(Node)); getnewnode(newnode); p-&gt;next = newnode; p = newnode; } return head; } int visit(struct Node *head){ struct Node * p = head; if ( p == NULL ) return 0; while( p-&gt;next != NULL ){ printf(&amp;quot;%10s %10ld\\n&amp;quot;,p-&gt;name,p-&gt;num); p = p-&gt;next; } return 1; } int getnewnode(struct Node *node){ if ( scanf(&amp;quot;%s%ld&amp;quot;,node-&gt;name,&amp;node-&gt;num) == 0 ) return 0; node-&gt;next = NULL; return 1; }
  4. /* 程序名称: ex8_9.c 建立日期: 2010-8-10 程序功能:链表中插入一个结点 */ List* insert_node(List* head,Node *node){ List *p = head; List *prep = p; if( head == NULL || node == NULL ) return head; while( p-&gt;next != NULL ){ if ( p-&gt;num &lt; node-&gt;num ){ prep = p; p = p-&gt;next; } else if ( p-&gt;num == node-&gt;num ){ printf(&amp;quot;%s already exist!\\n&amp;quot;,node-&gt;name); return head; } else break; } if ( head == p ){ /* 如果插入点在链表的头部,需要改动 head 指针 */ node-&gt;next = p; head = node; } else{ node-&gt;next = prep-&gt;next; prep-&gt;next = node; } return head; }
  5. #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #define MAX 100 struct addr{ char name[30]; char street[40]; char city[20]; char state[10]; unsigned long int zip; } addr_list[MAX]; void init_list(); void enter(); void deleteone(); void print(); int menu_select(); int find_free(); int main(){ char choice; init_list(); for(;;){ choice = menu_select(); switch(choice){ case 1: enter(); break; case 2: deleteone(); break; case 3: print(); break; case 4: exit(0); } } printf(&amp;quot;\\n&amp;quot;); return 0; } void init_list() { /* 初始化地址簿 */ int t; for(t=0; t&lt;MAX; ++t) addr_list[t].name[0] = &apos;\\0&apos;; } int menu_select(){ /* 选择一个菜单项 */ char s[80]; int c; printf(&amp;quot;1. Enter a name\\n&amp;quot;); printf(&amp;quot;2. Delete a name\\n&amp;quot;); printf(&amp;quot;3. print the file\\n&amp;quot;); printf(&amp;quot;4. Quit\\n&amp;quot;); do { printf(&amp;quot;\\nEnter your choice: &amp;quot;); gets(s); c = atoi(s); /* 系统函数,将数字串转成数值 */ } while(c&lt;0 || c&gt;4); return c; } void enter(){ /* 在空位处输入联系人详细信息 */ int position; char s[80]; position = find_free(); if(position==-1) { printf(&amp;quot;\\nList Full&amp;quot;); return; } printf(&amp;quot;Enter name: &amp;quot;); gets(addr_list[position].name); printf(&amp;quot;Enter street: &amp;quot;); gets(addr_list[position].street); printf(&amp;quot;Enter city: &amp;quot;); gets(addr_list[position].city); printf(&amp;quot;Enter state: &amp;quot;); gets(addr_list[position].state); printf(&amp;quot;Enter zip: &amp;quot;); gets(s); addr_list[position].zip = strtoul(s, &apos;\\0&apos;, 10); } int find_free() { /* 地址簿中查找空位 */ int t; for(t=0; addr_list[t].name[0] &amp;&amp; t&lt;MAX; ++t) ; if(t==MAX) return -1; /* 地址簿已满 */ return t; } void deleteone(){ /* 在地址簿中删除一个联系人 */ int position; char s[80]; printf(&amp;quot;enter record #: &amp;quot;); gets(s); position = atoi(s); if(position&gt;=0 &amp;&amp; position &lt; MAX) addr_list[position].name[0] = &apos;\\0&apos;; } void print(){ /* 显示详细地址 */ int t; for(t=0; t&lt;MAX; ++t) { if(addr_list[t].name[0]) { printf(&amp;quot;%s\\n&amp;quot;, addr_list[t].name); printf(&amp;quot;%s\\n&amp;quot;, addr_list[t].street); printf(&amp;quot;%s\\n&amp;quot;, addr_list[t].city); printf(&amp;quot;%s\\n&amp;quot;, addr_list[t].state); printf(&amp;quot;%lu\\n\\n&amp;quot;, addr_list[t].zip); } } }