以下程序段在VC6.0环境中运行的输出结果是 struct studentinfo{ char name[10]; int SNO; char sex?

用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项,从而反映一定的信息。

数据类型 结构体名1;
数据类型 结构体名2;
数据类型 结构体名3;
1)在大括号中的内容也称“成员列表”或“域表”;
2)每个成员名的命名规则与变量名相同;
3)数据类型可以是基本变量类型也可以是一个结构体类型;定义时不分配空间,定义变量才分配空间;

8.1.3结构体变量的使用

结构体变量是不同数据类型的若干数据的集合体。一般情况下不能把它作为一个整体参加数据处理,而参加各种类型运算和操作的是结构变量的各个成员数据。
结构体变量的成员用以下一般形式表示:
结构体变量名.成员名。
1>不能对结构体类型变量作为一个整体加以引用,而是对结构体类型变量的各个成员分别引用。
2>如果结构体成员本身又是一个结构体类型,则要运用若干运算符一级一级引用。
3>对成员变量可以像普通变量一样进行各种运算。
4>数组是不能相互赋值的,而结构体可以相互赋值。

8.1.4结构体变量的初始化

与其他类型的变量一样,也可以给结构体变量赋值,这称为结构体的初始化,一种是在定义结构体变量的时候进行初始化,语法结构如下:
struct 结构体 变量名={初始数据表};
另一种是在定义结构体的时候进行初始化。
变量名 ={初始数据表};

结构体数组和普通类型的数组类似这里就不一一介绍了。

介绍结构体指针之前,先给大家看一个小程序:

这段程序很简单,就是给结构体成员赋值,这里结构体成员是个数组,大家看看这种赋值方式有没有错,我们编译一下:
13行报错,就是赋值那行,报错原因是“字符分配的类型是不兼容的类型” = “qiang”,右边是字符串常量,这里其实是字符串的首地址,就是一个地址,我们以前 char a[] = "qiang"没错啊,为什么这里报错了,我们看看左值,, name 是数组名,是代表数组的首地址啊,但是我们要记住,这里name是个地址常量,是不能给常量赋值的,所以会报错,那我们如何给一个结构体中的字符数组赋值呢?我们这里用strcpy(,“qiang”) ! [1] = ‘q’,这样是可以的。

8.1.6.1指向结构体类型变量的使用

首先让我们定义结构体:

再定义指向结构体类型变量的指针变量:

定义指针变量p1、p2,分别指向结构体类型变量。引用形式为:指针变量→成员;这里我们要注意,非结构体指针引用类型是 结构体类型变量 . 成员;
对指向结构体类型变量的正确使用。 输入一个结构体类型变量的成员,并输出:

/*打印输出各成员项的值*/

8.1.6.2指向结构体类型数组的指针的使用

定义一个结构体类型数组,其数组名是数组的首地址,这一点前面的课程介绍得很清楚。定义结构体类型的指针,既可以指向数组的元素,也可以指向数组,在使用时要加以区分。
上个例子中定义了结构体类型,根据此类型再定义结构体数组及指向结构体类型的指针

p是指向一维结构体数组的指针,对数组元素的引用可采用三种方法。

若p指向数组的某一个元素,则p++就指向其后续元素。

指向结构体数组的指针变量的使用:

/*定义结构体数组并初始化*/

分析:我们知道时间有时 分 秒 组成,这里用结构体表示

这里是个动态效果,大家可以打印出来看一下。

8.1.7指针和结构类型的关系

可以声明一个指向结构类型对象的指针。

//声明了结构对象ss,并把ss的三个成员初始化为20,30和40。 //声明了一个指向结构对象ss的指针。它的类型是MyStruct*,它指向的类型是MyStruct。 //声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。

请问怎样通过指针ptr来访问ss的三个成员变量?
又请问怎样通过指针pstr来访问ss的三个成员变量?
虽然我在我的MSVC++6.0上调式过上述代码,但是要知道,这样使用pstr来访问结构成员是不正规的,为了说明为什么不正规,让我们看看怎样通过指针来访问数组的各个单元:

通过指针pa访问数组array的三个单元的方法是:

从格式上看倒是与通过指针访问结构成员的不正规方法的格式一样。
所有的C/C++编译器在排列数组的单元时,总是把各个数组单元存放在连续的存储区里,单元和单元之间没有空隙。但在存放结构对象的各个成员时,在某种编译环境下,可能会需要字对齐或双字对齐或者是别的什么对齐,需要在相邻两个成员之间加若干个"填充字节",这就导致各个成员之间可能会有若干个字节的空隙。

所以,在例中,即使pstr访问到了结构对象ss的第一个成员变量a,也不能保证(pstr+1)就一定能访问到结构成员b。因为成员a和成员b之间可能会有若干填充字节,说不定*(pstr+1)就正好访问到了这些填充字节呢。这也证明了指针的灵活性。要是你的目的就是想看看各个结构成员之间到底有没有填充字节,嘿,这倒是个不错的方法。
通过指针访问结构成员的正确方法应该是象使用指针ptr的方法。

8.2联合体(共用体)

union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。不过区别也挺明显:结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

8.2.2双刃剑——多种访问内存途径共存

所以说,管union的叫共用体还真是贴切——完全就是共用一个内存首地址,并且各种变量名都可以同时使用,操作也是共同生效。如此多的access内存手段,确实好用,不过这些“手段”之间却没法互相屏蔽——就好像数组+下标和指针+偏移一样。
上例中我改了v.i的值,结果v.l也能读取,那么也许我还以为v.l是我想要的值呢,因为上边提到了union的内存首地址肯定是相同的,那么还有一种情况和上边类似:一个int数组变量a,一个long int(32位机中,long int占4字节,与int相同)变量b,我即使没给int变量b赋值,因为数据类型相同,我使用int变量b也完全会拿出int数组a中的a[0]来,一些时候一不小心用上,还以为用的就是变量b呢。
这种逻辑上的错误是很难找出来的(只有当数据类型相去甚远的时候稍好,出个乱码什么的很容易发现错误)。

//数组中下标低的,地址也低,按地址从低到高,内存内容依次为:04,03,02,11。总共四字节! //而把四个字节作为一个整体(不分类型,直接打印十六进制),应该从内存高地址到低地址看,0x,低位04放在低地址上。

8.2.4联合体union所占内存空间大小

前边说了,首先,union的首地址是固定的,那么,union到底总共有多大?根据一些小常识,做个不严谨不高深的基础版验证吧。
根据:分配栈空间的时候内存地址基本上是连续的,至少同类型能保证在一起,连续就说明,我如果弄三个结构体出来,他们三个地址应该连着,看一下三个地址的间隔就知道了。

有了前边那个验证,基本可以确认,union的内存是照着里边占地儿最大的那个变量分的。也就可以大胆的推测一下,这种union的使用场合,是各数据类型各变量占用空间差不多并且对各变量同时使用要求不高的场合(单从内存使用上,我觉得没错)。
像上边做的第二个测试,一个数组(或者更大的数组int a[100]),和一个或者几个小变量写在一个union里,实在没什么必要,节省的空间太有限了,还增加了一些风险(最少有前边提到的逻辑上的风险)。所以,从内存占用分析,这种情况不如直接struct。
不过话说回来,某些情况下虽然不是很节约内存空间,但是union的复用性优势依然存在啊,比如方便多命名,这种“二义性”,从某些方面也可能是优势。这种方法还有个好处,就是某些寄存器或通道大小有限制的情况下,可以分多次搬运。

根据union固定首地址和union按最大需求开辟一段内存空间两个特征,可以发现,所有表面的定义都是虚的,所谓联合体union,就是在内存给你划了一个足够用的空间,至于你怎么玩它不管!(何止是union和struct,C不就是玩地址么,所以使用C灵活,也容易犯错)

没错,union的成员变量是相当于开辟了几个接口(即union包含的变量)!但是,没开辟就不能用了?当然也能用!

一个例子了然,我的结构体只定义了int和double“接口”,只要我获得地址,往里边扔什么数据谁管得到?这就是C语言的强大,这就是union的本质——只管开辟一段空间。有些东西,熟悉编译原理和编译器工作过程的话,解决会更容易点,虽然我现在这方面技能不太强,不过一般问题也足够分析了。

枚举类型声明为一组相关的符号常数定义了一个类型名称。枚举用于“多项选择”场合,就是程序运行时从编译时已经设定的固定数目的“选择”中做出决定。
枚举类型(也称为枚举)为定义一组可以赋给变量的命名整数常量提供了一种有效的方法。例如,假设您必须定义一个变量,该变量的值表示一周中的一天。该变量只能存储七个有意义的值。若要定义这些值,可以使用枚举类型。枚举类型是使用 enum 关键字声明的。

(0)。创建枚举时,应选择最合理的默认值并赋给它一个零值。这便使得只要在创建枚举时未为其显式赋值,则所创建的全部枚举都将具有该默认值。枚举中大小写敏感,但是建议不要这样。

有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

8.4.1位域的定义和位域变量的说明

位域定义与结构定义相仿,其形式为:
  { 位域列表 };
  其中位域列表的形式为: 类型说明符 位域名:位域长度
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1>一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2>由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3>位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。

位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。

上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于:

《c语言学校运动会管理系统课设报告》由会员分享,可在线阅读,更多相关《c语言学校运动会管理系统课设报告(58页珍藏版)》请在人人文库网上搜索。

页学校运动会管理系统目录目录1.课程设计目的32.需求分析32.1 要求32.2 任务描述42.3 运行环境42.4 开发工具43.总体设计43.1 系统流设计43.2 系统模块设计54.详细设计64.1 数据结构设计64.2 模块接口设计74.3 以下是几个主

2、要模块的流程图:85.运行结果915.1 主菜单界面:915.2 图书信息查询界面:1025.3:图书销售界面错误 !未定义书签。 45.4 图书信息整体浏览界面:错误 !未定义书签。 95.5 图书信息删除界面 :错误! 未定义书签。5.6 图书信息保存界面:225.7 退出程序:65.8 图书信息新建界面:65.9 修改密码236.程序调试与测试236.1 程序调试236.2 程序测试277.问题与不足308.建议319.编程体会3110.程序源代码:3111.参考文献5612.用户使用手册57第 4 页共 58页学校运动会管理系统1.课程设计目的1) 通过课程设计,加深对结构化程序设计思

3、想的理解,能对系统功能进行分析,并设计合理的模块化结构。2) 通过课程设计,进一步掌握 C 语言中重要的数据结构。掌握并熟练运用指针、链表、结构体、文件等数据结构。3) 通过课程设计,提高程序开发能力,能运用合理的控制流编写清晰高效的程序。4) 通过课程设计,培养 C 语言知识运用和自学能力,真正的把课堂上获得的知识运用起来,培养自己对程序编写的兴趣,并能独立设计和实现一个小型系统。5) 通过课程设计,加强了自己的程序分析能力。6) C 语言程序设计课程设计的主要目的是培养学生在 C 语言程序设计课程学习后,综合运用 C语言程序设计课程所学到的知识,编写 C 程序解决实际问题的能力,以及严谨的

4、工作态度和良好的程序设计习惯。7) 通过本课程设计的训练,学生应该能够了解程序设计的基本开发过程,掌握编写、调试和测试 C 语言程序的基本技巧,充分理解结构化程序设计的基本方法。能灵活应用,初步具备运用 C 解决实际问题的能力。8) C 语言课程设计的主要任务是要求学生遵循软件开发过程的基本规范,运用结构化程序设计方法,按照课程设计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C 语言程序及编写设计报告等过程。2.需求分析2.1 要求1) 遵循软件开发过程的基本规范;能灵活应用,初步具备运用C 程序解决实际问题的能力。2) 运用结构化程序设计方法,按照课程设

5、计题目要求,完成包括需求分析、数据结构设计、概要设计、详细设计、编写代码、调试和测试C 程序等过程。3) 学会利用数组、结构体、链表进行相关信息表示。4) 功能模块划分清晰,系统结构图符合功能操作要求,且有详尽的功能描述5) 各主要功能模块有详尽的流程图及描述,用函数的形式实现,且调用入口、功能、出口等关系正确。第 4 页共 58页学校运动会管理系统6) 所设计的 C 程序较好的可读性和可靠性;程序书写风格规范,注释清晰。7) 界面友好(良好的人机互交) ,凡需要输入信息时,都有较详尽的提示信息,并对输入信息有较完善的值域分析。8) 程序经上机调试通过,不应出现语法型、功能型错误,并获得满意的

6、结果。9) 学会通过各功能性测试用例测试程序的能力,尽可能避免原则性错误的出现。10) 掌握编写、 调试和测试 C 语言程序的基本技巧,充分理解结构化程序设计的基本方法。11) C 语言课程设计报告的内容反应实际设计过程, 且符合格式要求, 无抄袭现象。2.2 任务描述此系统以学校运动会为背景,支持运动会管理人员对获奖人员信息进行新建、查询、以及对相应项目,院系获奖情况整体列表浏览,亦可实现保存。具体功能实现如下:1)运动员信息载入: 管理人员从键盘输入获奖运动员信息, 以便操作者可以实现相关需求。3)获奖信息整体浏览功能: 实现对所有院系获奖信息的整体浏览, 使运动会管理人员对获奖信息信息有

7、一个整体的了解。4)单独院系获奖信息查询功能:实现对所指定院系查询其成员获奖情况。5)单独项目获奖信息查询功能:实现对所指定项目查询所有获奖成员信息。2.3 运行环境1) WindowsXP/7 系统2) VC+6.0 编译环境2.4 开发工具C 语言3.总体设计3.1 系统流设计本系统的功能模块如图1 所示,主要有以下模块:第 4 页共 58页学校运动会管理系统课程名称界面程序欢迎界面主菜单界面获所系项题奖有部目退目运信动系获获出奖息员部奖程浏查信整信序询息体息览浏浏信新览览息建输输查查查退入出 按所 按询按询询出本 书有 书所书相相此课 号获 号有号应应时题 查奖 查系查系项进题 询运 询

8、部询部目行目动获获获的要员奖奖奖程求名名名名序单单单单图 1 系统功能模块图3.2 系统模块设计1) 系统欢迎界面:构造函数 void welcome(), 实现欢迎使用学校运动会管理系统,作者和指导老师的显示。2)课程名称界面:构造函数void printtimu (),实现软件题目的显示。第 4 页共 58页学校运动会管理系统3)主菜单界面:构造函数void menu_select (),实现系统主菜单的显示。4) 获奖运动员信息新建:构造函数 void shuru() ,实现新建获奖运动员信息。5)系部获奖信息查询:构造函数void xibu() ,实现查询所选系部获奖信息查询。6)项目

9、获奖信息查询:构造函数void xiangmu(), 实现查询所选项目获奖信息查询。7)获奖运动员信息整体浏览:构造函数void shuchu() ,显示所有系部获奖人员情况。8) 导入链表信息到系部结构体:构造函数 void daoruxi() ,导入获奖运动员分数到系部。9) 判断所输入信息合理性:构造函数 int panduan() ,判断新输入的获奖信息是否与之前输入的信息有冲突。10) 对用户的提示函数:构造函数 void TiShi(), 提示学校院系及运动项目设置。11)退出系统:构造函数void exit0(),实现退出系统。4.详细设计4.1 数据结构设计根据系统要求,系统中

10、需要保存的数据信息,其结构如下:数据项名称数据项系统表示数据类型数据长度备注系部编号xinumInt4项目编号munumInt4运动员姓名NameChar30获奖名次MCInt4为了充分利用内存空间和实现不受限制的新建、载入获奖运动员信息,采用链表的结构保存获奖运动员信息,在新建一位运动员信息时,创建一个运动员信息的节点,将其插入到链表中,示意图如下。运动员运动员运动运动为此,需声明一个类型为structstudent的结构体,其成员为图书的基本信息。第 4 页共 58页学校运动会管理系统然后通过对指针、链表、文件等数据结构的操作,实现对运动员信息的新建、查询、整体浏览、比较、保存等一系列操作

switch(menu_select(), 显示主菜单,并利用 void menu_select()接受用户的返回值返回个主函数,再调用相关的函数进入到下一级菜单进行相关操

我要回帖

更多关于 VC程序 的文章

 

随机推荐