C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院.

Slides:



Advertisements
Similar presentations
第 8 章 数组 计算机科学学院 李淮 Tel QQ
Advertisements

电子成绩单项目实现.
第10章 结构体与链表 本章要点: 结构体类型与结构体变量的定义 结构体变量的引用与初始化 结构体数组 链表处理 共用体类型和枚举类型
第一章 C语言概述 计算机公共教学部.
第三章 鏈結串列 Linked List.
C语言基础——指针的高级应用 Week 05.
資料結構與C++程式設計進階 資料結構概論 講師:林業峻 CSIE, NTU 6/ 7, 2010.
数据结构与算法 数据结构与算法实验
第八章 类和对象.
第九章 系 统 安 全 性 9.1 结构体 9.2 结构体型数组  9.3 结构体型指针 9.4 内存的动态分配 9.5 共用体
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
單向鏈結串列 Singly Linked Lists.
第7章 结构体、联合体和枚举类型 本章导读 本章主要知识点 《 C语言程序设计》 (Visual C++ 6.0环境)
C语言程序设计 第十二章 位运算.
程式設計 博碩文化出版發行.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
内容提要 对象的生命周期 构造函数 析构函数 拷贝构造函数. 常宝宝 北京大学计算机科学与技术系
複習 char name1[20]; //長度為20的字串 char name2[20]; //讀取字串 gets(name1);
啟示錄.
计算概论 第二十一讲 文件操作 北京大学信息学院.
C++程序设计 第二讲 清华大学软件学院.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
目录 10.1 指针的基本概念 10.2 指向变量的指针变量 10.3 指向数组的指针变量 10.4 指向函数的指针变量和指针型函数
结构体和共用体 2 梁春燕 华电信息管理教研室.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
Chap 9 结构 9.1 构建手机通讯录 9.2 结构变量 9.3 结构数组 9.4 结构指针.
第5章 语义分析(Semantic Analysis)
Introduction to the C Programming Language
Introduction to the C Programming Language
目录 第八章 数组 1 简单学生成绩管理系统的开发 2 一维数组 3 多维数组 4 字符数组 5 数组作函数参数.
第9章 自訂資料型態 – 結構 9-1 結構資料型態 9-2 結構陣列 9-3 指標與結構 9-4 動態記憶體配置 9-5 聯合資料型態
STRUCTURE 授課:ANT 日期:2010/5/12.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第九章 结构体和共用体 结构体的定义 结构体的使用 共用体的定义 共用体的使用 主讲:李祥 时间:2015年10月.
第三章 C++中的C 面向对象程序设计(C++).
C语言程序设计 李祥.
C 程式設計— 結構 台大資訊工程學系 資訊系統訓練班.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
第5章 堆疊(Stacks) 5-1 堆疊的基礎 5-2 堆疊的表示法 5-3 堆疊的應用 - 運算式的計算與轉換
第五章 指针 5.1 指针的概念和定义 5.2 指针运算 5.3 指针和数组 5.4 字符串指针 5.5 指针数组 5.6 指向指针的指针
6.4.1指针与二维数组 1、二维数组结构的分析 设有数组定义为:int a[3][4]; 则有: a表示数组在内存中的首地址。
THE C PROGRAMMING LANGUAGE
C++语言程序设计 第二章 C++简单程序设计.
第13章 结构体的应用 13.1 了解由用户构造的数据类型 13.2 结构体类型说明及结构体变量 13.3 结构体数组
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
Struct結構 迴圈
C语言程序设计.
第十章 用户自定义数据类型 目录 学生信息管理系统的开发 结构体数据类型的概述 结构体变量的使用 结构体数组
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
第十章 结构体与链表 西安工程大学.
C语言概述 第一章.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第 二 章 数据类型、运算符与表达式.
C++复习2----类与对象.
C语言的特点 1. C程序由许多函数组成 2. C程序必须有且只有一个主函数main( ) 3. 函数用“{”和“}”表示起点和终点
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
第三章 数据抽象.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 指针类型.
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
C/C++基礎程式設計班 C語言入門、變數、基本處理與輸入輸出 講師:林業峻 CSIE, NTU 3/7, 2015.
C/C++基礎程式設計班 陣列 講師:林業峻 CSIE, NTU 3/14, 2015.
第9章 C++程序设计初步 9.1 C++的特点 9.2 最简单的C++程序 9.3 C++的输入输出 9.4 函数的重载
第六章 复合数据类型 指针的声明与使用 数组的声明与使用 指针与数组的相互引用 字符串及相关库函数 new与delete
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
安排座位.
C语言基础学习 从外行到入门.
Presentation transcript:

C程序设计 第9章 自定义数据类型 主讲教师: 鲁 萍 西安建筑科技大学 理学院

第9章 自定义数据类型 结构体变量 结构体数组 结构体与指针 指针与链表 共用体 枚举 小 结 习 题

结构体类型的定义 结构体 链表 例1 学生信息:学号,姓名,成绩1,成绩2,成绩3,平均成绩   要求计算平均成绩,并输出学生的学号,姓名和平均成绩 问题:学生信息包含不同类型的数据 例2 对一个班的若干学生进行管理,实现插入新生信息和删除转学学生信息的功能。 问题:新数据无法和已有数据连续存储 结构体 链表

结构体类型的定义 例1学生信息:学号,姓名,成绩1,成绩2,成绩3,平均成绩 要求计算平均成绩,并输出学生的学号,姓名和平均成绩    要求计算平均成绩,并输出学生的学号,姓名和平均成绩 struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; }; 结构体类型: 不同类型的数据的有序集合 struct 类型名称 { 成员表列 }; 结构体变量: 用结构体类型说明的变量 (定义结构体类型不分配内存单元!定义结构体变量时分配存储单元) //定义2个结构体变量 struct student stu1,stu2;    struct student stu[3];  //定义3个元素的结构体数组

结构体变量的初始化 定义时初始化:将各元素初值放在“{ }”里赋值给变量。 例: struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; } stu[3]={{001,"zhang3",80,88,75}, {002,"li4",90,83,84}, {003,"wang5",50,62,65}}; 可以这样定义结构体变量

结构体变量的定义 存储: (1)结构体的所有成员各自占用不同的内存单元 stu[0] (2)一共占用多少字节存储单元? stu1 int num char name[20] float score1 float score2 float score3 float aver 存储: (1)结构体的所有成员各自占用不同的内存单元 (2)一共占用多少字节存储单元? sizeof( struct student) stu1 001 “zhang3” 80 88 75 002 “li4” 90 83 84 stu[0] stu[1] stu[2] 38字节 int num char name[20] float score1 float score2 float score3 float aver stu2 struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; }stu1,stu2; stu[3];

结构体 变量引用 例11-1要求计算平均成绩,并输出学生的学号,姓名和平均成绩 for(i=0;i<3;i++) num name[20] score1 score2 score3 aver struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; }stu[3]={{001,"zhang3",80,88,75}, {002,"li4",90,83,84}, {003,"wang5",50,62,65}}; stu[0] 001 “zhang3” 80 88 75 002 “li4” 90 83 84 num name[20] score1 score2 score3 aver stu[1] for(i=0;i<3;i++) { aver= score1+ score2+ score3; aver /=3; } stu[i]. stu[i]. stu[i]. stu[i]. stu[i]. 成员的引用方式:结构体变量名. 成员名

结构体变量引用 × A0901:学生信息:学号,姓名,成绩1,成绩2,成绩3,平均成绩 要求计算平均成绩,并输出学生的学号,姓名和平均成绩    要求计算平均成绩,并输出学生的学号,姓名和平均成绩 for(i=0;i<3;i++) printf("%5d%20s%8.2f\n",stu[i].num,stu[i].name,stu[i].aver); 输出学生的所有信息 printf(”%d,%s,%f,%f,%f,%f\n”,stud1); 不能对结构体变量整体输入输出,只能对各个成员分别输入输出 printf(”%d,%s,%f,%f,%f,%f\n”,stud1.num, stu1.name, stu1.score1, stu1.score2, stu1.score3, stu1.aver);() ×

结构体例题 A0901 :#include<stdio.h> struct student{ int num; char name[20]; float score1; float score2; float score3;float aver; }; void main() { struct student stu[3]={{001,"zhang3",80,88,75}, {002,"li4",90,83,84}, {003,"wang5",50,62,65}}; int i; for(i=0;i<3;i++) { stu[i].aver=stu[i].score1+stu[i].score2+stu[i].score3; stu[i].aver /=3; } for(i=0;i<3;i++) printf("%5d%20s%8.2f\n",stu[i].num,stu[i].name,stu[i].aver);

指向结构体变量的指针 P A0901 :#include<stdio.h> struct student{ int num; char name[20]; float score1; float score2; float score3;float aver; }stu={001,"zhang3",80,88,75}; struct student *p=&stu; stu. aver=stu. score1+ stu.score2+ stu.score3; stu. aver /=3; printf("%5d%20s%8.2f\n", stu.num, stu.name, stu.aver); P 001 “zhang3” 80 88 75 p-> p-> p-> p-> (*p). p-> (*p). (*p). 1、结构体类指针变量的定义:结构体类型名称 *指针变量名 2、通过指针变量引用成员: 1) 结构体类指针变量名->成员名 (常用) 2) (*结构体类指针变量名).成员名

指向结构体数组的指针 A0901 :#include<stdio.h> struct student{ int num; char name[20]; float score1; float score2; float score3;float aver; }; stu[3]={{001,"zhang3",80,88,75},{002,"li4",90,83,84}, {003,"wang5",50,62,65}}; struct stud *p=stu; for(p=stu;p<stu+3; p++) { p->aver=p->score1+p->score2+p->score3; p->aver /=3; } for(p=stu;p<stu3; p++) printf("%5d%20s%8.2f\n", p->num, p->name, p->aver); 84 83 90 “li4” 002 75 88 80 “zhang3” 001 stu[0] stu[1] stu[2] P p++ 指向数组中的下一个元素

用指针构成链表 不行! 新 增加 一个学生? 数组不能动态定义!新增信息存储单元不连续 链表:可以使物理上不连续的存储单元在逻辑上连续访问 struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; }; 链表:可以使物理上不连续的存储单元在逻辑上连续访问 81.3 75 88 80 “zhang3” 001 struct student *next; 1249 1356 1475 002 85.7 84 83 90 “li4” 指针 59 65 62 50 wang5 003 每个结构中的最后一个是指针, 指向下一个节点的首地址,形成链式结构

构建链表 head A0902例 建立如下链表,由3个学生数据的结点组成。输出各结点中的数据,并计算学生成绩的平均值。 next next 001 89.5 002 90 004 85 =NULL 链表的起始 struct student { int num; float score; struct student *next; }; 标记链表的结束

构建链表 void main() { struct student a,b,c,*head,*p; a.num=001; a.score=89.5; b.num=002; b.score=90; c.num=004; c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; while ( ) { printf(“%d % f \n”,p->num,p->score); p=p->next; } struct student { int num; float score; struct student *next; }; a b c next head P next P P 001 89.5 next 002 90 next 004 85 p!=NULL NULL P

链表操作:插入、删除 1. malloc 函数: 内存动态存储区中分配一个长度为size的连续空间 2. free函数 释放空间 //动态申请一个节点空间 struct student *d; int len=sizeof(struct student); d=(struct student *) malloc(len); //为节点赋值 scanf("%d",&(d->num)); scanf("%f",&(d->score)); //将节点插入链表 d->next=b.next; b.next=d; //链表删除元素d b.next=d->next free(d); //释放空间 next 003 78 d--> next 001 89.5 a 002 90 next b head 004 85 next =NULL c next

结构体数组练习 A0903:有10人投票,对3个候选人得票进行统计。每此输入一个候选人的名字,要求输出最后统计结果。 【程序思路分析】 将输入的后选人的名字与结构体中的初始名字比较,若两者相等,则将该后选人的票数加1; 投票人数通过循环方式进行控制;有多少人就循环多少次,但每次只能投一个人的票。 结构定义: struct person{ char name[20]; int count; }pers[3]={{"Zhang",0},{"Wang",0},{"Li",0}};

printf("\n"); main(){ struct person{ char name[20]; int count; }pers[3]={{"Zhang",0},{"Wang",0},{"Li",0}}; int i=0,j=0; char nam[20]; for (;i<10;i++){ /*控制投票人数*/ scanf(“%s”,nam); /*输入候选人姓名*/ for(j=0;j<3;j++) /*控制候选人数*/ if(strcmp(nam,pers[j].name)==0) pers[j].count++; } printf("\n"); for(i=0;i<3;i++) printf("%6s %d",pers[i].name,pers[i].count); }

结构体变量嵌套 today.year=2004; today.time.second=15; nextday=today; 成员也可以是一个结构变量。 struct clock { int hour, minute, second;}; struct date { int year, month, day; struct clock time; } today,nextday ; 1. 单独引用结构体变量的成员 today.year=2004; today.time.second=15; 2. 结构体变量作为一个整体引用 nextday=today;

共用体 union data{ 共用体类型定义 int i; 使几种不同类型的变量存放到同一内存单元中,相互覆盖。 char ch; float f; }; 共用体变量所占内存长度 等于最长的成员的长度 共用体类型定义 使几种不同类型的变量存放到同一内存单元中,相互覆盖。 union 类型名称{ 成员表列 }; 变量定义:方法同结构体 变量引用 共用体变量名.成员名称 a,b,c; 地址 1000 例:a.i=1; a.ch=‘A’; a.f=10.50; 完成上述赋值操作后,有效的成员是a.f 整形 i 变量 字符变量ch 实 f 型 变 量

枚举类型 一、枚举类型的定义[格式]: enum 枚举类型名称 {枚举类成员名} 例:enum weekday{sun,mon,tue,wed,thu,fri,sat}; 0 1 2 3 4 5 6 枚举元素从数值0开始编号,按常量处理 例: main(){ enum weekday{sun,mon,tue,wed,thu,fri,sat}; enum weekday today=mon; printf(“today=%d ",today); } 运行结果: today=1

小结——自定义数据类型 结构体: 共用体 枚举 struct student{ int num; char name[20]; float score1; float score2; float score3; float aver; }stu,s[3]; 结构体: 结构体变量的引用 结构体数组 用指针访问结构体 构建链表 共用体 枚举 next 001 89.5 002 90 004 85

习 题 B0901(习题9.1) 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年的问题 (该程序可扩展为对任意一个班的学生)