动态通讯录

SAP采购信息记录批量维护实战:用BAPI ME_INFORECORD_MAINTAIN搞定价格等级和条件记录 本文深入解析SAP标准BAPI ME_INFORECORD_MAINTAIN在采购信息记录批量维护中的应用,特别聚焦价格等级和条件记录的技术难点。通过实战案例和代码示例,帮助用户高效处理供应商-物料价格数据,提升供应链管理效率。 阅读详情
#ifndef _CONTACT_H_
#define _CONTACT_H_

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

#pragma warning(disable:4996)

#define NAME_SIZE 64
#define TEL_SIZE  16
#define ADDR_SIZE 128
#define LIST_DEFAULT 1
#define INC_SIZE 2

#define CT_FILE "contact.bin"

typedef struct person{
	char name[NAME_SIZE];
	char sex;
	unsigned char age;
	char telphone[TEL_SIZE];
	char address[ADDR_SIZE];
}person_t, *person_p, **person_pp;

typedef struct contact{
	int cap;
	int size;
	person_t list[0];
}contact_t, *contact_p, **contact_pp;


//Init
void InitContact(contact_pp _ctpp);
//Add
void AddPerson(contact_pp ct);

//Del
//Mod
//Search
//Sort
void Sort(contact_p ct);

//Clear
//Show
void Show(contact_p ct);
void Save(contact_p ct);
int Load(contact_pp _ctpp);
#endif

#include "contact.h"

//yes->1,no->0
static int IsFull(contact_p ct)
{
	return ct->size == ct->cap ? 1 : 0;
}
//yes->1, no->0
static int Inc(contact_pp _ctpp)
{
	int new_size = sizeof(contact_t)+((*_ctpp)->cap+INC_SIZE)*sizeof(person_t);
	contact_p p = realloc(*_ctpp, new_size);
	if (!p){
		printf("Inc error!\n");
		return 0;
	}
	p->cap = (*_ctpp)->cap + INC_SIZE;
	*_ctpp = p;
	printf("debug: Inc Contact Sucess!\n");
	return 1;
}
int InitContactFile(contact_pp _ctpp, FILE *fp)
{
	contact_p ct_p = (contact_p)malloc(sizeof(contact_t));
	if (ct_p){
		fread(ct_p, sizeof(contact_t), 1, fp);
		int _cap = ct_p->cap;
		int size = sizeof(contact_t)+ct_p->cap*sizeof(person_t);
		contact_p p = (contact_p)realloc(ct_p, size);
		if (p){
			ct_p = p;
			fread(ct_p->list, ct_p->cap*sizeof(person_t), 1, fp);
			*_ctpp = ct_p;
			return 1;
		}
		else{
			return 0;
		}
	}
	else{
		return 0;
	}
}
void InitContactDefault(contact_pp _ctpp)
{
	//void Load();
	*_ctpp = malloc(sizeof(contact_t)+sizeof(person_t)*LIST_DEFAULT);
	if (NULL == *_ctpp){
		printf("%s: %d\n", strerror(errno), errno);
		exit(1);
	}
	(*_ctpp)->cap = LIST_DEFAULT;
	(*_ctpp)->size = 0;
	printf("debug: Init Contact Sucess!\n");
}
int Load(contact_pp _ctpp)
{
	FILE *fp = fopen(CT_FILE, "rb");
	if (NULL == fp){
		printf("Init Contact Default!\n");
		InitContactDefault(_ctpp);
		return 1;
	}
	int ret = InitContactFile(_ctpp, fp);
	fclose(fp);
	return ret;
}
void Show(contact_p ct)
{
	int top = ct->size;
	int i = 0;
	person_p p = ct->list;
	for (; i < top; i++){
		//姓名、性别、年龄、电话、住址
		printf("|%-6s|%-2c|%-3d|%-12s|%-16s|\n",\
			p[i].name, p[i].sex,p[i].age, p[i].telphone,p[i].address);
	}
}
static int person_cmp(const void *x, const void *y)
{
	person_p _x = (person_p)x;
	person_p _y = (person_p)y;
	return strcmp(_x->name, _y->name);
}
void Sort(contact_p ct)
{
	person_p p = ct->list;
	qsort(p, ct->size, sizeof(person_t), person_cmp);
}

void AddPerson(contact_pp ct)
{
	if (!IsFull(*ct) || Inc(ct)){
		person_p p = &((*ct)->list[(*ct)->size]);
		printf("Please Enter Name: ");
		scanf("%s", p->name);
		printf("Please Enter Sex: ");
		scanf(" %c", &(p->sex));
		printf("Please Enter Age: ");
		scanf(" %u", &(p->age));
		printf("Please Enter Tel: ");
		scanf(" %s", p->telphone);
		printf("Please Enter Addr: ");
		scanf(" %s", p->address);
		((*ct)->size)++;
	}
	else{
		printf("realloc error!\n");
		return;
	}
}

void Save(contact_p ct)
{
	FILE *fp = fopen(CT_FILE, "wb");
	if (NULL == fp){
		printf("fopen error!\n");
		return;
	}
	int size = sizeof(contact_t)+ct->cap * sizeof(person_t);
	fwrite(ct, size, 1, fp);
	fclose(fp);
}
#include "contact.h"

void Menu()
{
	printf("#####################################\n");
	printf("# 1. Show      2. Add      3. Del   #\n");
	printf("# 4. Mod       5. Search   6. Sort  #\n");
	printf("# 7. Clear     8. Save     9. Exit  #\n");
	printf("#####################################\n");
	printf("Please Select: ");
}
int main()
{
	volatile int quit = 0;
	int select = 0;
	contact_p ct;
	Load(&ct);
	while (!quit){
		Menu();
		scanf("%d", &select);
		switch (select){
		case 1:
			Show(ct);
			break;
		case 2:
			AddPerson(&ct);
			break;
		case 3:
			break;
		case 4:
			break;
		case 5:
			break;
		case 6:
			Sort(ct);
			break;
		case 7:
			break;
		case 8:
			break;
		case 9:
			Save(ct);
			quit = 1;
			break;
		default:
			break;
		}
	}
	system("pause");
	return 0;
}

 

从DCI-P3到sRGB:跨媒体色彩转换的矩阵奥秘与实践 本文深入解析从DCI-P3到sRGB的色彩空间转换技术,揭示矩阵运算的核心原理与实践技巧。通过实战案例展示如何正确处理白点差异、伽马曲线转换等关键环节,帮助影视从业者解决跨媒体色彩匹配问题,确保作品在不同设备上呈现一致的视觉效果。 阅读详情

相关推荐

构建多节点AI代理网络:OpenClaw协同框架与实战部署指南

在分布式系统与AI代理技术领域,多节点协同是提升智能体能力与扩展性的核心挑战。其原理在于通过设计清晰的通信协议与数据同步机制,使分散的智能体能够共享状态、知识与技能,从而实现1+1>2的群体智能。这一技术价值在于突破了单点AI的能力上限,为构建复杂、鲁棒且可扩展的自动化系统提供了基础。典型的应用场景包括跨设备任务编排、企业级工作流自动化以及大规模AI代理集群的管理。本文聚焦于OpenClaw这一开源AI代理框架,深入探讨如何利用模块化设计(如网状网络与任务控制中心)实现记忆共享与统一调度,解决多网关协同中的

weixin_42521032的博客 298

利用c语言实现通讯录功能

模拟实现通讯录的功能,主要功能包括增加联系人信息、删除联系人信息、修改联系人信息、查找联系人、对现有联系人排序、清空联系人和显示所有联系人信息这七大功能块。 需利用结构体嵌套的思想去定义通讯录的结构,将联系人的信息包括姓名、街道、城市、邮编、国家等保存在一个自定义结构体类型,在将自定义的联系人信息类型嵌套使用在自定义通讯录结构体类型中实现多个联系,为合理使用通讯录的存储空间...

qq_44370562的博客 2049

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

改良通讯录——动态通讯录

上一篇博客中的通讯录为静态通讯录,直接就创建了1000个空间,占内存。有时候,我们不需要这么多,那么就会浪费大量空间;有时候,我们需要大量空间(超过1000个)这样不能更好的满足我们。学习了动态内存知识点后,根据其将空间能够合理利用,创造出一个更好的通讯录。——前言 一。区别 静态通讯录 可以存放1000个人的信息 动态通讯录 默认可以存放3个人的信息 当发现当前通讯录满的时候,我们进行扩容,每次...

sakeww的博客 1062

openEuler 欧拉 安装Oracle19c数据库RPM包安装

欧拉系统安装部署oracle 19c rpm方式

陈苏漾的IT生涯 6893

【UML】第12篇 序列图(1/2)——基本概念和构成

序列图(Sequence Diagram)是一种用于显示对象之间交互的图形化表示。它描述了在特定场景下,对象之间按照时间顺序进行的消息传递和协作过程。在序列图中,对象被表示为带有垂直虚线的矩形,虚线表示对象的生命周期。对象之间的交互通过箭头表示的消息来表示,箭头从一个对象的生命线指向另一个对象的生命线,表示消息的发送和接收。

AI人人懂 3045

云原生——动态通讯录

云原生——动态通讯录

buhuisuanfa的博客 1798

GameFramework教程✨六、怎样加载一个3D UI

怎样加载一个3D UI

星河造梦坊 1583

C通讯录<动态版>

目录 1、动态版需求 2、不同于静态版之处 (1)创建通讯录 (2)初始化通讯录 (3)增加联系人信息 (4)退出通讯录 3、完整代码 (1)test.c 文件 (2)contact.h 文件 (3)contact.c 文件 1、动态版需求 假设通讯录初始化后,能存放3个人的信息 当我们空间存放满的时候,我们增加2个信息 以此类推每次不够就增加2个,例如3+2+2+2+…… 2、不同于静态版之处 (1)创建通讯录 ...

bit_zyx的博客 2621

[Dify实战] 在 Dify 官网环境使用 File Translator 插件实现 Office 文档翻译(支持 DOCX/XLSX/PPTX)

摘要:Dify平台的FileTranslator插件可实现Office文档一键翻译,保留原格式和结构。该插件支持Word、Excel、PPT等文件格式,无需额外密钥,直接复用Dify配置的大模型。安装后,用户可在Workflow中调用插件,设置目标语言等参数完成翻译。输出文件自动命名,保留原格式。适用于跨国协作、海外营销等场景,显著提升多语言办公效率。该插件简化了文档翻译流程,是企业用户和开发者的实用工具。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 544

QT C++ AI棉花智能变量灌溉工上位机(信创完整版)

北斗履带灌溉机器人/田间分区电磁阀基站 → 多层土壤温湿度/盐分EC传感器实时采集墒情 → 双目AI视觉扫描棉田长势、病苗分布 → AI融合**生育期+土壤墒情+盐分+棉株长势**计算变量灌溉定额、水肥配比、灌溉时长 → 分区电磁阀/变频水泵变量供水,病弱苗地块减量、干旱地块增量;墒情、盐分、长势多因子闭环修正灌水量;多层土壤含水率(0–10/20–40/40–80cm)、土壤EC盐分、土壤温度、空气温湿度、蒸发量、北斗地块坐标、管道水压、水肥罐液位、分区流量计、水泵电机负载、滴灌带压力反馈。

寒寒豆豆软件公司的博客 184

动态通讯录(并不难都能拿下)

铁子们好啊!今天咱们来整一个有意思的玩意——通讯录,相信大家对通讯录并不陌生,那接下来就跟着阿辉把它拿捏了😉。

m0_75108739的博客 2694

微信小程序报错:“errno“:600001,“errMsg“:“uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::

uploadFile:fail errcode:-105 cronet_error_code:-105 error_msg:net::ERR_NAME_NOT_RESOLVED,uniApp微信小程序使用uni.uploadFile出现报错,微信小程序如何解决wx.uploadFile报错,如何解决这个问题,微信小程序真机报错,微信小程序报错"errno":600001,"errMsg":"uploadFile:fail errcode:-105 cronet_error_code:-105 error_m

✅ 精选推荐文章 3826

通讯录(动态版)

动态版通讯录实现

xiaoHu_C的博客 868

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动态通讯录——C语言【详解+全部码源】

动态通讯录——C语言【详解+全部码源】

2201_75366661的博客 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

C语言实现通讯录(动态版)

前言: 目录 一.动态通讯录和静态通讯录的区别 二.动态通讯录接口函数实现 动态通讯录基本结构 1.初始化 2.增容 3.打印成员 4.删除成员 5.增加成员 6.查找成员信息 7.查找成员是否存在 8.修改成员信息 9.按名字排序通讯录成员 10.按年龄排序通讯录成员 11.释放通讯录 三.源码 Contact.c Contact.h test.c 一.动态通讯录和静态通讯录的区别 二.动态通讯录接口函数实现 文件名 功能 Contact.c

chuxinchangcun的博客 3424

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

动态版本通讯录的设计

动态版本的通讯录实现,涉及到realloc,calloc,free函数的使用,最终实现一个更加符合实际,可以随着联系人的增加而自动扩容的通讯录,是之前静态版本通讯录的进化版本!

暴躁小吕的博客 991

静态通讯录&&动态通讯录制作详解

C语言通讯录静态版,动态版,保存通讯录到文件,最全通讯录详解

lmbuhuiku的博客 1019

动态的通讯录

本章我们一起学习了如何将静态通讯录改造为动态通讯录,希望对大家认识动态通讯录由些许帮助!🎠🎠🎠。

m0_74288306的博客 1924

【C语言】动态内存管理基础知识——动态通讯录,如何实现通讯录容量的动态化

动态内存管理的函数有:malloc,calloc,ralloc,free,本文讲解动态内存函数和使用,如何进行动态内存管理,实现通讯录联系人容量的动态化,对常见动态内存错误进行总结。

2302_79491024的博客 6976

C语言—《动态版通讯录》

C语言—《动态版通讯录》

m0_59292239的博客 872

通讯录(动态版本)!

在上篇文章,讲了一下用C语言实现通讯录的静态版本,那么这篇文章主要讲一下怎样在它的静态版本的基础上,改成动态版本。 静态版本:通讯录(静态版本)!_m0_52066789的博客-优快云博客 1. 更改 在静态版本的通讯录中,我们在表示通讯录的结构体中,直接定义了一个结构体数组,并直接写死了它的元素个数 — 1000 个,这样就使通讯录的联系人总数也给写死了。最大只能存放1000个联系人,如果不够1000个,那么其他的空间也就会浪费掉。 所以在动态版本中,我们使用动态内存开辟来给定通讯录的大小,.

m0_52066789的博客 957

通讯录进阶——动态通讯录

通讯录进阶——动态通讯录 今天我们将来实现一下基于我之前博客里的通讯录的进阶,将静态版本升级为动态版本 (建议阅读本篇博客的读者阅读我的之前博客:动态内存管理—知识点小集结)和通讯录——静态版本 ...

weixin_51306225的博客 1230

通讯录进阶,支持动态内存与数据存储的通讯录

支持动态内存与数据存储的通讯录

Yui_的博客 3478

静态&动态&文件通讯录

通讯录是我们生活中比较常用的手机功能,本篇博客主要介绍三个版本通讯录的实现。这些通讯录具有增删查改的功能,以及自己增加的另外的一些功能。

joy.728的博客 1488

动态存储通讯录

在上一篇文章中,介绍了静态存储通讯录的方式,考虑到它在实际运用中存在的问题,接下来就在原有的基础上进行改造。 首先,我们思考,当我们想要动态进行存储时,那么我们就得动态开辟空间,既然是可以变化的空间,那么我们就得有一个判断有效元素个数与空间容量的比较,当有效元素个数达到空间容量时,就得进行扩容操作。 静态时通讯录结构体为 typedef struct Contact { Peoinfo data[MAX]; int sz; }Contact; 基于以上分析,需加入一个新的变量来记录空间容量大小

chen_hard的博客 3093
上一篇: java 输入一个整数求各个位上的和
下一篇: java 配置环境方法
王翔乐
博客等级 码龄8年 6粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值