文档章节

第14章 结构和其他数据形式 14.4 结构数组

idreamo
 idreamo
发布于 2017/03/14 06:29
字数 1035
阅读 12
收藏 0

程序清单14.2  manybook.c程序

/*manybook.c 包含多本书的图书目录*/
#include <stdio.h>
#define MAXTITL 40
#define MAXAUTL 40
#define MAXBKS 100    /*最多可以容纳的图书册数*/
struct book {         /*结构模板;标记为book*/
    char title[MAXTITL];
    char author[MAXAUTL];
    float value;
};                     /*结构模板结束*/

int main(void)
{
    struct book library[MAXBKS];    /*把library声明为book结构数组*/
    int count=0;
    int index;

    printf("Please enter the book title.\n");
    printf("Please [enter] at the start of a line to stop.\n");
    while(count<MAXBKS && gets(library[count].title)!=NULL && library[count].title[0]!='\0')
    {
        printf("Now enter the author.\n");
        gets(library[count].author);
        printf("Now enter the value.\n");
        scanf("%f",&library[count++].value);
        while(getchar()!='\n')
            continue;  /*清空输入行*/
        if(count<MAXBKS)
            printf("Enter the next title.\n");
    }
    if(count>0)
    {
        printf("Here is the list of your books: \n");
        for(index=0;index<count;index++)
            printf("%s by %s: $%.2f\n",library[index].title,
                   library[index].author,library[index].value);
    }
    else
        printf("No books? Too bad.\n");
    return 0;
}

首先,我们看看如何声明结构数组以及如何访问各个成员。然后,我们着重分析程序的两个方面。

14.4.1  声明结构数组

声明一个结构数组和声明其他类型的数组一样:

struct book library[MAXBKS];

这条语句声明library为一个具有MAXBKS个元素的数组,数组 的每个元素都是book类型的结构

library本身不是结构名,它是元素类型为struct book结构的数组名。

14.4.2  标识结构数组成员

为了标识结构数组的成员,可以采用适用于各个结构的规则:在结构名后加一个点运算符,然后是成员名。

library[0].value;  /*第1个数组元素的value成员*/
library[4].title;  /*第5个数组元素的title成员*/

使用library[0].value的原因是library[0]是结构变量名,就像library[4]是另一个结构变量名一样;

library[2].title[4];这个表达式代表什么?

这是由第3 个结构描述的书本的名称的第5个字符。这个例子指出,点运算符右边的下标作用于各个成员,点运算符左边的下标作用于结构数组。

作为结构,我们看下面的这个序列:

library             //book结构数组
library[2]          //数组元素,因此是一个book结构
library[2].title    //char数组(library[2]的title成员)
library[2].title[4] //title成员数组中的一个字符

14.4.3  程序讨论

相对于第一个程序的主要变化是,我们插入一个循环来读取多个输入项,循环是由下列的while条件开始的:

while(count<MAXBKS && gets(library[count].title)!=NULL && library[count].title[0]!='\0')

表达式gets(library[count].title)读入一个字符串作为书名;如果gets()试图超出文件结尾读取字符,这个表达式的值为NULL。表达式library[count].title[0]!='\0'是检测字符串的第一个字符是否为空字符,也就是字符串是否为空。如果用户在输入行的开始就按了回车键,将输入空字符串,这将结束循环。我们还进行限制,以确保输入的书本数不超出数组大小的限制。

程序中有这们的几行:

while(getchar()!='\n')
    continue;   /*清空输入行*/

在前面的章节我们介绍过,scanf()函数忽略掉空格和换行符,这段代码弥补了这一不足。当您回答对书本价格的请求时,您可能会键入下列的信息:

12.5[enter]

这个语句传送了下面的字符序列:

12.50 \n

scanf()函数读入了1、2、5、0,但是把\n留在了输入流中,等待下一个读入语句处理。如果没有前面那段预处理的代码,下一个读入语句gets(library[count].title)就会把留下来的换行符当作空行读入,程序会以为用户发出了一个停止信号。我们插入的那段代码会把后续所有字符丢掉,直到发现并丢掉一个换行符为止。除了把这些字符丢掉以外,它不会对它们进行任何处理。这样gets就可以重新开始 了。

© 著作权归作者所有

idreamo
粉丝 18
博文 139
码字总数 224743
作品 0
青岛
产品经理
私信 提问
转行程序员?你可能忽略了一件事。

     程序 = 数据结构 + 算法   ——图灵奖得主,计算机科学家N.Wirth(沃斯)      作为程序员,我们做机器学习也好,做python开发也好,java开发也好。   有一种对所有程序员无一...

java进阶架构师
2018/10/25
0
0
每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是《Oracle 12 c PL(SQL)程序设计终极指南》,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著。 内容简介: 《Oracle 12c PL/SQL程序设计终极指南》志在打造PL/SQL领...

zting科技
2017/12/11
0
0
第14章 Keras使用保存点保存最好的模型

第14章 Keras使用保存点保存最好的模型 深度学习有可能需要跑很长时间,如果中间断了(特别是在竞价式实例上跑的时候)就要亲命了。本章关于在训练时中途保存模型。本章将: 保存点很重要! ...

优惠券活动
2018/06/05
0
0
关东升的《从零开始学Swift》第2版已经出版

关东升的《从零开始学Swift》第2版已经出版 大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版《从零开始学Swift》 《从零开始学Swift》将在《...

tony关东升
2016/02/24
0
0
《java数据结构和算法》读书笔记

《Java多线程编程核心技术》读书笔记 常用数据结构 第2章 数组 最简单的数据结构,在查找上比链表有优势,但是在插入与删除上比不上链表。 Java中的数组有长度限制,为int值。在内存模型中,...

刀狂剑痴
2016/05/27
155
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库管理哪家强?Devart VS Navicat 360°全方位对比解析

今天小编向大家推荐的是两个开发环节的主流数据库管理品牌,那么你知道这两款数据库管理软件品牌与 数据库引擎配套的管理软件有什么区别吗?小编这就360°全方位为您解答: ★ 品牌介绍 Deva...

FILA6666
28分钟前
2
0
Leetcode PHP题解--D107 453. Minimum Moves to Equal Array Elements

D107 453. Minimum Moves to Equal Array Elements 题目链接 453. Minimum Moves to Equal Array Elements 题目分析 给定一个数组,对数组中的N-1个数组每次加1,返回最少需要多少步才能使得...

skys215
30分钟前
1
0
Spring注解——同一接口有多个实现类,如何注入

https://blog.csdn.net/u010476994/article/details/80986435

Java搬砖工程师
34分钟前
1
0
java高并发(二)并发与高并发基本概念

并发 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程将交替地换入或者换出内存,这些线程是同时“存在”的,每个线程都处于执行过程中的某个状态,如果运行在多核处理器上...

Vincent-Duan
38分钟前
7
0
Fundebug:JavaScript插件支持错误采样

Fundebug的付费套餐主要是根据错误事件数制定的,这是因为每一个发送到我们服务器的事件,都会消耗一定的CPU、内存、磁盘以及带宽资源,尤其当错误事件数非常大时,会对我们的计算资源造成很...

Fundebug
38分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部