C语言宠物系统

news2024/11/15 14:02:01

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

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/1981479.html

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

相关文章

角色管理功能助你打造精准智慧校园系统

在智慧校园的信息化架构中&#xff0c;角色管理功能犹如一把精细的钥匙&#xff0c;开启着系统安全与高效运作的大门。它不仅关乎信息的访问权限&#xff0c;更深层次地影响着校园内各类活动的顺畅进行。 智慧校园的角色管理&#xff0c;首先体现在对用户群体的细致划分上。系统…

【Linux】进程间通信:详解 VSCode使用 | 匿名管道

目录 0. 引入&#xff1a;vscode 的使用 下载 推荐插件 连接云服务器 1. 进程间通信 1.1 是什么 1.2 为什么 1.3 怎么办 介绍 &#xff1a; 2. 匿名管道 2.1 引入 2.2 原理 3. 建立管道的系统调用pipe 3.1 介绍 形参 返回值 3.2 代码 3.3 站在内核的角度 编…

通俗易懂的告诉你大模型如何微调!

如今&#xff0c;大模型&#xff08;Large Language Models&#xff09;在人工智能领域可是炙手可热的话题。它们拥有庞大的参数和广泛的知识&#xff0c;能够处理各种复杂的任务。然而&#xff0c;就像一把锋利的刀需要经过磨砺才能更贴合手型一样&#xff0c;大模型也需要经过…

鸿道Intewell操作系统X86生态之:Intel J1900

在当今数字化转型的浪潮中&#xff0c;工业自动化和智能制造的需求日益增长&#xff0c;对实时操作系统的性能和可靠性提出了更高的要求。鸿道Intewell操作系统正是聚焦于如何将高性能的处理器与先进的操作系统相结合&#xff0c;以构建一个强大且稳定的工业控制系统。 鸿道I…

【算法系列】双指针

双指针算法 1. 双指针算法概述2 经典双指针算法题目分享1. **复写零**2. 快乐数&#xff08;medium&#xff09;3. 11. 盛最多水的容器4. 有效三⻆形的个数&#xff08;medium&#xff09;5. 四数之和 1. 双指针算法概述 常⻅的双指针有两种形式&#xff0c;⼀种是对撞指针&…

MMC和eMMC的区别

MMC 和 eMMC 的区别 1. MMC MMC&#xff08;MultiMediaCard&#xff09;是一种接口协议&#xff0c;定义了符合这一接口的内存器&#xff0c;称为 MMC 储存体或 MMC 卡。它是一种非易失性存储器件&#xff0c;广泛应用于消费类电子产品中。 1.1 外观及引脚定义 MMC卡共有七个…

文件解析漏洞合集

IIS 解析漏洞 IIS6 目录解析 打开windows——server2003&#xff0c;在 wwwroot 目录下创建 1.asp &#xff0c;在其中创建的所有文件都会在访问时以 asp 解析出来 畸形文件解析 在wwwroot目录下创建 2.asp;.jpg &#xff0c;此文件上传时是 .jpg 后缀,但解析时由于 iis6 文…

transformer死亡9问

transformer死亡20问 1. Transformer为何使用多头注意力机制&#xff1f;2. Transformer为什么Q和K使用不同的权重矩阵生成&#xff0c;为何不能使用同一个值进行自身的点乘3. Transformer计算attention的时候为何选择点乘而不是加法&#xff1f;两者计算复杂度和效果上有什么区…

C#桌面开发(那些年你总走进误区的技术):异步多线程、异步事务与递归技术

1. 异步多线程 (Asynchronous Multithreading) 在C#桌面开发中&#xff0c;异步多线程是提高应用程序响应速度和性能的关键技术之一。以下是几个深入的技术点和示例代码。 1.1 使用async和await实现异步操作 C#的async和await关键字使得编写异步代码变得更加简单。以下是一个…

老司机也会翻车?通过自动建模技术轻松实现工程机械翻滚保护分析

什么是ROPS分析&#xff1f; ROPS分析&#xff0c;指的是"Roll-Over Protective Structure"&#xff08;翻滚保护结构&#xff09;的简称&#xff0c;这是一种用于评估和设计特殊设备&#xff08;如前装载机、各种挖掘机、履带式推土机&#xff09;的被动安全标准&am…

slam过程中每一帧的gt位姿如何计算

一般得到的每一帧数据类似如下&#xff1a; 4*4的变化矩阵&#xff0c;都属于相机到世界坐标系下的变化矩阵&#xff0c;如果是x,y,z和四元数也可以转换为这种4*4的矩阵。 第一帧为世界坐标系的原点&#xff0c;后续的位姿都基于这个原点进行变化。 def load_poses(path, n_im…

HCIA概述

一、OSI七层模型 1.物理层&#xff08;七层&#xff09; 定义物理设备的标准&#xff0c;主要对物理连接方式&#xff0c;电气特性&#xff0c;机械特性等制定统一标准&#xff0c;传输比特流&#xff0c;因此最小的传输单位——位&#xff08;比特流&#xff09;。 2.数据链…

差分专题的练习

神经&#xff0c;树状数组做多了一开始还想着用树状数组来查询差分数组&#xff0c;但是我们要进行所有元素的查询&#xff0c;直接过一遍就好啦 class Solution { public:int numberOfPoints(vector<vector<int>>& nums) {vector<int> c(105, 0);for (i…

Hadoop的安装和使用-2024年08月01日

Hadoop的安装和使用-2024年08月01日 1.创建Hadoop用户2.SSH登陆权限设置3.java的安装4.Hadoop单机安装配置5.Hadoop伪分布式安装配置 1.创建Hadoop用户 如果安装Ubuntu的时候不是用的“hadoop”用户&#xff0c;那么需要增加一个名为 hadoop的用户首先按ctrlaltt打开终端窗口&…

源代码加密防泄漏如何做?

源代码开发环境复杂&#xff0c;涉及的开发软件、文件类型庞杂多变&#xff0c;究竟有什么源代码加密防泄漏软件能够适应众多开发软件而不影响原有的工作效率&#xff1f; 相信这是很多IT管理员或者老板们都想要了解的问题&#xff0c;今天和行业内专业人士讨论&#xff0c;将…

【docker】虚拟化与docker基础

一、虚拟化 1.虚拟化概述 什么是虚拟化&#xff1f; 虚拟化&#xff1a;将应用程序和系统内核资源进行解耦&#xff0c;以操作系统级别进行隔离&#xff0c;目的是提高资源利用率 2、虚拟化的功能 将虚拟化的性能优化趋近于物理资源的性能&#xff0c;主要用于提高资源利用…

浏览器被360劫持了的解决办法

所有浏览器一打开就是360界面&#xff0c;查询资料解决 以谷歌浏览器为例&#xff1a;打开其exe的位置&#xff0c;将exe文件重命名&#xff0c;再次创建快捷方式即可

Kickstart自动安装系统

目录 一、Kickstart的介绍 1.1 为什么要使用Kickstart? 1.2 如何解决以上问题&#xff1f; 1.3 Kickstart的作用 二、实验环境 2.1 实验所需环境 2.2 测试所给的环境是否可用 三、安装Kickstart配置ks文件 3.1 安Kickstart 3.2 配置ks文件 3.2.1 使用图像配置工具配置…

日志采集格式

本实验需要两个虚拟机&#xff0c;一个用于配置&#xff0c;一个用于查看测试结果 node1主机上的配置 vim /etc/rsyslog.conf #添加配置&#xff0c;写入指定的日志格式 13 module(load"builtin:omfile" Template"HAHA") 14 $template HAHA,"%FROM…

Ceres Cuda加速

文章目录 一、简介二、准备工作三、实现代码四、实现效果参考资料一、简介 字Ceres2.2.1版本之后,作者针对于稠密矩阵的分解计算等操作进行了Cuda加速,因此这里就基于此项改动测试一下效果。 二、准备工作 1、首先是需要安装Cuda这个英伟达第三方库,https://developer.nvidi…