C语言设计第9章 复合结构类型
C语言程序设计(第3版)何钦铭 颜 晖 第9章 结构

第9章结构【练习9-1】定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个部分。
解答:struct complex{float real;float imaginary;};【练习9-2】人的出生日期由年、月、日组成,请在例 9-1 中的通讯录结构中增加一个成员:出生日期,用嵌套定义的方式重新定义该结构类型。
解答:struct date{int year;int month;int day;};struct student{int num;char name[10];struct date birthday;int computer,english,math;double average;};【练习9-3】例 9-1 中,如果要计算的是三门课程的课程平均成绩,应该如何改写程序?解答:#include<>struct student{int num;char name[10];int computer,english,math;double average;};int main(void){int i, n;double math_sum,english_sum,computer_sum;struct student s1;printf("Input n:");scanf("%d", &n);printf("Input the student's number, name and course scores:\n"); math_sum=english_sum=computer_sum=0;for(i=1;i<=n;i++){printf("No.%d:",i); scanf("%d%s%d%d%d",&,,&,&,&;math_sum+=;english_sum+=;computer_sum+=;}printf("math_ave:%.2lf\nenglish_ave:%.2lf\ncomputer_ave:%.2lf\n", math_sum/n,english_sum/n,computer_sum/n);return 0;}【练习9-4】定义一个包含 5 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。
C语言数据结构-第9章 结构体共用体与枚举

"Shang Hai","13901000003"}}; int i; for(i=0;i<3;i++) { printf("%s,%d,%s,%s,",stud[i].name,stud[i].age,stud[i].sex,stud[i].xh); printf("%d,%d,%d,",stud[i].birthday.year,stud[i].birthday.month, stud[i].birthday.day); printf("%s,%s,%s\n",stud[i].nation,stud[i].address,stud[i].tel); } }
成员运算符“.”的优先级最高,在表达式中的结构体变量成员不 需要加括号。例如:
wang.age++;
相当于
(wang.age)++;
注意
13
结构体变量的成员名可以相同,但必须处在不同的层次。 例如:
sturct student { int no;
char name[20]; struct { int no; char classname[20]; }class; struct { int no; char groupname[20]; }group; }wang;
定义结构体类型名的同时定义结构体数组,例如:
struct student{…} stud[50];
C语言 第九章 结构体数据类型期末测试习题与答案

程序运行后的输出结果是( )。
A.SunDan 20044
B.YangSan 20041
C.SunDan 20042
D.LiSiGuo 20042
参考答案:D
3、以下程序运行的结果是_( )。
#nclude”stdio.h
main()
{
struct date
{
int year , month , day ;
D.struct color
{ int red;
int green;
int blue;
} c l;
参考答案:B
7、有以下程序:
struct stu
{
char[10];
float score[3];
};
main( )
{
struct stu s[3]={{"20021",90,95,85},
{"20022",95,80,75},
} today ;
printf(“%d\n”,sizeof(struct date));
}
A.10
B.6
C.8
D.12
参考答案:D
4、设有如下说明
typedef struct ST
{
long a;
int b;
char c[2];
} NEW;
则下面叙述中正确的是______。
A.ST是一个结构体类型
B.NEW是一个结构体类型
A.typedef struct
{ int red;
int green;
int blue;
} COLOR;
COLOR cl;
B.struct color cl
C语言程序设计 第9章 文件

9.3 文件的顺序读写
❖ 【例9.4】fputs函数和fgets函数的使用。
9.3 文件的顺序读写
❖ 9.3.3 fprintf函数和fscanf函数 ❖ fprintf与fscanf函数为格式读写函数,与printf、scanf类似,fprintf与
fscanf用于从文件中读取指定格式的数据和把指定格式的数据写入文件,这 是按数据格式要求进行文件的输入/输出。其一般形式为: ❖ fscanf(fp,format,args); ❖ fprintf(fp,format,args); ❖ 其中,fp为文件指针,format为格式控制字符串,args为输入或输出的地 址列表。 ❖ 例如,若文件指针fp已指向一个已打开的文件文本,a、b分别为整型变量 ,则以下语句从fp所指向的文件中读入两个整数放入变量a和b中。 ❖ fscanf(fp,”%d%d”,&a,&b); ❖ 又如,若文件指针fp已指向一个已打开的文件文本,x、y分别为整型变量 ,则以下语句将x、y中的数据按%d的格式输出到fp所指向的文件中。 ❖ fprintf(fp,"%d%d",&a,&b);
本章小结
❖ 本章主要介绍了以下内容。 ❖ (1)文件的概念 ❖ 介绍了文件及文件指针的基本概念,以及文件的打开与关闭
函数fopen、fclose等。 ❖ (2)文件的顺序读写 ❖ 主要介绍了从文件中输出字符、字符串,以及将字符、字符
串写入文件的函数。 ❖ (3)随机文件的读写及错误检测 ❖ 主要介绍了随机文件读写的应用,以及文件的出错检测。
❖ 在实际读写文件中,人们常常希望能直接读到某一数据 项而不是按物理位置顺序逐个读下来。这种可以任意指 定读写位置的操作称为文件的随机读写。可以想象,只 要能移动位置指针到所需要的地方,实现文件的定位, 就能实现随机读写。
919149-C语言程序设计教程——面向计算思维和问题求解-第9章-新

9.2.2 嵌套结构体的定义
结构体成员的类型也可以是结构体,这时形成了 结构体的嵌套。
例如,若将引例中学生的年龄“age”改为出生 日期“birthday”,则由于birthday本身含有“年、 月、日”信息,应该为结构体型date的变量,故结 构体stu的定义如下:
9.2.2 嵌套结构体的定义
语言程序设计教程
面向计算思维和问题求解
第9章 复杂结构数据处理
结构体 结构体变量 结构体数组 结构体指针 结构体与函数 结构体与链表 枚举
9.1.1 问题描述
学生信息中包括学号、姓名、性别、年龄(或者 出生日期)和成绩。其中学号和年龄为整型数据、姓 名为字符串、性别为字符型数据、成绩则是浮点型数 据。各数据项的类型不尽相同,它们的组合才能描述 一个学生的信息。若要管理一批学生的相关信息,要 求实现以下操作应如何实现?
#include <stdio.h> struct stu
{
int num;
char name[20];
char sex;
int age;
/*用年龄描述学生的信息*/
float score;
};
例9-3 源代码(续1)
void main( ) {
struct stu student[5]={ {101,"Li ping",'M', 18,45}, {102,"Zhang ping",'M',18,62.5}, {103,"He fang",'F',18,92.5}, {104,"Cheng ling",'F',18,87}, {105,"Wang ming",'M',18,58} };
C语言第9章结构体、共用体、枚举

结构体变量.成员
struct date { int year;
int month; int day;
“.”是成员运算符, 优先级最高
printf("%d,%d,%d",birth);
printf("%d,%d,%d",birth.year,
}; struct date birth;
birth.month,birth.day);
scanf("%f",&student2.score[2])7; 8
student2
结构变量的整体赋值 student3 = student2;
02 Zhang Zi Liang 88 78
student3
02 Zhang Zi Liang 88 78
湖南工业大学计算机与通信学院
例9-1学生的基本信息包括学号、姓名、3门成绩、平均分、总分。输入一 个学生的前3项基本信息,计算平均分和总分并输出。
湖南工业大学计算机与通信学院
9.1 问题的提出
又如,在学生信息管理系统中填 加个属性:是否是中共党员,如 果不是属性的值为0(int),如
果是属性的值为入党的时间 (char)。在某一时间,属性只有 一种值,而且数据类型不同,这 种情况用什么数据类型描述呢?
对于这种应用,C语言引入了共用体类型。
共用体是一种同一存储区域由不同类型变量共享的数据 类型,它提供—种方法能在同一存储区中操作不同类型 的数据,也就是说共用体采用的是覆盖存储技术,准许 不同类型数据互相覆盖。
基本数据类型并不能方便地解决所有问题
❖ 复合数据类型是基本数据类型迭代派生而来
典型的代表就是“结构”,数组、指针也可算作此类
C语言程序设计 第3版 第9章 编译预处理

#include "test2.c" static int sum(int n) {
int i,s=0; for(i=1;i<=n;i++)
s=s+fact(i); return s; }
static int fact(int n) {
C语言程序设计
第9章 编译预处理
第1讲:编译预处理基本形式
提纲
1.宏定义 2.文件包含 3.条件编译
1.宏定义
不带参数宏定义 带参数宏定义
格式:
#define 标识符 字符串
功能:
指定标识符代替一个较复杂的字符串。
注意说明:
(1)宏名一般习惯用大写字母,例如宏名PI。 (2)宏名用做代替一个字符串,不作语法检查。 (3)宏定义无需在末尾加“;” (4)宏定义的有效范围为#undef命令终止。 (5)在进行宏定义时,可以引用已定义的宏名。
char web[50]; int i=0; gets(web); while(web[i]!='\0') {
#if(R==1) if(web[i]>='A'&&web[i]<='Z') {web[i]=web[i]+32; i++;}
#else if(web[i]>='a'&&web[i]<='z') {web[i]=web[i]-32; i++;}
形式3:
#ifndef 标识符 程序段1
#else 程序段2
第9章 结构体、共用体和枚举类型

9.1 结构体类型与结构体变量 9.2 结构体数组 9.3 向函数传递结构体型数据 9.4 链表 9.5 共用体 9.6 枚举类型 9.7 用户自定义类型
9.1 结构体类型与结构体变量
• 结构体类型的定义
–概述:
• 建立单链表的主要步骤为:
– 生成只含有头结点的空链表; – 然后读取数据信息,生成新结点,将数据存放于新结点中, 插入新结点到单链表中 – 重复第二步,直到输入结束。 根据新结点插入到链表的位置的不同,建立链表的方式, 分为在表尾插入的方法和在表头插入的方法。 •表尾插入: 例9.6 •表头插入: 例9.7
• 共用体变量的定义
–用已定义的共用体类型去定义共用体变量 –定义共用体类型的同时定义变量: –定义无名共用体类型的同时定义变量:
• 共用体变量的引用
–引用方式:共用体变量名.成员名 共用体变量名. 共用体变量名 –说明: 对于共用体变量,只能引用它的成员,而不能引用整个 共用体变量。若共用体的成员是构造类型的,则需要逐级引 用至最低级的成员。 –能通过定义指向共用体的指针变量来引用共用体变量。
在实际应用中,一组相关的数据可能是不同类型的。C语 言提供了包含不同类型成员的类型来定义这样的数据,这 种类型就是结构体类型 结构体类型。 结构体类型
– 定义形式:
struct 结构体名 类型名1 成员名1 {类型名1 成员名1; 类型名2 成员名2 类型名2 成员名2; …… 类型名n 成员名n 类型名n 成员名n; };
• 举例
例9.11 上一页
9.6 枚举类型
• 枚举类型的定义–定义来自式:enum 枚举类型名{枚举常量1,枚举常量2,……,枚举常量n}; •
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第1 节 结构体类型变量定义与引用
• • (2)结构体变量的赋值方法有三种:初始化、赋值、从键盘输入。 • ①结构体变量的初始化——结构体变量在声明时直接进行初始化 • 例如:student1、student2被定义为结构体变量,并对student2作了 初始化赋值。在main函数中,把student2的值整体赋予student1,然 后用printf语句输出student1各成员的值。
第1 节 结构体类型变量定义与引用
1、结构体类型的定义 • 在解决实际问题中,一组数据往往具有不同的数据类型。例如 ,在学生登记表中,姓名应为字符型;学号可为整型或字符型;年龄 应为整型;性别应为字符型;成绩可为整型或实型。 显然不能用一 个数组来存放这样一组数据。因为数组中各元素的类型和长度都必须 一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另 一种构造数据类型——“结构(structure)”或叫“结构体”。每 一个成员可以是一个基本数据类型或者又是一个构造类型。结构既然 是一种“构造”而成的数据类型,那么在说明和使用之前必须先定义 ,也就是先构造。如同在调用函数之前要先定义函数一样。
第1 节 结构体类型变量定义与引用
• • • • • • • • • • • • • • (2)在声明类型的同时定义变量 一般格式为: struct 结构体名 { 成员列表; } 变量名列表; (3)直接定义结构体类型变量 一般格式为: struct { 成员列表; } 变量名列表;
第1 节 结构体类型变量定义与引用
第1 节 结构体类型变量定义与引用
• • • • • • • • • • • • • main() { struct stu { int num; char name[20]; char sex; float score; }student1,student2={101,”Lihao”,”M”,90.5}; student1=student2; printf(“number=%d,name=%s,sex=%c,score=%f\n”,student1.num, ,student1.sex,student1.score); }
第1 节 结构体类型变量定义与引用
• 其中,struct 是关键字,关键字struct连同后面的结构体标识符一 起称为结构类型名或结构名;结构体名是由用户定义的标识符,其命 名规则应符合标识符的书写;数据类型可以是基本类型说明符,也可 以是已定义过的结构体类型名,还可以是后面将要介绍的共用体类型 ;成员名也是用户自定义的标识符,用来标识所包含的成员名称;各 成员的定义语句必须在花括号内;注意不要忽略最后的分号,它是整 个定义语句的结尾。 定义结构体类型是需要注意以下几个问题: • 类型与变量是不同的概念,不能混淆。可以对变量进行赋值、存取或 运算,但不能对类型进行赋值、存取或运算。编译时对类型不分配空 间,只对变量分配空间。 • 结构体中的成员可以单独使用,其作用和地位相当于普通变量。
第1 节 结构体类型变量定义与引用
• 结构体类型定义的位置,可以在函数内部,也可以在函数外部。在函 数内部定义的结构体类型,只能在函数内部使用;在函数外部定义的 结构体类型,其有效范围是从定义处开始,直到它所在的源程序文件 结束。 • 结构体中的每个成员都必须有自己的数据类型,位置上连续的同类型 的结构体成员可以出现在一条语句,并共用同一个类型关键字。 • 结构体成员可和程序中的其他标识符同名,也可以和另一个结构体的 成员同名。 • 结构体中的成员名可以与程序中的变量名相同,但二者并不代表同一 个对象。 • struct是声明结构体类型时必须使用的关键字,不能省略;每定义一 个变量,其后跟一个分号,不能忽略大括号外的分号。
第9章
复合结构类型
内容简介
前面已介绍了基本类型的变量,如整型、 字符型与实型。还介绍了一种构造类型数 据(数组),数组中的各元素是同一种类 型的。但是在实际应用中只有这些数据类 型是不够的。有时需要将不同类型的数据 组合成一个整体,整体中的数据是互相联 系的,以便于引用。
例如,一个学生的信息可以由学号、姓 名、性别、年龄、成绩、地址若干个数据 项组成,但是这些数据项并不属于同一种 数据类型。如果把这些数据项分别定义为 互相独立的简单变量,难以反映它们之间 的内在联系,所以把它们组织成一个组合 项,在组合项中包含若干个类型不同的数 据项。C语言允许定义这样的一种数据结构, 称为结构体类型(struct)。结构体类型 相当于其他高级语言中的“记录”。
• 3、结构体类型变量的初始化与引用 • 在程序中使用结构体变量时,往往不把它作为一个整体来使用。在C 中除了允许具有相同类型的结构体变量相互赋值以外,一般对结构体 变量的使用,包括赋值、输入、输出、运算等都是通过结构体变量的 成员来实现的。结构变量的赋值就是给各成员赋值。可用输入语句或 赋值语句来完成。 • (1)引用结构变量成员。一般形式是: • 结构体变量名.成员名 • 例如:student1.num表示student1变量中的num成员,即student1的 num(学号)项,可以对变量的成员赋值。如, student1.num=201110; • “.”是成员(分量)运算符,它在所有的运算符中优先级最高,因 些可以把student1.num作为一个整体来看待。上面赋值语句的作用是 将整数201110赋给student1变量中的成员用
•
• • • • • • • • • };
C语言没有提供现成的结构体类型,因此用户必须要在程序中建立所 需要的结构体类型。结构体类型的定义格式为: struct 结构体类型名 { 数据类型1 成员名1; 数据类型2 成员名2; 数据类型3 成员名3; …… 数据类型n 成员名n;
第1 节 结构体类型变量定义与引用
• 2、结构体类型变量定义 • 指定了一个结构体类型,相当于建立一个模型,但其中并没有具体的 数据,系统也不会为其分配实际的内存单元,为了能在程序中使用结 构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的 数据。可以采取以下介绍的3种定义结构体类型变量。 • • (1)先声明结构体类型再定义变量名 • 一般格式为: • struct 结构体名 变量名; •