1、高级语言程序设计高级语言程序设计 诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点: 每个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。 不同的人,数据的值不同,但都有共同的成员组成。 struct 结构体名 类型标识符 成员名; ; 关键字 用户指定/*struct 结构体名合称“结构类型标识符”*/*成员表列*/*此处分号不能省略*/【例一】main() struct student int number; char name6; char sex; int age; char address20; ; 本质上,
2、它定义了一个名为”student”的“结构体类型”(表头)。 在定义结构体类型的同时定义结构体类型变量 struct 结构体名 变量名1,变量名2, 变量名n; 直接定义结构体类型变量 struct 变量名1,变量名2, 变量名n;实际使用中,还可以使用以下形式:先定义 #define STU struct student尔后 STU student1,student2;【例四】main() struct student int number; char name6; char sex; int age; char address20; ; printf(%dn ,sizeof(struct
3、student); 结果: 31答案:C).real=1 正确编程:main() struct char name15; char class12; long num; stu; scanf(%s,stu.name); scanf(%s,stu.class); scanf(%ld,&stu.num); printf(%s,%s,%ldn,stu.name,stu.class,stu.num);亦可用以下赋值语句:strcpy(stu.name,”wenli”); strcpy(stu.class, “Computer”);stu.num=200113;为什么啊?但是如果改为stu.name=”
4、wenli”是错误的。 #include stdio.hstruct datetp unsigned year,month,day;unsigned months =0,31,28,31,30,31,30,31,31,30,31,30,31;main() struct datetp d; printf(请输入年 月 日:); scanf(%u%u%u,&d.year,&d.month,【1】); if (d.year%4=0&d.year%100!=0)|(d.year%400)=0) months2=29; printf(%d年%d月%d日是该年的第%d天。n, d.year,d.month
5、, d.day, getdays(d); getdays(【2】date) unsigned days=0,i; for(i=1;idate.month;i+) days+=【3】; days+=date.day; return days;答案:【1】&d.day 【2】struct datetp 【3】monthsi struct student int num; char name20; char sex; int age; float score; char addr30;struct student stu3;struct student int num; char name20; c
6、har sex; int age; float score; char addr30;stu3;struct student int num; char name20; char sex; int age; float score;stu3= 10101,李宁,M,18,87.5, 10102,张凡,M,19,99, 10103,王敏,F,20,78.5 ;struct student int num; char name20; char sex; int age; float score;;Struct student stu3= 10101,李宁,M,18,87.5, 10102,张凡,M
7、,19,99, 10103,王敏,F,20,78.5 ; main() struct student int num; char name20; char sex; int age; float score; stu3= 10101,李宁,M,18,87.5, 10102,赵凡,M,19,99, 10103,王敏,F,20,78.5 ; int i; clrscr(); for (i=0;i3;i+) printf(%s,学号%d,成绩:%.2fn,stui.name,stui.num,stui.score); 试一试运行结果这里面的花括号能不能去掉?struct tm int hours,m
8、inutes,seconds;main() struct tm time; time.hours=time.minutes=time.seconds=0; clrscr(); printf(Now, press any key to begin my clock.); getch(); for(;) update(&time); display(&time); update(struct tm *t) (*t).seconds+; if (*t).seconds=60) (*t).seconds=0; (*t).minutes+; if (*t).minutes=60) (*t).minute
9、s=0; (*t).hours+; if(*t).hours=24) (*t).hours=0; delay();display(struct tm *t) clrscr(); printf(%d:,(*t).hours); printf(%d:,(*t).minutes); printf(%dn,(*t).seconds);delay() long int t; for(t=1;t结果有什么变化?特点: 按需分配内存 不连续存放 有一个“头指针”(head)变量 每个结点中应包括一个指针变量,用它存放下一结点的地址。 最后一个结点的地址部分存放一个“NULL” (空地址)。 A) for (
10、 ;p!=NULL;p+) printf(“%7d,”,p-data); B) for ( ;!p;p=p-next) printf(“%7d,”,(*p).data); C) while (p) printf(“%7d,”,(*p).data); p=p-next; D) while (p!=NULL) printf(“%7d,”, p-data); p+; 答案:Cmain() struct stu int num; char *name; int age; st=12,ABC,100,*p=&st; clrscr(); printf(%pn,p+); printf(%pn,p+); pr
11、intf(%pn,p+); printf(%pn,p+); printf(%dn,sizeof(st); 结果: FFD2 FFD8 FFDE FFE4 6结论: 若p指向某个结构体变量,则 p+ 的功能是将指针p 移到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p+进行结点间的跳转。#define NULL 0struct student long num; float score; struct student *next;main() struct student a,b,c,*head,*p; a.num=99101;a.score=89.5; b.num=9910
12、3;b.score=90; c.num=99107;c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; do printf(%ld,%.1fn,p-num,p-score); p=p-next; while(p!=NULL);注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?1、“动态内存分配”的概念 使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。 如,为了保证程序的通用性,最大需要建
13、立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。 此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。 使用动态内存分配技术建立的链表称为“动态链表”。结果:10 9 8 7 6 5 4 3 2 1 union 共用体名 类型标识符 成员名; ; 关键字 用户指定/*union 共用体名合称“共用类型标识符”*/*成员表列*/*此处分号不能省略*/示例union data int i; char ch; float
14、 p; ; 用union 共用体名 复合词声明 union 共用体名 ; union 共用体名 变量名1,变量名2, 变量名n; 在定义共用体类型的同时声明 union 共用体名 变量名1,变量名2, 变量名n; 直接声明共用体类型变量 union 变量名1,变量名2, 变量名n;结果:18结果:1,2p 经常不断地学习,你就什么都知道。你知道得越多,你就越有力量p Study Constantly, And You Will Know Everything. The More You Know, The More Powerful You Will Be写在最后谢谢大家荣幸这一路,与你同行ItS An Honor To Walk With You All The Way演讲人:XXXXXX 时 间:XX年XX月XX日