高级数据表示(C Primer Plus 第六版)

简介: 高级数据表示(C Primer Plus 第六版)

高级数据表示


主要内容:

函数:进一步学习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)可用的内存数量设置了一个默认的限制,如此大型的数组可能会超过默认设置的值。可以把数组声明为静态或外部数组,或者设置编译器使用更大的栈来解决这个问题。但是.这样做并不能根本解决问题。 该程序真正的问题是,数据表示太不灵活。程序在编译时确定所需内存量,其实在运行时确定会更好。要解决这个问题,应该使用动态内存分配来表示数据。可以这样做:

image.png

更新之后的程序不在程序运行前才确定数组中的元素数量,这种属于是一次调用分配连续的内存空间。

创建指针,指向这个结构,最后为指针分配地址(n*sizeof(struct film))


相关文章
|
3月前
|
算法 安全
【 第九章】软件设计师 之 多媒体基础
软件设计师 之 多媒体基础备考资料
【 第九章】软件设计师 之 多媒体基础
|
4月前
IEC104初学者教程,第七章:传送原因语义归总
传送原因(Cause of Transmission, COT)是该协议中的一个重要字段,用于描述报文的传送目的或触发事件。 这些代码有助于接收方理解报文的意图和上下文,并做出相应的处理。例如,如果接收到的报文的传送原因是“周期”,接收方可以理解这是一个定期传输的状态信息,而如果传送原因是“突发”,则表示这是一个紧急事件需要立即处理。
67 2
|
5月前
|
存储 C++
C primer plus 学习笔记 第17章 高级数据表示
C primer plus 学习笔记 第17章 高级数据表示
|
6月前
|
缓存 编译器 C语言
|
存储 算法 Java
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(二)
|
安全 编译器 C++
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)(一)
[笔记]读书笔记 C++设计新思维《二》技术(Techniques)
|
存储 Java 程序员
一起啃书(C Primer Plus 第六版)--数据和C<附大量编程题>
一起啃书(C Primer Plus 第六版)--数据和C<附大量编程题>
147 0
|
C语言
C语言高级数据表示(C Primer Plus 第六版)(三)
C语言高级数据表示(C Primer Plus 第六版)(三)
142 0
C语言高级数据表示(C Primer Plus 第六版)(三)
|
程序员 C语言
C语言高级数据表示(C Primer Plus 第六版)(二)
C语言高级数据表示(C Primer Plus 第六版)(二)
178 0
C语言高级数据表示(C Primer Plus 第六版)(二)

相关实验场景

更多
下一篇
无影云桌面