当前位置: 首页 > news >正文

模仿建设网站是侵权吗正规seo大概多少钱

模仿建设网站是侵权吗,正规seo大概多少钱,网络设计案例题,免费注册一个网站文章目录前言:一.动态管理思想1.通讯录结构体声明发生变化2.通讯录结构体初始化发生变化3.通讯录能够动态增容4.通讯录销毁数据二.优化通讯录可持续读写信息1.保存通讯录中的信息到文件中2.加载文件信息到通讯录中三.源码1.text.c2.contact.c3.contact.h前言&#x…

文章目录

  • 前言:
  • 一.动态管理思想
    • 1.通讯录结构体声明发生变化
    • 2.通讯录结构体初始化发生变化
    • 3.通讯录能够动态增容
    • 4.通讯录销毁数据
  • 二.优化通讯录可持续读写信息
    • 1.保存通讯录中的信息到文件中
    • 2.加载文件信息到通讯录中
  • 三.源码
    • 1.text.c
    • 2.contact.c
    • 3.contact.h

前言:

1.0版本–>静态通讯录

  • 在上一个静态版本中,我们在使用的时候会发现有诸多不便,比如通讯录可以存放的信息总量是固定不变的,比如当我们打开通讯录写入数据后,保存再打开时上一次写入的数据消失不见了,本篇将详细讲解如何使用动态内存管理和文件操作解决这两个问题:

一.动态管理思想

1.通讯录结构体声明发生变化

  • 首先,在静态通讯录中,结构体的大小是固定好的,比如有20个空间,我们就没法存放30个人的信息,但是只存放3个人的信息那又太浪费了。
  • 所以,我们让通讯录结构体一开始只有3个空间,满了后就增容2个空间,这样可以提高空间利用率,需要用到动态内存管理:

原来1.0静态版本:


#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 10
#define ADDRESS_MAX 30
#define TELEPHONE_MAX 12//定义一个结构体类型,这里存放人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char address[ADDRESS_MAX];char telephone[TELEPHONE_MAX];
}PeoInfo;
//所有人的都放到这里
typedef struct Contact
{PeoInfo data[MAX];int size;
}Contact;

现在2.0动态版本:

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12#define DEFAULT_SZ 3
#define INC_SZ 2//人的信息
typedef struct PeoInfo
{char name[NAME_MAX];  //姓名int age;              //年龄char sex[SEX_MAX];    //性别char addr[ADDR_MAX];  //住址char tele[TELE_MAX];  //电话号码
}PeoInfo;typedef struct Contact
{PeoInfo* data; //指向存放人的信息的空间int sz;        //当前已经放的信息的个数int capacity;  //当前通讯录的最大容量
}Contact;

解析:原来的data[MAX]数组存放信息,其大小MAX是固定的,现在通讯录随时会增容,故要改为指针指向每个人的信息,sz值随着通讯录中的人数动态增长:
在这里插入图片描述

2.通讯录结构体初始化发生变化

为每个结构体动态分配内存空间

//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SIZE, sizeof(PeoInfo));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;pc->size = 0;pc->capacity = DEFAULT_SIZE;
}

3.通讯录能够动态增容

对静态通讯录来说,满了就不能继续添加了。
我们为解决这一问题,给动态通讯录封装一个增容函数,以实现动态扩容:

//检查当前通讯录的容量:
//sz满了才增加容量,不满就没必要增加
void check_capacity(Contact* pc)
{if (pc->sz == pc->capacity){//增加容量PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");return;}pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}
}

解析:只有当sz(即当前存在通信录中的人数)等于当前最大容量capaciity,即存满了的时候,才扩容,我们定义INC_SZ为每次再增加多少容量

4.通讯录销毁数据

由于现在的内存空间都是动态分配的,所以数据也都在堆区上,那么每次关闭通讯录的时候都要释放内存,也就是销毁通讯录,以防止内存泄漏:

//销毁通讯录
void DestoryContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->size = 0;pc = NULL;
}

二.优化通讯录可持续读写信息

前面提到,静态版本中,当我们打开通讯录写入数据后,保存再打开时上一次写入的数据消失不见了,为解决这个问题,我们将每次输入到通讯录的信息保存的文件里,这样再打开程序的时候上次的数据仍然存在:

1.保存通讯录中的信息到文件中

//保存通讯录中的信息到文件中
void SaveContact(Contact* pc)
{//写数据//1, 打开文件FILE* pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{//写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}
}

2.加载文件信息到通讯录中

再次打开通讯录需要从文件中读数据:

//加载文件信息到通讯录
void LoadContact(Contact* pc)
{//读数据//1. 打开文件FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("LoadContact");}else{//2. 读数据PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){//需不需要增容check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}
}

三.源码

1.text.c

#define _CRT_SECURE_NO_WARNINGS 1#include "contatc.h"void menu()
{printf("********************\n");printf("****1.add     2.del****\n");printf("****3.search  4.modify****\n");printf("****5.show    6.sort****\n");printf("****0.exit      ****\n");printf("********************\n");
}
enum Option
{EXIT,//0ADD, //1DEL, //2SEARCH,MODIFY,SHOW,SORT
};
int main()
{int input = 0;Contact con;InitContact(&con);do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case SORT:ShowContact(&con);break;case EXIT:SaveContact(&con);DestroyContact(&con);printf("推出通讯录\n");break;default:printf("选择错误\n");break;}} while (input);return 0;
}

2.contact.c

#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;PeoInfo* ptr = (PeoInfo*)calloc(DEFAULT_SZ, sizeof(PeoInfo));if (ptr == NULL){perror("InitContact::calloc");return;}pc->data = ptr;pc->capacity = DEFAULT_SZ;//加载文件信息到通讯录LoadContact(pc);
}//销毁通讯录
void DestroyContact(Contact* pc)
{free(pc->data);pc->data = NULL;pc->capacity = 0;pc->sz = 0;pc = NULL;
}//检查当前通讯录的容量
void check_capacity(Contact* pc)
{if (pc->sz == pc->capacity){//增加容量PeoInfo* ptr = (PeoInfo*)realloc(pc->data, (pc->capacity + INC_SZ) * sizeof(PeoInfo));if (ptr == NULL){perror("check_capacity::realloc");return;}pc->data = ptr;pc->capacity += INC_SZ;printf("增容成功\n");}
}//增加联系人
void AddContact(Contact* pc)
{assert(pc);check_capacity(pc);//增加一个人的信息printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s", pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;
}//显示通讯录中的信息
void ShowContact(const Contact* pc)
{assert(pc);int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}
}//根据名字查找信息
int FindByName(const Contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}//删除指定联系人
void DelContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (-1 == ret){printf("要删除的人不存在\n");return;}int i = 0;//删除for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}//查找指定联系人
void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要查找的人不存在\n");return;}//打印信息printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name,pc->data[pos].age,pc->data[pos].sex,pc->data[pos].addr,pc->data[pos].tele);
}//修改指定联系人
void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要修改人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要修改的人不存在\n");return;}printf("请输入名字:>");scanf("%s", pc->data[pos].name);printf("请输入年龄:>");scanf("%d", &(pc->data[pos].age));printf("请输入性别:>");scanf("%s", pc->data[pos].sex);printf("请输入地址:>");scanf("%s", pc->data[pos].addr);printf("请输入电话:>");scanf("%s", pc->data[pos].tele);printf("修改完成\n");
}//保存通讯录中的信息到文件中
void SaveContact(Contact* pc)
{//写数据//1, 打开文件FILE* pf = fopen("contact.txt", "wb");if (NULL == pf){perror("SaveContact");}else{//写数据int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data + i, sizeof(PeoInfo), 1, pf);}fclose(pf);pf = NULL;printf("保存成功\n");}
}//加载文件信息到通讯录
void LoadContact(Contact* pc)
{//读数据//1. 打开文件FILE* pf = fopen("contact.txt", "rb");if (pf == NULL){perror("LoadContact");}else{//2. 读数据PeoInfo tmp = { 0 };int i = 0;while (fread(&tmp, sizeof(PeoInfo), 1, pf)){//增容check_capacity(pc);pc->data[i] = tmp;pc->sz++;i++;}fclose(pf);pf = NULL;}
}

3.contact.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12#define DEFAULT_SZ 3
#define INC_SZ 2//人的信息
typedef struct PeoInfo
{char name[NAME_MAX];  //姓名int age;              //年龄char sex[SEX_MAX];    //性别char addr[ADDR_MAX];  //住址char tele[TELE_MAX];  //电话号码
}PeoInfo;typedef struct Contact
{PeoInfo* data; //指向存放人的信息的空间int sz;        //当前已经放的信息的个数int capacity;  //当前通讯录的最大容量
}Contact;//初始化通讯录
void InitContact(Contact* pc);//销毁通讯录
void DestroyContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//删除指定联系人
void DelContact(Contact* pc);//显示通讯录中的信息
void ShowContact(const Contact* pc);//查找指定联系人
void SearchContact(const Contact* pc);//修改指定联系人
void ModifyContact(Contact* pc);//保存通讯录中的信息到文件中
void SaveContact(Contact* pc);//加载文件信息到通讯录
void LoadContact(Contact* pc);

本篇到此结束,码文不易,还请多多支持哦!!

http://www.ritt.cn/news/13694.html

相关文章:

  • 网站搭建服务器配置搜索引擎优化论文3000字
  • 水磨沟区做网站的特大新闻凌晨刚刚发生
  • 谷歌翻译做多语言网站全媒体广告策划营销
  • 信管女生做网站开发seo推广怎么样
  • 怎么看公司网站做的好不好哦怎么免费建个人网站
  • 中国人做代购的网站舆情分析系统
  • ecshop做的网站酒泉网站seo
  • 浙江做铁塔的公司网站百度指数的特点
  • 商城网站建设怀柔网站整站优化公司
  • 网站互点可以自己点么手机最新产品新闻
  • 公司网站不续费百度手机端推广
  • 企业vi设计的几大特点seo的主要分析工具
  • 大学生app开发经费预算优化大师win7官方免费下载
  • 煤炭网站建设企业网页生成器
  • 网站开发主要学些什么百度一下首页登录入口
  • 西宁那有做网站的南京seo报价
  • 湖北网站建设公司排名seo推广系统
  • 响应式网站制作方法推广引流吸引人的文案
  • 做公司网站的企业网络推广有效果吗
  • 大庆建设网站seo诊断书案例
  • 谷歌seo网站排名优化2022今天刚刚发生地震了
  • 胶南做网站在线刷seo
  • 网站开发工程师 英文发广告平台有哪些
  • 深圳公司网站开发nba最新交易消息
  • 网站的特点seo软件视频教程
  • 绍兴越城区建设局网站性价比高的seo网站优化
  • wordpress 自动剪裁郑州seo排名工具
  • 学做面包的网站百度关键词seo公司
  • 农业建设信息网站seo引擎优化外包
  • 高效网站推广设计线上推广平台有哪些