高级数据表示
主要内容:
函数:进一步学习malloc ( )
使用C表示不同类型的数据
新的算法,从概念上增强开发程序的能力
抽象数据类型( ADT)
学习计算机语言和学习音乐、木工或工程学一样。首先,要学会使用工具:学习如何演奏音阶、如使用锤子等,然后解决各种问题,如降落、滑行以及平衡物体之类。到目前为止,读者一直在本书中学和练习各种编程技能,如创建变量、结构、函数等。然而,如果想提高到更高层次时,工具是次要的,真正的挑战是设计和创建一个项目。
学到现在应该明白C语言的内置类型
简单变量、数组、指针、结构和联合
后面还会讲一些算法,即操控数据的方法
之后是研究设计数据类型的过程,这是一个把算法和数据相匹配的过程,会讲到常用的数据形式,如队列、列表和二叉树
小荔枝
#include <stdio.h> #include <string.h> #define TSIZE 45 //存储片面的数组大小 #define FMAX 5 //影片的最大数量 struct film { char title[TSIZE]; int rating; }; char * s_gets(char str[] , int lim); //一个函数类型的指针 int main(void) { struct film movies[FMAX]; //定义一个结构数组,数组中的每一个元素都是film类型的结构变量 int i = 0; int j; puts("Enter first movie title:"); while (i < FMAX && s_gets(movies[i].title,TSIZE) != NULL && movies[i].title[0] != '\0') { puts("Enter your rating<0-10>:"); scanf("%d", &movies[i++].rating); while (getchar() != '\n') continue; puts("Enter next movie title (empty line to stop):"); } if (i == 0) printf("No data entered."); else printf("Here is the movie list:\n"); for (j = 0; j < i; j++) printf("Movie: %s Rating: %d\n",movies[j].title,movies[j].rating); printf("Bye!\n"); return 0; } char * s_gets(char * st,int n) { char * ret_val; char * find; ret_val = fgets(st,n,stdin); if (ret_val) { find = strchr(st,'\n'); if (find) *find = '\0'; else while (getchar() != '\n') continue; } return ret_val; } 输出结果为: PS D:\Code> cd "d:\Code\C\结构\" ; if ($?) { gcc structDemo03.c -o structDemo03 } ; if ($?) { .\structDemo03 } Enter first movie title: Roman holiday Enter your rating<0-10>: 2 Enter next movie title (empty line to stop): Here is the movie list: Movie: Roman holiday Rating: 2 Bye!
程序解析
该程序创建了一个结构数组,然后把用户输入的数据储存在数组中。直到数组已满(用FMAX进行判断)或者到达文件结尾(用NULL进行判断),或者用户在首行按下 Enter键(用'\0'进行判断),输入才会终止。 这样设计程序有点问题。首先,该程序很可能会浪费许多空间,因为大部分的片名都不会超过40个字符。但是,有些片名的确很长,如The Discreet Charm of the Bourgeoisie和 Won Ton Ton, The Dog Who SavedHollywood。其次,许多人会觉得每年5部电影的限制太严格了。当然,也可以放宽这个限制,但是,要多大才合适?有些人每年可以看500部电影,因此可以把FMAX改为500。但是,对有些人而言,这可能仍然不够,而对有些人而言一年根本看不了这么多部电影,这样就浪费了大量的内存。另外,一些编译器对自动存储类别变量(如movies)可用的内存数量设置了一个默认的限制,如此大型的数组可能会超过默认设置的值。可以把数组声明为静态或外部数组,或者设置编译器使用更大的栈来解决这个问题。但是.这样做并不能根本解决问题。 该程序真正的问题是,数据表示太不灵活。程序在编译时确定所需内存量,其实在运行时确定会更好。要解决这个问题,应该使用动态内存分配来表示数据。可以这样做:
更新之后的程序不在程序运行前才确定数组中的元素数量,这种属于是一次调用分配连续的内存空间。
创建指针,指向这个结构,最后为指针分配地址(n*sizeof(struct film))