数据的组织结构二高级语言程序设计北京工业大学.pptx
《数据的组织结构二高级语言程序设计北京工业大学.pptx》由会员分享,可在线阅读,更多相关《数据的组织结构二高级语言程序设计北京工业大学.pptx(111页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、一、结构体如何表示多个不同类型的数据项,这些数据项逻辑上构成一个数据元素?如:每个学生都有学号、姓名每本书都有书号、书名、作者、出版社用结构体类型来表示。第1页/共111页struct ;struct point int x;int y;struct student int sNum;char name10;结构体类型声明声明的是数据类型,不是变量!第2页/共111页point p1,p2;/对比:int i,j;student zhang,wang;定义时初始化point p1=1,1;student zhang=1,张一;结构体类型变量定义p1p1p111zhang1张一整型大小10个字符
2、大小第3页/共111页结构体类型变量的成员变量的引用.p1.x p1.y zhang.sNum zhang.name即看成普通变量使用scanf(%d%d,&p1.x,&p1.y);scanf(%s,zhang.name);printf(%s,zhang.name);p1.x=1;zhang.name=张一;第4页/共111页同一结构体类型变量可以赋值point p1=1,2,p2;p2=p1;等同于:p2.x=p1.x;p2.y=p1.y;第5页/共111页例:学生基本信息的组织学生信息:学号、姓名、出生日期、所属院系、专业完成任务键盘输入30个学生的信息、并屏幕输出;键盘输入月份和日期,查
3、找并输出本年度在给定日期之后过生日的学生信息第6页/共111页例:学生基本信息的组织设计数据结构:每个学生基本信息用结构体描述学号学号int num;姓名姓名char name24;出生日期出生日期自定义一个结构:年、月、日自定义一个结构:年、月、日所属院系所属院系char department48;专业专业char major32;第7页/共111页struct Date/*日期结构*/int year;int month;int day;struct StudentInfo/*学生信息结构*/int num;char name24;Date birthday;char department
4、48;char major32;第8页/共111页数据类型的别名用户可以为已有的数据类型起别名语法:typedef 原数据类型 新的数据类型名例如:typedef int xuehao;思考这样做的好处?程序更加清晰易懂日期Date和学生信息StudentInfo结构的另一种定义方式:第9页/共111页typedef struct /*日期结构*/int year;int month;int day;Date;typedef struct /*学生信息结构*/int num;char name24;Date birthday;char department48;char major32;Stu
5、dentInfo;第10页/共111页30名学生用数组表示#define NUM 30StudentInfo sNUM;第11页/共111页程序结构设计给出每个函数的定义,包括:功能说明,入口参数,出口参数等。主模块main()输入模块inputIofo()查询处理模块searchInfo()输出模块outputInfo第12页/共111页输入模块void inputInfo(StudentInfo);功能:将全部学生信息通过键盘输入到StudentInfo 数组。参数:学生信息数组。返回值:没有。输出模块void outputInfo(StudentInfo );功能:格式化输出Studen
6、tInfo 数组中的全部学生信息。参数:学生信息数组。返回值:没有。查询处理模块void searchInfo(StudentInfo,DATE);功能:查找并输出StudentInfo 数组中,DATE之后过生日的学生信息。参数:学生信息数组。查找关键字:Date返回值:没有。第13页/共111页依据定义设计函数的流程,编写代码。编写主模块函数的代码。看书P170,程序代码。分析书中设计的优缺点?第14页/共111页结构体应用例题P172,键盘输入10个整数,将它们从小到大重新排序,要求输出排序后的结果和排序前的位置数据结构用结构体类型将整数和原始位置绑在一起typedef struct i
7、nt data;/*整型数值*/int pos;/*原始位置*/DATATYPE;算法输入:针对本次任务修改输出:针对本次任务修改排序:用以前的函数第15页/共111页例:模拟发扑克牌数据结构一张扑克牌的表示一副扑克牌的表示算法初始化一副扑克牌洗牌发牌P175第16页/共111页二、指针指针类型变量的定义*int*intptr;char*chptr;intptr0 x0012ff78一个地址大小chptr0 x0012ff70一个地址大小指针是变量是地址变量第17页/共111页指针类型变量的引用int*intptr;char*chptr;int i=0;char c=a;intptr=&i;/
8、i的地址赋给intptrchptr=&c;/c的地址赋给chptr第18页/共111页intptr0 x0012ff780 x0012ff78chptr0 x0012ff700 x0012ff700aint*intptr;char*chptr;int i=0;char c=a;intptr=&i;chptr=&c;ci第19页/共111页指针变量所指的值*intptr=30;在格式化输入输出中的应用printf(“%d,%c”,*intptr,*chptr);scanf(“%d%c”,intptr,chptr);intptr30第20页/共111页intptr1intptr2NULL指针变量可
9、初始化为空指针int*intptr1=&i;int*intptr2=NULL;指针赋值intptr2=intptr1;i第21页/共111页指针比较if(intptr2=intptr1)if(intptr2=NULL)if(!intptr2)第22页/共111页指针加减int*p=data;/p指向data0;即:&data0p+;/p指向data1;p=p+2;/p指向data3;p=p-2;/p指向data1;p=p+12;/成为bug;0 1 2 3 4 5 6 7 8 9dataint data10;第23页/共111页例char*strchr(char*s,char c)函数确定某个
10、字符在字符串中出现的位置s 是字符串,c 要找的字符strchr函数返回指向找到的字符的指针用此函数获取指定字符在字符串中的位置数目char s=1236.87;int p;p=strchr(s,.)-s+1;printf(位置在:%dn,p);strchr函数返回指针,指针相减定位位置第24页/共111页例#include stdio.h#include string.hint main(int argc,char*argv)char b=Goodbye;char*pb=&b7;while(-pb=&b0)putchar(*pb);putchar(n);return 0;逆序第25页/共11
11、1页为什么指针变量也要有类型?指针变量所存地址没有区别但对指针变量所存地址指向的数据的操作不同 (不同数据集合上定义的操作不同,如:指针加1的操作)指针可指向各种数据类型,如基本类型、数组、函数、对象、指针等第26页/共111页指针与数组数组名是指向数组第1个元素的指针,但这个指针是常量;char str=program;printf(“%cn”,*str);/打印p printf(“%cn”,*+str);/错 printf(“%cn”,*(1+str);/对char*p;p=str;printf(“%cn”,*+p);/打印r第27页/共111页指针与数组数组名定位数组元素P184 图6-
12、14指针定位数组元素P184 图6-15第28页/共111页利用指针对数组元素进行操作int iarray20;int*ptr;/方法一for(ptr=iarray,i=0;i20;i+)printf(“%d”,*(ptr+i);/方法二for(ptr=iarray;ptriarray+20;ptr+)printf(“%d”,*ptr);例6-4 P185第29页/共111页指针数组例子/打印整型数组指定的行。j:行号(0开始),rowD:行长度,p:指向数组第一个元素的指针void pr_row(int j,int rowD,int*p)int i;p=p+(j*rowD);for(i=0;
13、irowD;i+)printf(“%d ”,*(p+i);第30页/共111页二维数组与一维指针数组int a32;a00a01a10a11a20a21a0a0a1a2第31页/共111页二维数组与一维指针数组int a32;a00a01a10 a11a20 a21a0a1a2a0,a1,a2,一维数组的首地址,是指针。用指针定位二维数组元素:i 代表行,j 代表列int*ptr=a0;元素:*(ptr+i*列数+j)第32页/共111页例:P187#define ROWNUM 5#define COLNUM 4int aROWNUMCOLNUM;int*ptr1;ptr1=a0;for(i=
14、0;iROWNUM;i+)for(j=0;jCOLNUM;j+)printf(%3d,*(ptr1+i*COLNUM+j);printf(n);可替换:ptr1=&a00;ptr1=(int*)a;第33页/共111页例:P187int(*ptr2)COLNUM;ptr2=&a0;/a0是指针,可以:ptr2=a;for(i=0;iROWNUM;i+)for(j=0;jCOLNUM;j+)printf(%3d,*(*(ptr2+i)+j);printf(n);书错int(*ptr2)COLNUM;与 int*ptr2COLNUM;区别int*ptr2COLNUM;/是整型指针的数组int(*p
15、tr2)COLNUM;/指向整型指针的指针数组第34页/共111页指针数组int a10;int *b3;b0=&a0;for(i=0;inumber);/等价:printf(%d,zhang.number);第41页/共111页例:选举问题选举问题:某部门,需要由全体员工推选一名办公室主任。假设有10名候选人。编程序依据每个候选人的得票数量,得票最多当选,给出选举结果包括候选人编号和得票数。定义结构体:struct Candidateint number;/候选人号码int vote;/候选人得票数;第42页/共111页int main()Candidate data NUM;Candida
16、te MySelected;input(data,NUM);MySelected=max(data,NUM);output(MySelected);return 0;第43页/共111页/*查找得票最多的候选人。参数,返回值。*/Candidate max(Candidate value,int n)int i;Candidate selected;selected.vote=value0.vote;selected.number=value0.number;for(i=1;i selected.vote)selected.vote=valuei.vote;selected.number=va
17、luei.number;return selected;第44页/共111页void output(Candidate selected)printf(当选者是%d候选人。得票数%d。n,selected.number,selected.vote);return;void input(Candidate value,int n)int i;printf(请输入%d个候选人的号码:,n);for(i=0;in;i+)scanf(%d,&valuei.number);printf(请输入%d个候选人的得票数:,n);for(i=0;idata);/等价:printf(%d,a.data);第46页
18、/共111页三、动态申请存储空间库函数中动态申请和释放存储空间的函数,包含:stdlib.hvoid*malloc(int size)/申请void free(void*p)/释放例:int*ptr=(int*)malloc(sizeof(int)*20);free(ptr);为什么叫动态内存分配?第47页/共111页数组:int a10;/静态内存分配动态申请内存空间存储数组int*ptr=(int*)malloc(sizeof(int)*10);比较:程序运行到此语句才分配内存空间必须释放注意内存泄漏第48页/共111页例6-6,P190,构造杨辉三角形a分析题目,设计数据结构一维整型指针
19、数组动态生成整型数组空间第49页/共111页四、引用引用类型变量定义:int&a;/变量的别名用法:int&a;a=0;第50页/共111页与地址相关的运算符:*&int*p;/声明 p 是一个int型指针int i=0;int&rf=i;/声明一个int 型的引用,rf存int型数据的地址,/所以 int&rf=0 错,但可以 int rf(0);p=&i;printf(%dn,*p);/指针 p 所指的内容,*是指针运算符printf(%dn,(*p)+);/指针 p 所指的内容加1printf(%dn,*p);printf(%dn,rf);/rf此时用 i 的值rf+;/引用数据加1p=
20、&rf;printf(%dn,*p);第51页/共111页五、再谈函数和函数参数值传递:变量值做函数参数void exchang1(int x,int y)int s;s=x;x=y;y=s;main()int t1=1,t2=2;exchange1(t1,t2);Exchange1中对x,y的改变不影响t1,t2的值。实际没有完成交换功能。结论:值传递时,被调用函数中对参数值的改变,不影响调用它的函数实参的值。第52页/共111页地址传递:指针变量做函数参数void exchang3(int*x,int*y)int s;s=*x;*x=*y;*y=s;main()int t1=1,t2=2;
21、exchange3(&t1,&t2);Exchange3中对x,y所指值的改变使t1,t2的值发生改变。完成了交换功能。结论:地址传递时,被调用函数中对参数值的改变,将影响调用它的函数实参的值。第53页/共111页引用变量做函数参数void exchang2(int&x,int&y)int s;s=x;x=y;y=s;main()int t1=1,t2=2;exchange2(t1,t2);Exchange2中对x,y的改变使t1,t2的值发生改变。完成了交换功能。结论:地址传递时,被调用函数中对参数值的改变,将影响调用它的函数实参的值。第54页/共111页数组做函数参数void exchan
22、g4(char*a,char*b)char s5;strcpy(s,a);strcpy(a,b);strcpy(b,s);main()char t35=aaa;char t45=bbb;exchang4(t3,t4);Exchange4中对a,b的值改变使t3,t4的值发生改变。完成了交换功能。第55页/共111页利用函数返回值例题int main()char a;while(1)scanf(%c,&a);getchar();if(fun(a)=-1)printf(出现异常n);break;else printf(%cn,a);return 0;int fun(char&c)if(c=a-1&
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 组织 结构 高级 语言程序设计 北京工业大学
限制150内