C Primer Plus学习 五十八 高级数据表示(一)
来源:互联网 发布:程序员思维 编辑:程序博客网 时间:2024/06/14 05:18
我们来看一个数据表示的实例。假设您想要写一个程序来输入您-年中看过的所有电影(包括录像 带和DVD)的列表。对每一部电影,您想记录各种信息,比如片名、发行年份、导演、主演、片长、影片 类别(喜剧、科幻、爱情、传奇,诸如此类),您的评价等。根据这种情况,可以对每一部电影使用•个 结构,对电影列表使用结构数组。为了简化,我们将结构限制为只有两个成员:片名和您的评价(分为0 到10十个等级)。
/* filmsl.c --使用结构数组*/
#include<stdio.h>
#define TSIZE 45 /*存放片名的数组大小*/
#define FMAX 5 /*最多的影片数 */
struct film{
char title[TSIZE];
int rating;
};
int main(void)
{
struct film moves[FMAX];
int i=0;
puts("Enter first movie title:");
while(i<FMAX&&gets(moves[i].title)!=NULL&&moves[i].title[0]!='\0')
{
puts("enter your rating(0-10):");
scanf("%d",&moves[i++].rating);
while(getchar()!='\n')
{
continue;
}
puts("Enter first movie title(empty line to stop):");
}
if(i==0)
{
printf("No data entered.");
}
else
{
printf("Here is the movie list:\n");
}
for(int j=0;j<i;j++)
{
printf("Movie: %s rating:%d\n",moves[j].title,moves[j].rating);
}
printf("Bye!\n");
return 0;
}
程序创建了一个结构数组,然后把用户输入的数据填充到这个数组中。直到数组满(FMAX判断), 或者到达文件结尾(NULL判断),或者用户在行首按下冋车键(‘\O’判断),输入才会终止。
这种方法有些问题。首先,程序很可能会浪费大量空间,因为大多数电影的片名并没有40个字符, 但是有些电影片名的确很长,比如 TVie Decree丨 C/wrm 〇/ S〇Hrgeo!'s/e 和 Wcw 7"on Ton,Dog WTio
第二,很多人会觉得每年5部电影的限制太严格了。当然,可以放宽这个限制,但 是,多大的值比较合适呢?有些人每年看500部电影,所以可以将FMAX增加到500;但是,对于有的人来说,这可能仍然太小,但是对别人来说可能浪费大量的内存。同时,有些编译器对像movies这 样的自动存储类变量可用的内存大小设置了一个默认的限制,如此之大的数组可能会超过那个值。这可 以通过将数组声明为静态或外部数组,或者指示编译器使用更大的堆栈来解决,但这样并不能解决根本 问题。
这里的根本问题是数据表示方法太不灵活。您必须在编译时做出决定,而事实上在运行时做这些决定 会更好。这就表明您应该转向使用动态内存分配的数据表示。您可以尝试以下方法:
#define TSIZE 45 /*存放片名的数组人小*/
struct film {
char title[TSIZE]:
struct film * movies; /* 指向结构的指针 */
printf ("Enter the maximum number of movies you'll enter: \n"); acanf ("%d". &nJ;
movies = (struct film *) malloc (n * sizeof (struct film)):
这里,正如在第12章“存储类、链接和内存管理”中描述的那样,您可以将指针movies当作一个数 组名:
while (i < FiyiAX && gets (movies[i] .title) != NULL && movies [i ] . title [0 ] !='\0')
通过使用malloc (),可以将确定元素个数的时间延迟到程序运行时。所以如果只需要20个元素,程 序就无须分配存放500个元素的空间。当然,这要求用户为元素个数提供正确的值。
- C Primer Plus学习 五十八 高级数据表示(一)
- C Primer Plus学习 一
- 《C++.Primer.Plus》学习笔记(一)
- 《C++Primer Plus》学习笔记(一)
- [C++ Primer Plus]开始学习C++(一)
- 《C Primer Plus》学习笔记之 C数据的属性(一)数据类型
- C Primer Plus学习
- C Primer Plus学习笔记----第三章数据和C
- C Primer Plus(一)
- 《c primer plus》笔记<一>
- c primer plus 练习一
- C Primer Plus 学习笔记系列之(一)
- 《C Primer Plus》 学习笔记系列之(一)
- C Primer Plus(第五版)学习(一)
- C Primer Plus学习 六十一 队列 ADT(一)
- C++ primer plus 学习(一)
- C++Primer Plus学习笔记
- 《C Primer Plus》学习笔记
- 谷歌的Gson消息传递数据格式封装及解析,跨平台必用知识
- CodeForces 732A Buy a Shovel
- 打印个个页面的控制器
- Android唯一标识生成方案
- 关于ajax结合分部视图实现异步刷新
- C Primer Plus学习 五十八 高级数据表示(一)
- HandlerThread,子线程中处理Handler消息
- MySQL 主从复制你了解多少
- 关于WebView的总结2---使用方法及常见问题和解决方案汇总
- 导航表
- 51nod-【1080 两个数的平方和】
- GOF 设计模式总结
- Android 获取外部存储设备列表
- 5.Android数据保存策略之3--SharedPreference