小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
高级数据表示
主要内容:
函数:进一步学习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))