欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    C语言新教材PPT课堂课件-8-结构枚举等.pdf

    • 资源ID:34863981       资源大小:451.83KB        全文页数:46页
    • 资源格式: PDF        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言新教材PPT课堂课件-8-结构枚举等.pdf

    1第第八八章章 用用户户自自定定义义数数据据类类型型8.1 8.1 结结构构类类型型及及其其变变量量的的定定义义8.2 8.2 结结构构数数组组8.3 8.3 结结构构和和指指针针8.4 8.4 联联合合类类型型8.5 8.5 枚枚举举类类型型8.6 8.6 用用typedeftypedef 定定义义类类型型别别名名补补: 编编译译预预处处理理28.1 8.1 结结构构类类型型及及其其变变量量的的定定义义l数数组组是是一一种种存存放放一一组组相相关关的的同同类类型型数数据据的的构构造造类类型型,但但是是不不能能将将不不同同类类型型的的数数据据放放入入同同一一数数组组中中。l如如果果需需要要把把一一个个学学生生的的学学号号、姓姓名名、性性别别、年年龄龄、成成绩绩等等不不同同类类型型的的数数据据作作为为一一个个有有机机的的整整体体,就就需需要要一一种种新新的的构构造造类类型型结结构构类类型型。l结结构构类类型型变变量量中中的的各各个个数数据据项项各各自自独独立立存存放放。3l结结构构类类型型需需要要自自定定义义,先先定定义义结结构构类类型型后后,再再定定义义结结构构变变量量。l结结构构类类型型定定义义包包含含:各各个个成成员员的的名名称称、类类型型。l结结构构变变量量定定义义包包含含:结结构构类类型型、结结构构体体变变量量名名称称。48.1.1 结结构构类类型型的的定定义义一一般般格格式式: struct 结结构构类类型型名名 类类型型 成成员员1; 类类型型 成成员员2; 类类型型 成成员员n; ;例例8.1: struct Student int number; char name9; int age; char sex; ;l定定义义结结构构类类型型,系系统统是是不不会会为为之之分分配配内内存存单单元元。只只有有在在定定义义了了结结构构变变量量后后,系系统统才才会会分分配配内内存存单单元元给给变变量量。l成成员员名名可可以以与与程程序序中中其其它它变变量量同同名名,二二者者不不代代表表同同一一对对象象,但但为为增增强强可可读读性性,不不提提倡倡这这样样做做。 * struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; ;例例8.28.2:l成成员员也也可可以以是是一一个个结结构构变变量量。l可可以以用用sizeofsizeof运运算算符符计计算算结结构构类类型型的的长长度度。sizeof(struct Student)的的值值是是18numbername9birthdaysex 2 9 6 1 68.1.2 结结构构变变量量的的定定义义 (1)先先定定义义结结构构类类型型,再再定定义义结结构构变变量量struct Student int number; char name9; int age; char sex;struct Student student1;结结构构类类型型只只是是模模型型,结结构构变变量量才才是是可可操操作作的的实实体体应应区区分分结结构构类类型型名名与与结结构构变变量量名名。三三种种方方式式7(2)(2)在在定定义义结结构构类类型型的的同同时时定定义义结结构构变变量量 struct Student int number; char name9; int age; char sex; student1;结结构构变变量量的的定定义义(3)(3)定定义义结结构构类类型型但但不不命命名名, ,同同时时定定义义结结构构变变量量struct int number; char name9; int age; char sex; student1;无无名名结结构构体体8结结构构变变量量的的初初始始化化 struct Student int number; char name9; struct int year; int month; int day; birthday; char sex; student1=1101,lilin, 1985, 8, 1, M ;birthday各成员的初值 如如:98.1.3 8.1.3 结结构构成成员员的的引引用用引引用用结结构构成成员员的的一一般般形形式式如如下下:结结构构变变量量名名. 成成员员名名 例例如如:struct Student int number; char name9; int age; char sex; student1;各各成成员员的的引引用用: student1.number,student1.name, student1.age,student1.sex成成员员运运算算符符: : . . 功功能能: : 访访问问结结构构体体变变量量中中指指定定的的成成员员优优先先级级1 1,左左结结合合性性不不能能用用 Student.numberStudent.number 等等10允允许许对对结结构构变变量量进进行行整整体体赋赋值值操操作作。 如如: student2= student1; student1、student2为为类类型型相相同同的的结结构构体体变变量量不不允允许许将将一一组组常常量量直直接接赋赋给给一一个个结结构构变变量量。如如: student2=1101, lilin, 1985,8,1, M; 错错误误!不不允允许许对对结结构构变变量量进进行行整整体体输输入入输输出出,而而只只能能对对结结构构变变量量中中各各个个成成员员分分别别进进行行输输入入输输出出。如如:printf(, student1); 错错误误!结结构构变变量量引引用用注注意意事事项项11如如果果成成员员本本身身又又是是一一个个结结构构,欲欲对对最最后后一一级级成成员员进进行行访访问问,必必须须通通过过多多级级成成员员运运算算符符。 如如: student1.birthday.year结结构构变变量量的的成成员员其其作作用用和和地地位位相相当当于于普普通通变变量量,可可以以像像普普通通变变量量一一样样进进行行各各种种运运算算。可可以以引引用用成成员员的的地地址址,也也可可以以引引用用结结构构变变量量的的地地址址。如如: &student1表表示示结结构构变变量量student1的的首首地地址址 &student1.age 表表示示结结构构变变量量student1的的成成员员age的的地地址址结结构构变变量量引引用用注注意意事事项项12 结结构构类类型型定定义义:struct Employee long code; char name20; float salary; char address50; char phone11;例例8.4 职职工工数数据据包包括括职职工工编编号号、姓姓名名、工工资资、地地址址、电电话话,定定义义职职工工类类型型并并用用它它来来声声明明职职工工变变量量,然然后后访访问问其其各各个个成成员员。 举举例例1 结结构构类类型型及及变变量量定定义义、成成员员访访问问13用用2个个结结构构变变量量存存放放2个个职职工工记记录录:#include #include void main() struct Employee ps1=123,chen,2000.0, 泉泉州州,2699999, ps2; /*/*以以下下给给结结构构变变量量ps2各各成成员员输输入入值值或或赋赋值值* */ / printf (code: ); scanf (%ld,&ps2.code); printf (name: ); scanf (%s, ps2.name); printf (phone: ); scanf (%s, ps2.phone); strcpy(ps2.address, ps1.address); ps2.salary=ps1.salary*1.5;可可改改用用:getchar();gets(ps2.name); getchargetchar() () 用用来来“吃吃掉掉”作作为为codecode输输入入结结束束符符的的回回车车键键;getsgets函函数数可可输输入入含含空空格格的的姓姓名名。14/*/*以以下下输输出出结结构构变变量量ps1、ps2各各成成员员的的值值* */ / printf (ncode:%ldn, ps1.code); printf (name:%s=n, ps1.name); printf (salary:%6.2fn, ps1.salary); printf (address:%sn,ps1.address); printf (phone:%sn,ps1.phone); printf (ncode:%ldn,ps2.code); printf (name:%sn,ps2.name); printf (salary:%6.2fn,ps2.salary); printf (address:%sn,ps2.address); printf (phone:%sn,ps2.phone);15举举例例2 结结构构类类型型及及变变量量定定义义、成成员员访访问问#include void main() struct Student int number; char name9; struct Birthday int year; int month; int day; birthday; char sex; s;numbername9birthdaysexs scanf (%d,&s.number); scanf (%s, s.name); scanf (%d-%d-%d, &s.birthday.year, &s.birthday.month, &s.birthday.day); scanf ( %c,&s.sex); printf (%d,%s, %d-%d-%d, %cn, s.number, s.name, s.birthday.year, s.birthday.month, s.birthday.day, s.sex); 168.2 8.2 结结构构数数组组如如:方方式式(2)(2)struct Student int number; char name20; struct int year; int month; int day; birthday; char sex; student2= 1101,lilin,1985,8,1, M, 1102,wangjing,1985,7,1,F ;结结构构数数组组初初始始化化 结结构构数数组组的的定定义义也也有有三三种种方方式式student0numbername9birthdaystudent1sex17结结构构数数组组应应用用举举例例例例8.5 计计算算学学生生的的平平均均年年龄龄 #include struct Student int number; char name20; int age; stu4;void main ( ) int i; float ave,s=0; for (i=0;i4;i+) scanf(%d%s%d,&stui.number,stui.name, &stui.age); for (i=0; i 成成员员名名二二、通通过过指指针针引引用用结结构构变变量量成成员员 +pman-name 等等同同于于 +(pman-name)*pman-name 等等同同于于 *(pman-name)指指向向运运算算符符: - 功功能能: 对对指指针针所所指指向向的的结结构构的的成成员员进进行行访访问问优优先先级级1 1,左左结结合合性性20举举例例 用用结结构构指指针针间间接接访访问问结结构构变变量量成成员员#include #include struct Student long num; char name20; int age; ; void main ( ) struct Student student,*p=&student; strcpy(p-name, Wang Li); p-num=89101; p-age=18; printf(name: %snnumber:%ldnage:%dn, (*p).name, (*p).num, (*p).age ); 类类例例8.7 *类类例例8.98.9 学学生生类类型型结结构构数数组组中中存存放放若若干干学学生生的的数数据据,通通过过结结构构指指针针输输出出各各个个学学生生的的数数据据。举举例例 用用结结构构指指针针间间接接访访问问结结构构数数组组元元素素的的成成员员#include struct Student int number; char name20; int age; ; void main() struct Student stu2=10101,li lin,18, 10102,zhang fan,19; struct Student *p; printf(No. Name agen); for (p=stu; pnumber,p-name,p-age); p+后后,p指指向向下下一一个个结结构构数数组组元元素素 *三三、指指针针变变量量作作为为结结构构成成员员输输出出:lililili例8.8#include struct Student int number; char *name; /*成员name为指针变量*/; void main() struct Student stu=1101,lili; puts( stu.name ); 如如果果没没有有给给结结构构变变量量stustu初初始始化化,而而是是通通过过scanfscanf来来输输入入各各个个成成员员的的值值,则则指指针针namename没没有有明明确确指指向向,无无法法输输入入字字符符串串。了了解解23四四、结结构构指指针针作作为为函函数数参参数数 允允许许用用结结构构变变量量作作函函数数参参数数,但但数数据据传传递递方方式式是是逐逐个个成成员员传传递递,特特别别是是成成员员为为数数组组时时将将会会使使传传递递的的时时间间和和空空间间开开销销很很大大,严严重重地地降降低低了了程程序序的的效效率率。最最好好的的办办法法是是使使用用结结构构指指针针变变量量作作函函数数参参数数,这这时时由由实实参参传传向向形形参参的的只只是是地地址址,从从而而减减少少了了时时间间和和空空间间的的开开销销。形形参参:结结构构指指针针变变量量实实参参:结结构构指指针针24例例:给给出出年年月月日日计计算算它它是是该该年年的的第第几几天天 。结结构构指指针针作作函函数数参参数数举举例例#include void main()int days(struct Date *); /*函函数数原原型型声声明明*/ struct Date d1; printf(Enter year,month,day:); scanf(%d-%d-%d,&d1.year,&d1.month,&d1.day); printf(是是第第%d天天, days(&d1); /*函函数数调调用用*/ struct Date int year; int month; int day; ;25int days(struct Date *sp) int monthtable13 =0,31,28,31,30,31,30,31,31,30,31,30,31; int i,day_sum = 0; for (i=1;imonth;i+) day_sum += monthtablei; i=sp-year; if( i2 & (i%4=0)&(i%100!=0)|i%400=0) day_sum += 1; day_sum += sp-day; return day_sum ;月月份份大大于于2时时判判断断是是否否为为闰闰年年结结构构指指针针作作函函数数参参数数举举例例26 联联合合类类型型是是一一种种类类似似于于结结构构类类型型的的构构造造型型数数据据类类型型,它它准准许许不不同同类类型型和和不不同同长长度度的的数数据据共共享享同同一一块块存存储储空空间间。 也也称称为为“共共用用体体”。 8.4 8.4 联联合合类类型型27联联合合类类型型的的定定义义与与结结构构类类似似: union 联联合合类类型型名名 类类型型 成成员员名名1; 类类型型 成成员员名名n; ;union dataunion data char char chch; ; intint i; i; float f; float f;一一、联联合合类类型型的的定定义义 几几个个成成员员占占用用同同一一个个内内存存段段,因因此此,共共用用体体变变量量所所占占的的内内存存长长度度应应为为最最长长的的成成员员长长度度地地址址1000ichf28结结构构与与联联合合可可以以互互相相嵌嵌套套,例例如如:union uniontype int i; float f; ;struct structtype short s; long l; ;struct sutype char c; union uniontype u; ;union ustype int i; struct structtype st;联联合合类类型型的的定定义义29联联合合变变量量的的定定义义与与结结构构变变量量定定义义一一样样,有有三三种种方方式式例例如如:(2) union uniontype int a; long d; my_data; (3)union int a; long d;my_data; (1)union uniontype int a; long d; ;union uniontype my_data; 二二、联联合合变变量量的的定定义义30联联合合类类型型和和联联合合变变量量的的定定义义举举例例struct Personchar name20; char sex; int age; union int single; struct char spouseName20; int child; married; struct Date int year; int month; int day; divorcedDay; marital; int marryFlag; person1; 姓姓名名性性别别年年龄龄婚婚姻姻状状况况婚婚姻姻状状况况标标记记未未婚婚 已已婚婚离离婚婚配配偶偶名名子子女女数数年年 月月日日31 联联合合变变量量成成员员的的引引用用类类似似结结构构变变量量,也也是是利利用用运运算算符符“.”和和“”。例例如如: union uniontype int i; char c; my_data; union uniontype *p; p = &my_data; 下下列列引引用用都都是是合合法法的的:my_data.i , my_data.c,p-i , p-c 三三、联联合合变变量量成成员员的的引引用用32同同一一内内存存段段可可用用来来存存放放几几种种不不同同类类型型的的成成员员,但但每每一一瞬瞬间间只只有有最最后后被被赋赋值值的的成成员员在在起起作作用用。联联合合变变量量和和它它的的各各成成员员都都是是同同一一地地址址。不不能能对对联联合合变变量量表表列列赋赋值值,这这一一点点与与结结构构不不一一样样,如如: union int i; char ch; float b; a=1,a,1.5; -不不对对!四四、使使用用联联合合变变量量应应注注意意的的问问题题 33枚枚举举的的概概念念: 枚枚举举类类型型也也是是一一种种数数据据类类型型。对对那那些些只只可可能能取取有有限限的的某某几几种种值值的的数数据据,可可以以把把它它定定义义为为枚枚举举类类型型数数据据。如如果果某某些些变变量量只只有有几几种种可可能能,如如: 星星期期一一、星星期期二二、 星星期期日日又又如如,性性别别的的取取值值,月月份份的的取取值值可可以以通通过过枚枚举举法法将将变变量量的的值值一一一一列列出出,在在这这种种情情况况下下可可以以使使用用枚枚举举类类型型变变量量8.5 枚枚举举类类型型 34枚枚举举类类型型定定义义的的一一般般形形式式为为: enum 枚枚举举名名枚枚举举常常量量1,枚枚举举常常量量2,枚枚举举常常量量n;一一、枚枚举举类类型型的的定定义义例例如如: enum weekday Sun,Mon,Tue,Wed,Thu,Fri,Sat; /*该该枚枚举举类类型型只只准准许许取取7种种值值 */ enum month Jan,Feb,Mar,Apr,May,Jun, Jul,Aug,Sep,Oct,Nov,Dec; /*该该枚枚举举类类型型只只准准许许取取12种种值值 */ 35请请注注意意: 列列在在枚枚举举类类型型定定义义的的 中中的的是是枚枚举举常常量量名名,它它们们类类似似于于符符号号常常量量,不不是是串串常常量量(不不能能加加引引号号),也也不不是是变变量量名名(不不能能被被赋赋值值)。 每每个个枚枚举举常常量量均均有有对对应应的的整整数数值值,称称为为枚枚举举常常量量值值,默默认认值值分分别别为为0、1、n-1。例例如如: enum weekday Sun, ,Mon, Tue, Wed, Thu, Fri, Sat ; 枚枚举举常常量量分分别别是是Sun、Mon、Tue、Wed、Thu、Fri、Sat,对对应应值值分分别别为为0、1、2、3、4、5、6。36 枚枚举举常常量量的的值值可可在在定定义义时时重重指指定定,而而对对于于没没有有指指定定值值的的元元素素,其其值值按按顺顺序序加加1 1例例如如:enum weekday Sun=7, ,Mon=1, Tue,Wed, Thu, Fri, Sat ;又又如如:enum weekday Sun=7,Mon, Tue=5, Wed, Thu=6, Fri, Sat ;37枚枚举举型型变变量量的的定定义义也也有有三三种种方方式式,如如:(1) enum weekday Sun,Mon,Tue ; enum weekday day; (2) enum weekday Sun,Mon,Tue day;(3) enum Sun,Mon,Tue day;二二、枚枚举举型型变变量量的的定定义义38三三、枚枚举举型型变变量量的的使使用用 1 1)可可对对枚枚举举变变量量赋赋值值:直直接接赋赋予予枚枚举举常常量量名名,或或间间接接赋赋予予枚枚举举常常量量的的值值。如如: enum weekday Sun, ,Mon, Tue, Wed, Thu, Fri, Satworkday; ; workday=Sat; ; 正正确确! workday=6; 6; 语语法法上上错错误误! workday =(enum weekday)6; 6; 正正确确!2 2)枚枚举举变变量量的的值值不不能能用用scanfscanf函函数数输输入入,但但可可用用printfprintf函函数数输输出出输输出出枚枚举举常常量量的的值值(整整数数型型)。393 3)可可对对枚枚举举变变量量进进行行判判断断或或比比较较操操作作。 enum flag true,false my_flag; if (my_flag = true) 4 4)枚枚举举变变量量可可进进行行自自增增(+)、自自减减(-)运运算算。 利利用用4)、5),可可用用枚枚举举变变量量控控制制forfor循循环环。枚枚举举型型变变量量的的使使用用 枚枚举举常常量量名名40类类习习题题8.2:三三种种颜颜色色取取两两色色,输输出出各各种种组组合合情情况况。#include void main() enum colorred,yellow,blue i, j; int n=0; for (i=red;i=blue;i+) for (j=red;j=blue;j+) if(j!=i) n=n+1; printf(%-4d,n); switch(i) case red: printf(%-10s,red);break; case yellow: printf(%-10s,yellow);break; case blue: printf(%-10s,blue); switch(j) case red: printf(%-10s,red);break; case yellow: printf(%-10s,yellow);break; case blue: printf(%-10s,blue); printf(n); 结结果果:1 1redredblueblue2 2redredyellowyellow3 3yellowyellowblueblue4 4yellowyellowredred5 5blueblueredred6 6blueblueyellowyellow41用用typedef给给已已存存在在的的数数据据类类型型取取别别名名 一一般般形形式式: typedef 类类型型名名 别别名名; 例例如如: 1)为为int命命名名一一个个新新名名字字INTEGER typedef int INTEGER; 于是,int a,b;与 INTEGER a,b;完全等效。 8.6 8.6 用用typedeftypedef定定义义类类型型的的别别名名注注:用用typedef定定义义的的类类型型名名习习惯惯用用大大写写字字母母表表示示422)定定义义STU代代表表结结构构类类型型struct Student: typedef struct Student int number; char name20; STU; STU stu1; /*定定义义stu1为为结结构构体体变变量量*/3)定定义义COUNT代代表表有有10个个元元素素的的整整型型数数组组类类型型 typedef int COUNT10; COUNT a,b; /*定定义义n为为整整型型数数组组变变量量 */4)定定义义STRING代代表表字字符符指指针针类类型型 typedef char *STRING; STRING p, s10 ; /*定定义义 p为为字字符符指指针针变变量量,s为为指指针针数数组组*/43增增强强程程序序的的可可读读性性和和可可移移植植性性用用typedef定定义义数数组组、指指针针、结结构构等等类类型型将将使使程程序序书书写写简简单单定义类型别名的优点 44编编译译预预处处理理l所所谓谓预预处处理理就就是是C C语语言言的的编编译译系系统统在在对对程程序序进进行行通通常常的的编编译译之之前前,先先对对这这些些特特殊殊的的命命令令进进行行预预处处理理,然然后后将将预预处处理理的的结结果果和和源源程程序序一一起起再再进进行行通通常常的的编编译译处处理理,以以得得到到目目标标代代码码。l C C 语语言言的的预预处处理理主主要要有有以以下下三三种种: : 1. 1. 文文件件包包含含:#include #include 或或 #include #include 文文件件名名 2. 2. 宏宏定定义义: #define#define开开头头 3. 3. 条条件件编编译译:#if-#else-#if-#else-#endifendif # #ifdef-#else-#endififdef-#else-#endif # #ifndef-#else-#endififndef-#else-#endif补补充充不不是是 C语语句句,末末尾尾不不加加分分号号45宏宏定定义义l格格式式: #define : #define 宏宏名名 宏宏体体l宏宏定定义义:定定义义宏宏名名来来代代表表一一个个宏宏体体l宏宏展展开开(宏宏替替换换):预预编编译译时时将将宏宏名名直直接接替替换换成成宏宏体体,不不做做语语法法检检查查 例例: #define N 10#define N 10在在程程序序中中可可以以用用1010取取代代所所有有的的N N。补补充充46宏宏定定义义使使用用举举例例#include #define M 5#define N M+1#define NN N*N-Mvoid main( ) printf(%dn,3*NN);3*N*N-M即即3*M+1*M+1-M3*(N*N-M)即即3*(M+1)*(M+1)-M)即即3*(6*6-5)=93结结果果: 16补补充充

    注意事项

    本文(C语言新教材PPT课堂课件-8-结构枚举等.pdf)为本站会员(君****)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开