C语言宠物系统

       功能有增加宠物信息,显示宠物信息,删除宠物信息,修改功能和排序功能,可以选择姓名排序,年龄排序,价格排序。进阶的功能有文件操作,动态内存开辟。。

test.c源文件

#include "Pet.h"void menu()
{printf("------------------------\n");printf("-   欢迎来到宠物商店   -\n");printf("-              1.add   -\n");printf("-             2.show   -\n");printf("-             3.del    -\n");printf("-           4.modify   -\n");printf("-           5.sort     -\n");printf("-   欢迎来到宠物商店   -\n");printf("------------------------\n");}int main()
{printf("hello world\n");init(&shop);load(&shop);int input = 0;do{menu();scanf("%d", &input);switch (input){case 1:add(&shop);break;case 2:show(&shop);break;case 3:del(&shop);break;case 4:modify(&shop);break;case 5:sort(&shop);break;case 0:Save(&shop);Destroy(&shop);printf("退出程序\n");break;default:printf("你的输入不对,请重新输入\n");break;}} while (input);return 0;
}

Pet.c源文件

#include "Pet.h"int ssearch(struct Shop* pc, char* name);void init(struct Shop* pc)
{pc->data= (struct Pet*)malloc(init_value * (sizeof(struct Pet)));if (pc->data == NULL){perror("malloc");return;}pc->sz = 0;pc->capcity = init_value;
}int check(struct Shop* pc)
{if (pc->sz == pc->capcity){struct Pet* ptr = realloc(pc->data, (init_value + cre_value) * sizeof(struct Pet));if (ptr == NULL){perror("realloc");return 0;}pc->data = ptr;pc->capcity += cre_value;printf("增容成功\n");return 1;}return 1;
}void add(struct Shop* pc)
{int ret = check(pc);if (ret == 0){return;}printf("请输入名字:>\n");char name[20];scanf("%s", name);//scanf("%s", pc->data[pc->sz].name);	int pos = ssearch(pc, name);if (pos != -1){printf("该宠物名字已存在,不能重名\n");return;}strcpy(pc->data[pc->sz].name, name);printf("请输入年龄:>\n");scanf("%d", &(pc->data[pc->sz].age));printf("请输入价格:>\n");scanf("%f", &(pc->data[pc->sz].price));printf("请输入性别:>\n");scanf("%s", pc->data[pc->sz].sex);printf("增加宠物成功\n");pc->sz++;
}void show(struct Shop* pc)
{int i = 0;printf("%-10s %-10s %-10s %-10s", "姓名", "年龄", "价格", "性别");printf("\n");for (i = 0; i < pc->sz; i++){printf("%-10s %-10d %-10.2f %-10s\n", pc->data[i].name,pc->data[i].age,pc->data[i].price,pc->data[i].sex);}
}void Save(struct Shop* pc)
{FILE* pf = fopen("test.txt", "wb");if (pf == NULL){perror("Save");return;}int i = 0;for (i = 0; i < pc->sz; i++){fwrite(pc->data+i, sizeof(struct Pet), 1, pf);//}//free(pf);  写错了,怪不得加上这个,文件里啥都没有 ,errfclose(pf);pf = NULL;
}void Destroy(struct Shop* pc)
{free(pc->data);pc->data = NULL;pc->capcity = 0;pc->sz = 0;
}void load(struct Shop* pc)
{FILE* pf = fopen("test.txt", "rb");if (pf == NULL){perror("load");return;}struct Pet tmp = {0};while (fread(&tmp, sizeof(struct Pet), 1, pf)>=1){if (check(pc) == 0){return;}pc->data[pc->sz] = tmp;pc->sz++;}if (feof(pf)){printf("end of file reach successfully\n");}else if (ferror(pf)){printf("i/o error when read\n");}fclose(pf);pf = NULL;
}int ssearch(struct Shop* pc,char* name)
{int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(name, pc->data[i].name) == 0){return i;}}return -1;
}void del(struct Shop* pc)
{if (pc->sz == 0){printf("没有宠物可删除\n");return;}printf("请输入要删除的名字:>\n");char name[20];scanf("%s", name);int ret = ssearch(pc,name);if (ret == -1){printf("没找到\n");return;}printf("找到了,是%s %d %f %s", pc->data[ret].name, pc->data[ret].age, pc->data[ret].price, pc->data[ret].sex);printf("\n");int i = 0;for (i = ret; i < pc->sz-1; i++)//i等于ret,小于最后一个下标{//pc->data[ret] = pc->data[ret + 1]; err//pc->data[i] = pc->data[i + 1];第一种方法memmove(&(pc->data[i]), &(pc->data[i + 1]), sizeof(struct Pet));//目的地,源头,要复制的字节数}	printf("删除成功\n");pc->sz--;
}void modify(struct Shop* pc)
{printf("请输入你要查找修改的名字:>\n");char name[20];scanf("%s", name);int m = ssearch(pc, name);if (m == -1){printf("没找到要修改的名字\n");return;}printf("找到了,是%s %d %f %s", pc->data[m].name, pc->data[m].age, pc->data[m].price, pc->data[m].sex);printf("\n");printf("请输入修改后的名字:>\n");scanf("%s", name);int m1 = ssearch(pc, name);if (m1 != -1){printf("该宠物名字已存在,不能重名\n");return;}strcpy(pc->data[m].name, name);printf("请输入修改后的年龄:>\n");scanf("%d", &(pc->data[m].age));printf("请输入修改后的价格:>\n");scanf("%f", &(pc->data[m].price));printf("请输入修改后的性别:>\n");scanf("%s", pc->data[m].sex);
}int cmp1(const void* p1, const void* p2)//按姓名
{return strcmp(((struct Pet*)p1)->name, ((struct Pet*)p2)->name);
}
int cmp2(const void* p1, const void* p2)//按年龄
{return ((struct Pet*)p1)->age - ((struct Pet*)p2)->age;
}
int cmp3(const void* p1, const void* p2)//按价格
{if (((struct Pet*)p1)->price - ((struct Pet*)p2)->price > 0)return 1;if (((struct Pet*)p1)->price - ((struct Pet*)p2)->price < 0)return -1;return 0;
}void sort(struct Shop* pc)
{int sort1 = 0;do{printf("按姓名排序:>1\n");printf("按年龄排序:>2\n");printf("按价格排序:>3\n");printf("退出:>0\n");scanf("%d", &sort1);if (sort1 == 1)qsort(pc->data, pc->sz, sizeof(struct Pet), cmp1);if (sort1 == 2)qsort(pc->data, pc->sz, sizeof(struct Pet), cmp2);if (sort1 == 3)qsort(pc->data, pc->sz, sizeof(struct Pet), cmp3);if(sort1!=3&&sort1!=2&&sort1!=1&&sort1!=0)printf("选择不对,请重新选择\n");} while (sort1);}

Pet.h头文件 

#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define init_value 3
#define cre_value 2
#define NAME 20
#define SEX 5struct Pet
{char name[NAME];int age;float price;char sex[SEX];
};struct Shop
{struct Pet* data;int sz;int capcity;
};struct Shop shop;void init(struct Shop* pc);void add(struct Shop*pc);void show(struct Shop* pc);void Save(struct Shop* pc);void Destroy(struct Shop* pc);void load(struct Shop* pc);void del(struct Shop* pc);void modify(struct Shop* pc);void sort(struct Shop* pc);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/395435.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器人帮助文档

文章目录 机器交流使用群使用图例1. 查看机器人使用文档2. 直接问问题&#xff08;系统默认AI&#xff09;3. 系统默认AI切换4. 直接问问题&#xff08;指定讯飞星火AI&#xff09;5. 直接问问题&#xff08;指定百度文心AI&#xff09;6. 直接问问题&#xff08;指定谷歌AI&am…

代码随想录算法训练营Day34 | 62.不同路径 | 63. 不同路径 II | 343.整数拆分 | 96.不同的二叉搜索树

今日任务 62.不同路径 题目链接&#xff1a; https://leetcode.cn/problems/unique-paths/description/题目描述&#xff1a; Code class Solution { public:int uniquePaths(int m, int n) {// vector<vector<int>> memo(m, vector<int>(n, -1));// fu…

从0开始的1panel搭配雷池社区版保护网站

1.安装1panel 使用默认安装地址&#xff1a;/opt [1Panel Log]: 外网地址: http://xxxxx:35628/dc54fe6a54 [1Panel Log]: 内网地址: http://10.0.4.3:35628/dc54fe6a54 [1Panel Log]: 面板用户: root [1Panel Log]: 面板密码: xxxxx 安装完成第一次登陆 安装openresty&…

【原创】springboot+mysql法律咨询网设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

初学51单片机1602液晶时序图实例分析

上篇博文笔者分享了关于液晶1602基本的工作流程&#xff0c;本篇主要是通过逻辑分析仪来看一下程序使能的电平时序&#xff0c;是否符合产品文档给出 的时序逻辑。 先看一下1602的时序图 认识下时序图中各个标识的含义&#xff1a; Tc信号周期&#xff08;E Cycle Time&#x…

【解压既玩】PS3模拟器v0.0.32+战神3+战神升天+各存档 整合包 ,完美不死机,没有BUG,旷世神作,强力推荐

战神3是圣莫尼卡公司的大作&#xff0c;PS3 上必玩的游戏之一。 本文收集了战神3和升天两作&#xff0c;附存档&#xff0c;完美不死机&#xff0c;没有BUG&#xff0c;强烈推荐。 解压即玩。 立即下载&#xff1a;【chumenx.com】【解压既玩】PS3模拟器v0.0.32战神3战神升天…

Docker数据管理,数据卷,容器服务器数据卷

一、容器的数据管理介绍 1.1 Docker容器分层 Docker镜像由多个只读层叠加而成&#xff0c;启动容器时&#xff0c;Docker会加载只读镜像层并在镜像栈顶部添加一个读写层。 如果运行中的容器修改了现有的一个已经存在的文件&#xff0c;那该文件将会从读写层下面的只读层复制到…

Redis相关面试题(二)

一、Bit中不同命令使用的场景 二、什么是缓存击穿&#xff0c;缓存穿透&#xff0c;缓存雪崩&#xff1f; 缓存击穿&#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问key&#xff0c;瞬间击穿服务器直接访问到数据库&#xff0c;使得数据库处于负载情况 缓存穿透…

mysql8.4.2数据库做主从复制

linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包-CSDN博客文章浏览阅读472次&#xff0c;点赞7次&#xff0c;收藏4次。linux rocky 9.2系统安装mysql-wsrep-8.4.2-26.20-linux-x86_64.tar.gz二进制包https://blog.csdn.net/xikui1551/article/de…

C++的深拷贝和浅拷贝

浅拷贝是一种简单的拷贝方式&#xff0c;仅仅是复制对象的基本类型成员和指针成员的值&#xff0c;而不复制指针所指向的内存。这可能会导致两个对象共享相同的资源&#xff0c;从而引发潜在的问题&#xff0c;如内存泄漏、意外修改共享资源等。一般来说编译器默认帮我们实现的…

Openwrt配置ZeroTier,实现公网访问内网中服务器

ZeroTier注册&Openwrt初始配置 首先来到Openwrt的VPN→ZeroTier页面&#xff0c;进行一个很简单的注册 注册后去zerotier的网页管理页面进行一个很简单的创建网络 复制网络ID备用 在openwrt填写网络ID并启用。如果你需要访问内网主机勾上 自动客户端NAT 在zerotier网络管理…

十一、vector 类

Ⅰ . vector 的介绍和使用 01 vector 的介绍 vector 的文档介绍&#xff1a;vector ① vector 是表示可变大小数组的序列容器&#xff0c;既像数组&#xff0c;又不像数组 像体现在&#xff1a;同样采用连续存储空间存储元素&#xff0c;可以使用下标访问元素 不像体现在&…

大模型笔记5 Extractive QA任务评估

目录 Extractive QA任务评估 Extractive QA评测指标 precision, recall, f1 ROUGE 划分训练与评估数据集 token位置评估 单个token位置评估 输入label的token位置 预测token位置 评估 Wandb 共享机器同时登录 样本类别平衡 标记token label时对窗口进行筛选 训练…

IT运维岗适用的6本证书

作为IT从业人员&#xff0c;不断提升自身的专业技能和知识是提升职场竞争力、助力升职加薪的重要途径。特别是在运维领域&#xff0c;虽然工作看似简单&#xff0c;但实际上需要掌握的技术知识却相当全面。为了全面提升自己的技术能力&#xff0c;并证明自己的专业能力&#xf…

2024 年 7 月区块链游戏研报:市场波动与数据分化的挑战与机遇

作者&#xff1a;Stella L (stellafootprint.network) 数据来源&#xff1a;Footprint Analytics 游戏研究页面 7 月份&#xff0c;加密货币市场波动显著&#xff0c;价格表现各异。比特币和 Solana 表现抢眼&#xff0c;与此同时&#xff0c;以太坊在美国市场推出现货以太坊…

Python酷库之旅-第三方库Pandas(073)

目录 一、用法精讲 296、pandas.Series.dt.as_unit方法 296-1、语法 296-2、参数 296-3、功能 296-4、返回值 296-5、说明 296-6、用法 296-6-1、数据准备 296-6-2、代码示例 296-6-3、结果输出 297、pandas.Series.dt.days属性 297-1、语法 297-2、参数 297-3、…

零售企业中 SRM 系统与开源 AI 智能名片商城系统的协同作用

摘要&#xff1a;本文深入探讨了 SRM 系统在零售企业与上游供应商关系管理中的关键作用&#xff0c;并引入开源 AI 智能名片商城系统&#xff0c;细致分析了两者如何协同助力零售企业优化供应链、提升竞争力。通过阐述 SRM 系统的功能模块及其对零售企业的多方面积极影响&#…

WEB渗透未授权访问篇-Redis

测试 redis-cli redis-cli -h 127.0.0.1 flunshall 192.168.0.110:6379>ping PONG 存在未授权访问 JS打内网 var cmd new XMLHttpRequest(); cmd.open("POST", "http://127.0.0.1:6379"); cmd.send(flushall\r\n); var c…

8月6日笔记

8月6日 红日靶场打靶继续 SHOW VARIABLES #用于显示服务器运行时的各种系统变量的当前设置。这些变量可以控制服务器的行为在 MySQL 中&#xff0c;general_log 和 general_log_file 是两个与“general”相关的系统变量&#xff0c;它们控制着服务器是否启用一般查询日志以及…

重庆市合川区第二届网络安全“钓鱼城“杯部分题解

MISC 下载文件后&#xff0c;进行分析 往下划看见smb 最开始以为是通过smb协议下载的文件 找半天没发现&#xff0c;往前翻了翻&#xff0c;看见了flag 存储为原始数据 通过上述分析发现开头是pk&#xff0c;保存为zip压缩包 发现需要密码 感觉是伪加密 使用工具一把梭 再…