`
hongbochen1223
  • 浏览: 44327 次
文章分类
社区版块
存档分类
最新评论

通讯录的输入输出

 
阅读更多

在实际问题中,一组数据往往具有不同的数据类型。例如,在学生登记表中,姓名为字符型,学号为整型或字符型,年龄为整型,性别为字符型,成绩为整型或实数型别,显然,不能使用一个数组来存放这一组数据。因为数组中各个元素的类型和长度都必须一致,以便于编译系统处理。为了解决这个问题,C语言中给出了另一种构造数据类型–结构。他相当于其他高级语言中的记录。

“结构”是一种构造类型,他是由若干“成员”组成的。每一个成员可以是一个基本数据类型或者又是一个构造类型。结构是一种“构造”而成的数据类型,在说明和使用之前先定义它,也就是构造它。就像是定义函数一样。

1:结构的定义
定义一个结构的一般形式为:

struct 结构名
{
成员列表
};

2:结构类型变量的说明

说明结构变量有3中方法,以结构stu为例。

struct stu
{
    int num;
    char name[20];
    char sex;
    float score;
}; 

//说明结构变量
struct stu boy1,boy2;

说明变量boy1和boy2为stu结构类型。也可以使用宏定义用一个符号常量来表示一个结构类型,例如

#define STU struct stu
STU
{
    int num;
    char name[20];
    char sex;
    float score;
};

STU boy1,boy2;

还可以在定义结构类型的同时说明结构变量,例如:

struct stu
{
    int num;
    char name[20];
    char sex;
    float score;
} boy1,boy2;

或者是直接说明结构变量,例如

struct 
{
    int num;
    char name[20];
    char sex;
    float score;
}boy1,boy2; 

注意:
如果结构变量是全局变量或为静态变量,则可以对它进行 初始化赋值。对局部或自动结构变量不能进行初始化赋值。

3:结构数组
继续使用上面stu的例子:

struct stu boys[20];

4:结构指针变量
当使用一个指针变量指向一个结构变量时,称之为结构指针变量。结构变量中的值是所指向的结构变量的首地址。通过结构指针即可访问该结构
变量,这与数组指针和函数指针的情况是相同的。结构指针变量说明的一般形式为:

struct 结构名 *结构指针变量名

例如,如果要说明一个指向stu的指针变量pstu,可写为:
struct stu *pstu;

当然,也可以在定义stu结构的时候同时说明pstu。与前面变量的声明相同。结构指针变量必须要先赋值后才能使用。赋值是把结构变量的首地址赋予该指针变量,不能把结构名赋予该指针变量,如过boy是被说明为stu类型的结构变量,则”pstu=&boy”是正确的,但是”pstu=&stu”是错误的。

结构名和结构变量是两个不同的概念,不能混淆。结构名只能表示一个结构形式,编译系统并不对他分配空间。只有当变量说明为这种类型的结构时,才对该变量分配内存空间。因此”&stu”的写法是错误的,不可能去取一个结构名的首地址。有了结构指针变量,就能更方便的访问结构变量的各个成员。

程序访问的一般形式为:(*结构指针变量).成员名 或为:
结构指针变量->成员名

例如”(*pstu).num”或者”pstu->num”。

应该注意(pstu)两侧的括号不可少,因为成员符号“.”的优先级高于”“。如果去掉括号协作pstu.num,就等效于”(pstu.num)”,这样意义就不对了。

5:结构指针变量作为函数参数
在ANSI C标准中允许使用结构变量作为函数参数进行整体传送。但是这种传送要将全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重的降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作为函数参数进行传送,由于实参传向星灿的只是地址,从而减少了时间和空间的开销。

在本例中,假设一个通讯录由以下几项数据信息组成
数据项 类型
姓名 字符串
地址 字符串
邮政编码 字符串
电话号码 字符串

下面请看一下代码的实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ZIPLEN 10
#define PHONLEN 10

struct addr{
    char *name;     /* 姓名 */
    char *address;  /* 地址 */
    char zip[ZIPLEN];   /* 邮编 */
    char phone[PHONLEN]; /* 手机号码 */
};

int readaddr(struct addr *dpt);
 int writeaddr(struct addr *dpt);

/**
 * 编制一个包含姓名,地址,邮编和电话的通讯录
 * 输入输出函数。
 */
int main()
{
    struct addr p[1];
    int i,j;

    for(i=0;readaddr(p+i);i++);
    for(j = 0;j < i;j++)
        writeaddr(p+j);

    puts("Press any key to quit...\n");
    getch();

    return 0;
}

/**
 * 向结构中的成员赋值
 *
 */
int readaddr(struct addr *dpt)
{
    int len;
    char buf[120]; //输入字符串的缓冲区

    printf("Please input the Name:\n");
    if(scanf("%s",buf)==1){
        len = strlen(buf);

        dpt->name = (char *)malloc(len+1);
        strcpy(dpt->name,buf);
    }else return 0;

    printf("Please input the Address:\n");
    if(scanf("%s",buf) == 1){
        len = strlen(buf);
        dpt->address = (char *)malloc(len+1);
        strcpy(dpt->address,buf);
    }else{
        free(dpt->name);
        return 0;
    }

    printf("Please input the Zip:\n");
    if(scanf("%s",buf) == 1){
        strncpy(dpt->zip,buf,ZIPLEN-1);
    }else{
        free(dpt->name);
        free(dpt->address);
        return 0;
    }

    printf("Please input the Phone:\n");
    if(scanf("%s",buf) == 1){
        strncpy(dpt->phone,buf,PHONLEN-1);
    }else{
        free(dpt->name);
        free(dpt->address);

        return 0;
    }

    return 1;
}

/**
 *  输出通讯录
 */
 int writeaddr(struct addr *dpt)
 {
    printf("Name        :   %s\n",dpt->name);   /* 输出姓名 */
    printf("Address     :   %s\n",dpt->address); /* 输出地址 */
    printf("Zip         :   %s\n",dpt->zip); /* 输出邮编 */
    printf("Phone       :   %s\n",dpt->phone); /* 输出手机号 */
 }

下面是运行结果:

这里写图片描述

注意:关于动态内存分配问题:

在数组中,数组的长度是预先定义好的,在整个程序中固定不变。C语言不允许动态数组类型。例如”int n;scanf(“%d”,n);int a[n];”,这是错误的。但是在实际编译过程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按照需要动态分配内存空间,也可以把不再使用的空间收回待用。常用的内存管理函数有3个:

1:分配内存空间函数malloc。调用形式
(类型说明符 *)malloc(size);

在内存的动态存储区中分配一块长度为”size”字节的连续区域。函数的返回值为该区域的首地址。

2:分配内存空间函数 calloc。calloc也用于分配内存空间,调用形式:

(类型说明符 *)calloc(n,size);

在内存动态存储区中分配n快长度为”size”字节的连续区域。函数的返回值为该区域的首地址。

3:释放内存空间函数free.调用形式
free(void *ptr);
释放ptr所指向的一块内存区域,ptr是一个任意类型的指针变量,他指向被释放区域的首地址。被释放区域应是由malloc或calloc函数所分配的区域。

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    用c编写通讯录的输入输出

    通讯录的输入输出 通讯录的输入输出 通讯录的输入输出 通讯录的输入输出 通讯录的输入输出

    032 通讯录的输入输出 C语言

    032 通讯录的输入输出 C语言

    java树形结构加文件输入输出流实现的日记本和通讯录

    是带有界面的日记本,利用属性结构和文件的输入输出流实现的,对于刚学习java的同志们有很大帮助的哦,而且比较实用的,绝对路径保存,在工程文件夹下就可以找到你保存的文件,QQ:389020106,喜欢的朋友加QQ哦

    c++通讯录管理系统

    通讯录管理: (1) 可以实现的功能: * 建立通讯录 * 插入通讯录 * 通讯录进行查询 * 通讯录删除 * 输出通讯录 * 退出管理系统 (2)通讯录中保存的信息 * 编号* 姓名* 性别* 电话* 地址 ...

    c++多态实现通讯录 通讯录管理程序

    通讯录管理程序。...可以输入通讯录、可以输出通讯录、可以查找、修改。其中的通讯录条目可以是一般条目,也可以是朋友条目。 要求: 1.输入通讯录 2.输出通讯录 3.查找姓名 4.修改(输入姓名,修改其电话) 0.退出

    通讯录

    简单通讯录代码

    实验1:通讯录管理程序

    实验1:通讯录管理程序 利用数据结构和C语言技术设计通讯录管理程序

    简单通讯录程序:编程实现简单通讯录程序。

    简单通讯录程序:编程实现简单通讯录程序。通讯者的基本信息包括编号、姓名、性别、年龄、宅电、手机电话等信息。...(6)文件的导入和导出(从文件中读取若干条通讯录,或者将通讯录输出到文件中)。

    通讯录JAVA程序设计实验报告

    程序使用了ObjectInPutStream和ObjectOutPutStream这两个文件输入输出流,利用这两个文件输入输出流,可以方便的直接将通讯记录对象直接写入文件中,另外为了方便添加和删除一条记录还使用了系统的对象数组类...

    简单的好友通讯录管理程序

    保存已有好友通讯录信息,并通过字符串提示用户对好友通讯录信息进行增删改查等操作,输入数字1进行好友好友添加,输入数字2删除好友,3和4分别进行好友信息修改和查询,接着根据用户选择的处理方式来进行针对性的...

    通讯录的制作(数据结构c语言 代码+报告)

    思路:先初始化创建双链表,创建头结点来辅助双链表的插入操作,再运用c程序设计中输入输出语句,达到输入信息的功能 (4)对通讯录信息的输出显示功能的实现: 思路:简单运用c程序设计中的输入scanf函数、输出printf...

    java编写的通讯录

    摘 要 -- 第1章 绪 论 1 第2章 系统功能介绍 2 2.1系统功能总框图 2 2.1.1 系统总体功能介绍 2 2.1.2 系统总体功能模块图 3 2.3 组内任务分工 4 第3章 系统功能实现 5 3.1 用户登录功能实现 5 3.1.1用户登录模块功能...

    数据结构上机实例 通讯录管理 C语言

     实现功能:用带头结点的单链表作存储结构,实现通讯录单链表的建立、通讯者的插入、删除、查询以及通讯录链表的输出功能。  实验机时:6  设计要求: 为了实现通讯录管理的操作功能,首先设计一个含有多个...

    C#结合数据库开发的通讯录管理系统

    C#结合SQL Server数据库开发的通讯录管理系统 (winform),具体效果请看:https://blog.csdn.net/xch_yang/article/details/51355486

    C语言课程设计-学生通讯录管理系统.cpp

    本学生通讯录管理系统实现数据的输入、输出、添加加、删除、查询、保存功能。程序的基本功能为: ① 添加学生信息:添加的信息包括学号、姓名、年龄、电话、地址、邮箱。 ② 显示学生信息:输出显示已添加的学生...

    个人通讯录管理系统C语言版(源码+报告)

    大一时做的课程设计,基于链表的个人通讯录管理系统(C语言版),压缩包内包含源代码和报告,代码量大概1000多行,能实现基本的增删改查,支持文件写入和输出,界面非常美观。 个人通讯录管理系统:建立一通讯录,...

    C语言课程设计同学通讯录

    C语言课程设计,通讯录,增删查改,文件保存输入输出(功能只有模板,可自行增加额外功能)

    通讯录(有设计详细说明)

    本通讯录是一款具有基本通讯信息管理功能的系统。包括基本添加,修改,删除,查询和输出等功能。其中联系组是为了更好地管理联系人信息,如常用的组有亲戚,家人,朋友,同学等。 1、 组信息管理模块: ◎ 添加新组...

    C语言 课程设计电子通讯录

    设计一个学生电子通讯录,可以进行添加、删除、查找、排序(按学号或按姓名)和列表输出的完整程序。每个学生的信息包括: 学号 姓名 性别 出生日期 宿舍 电话 Email 可以使用结构体存取每个学生的信息,多个学生的...

    通讯录管理系统(c 链表)

    4. 删除联系人的信息,输入一个姓名,若通讯录中有该联系人的信息,则删除该联系人,否则输出提示信息,并提示用户选择是否继续进行删除操作。 5. 修改联系人的信息,输入一个姓名,根据具体需要修改该联系人的某一...

Global site tag (gtag.js) - Google Analytics