C语言宠物系统3

news2024/9/29 9:23:29

        在前面的基础上,加上了修改功能和排序功能,可以选择姓名排序,年龄排序,价格排序。

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);  写错了,怪不得加上这个,文件里啥都没有 ,err
	fclose(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 5

struct 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.coloradmin.cn/o/1980439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实践出真知:Agents 领域“一年打怪升级”的经验分享

编者按&#xff1a;在你构建 AI Agents 时&#xff0c;是否曾遇到这些困扰&#xff1a;总是在简单任务上出错&#xff0c;从而让你有时会怀疑自己的技术水平&#xff1f;面对客户的需求&#xff0c;AI Agent 表现得像个“笨蛋”&#xff0c;无法准确理解和执行指令&#xff1f;…

不同网络上的计算机怎么通信

从 一个网络上计算机的通信 &#xff0c;我们知道&#xff0c;在一个网络里&#xff0c;多台主机通过交换机连接起来&#xff0c;每台主机的网卡有全球唯一的 MAC 地址&#xff0c;一个网络上的主机通过 MAC 地址通信。 那么&#xff0c;多个网络之间如何互联和通信&#xff1…

【轨物方案】智慧供热物联网整体解决方案

目前城市供暖系统当中&#xff0c;供暖设备一直得不到更新和升级&#xff0c;没有合理的监控设备&#xff0c;导致对供暖的合理调控不理想&#xff0c;供暖严重失调而浑然不知&#xff0c;进而出现冷热不均的问题&#xff0c;极易造成资源严重浪费。缺乏成熟的管理系统&#xf…

上门按摩小程序项目开发功能介绍

上门按摩小程序通常设计为连接按摩服务提供者和客户的平台&#xff0c;提供便捷的预约和服务管理功能。以下是这类小程序可能包含的功能&#xff1a; 用户注册和登录&#xff1a; 用户可以注册个人账户并登录&#xff0c;以便管理个人信息和预约记录。 按摩师信息浏览&#xf…

JAVA中实现线程安全的三种方式

JAVA中实现线程安全的三种方式 1. 同步代码块2. 同步方法3. ReentrantLock4. 总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 同步代码块 使用synchronized关键字加在需要同步的代码块上&#xff0c;并指定一个锁对象。这种方式可以…

Java作用域

目录 1.作用域 基本使用 2.作用域的注意事项和细节使用 1.作用域 基本使用 局部变量一般是成员方法里的变量 。全局变量有默认值&#xff0c;局部变量没有默认值。 在类内但是方法外定义的变量是局部变量&#xff0c;有初始值0可以不赋初值&#xff0c;在方法内的是局部变量…

本机IP地址可以随便改吗?怎样修改本机IP地址

在当今数字化时代&#xff0c;IP地址作为设备在网络中的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;许多用户对于IP地址的修改存在诸多疑问&#xff0c;尤其是关于其是否可以随意更改以及如何操作。本文旨在深入探讨这些问题&#xff0c;帮助读者理解本机IP地…

电信流量卡合约期内可以强制注销吗?这篇文章终于说清楚了!

流量卡在注销的时候&#xff0c;却被告知在合约期内不能注销&#xff0c;要注销的话就要交违约金&#xff0c;这种情况你遇到过没有&#xff1f;其实合约期内也是可以注销流量卡的&#xff0c;只不过方法你没有用对&#xff01; 今天靠谱教大家怎么注销合约期内的流量卡&#…

算法day05 优先级队列 桶排序

3.详解桶排序以及排序内容大总结_哔哩哔哩_bilibili 优先级队列&#xff1a; java提供有PriorityQueue类&#xff0c;如果没有提供优先级队列&#xff0c;例如c语言&#xff0c;需要先创建优先级队列&#xff0c;按需求创建的优先级队列通常效率更高。 默认创建priority对象数据…

【QT】Qt 网络

Qt 网络 Qt 网络1. UDP Socket&#xff08;1&#xff09;核心 API 概览&#xff08;2&#xff09;回显服务器&#xff08;3&#xff09;回显客户端 2. TCP Socket&#xff08;1&#xff09;核心 API 概览&#xff08;2&#xff09;回显服务器&#xff08;3&#xff09;回显客户…

【编程笔记】解决移动硬盘无法访问文件或目录损坏且无法读取

解决移动硬盘无法访问文件或目录损坏且无法读取 只解决&#xff1a;移动硬盘无法访问文件或目录损坏且无法读取 问题 由于频繁下载数据&#xff0c;多次安装虚拟机导致磁盘无法被系统识别。磁盘本身是好的&#xff0c;只是不能被识别&#xff0c;如果将磁盘格式化&#xff0c…

Linux 基于 Docker 容器化部署 Pmhub 项目

文章目录 Linux 基于 Docker 容器化部署Pmhub项目前置准备条件( 必做 )MYSQL环境配置( 必做 )Redis环境配置( 必做 )Nacos环境配置( 选做 )Seata环境配置( 选做 )容器可视化工具Portainer 部署各服务到DockerPmHub-gateway修改配置文件bootstrap.yml修改Nacos中pmhub-gateway-d…

英特尔股市暴跌,财报亏损 | HuggingFace 实现盈利 |iOS18 Beta 苹果AI

写在前面 了解一下最近科技圈发生的一些事情 英特尔 硬件巨头英特尔宣布裁掉1.5w个岗位&#xff0c;约占英特尔员工的12%&#xff0c;非常的夸张。本次裁员可能是由于前段时间英特尔的i7&#xff0c;i9的13/14代处理器的暴雷&#xff0c;导致英特尔Q2的财报低迷。 今年以来…

IDC权威认可:亚信安全引跑中国DDI市场

近日&#xff0c;国际数据公司&#xff08;IDC&#xff09;正式发布了《IDC China Semiannual DDI Tracker, 2023H2》&#xff0c;亚信安全域名服务和地址分配及管理系统&#xff08;AIDDI&#xff09;凭借在企业核心网络防护中自动化、安全性、智能化的突出能力&#xff0c;占…

十分钟带你速通 Vue 组件

自定义组件 组件是可复用的 Vue 实例&#xff0c;在开发过程中&#xff0c;我们可以把重复用到的功能封装成自定义组件&#xff0c;达到便捷开发的目的。 组件的组织 通常一个应用会以一棵嵌套的组件树的形式来组织&#xff1a; 你可能会有头部导航、内容区、侧边栏等组件&a…

WEB漏洞-SQL注入之MYSQL注入

跨库注入的原理&#xff1a;针对同一IP下的不同域名 同一服务器下 网站A对应数据库A 网站B对应数据库B 网站C对应数据库C 如果某网站的存在注入点&#xff0c;注入点的权限恰好是root权限&#xff0c;也就是最高权限&#xff0c;那么可以通过跨库注入获取其他网站的数据库…

室内宠物空气净化器哪个好?排名靠前室内宠物空气净化器使用感受

自从家里有了4只英短后&#xff0c;一到季节我就得不停的拖地刷床&#xff0c;除了这些可以手动清理的猫毛之外&#xff0c;那么空气中的猫毛怎么办&#xff1f;感受一下40度高温的养猫人&#xff0c;给掉毛怪疏毛浮毛飘飘&#xff0c;逃不过的饮水机&#xff0c;各个角落&…

YOLOv8部署的4种不同部署方式推理速度对比:pytorch、onnx、ncnn、tflite

1.模型转换 首先,我们将yolov8n.pt转换分别转换成onnx、ncnn、tflite格式模型,供后续使用不同模型部署使用,进行速度对比测试。转换代码如下: # 转onnx yolo export model=yolov8n.pt format=onnx# 转ncnn yolo export model=yolov8n.pt format=ncnn# 转tflite yolo expo…

【C++】windows11环境包管理工具vcpkg配置和教程

【C】windows11环境包管理工具vcpkg配置和教程 文章目录 【C】windows11环境包管理工具vcpkg配置和教程vcpkg 概述Vckpg 下载和安装先决条件下载安装 初识vcpkg&#xff1a;新建helloworld项目集成到 Visual Studio全局集成和移除集成到项目 总结 vcpkg 概述 开源库绝大部分都…