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个元素的空间。当然,这要求用户为元素个数提供正确的值。


0 0
原创粉丝点击