线上宠物领养系统

实现功能

客户端:客户可以查询数据库的宠物信息并根据查询的宠物信息选择自己喜欢的宠物进行领养。
服务器:服务器实现了对管理员相关信息的保存,管理员必须输入正确的用户名和密码才能对数据库信息进行增删改查等操作。服务器也可以直接对数据库信息进行查询。服务器进入默认模式后,就可以接收客户端的链接请求,并根据客户端的请求信息对数据库进行相应的操作

用到的关键技术

客户端与服务器通信时,使用的是IO多路服用技术进行通信,实现了一对多的通信方式。
服务器端对数据库进行增删改查操作,并利用文件管理的方式将管理员信息进行保存。

流程图

在这里插入图片描述

代码实现

服务器代码

主函数:

#include "net.h"int main(int argc,char *argv[])
{User User1;//创建数据库sqlite3 *db;int op=0;while(1){system("clear");printf("<<<<<<<<<欢迎进入宠物领养店>>>>>>>>>>\n");printf("1\t\t以管理员方式对数据库进行操作\n");printf("2\t\t展示宠物信息\n");printf("3\t\t默认模式\n");	printf("4\t\t退出\n");printf("请输入你的选择\n");scanf("%d",&op);switch(op){case 1:{//实现用户的注册和登陆,并能够实现对数据库的增删改查user_registers_login_func(User1,db);break;}case 2:{//展示宠物信息	display(db);break;}case 3:{//默认模式,就是将服务器打开,系统开始接收客户端发来的的领养宠物的操作communication_func(argc,argv,db);break;}case 4:{//退出exit(0);}}}return 0;
}

函数定义

#ifndef _NET_H
#define _NET_H
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sqlite3.h>
//定义宠物的信息的结构体
typedef struct pot
{int ID;char nature[20];//宠物的属性char name[20];//名字char color[20];//颜色float age;//年龄float weight;//体重
}Pot;//第一管理员信息的结构体
typedef struct The_users   //typedef 可以定义结构体别名
{char id[11]; //账号 char pwd[20]; //密码 
}User;void Exit(void);  //退出函数
void registers(User User1); //用户注册
void login(User User1,sqlite3 *db);  //登录账号
int user_registers_login_func(User User1,sqlite3 *db);//实现用户的注册和登陆,并能够实现对数据库的增删改查
void analysis(char buf[],char username[],char passward[]);//解析字符串,对用户名和密码进行解析
void db_func(sqlite3 *db);//对数据库进行增删改查
void menu();//打印菜单
int insert(sqlite3 * db);//插入数据到数据库中
int callback(void *Notuserd,int argc,char *argv[],char *colName[]);//回调函数,在数据库中查找数据时,数据库返回的数据。
int Select(sqlite3 *db);//查看数据库值中的信息
int Delete(sqlite3 *db);//删除数据库中的信息
int Update(sqlite3 *db);//修改数据库中的数据
int Drop(sqlite3 *db);//删除数据库中创建的表
void display(sqlite3 *db);//展示宠物信息
int tcp_server(char * ip,int port);//编写一子函数,实现tcp的服务器端
int communication_func(int argc,char *argv[],sqlite3 *db);//实现服务器和客户端之间的通信
int tcp_com(int newfd);//实现和客户端通信#endif

函数实现

#include "net.h"//函数功能:实现用户的注册,将用户的信息保存到文件中
//参数:用户名
//返回值:void
void registers(User User1)  //用户注册
{//打开文件,将用户信息保存到文件中int fw=open("Message.txt",O_WRONLY | O_CREAT,0666);if(fw<0){perror("open err");return ;}//定义用户的信息printf("请输入用户的账号和密码\n");scanf("%s%s",User1.id,User1.pwd);char buf[50]={0};printf("你输入的姓名和密码为\n");sprintf(buf,"username=%s&passward=%s",User1.id,User1.pwd);//将输入的用户信息和密码写入到文件中int ret = write(fw,buf,sizeof(buf));if(ret<0){perror("fwrite err");return ;}close(fw);printf("用户信息输入成功\n");
}//函数功能:解析字符串,对用户名和密码进行解析
//参数1:buf,文件中宝保存的用于名和密码的字符串
//参数2:username,解析出来的用户名
//参数3:password,解析出来的密码
//返回值:void
void analysis(char buf[],char username[],char passward[])
{int i=0;int j=0;int q=0;while(buf[i] != '\0'){if(buf[i] == '='){break;}i++;}if(buf[i]!='='){return ;}i++;while(buf[i+j] != '\0'){if(buf[i+j] == '&'){break;}username[j]=buf[i+j];j++;}username[j]='\0';if(buf[i+j] != '&'){return ;}//找到第二个等号while(buf[i+j+q] != '\0'){if(buf[i+j+q] == '='){break;}q++;}if(buf[i+j+q] != '=')return ;i++;int k=0;while(buf[i+j+q+k] != '\0'){passward[k]=buf[i+j+q+k];k++;}passward[k]='\0';
}//函数功能:登陆,用户先输入用户姓名和密码,然后将文件信息中的用户名和密码与输入信息作比较,不一致则登陆成功,
//一致则登陆失败,请重新登陆
//参数1:用户
//参数2:数据库
//返回值:void
void login(User User1,sqlite3 *db)
{printf("请输入你的用户名和和密码\n");scanf("%s%s",User1.id,User1.pwd);//打开文件int fr=open("Message.txt",O_RDONLY,0666);if(fr<0){perror("open err");return ;}//读文件内容char buf[50]={0};int i=0;while(1){int rd_count = read(fr,buf,sizeof(buf));if(0 == rd_count){printf("倒入信息完毕\n");break;}else if(rd_count<0){printf("倒入失败\n");return ;}else {printf("%s\n",buf);}}//关闭文件close(fr);//解析文件数据char username[20];char passward[20];analysis(buf,username,passward);while(1){//与输入信息作比较,一样则登陆成功,否则失败if((strcmp(username,User1.id)==0) && (strcmp(passward,User1.pwd)==0)){printf("登陆成功\n");printf("进入主界面\n");//管理员对数据库进行操作db_func(db);break;}else{printf("登陆失败,请重新输入\n");break;}}
}
//函数功能:退出登陆界面
//参数:void
返回值:void
void Exit(void)
{system("clear");printf("\n\n\n           ^*^感谢使用,祝您生活愉快!\n\n\n\n\n\n\n\n\n");return ;
}//函数功能:用户的注册,登陆函数的实现
//参数1:用户名
//参数2:数据库
//返回值:成功返回0,失败返回-1
int user_registers_login_func(User User1,sqlite3 *db)
{int n;char buf[20]={0};do{system("clear");if(strncmp(buf,"quit",4)==0){break;}printf("\n				             $登录界面$\n");printf("\n      1.用户注册           2.用户登录         3.退出程序\n");printf("\n^*^请选择:");scanf("%d",&n);switch(n){case 1:registers(User1);break;case 2:login(User1,db);break;case 3:Exit();strcpy(buf,"quit");default:printf("#输入有误,请重新输入\n#");system("clear");}}while(1);return 0;
}//函数功能:打印菜单
//参数:无
//返回值:无
void menu()
{printf("insert\t\t1\n");printf("selete\t\t2\n");printf("delete\t\t3\n");printf("update\t\t4\n");printf("销毁表\t\t5\n");printf("退出表\t-1\n");printf("请输入你的选择\n");
}//函数功能:插入数据到数据库中
//参数:数据库
//返回值:成功返回0,失败返回-1
int insert(sqlite3 * db)
{//定义一个宠物的信息Pot Pot1;printf("请输入宠物的编号,名字,属性,颜色,年龄,体重\n");scanf("%d%s%s%s%f%f",&Pot1.ID,Pot1.name,Pot1.nature,Pot1.color,&Pot1.age,&Pot1.weight);char sql[100]={0};sprintf(sql,"insert into Pot values(%d,'%s','%s','%s',%.1f,%.1f)",Pot1.ID,Pot1.name,Pot1.nature,Pot1.color,Pot1.age,Pot1.weight);printf("sql=%s\n",sql);int rc=0;rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc != SQLITE_OK){perror("insert err");return -1;}printf("insert ok\n");return 0;
}//函数功能:回调函数,在数据库中查找数据时,数据库返回的数据。
//参数1:sqlite3_exec的第四个参数
//参数2:个数
//参数3:列名
//参数4:具体的名字
//返回值:成功返回0.失败返回-1
int callback(void *Notuserd,int argc,char *argv[],char *colName[])
{int i=0;for(i=0;i<argc;i++){printf("%s ",argv[i]);}printf("\n");return 0;
}//函数功能:查看数据库值中的信息
//参数1:sqlite3 *db
//返回值:成功返回0,失败返回-1
int Select(sqlite3 *db)
{char sql[100]={0};sprintf(sql,"select * from Pot");int rc;//参数3:函数的指针回调函数//参数4:给回调函数的参数//参数5:错误信息rc=sqlite3_exec(db,sql,callback,NULL,NULL);if(rc != SQLITE_OK){perror("select err");return -1;}printf("select ok\n");return 0;
}//函数功能:删除数据库中的信息
//参数:sqlite3 *db
//返回值:成功返回0,失败返回-1
int Delete(sqlite3 *db)
{//删除学生的信息printf("请输入要删除宠物的编号\n");int ID;scanf("%d",&ID);char sql[100]={0};sprintf(sql,"delete from Pot where ID = %d",ID);printf("sql=%s\n",sql);int rc=0;rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc != SQLITE_OK){perror("delete err\n");return -1;}printf("delete ok\n");return 0;
}//函数功能:修改数据库中的数据
//参数:sqlite3 *db
//返回值:成功返回0;失败返回-1
int Update(sqlite3 *db)
{//要修改的宠物的信息printf("请输入要修改的宠物的体重和要修改的姓名\n");float weight=0;char name[20]={0};scanf("%f%s",&weight,name);char sql[100]={0};sprintf(sql,"update Pot set weight = %f where name = '%s'",weight,name);printf("sql=%s\n",sql);int rc=0;rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc != SQLITE_OK){perror("update err\n");return -1;}printf("update ok\n");return 0;
}//函数功能:删除数据库中创建的表
//参数:sqlite3 *db
//成功返回0,失败返回-1
int Drop(sqlite3 *db)
{char sql[100]={0};sprintf(sql,"drop table Pot");printf("%s\n",sql);int rc=0;rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc != SQLITE_OK){perror("drop err\n");return -1;}printf("drop ok\n");return 0;
}//函数功能:数据库的操作
//参数:数据库
//返回值:void
void db_func(sqlite3 *db)
{int rc;//定义一个宠物的信息char *zErrMsg=0;rc=sqlite3_open("test.db",&db);//创建一张表if(rc){printf("数据库打开失败\n");return ;}printf("打开成功\n");//拼好sql语句char sql[200]={0};sprintf(sql,"create table Pot (ID int primary key not null,name text,nature text,color text,age real,weight real)");printf("%s\n",sql);//参数1:sqlite3//参数2:char *sql语句//参数3:参数4:NULL//参数5:将错误信息显示rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc == SQLITE_OK){printf("table create OK\n");}int op=0;while(1){menu();scanf("%d",&op);if(op == -1){break;}switch(op){case 1:insert(db);break;case 2:Select(db);break;case 3:Delete(db);break;case 4:Update(db);break;case 5:Drop(db);break;}}//关闭数据库sqlite3_close(db);
}//函数功能:展示所有宠物信息
//参数:sqlite3 *db
//返回值:无
void display(sqlite3 *db)
{int rc;rc=sqlite3_open("test.db",&db);//创建一张表if(rc){printf("数据库打开失败\n");return ;}printf("打开成功\n");Select(db);printf("展示完成,是否退出\n");printf("退出请输入“quit”\n");char buf[20]={0};scanf("%s",buf);if(strncmp(buf,"quit",4)==0){return ;}
}//函数功能:编写一子函数,实现tcp的服务器端
//参数1:自己的IP地址   
//参数2:自己的PORT号
//返回值:成功监听的socket对象,失败返回-1
int tcp_server(char * ip,int port)
{//1.创建socket对象            socket()//2.设置自己的IP地址和端口号  struct sockaddr_in//3.绑定自己的IP地址和端口号  bind()//4.监听该socket对象          listen()//1.创建TCP socketint socket_fd = socket(AF_INET, SOCK_STREAM, 0);if(0>socket_fd){perror("create socket error");return -1;}printf("socket  ok\n");//2.设置自己的指定端口及ip地址struct sockaddr_in server;memset(&server,'\0',sizeof(server));server.sin_family = AF_INET;       //协议server.sin_port = htons(port);  //将主机字节序转换成网络字节序//端口号  "8888"  -->atoi("8888")  8888server.sin_addr.s_addr = inet_addr(ip);//将主机字节序转换成网络字节序//INADDR_ANY OS自动获取的是谁就用谁 //inet_addr("192.168.2.112") 将其转换成网络字节序//3.绑定自己的IP地址和端口号if(bind(socket_fd,(struct sockaddr *)&server,sizeof(server))<0){perror("bind error");return -1;}printf("bind ok\n");//4.监听是否有人连接if(listen(socket_fd,5)<0){perror("listen error");return -1;}printf("listen ok\n");return socket_fd;}//函数功能:实现和客户端通信
//参数1:连接好的文件描述符
//返回值:客户端断开连接返回-1,否则返回0
int tcp_com(int newfd)
{//4.服务器连接成功之后实现的具体操作使用的是接受连接之后的新的socket对象char buf[256] = {'\0'};while(1){memset(buf,'\0',sizeof(buf));recv(newfd,buf,sizeof(buf),0);//tcpsocke中提供专门接受的函数if(strncmp(buf,"quit",4)==0){return -1;}printf("buf=%s\n",buf);//recv(newfd,buf,sizeof(buf),0);//tcpsocke中提供专门接受的函数//printf("buf=%s\n",buf);}return 0;
}//函数功能:服务器不通过登陆直接查看数据库中的信息时用到的回调函数
//参数1:sqlite3_exec的第四个参数
//参数2:个数
//参数3:列名
//参数4:具体的名字
//返回值:成功返回0,失败返回-1
int callback_client(void *pNewfd,int argc,char *argv[],char *colName[])
{int i=0;int *pfd=(int *)pNewfd;int fd=*pfd;Pot pot1;pot1.ID=atoi(argv[0]);strcpy(pot1.name,argv[1]);strcpy(pot1.nature,argv[2]);strcpy(pot1.color,argv[3]);pot1.age=atof(argv[4]);pot1.weight=atof(argv[5]);//printf("%s %s %s %f %f\n",pot1.name,pot1.nature,pot1.color,pot1.age,pot1.weight);//printf("连接好的socket对象%d\n",fd);send(fd,&pot1,sizeof(pot1),0);//printf("\n");sleep(1);return 0;
}//函数功能:不通过登陆直接查询数据库中的信息
//参数1:sqlite3 *db
//参数2:连接好的文件描述符
//返回值:成功返回0,失败返回-1
int Select_client(sqlite3 *db,int newfd)
{char sql[100]={0};int rc;rc=sqlite3_open("test.db",&db);sprintf(sql,"select * from Pot");//参数3:函数的指针回调函数//参数4:给回调函数的参数//参数5:错误信息rc=sqlite3_exec(db,sql,callback_client,&newfd,NULL);if(rc != SQLITE_OK){perror("select_client err");return -1;}printf("select_client ok\n");sqlite3_close(db);return 0;
}//函数功能:实现服务器和客户端之间的通信
//参数1:ip地址
//参数2:端口号
//参数3:数据库
//返回值:成功返回0,失败返回-1
int communication_func(int argc,char *argv[],sqlite3 *db)
{//1.入参判断if(argc < 3){perror("参数有误\n");return -1;}//2.获得监听好的socket对象int listenfd=tcp_server(argv[1],atoi(argv[2]));//接收连接int newfd=0;//用来保存连接后的socket对象struct sockaddr_in client;int len=sizeof(client);//IO多路复用并法服务器//1.定义两个监控队列fd_set rdfs,temp;//2.清空监听队列FD_ZERO(&rdfs);FD_ZERO(&temp);//3.将监听套接子加入到监听列表中FD_SET(listenfd,&rdfs);int i=0;while(1){//4.将rdfs复制给temptemp=rdfs;//5.select阻塞监控,监控的是tempif(select(FD_SETSIZE,&temp,NULL,NULL,NULL)<0){perror("select error");return -1;}//FD_SETSIZE 1024//6.selete退出必然有文件描述符的状态发生了变化//7.遍历文件描述符for(i=0;i<FD_SETSIZE;i++){if(FD_ISSET(i,&temp)){if(i==listenfd){//有客户端连接newfd=accept(i,(struct sockaddr *)&client,&len);if(newfd<0){perror("accept error");return -1;}printf("accept success\n");printf("client IP=%s PORT=%d\n",inet_ntoa(client.sin_addr),ntohs(client.sin_port));//8.将连接好的新的套接子加入到监控队列中FD_SET(newfd,&rdfs);}else//表示套接子有数据传过来{char buf[20]={0};int n=recv(i,buf,sizeof(buf),0);if(n==0){break;}printf("buf=%s\n",buf);if(strncmp(buf,"quit",1)==0){printf("socket %d\n",i);close(i);FD_CLR(i,&rdfs);//将套接子从监听队列中删除return 0;}else if(strncmp(buf,"select",6)==0){//打开数据库,发送宠物信息给客户端展示//printf(".........................\n");Select_client(db,newfd);send(newfd,"quit",4,0);//display(db);break;						}else if(strncmp(buf,"buy",3)==0){//如果接收到的是宠物的名字的话,查询数据库,根据数据库的名字删除该宠物//Select_client(db,newfd);//操作数据库int rc;rc=sqlite3_open("test.db",&db);int flag=0;int n=recv(i,&flag,sizeof(flag),0);printf("%d\n",flag);//sleep(3);char sql[100]={0};sprintf(sql,"delete from Pot where ID = %d",flag);printf("sql=%s\n",sql);rc=sqlite3_exec(db,sql,NULL,NULL,NULL);if(rc != SQLITE_OK){perror("delete err\n");return -1;}printf("delete ok\n");Select(db);printf("客户已经购买成功\n");printf("是否退出?\n");printf("quit\t退出\n");char buf[20]={0};scanf("%s",buf);if(strncmp(buf,"quit",4)==0){return 0;}}}}}}close(listenfd);
}

客户端

主函数

#include "net.h"int main(int argc,char *argv[])
{char buf[20]={0};while(1){system("clear");printf("<<<<<<<<<欢迎进入宠物领养店>>>>>>>>>>\n");printf("select\t\t展示宠物信息\n");printf("quit\t\t退出\n");printf("请输入你的选择\n");fgets(buf,sizeof(buf),stdin);if(strncmp(buf,"select",6)==0){display_info(argc,argv);}else if(strncmp(buf,"quit",4)==0){break;}}return 0;
}

函数声明

#ifndef __NET_H
#define __NET_H#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sqlite3.h>
//定义宠物的信息的结构体
typedef struct pot
{int ID;char nature[20];//宠物的属性char name[20];//名字char color[20];//颜色float age;//年龄float weight;//体重
}Pot;//定义管理员信息的结构体
typedef struct users   //typedef 可以定义结构体别名
{char id[11]; //账号 char pwd[20]; //密码 
}User;int connect_Func(char *ip,int port);//与服务器进行连接的函数
int display_info(int argc,char *argv[]);//展示宠物信息,当和服务器进行连接成功后,客户端发送查询宠物信息,服务器就会将宠物信息发送给客户端#endif

函数实现

#include "net.h"//函数功能:与服务器进行连接的函数
//参数1:ip
//参数2:端口号:port
//返回值:成功返回连接处成功的socket对象,失败返回-1
int connect_Func(char *ip,int port)
{//创建套接子//设置对方的IP和端口号//请求连接//发送消息//关闭socket对象//创建套接子int tcp_socket=socket(AF_INET,SOCK_STREAM,0);if(tcp_socket<0){perror("socket err");return -1;}//设置对方的IP和端口号//定义一个结构体并赋值struct sockaddr_in server;server.sin_family=AF_INET;//IPV4协议server.sin_port=htons(port);server.sin_addr.s_addr=inet_addr(ip);//请求连接if(connect(tcp_socket,(struct sockaddr *)&server,sizeof(server))<0){perror("connect err");return -1;}printf("connect ok\n");return tcp_socket;
}//函数功能:展示宠物信息,当和服务器进行连接成功后,客户端发送查询宠物信息,服务器就会将宠物信息发送给客户端
//后查询数据库,并将宠物信息发送给客户端
//参数1:ip
//参数2:端口号 
//返回值:成功返回0,失败返回的-1;int display_info(int argc,char *argv[])
{//入参判断if(argc>3){perror("参数有无");return -1;}//创建连接int tcp_socket=connect_Func(argv[1],atoi(argv[2]));//发送消息char buf[20]={0};memset(buf,0,sizeof(buf));printf("write:\n");strcpy(buf,"select");send(tcp_socket,buf,strlen(buf),0);//发送数据sleep(1);if(strncmp(buf,"select",6)==0){Pot pot1;while(1){int n=recv(tcp_socket,&pot1,sizeof(pot1),0);printf("n=%d\n",n);if(n<sizeof(pot1)){//询问客户是否要进行购买,输入buy进入购买连接printf("是否需要领养\n");printf("领养输入1,退出输入2\n");int flag;scanf("%d",&flag);if(flag==1){//购买memset(buf,0,sizeof(buf));printf("write:\n");strcpy(buf,"buy");send(tcp_socket,buf,strlen(buf),0);//发送数据printf("请输入你想要领养的宠物的编号\n");int flag=0;//fgets(buf_name,sizeof(buf_name),stdin);scanf("%d",&flag);send(tcp_socket,&flag,sizeof(flag),0);//printf("%d\n",flag);printf("购买成功\n");printf("是否退出?\n");printf("quit\t退出\n");char buf[20]={0};scanf("%s",buf);if(strncmp(buf,"quit",4)==0){break;}}else{break;}}printf("%d %s %s %s %.1f %.1f\n",pot1.ID,pot1.name,pot1.nature,pot1.color,pot1.age,pot1.weight);}}//关闭socket对象close(tcp_socket);return 0;
}

编译运行

编译
在这里插入图片描述
主界面
在这里插入图片描述

先对服务器端进行操作,先择1,以管理员方式对数据库进行操作
在这里插入图片描述

选择1,注册信息,输入用户名zhangsan和密码123456
在这里插入图片描述

再输入2,进行用户登录,输入刚刚输入的用户名和密码
在这里插入图片描述

登录成功显示登录成功。登录成功后开始对数据库进行增删改查
输入1,插入信息,将宠物信息输入数据库
在这里插入图片描述
插入成功后提示insert ok
输入2查询插入的信心是否插入成功
在这里插入图片描述
红色框中的数据即为插入的数据,插入成功
输入3可以删除数据库中的信息
在这里插入图片描述

输入3后再输入你要删除的宠物编号,成功则显示delete ok,也可以输入2查看是否删除成功
在这里插入图片描述
输入2后查看,未发现编号为9的宠物信息,说明删除成功。
输入4修改宠物信息,宠物信息的修改是根据宠物的名字修改宠物的体重:
在这里插入图片描述

修改后再次查看,宠物体重发生变化。
输入5是数据库中创建的表,由于后面要对数据库进行操作,在此不做演示。
输入-1,退出
在这里插入图片描述
退出到登录界面,输入3,退出登录界面
在这里插入图片描述
退出到主界面
输入2,展示数据库中所有宠物信息
在这里插入图片描述
展示完成后想退出,驶入quit即可退出
在这里插入图片描述
输入3进入默认模式,此时服务器可以接收客户端的链接
在这里插入图片描述
客户端输入select查询,即可链接数据库
在这里插入图片描述
链接成功后,服务器就会将查询数据库,并将数据库中的信息发送给客户端。客户端询问客户是否要领养宠物,领养输入1,退出输入2,此处选择领养,并将领养的宠物的编号发送给服务器
在这里插入图片描述

服务器收到领养宠物的编号后,将改编号的宠物从数据库中删除,并展示剩余的宠物信息,客户端即领养成功。
客户端选择退出,回到主界面
在这里插入图片描述
再次退出,退出程序。
在这里插入图片描述
服务器端退出,退出到主界面
在这里插入图片描述
再次选择退出,退出到主界面
在这里插入图片描述

以上就是此次宠物领养系统的所有代码和编译执行的全过程,适合刚开始学习C语言的朋友们学习,希望能对你们提供一些指导和帮助。该功能还有很多有缺陷的地方,还请各位大佬在评论区中提一提自己宝贵的意见,万分感谢。

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

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

相关文章

软件官网页面模板

此项目由Htmlcss结构搭建而成 里面自适应移动端而做出调整 上代码: 使用了该模板的请将出处表明 项目结构 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conte…

(学习笔记)使用CHATGPT写的前端页面模板

一、学生管理系统的登录页面 写一个好看的学生管理系统的登录页面&#xff0c;学生使用用户名和密码进行登录 <!DOCTYPE html> <html> <head><title>Student Management System - Login</title><style>body {font-family: Arial, sans-s…

如何将ChatGPT用到Facebook的文案生产中?

ChatGPT 是一款由 OpenAI 所开发的大型语言模型&#xff0c;它可以生成高质量、自然流畅的文本&#xff0c;具有很强的语言理解和生成能力。这使得它成为了一个非常有用的工具&#xff0c;可以应用于许多领域中&#xff0c;包括文案生产。 Facebook 是全球最大的社交媒体平台之…

转载。1AGI 14个关键问题

信息爆炸的 10 篇 AGI 访谈&#xff0c;我们从中整理了 14 个关键问题 原创 Founder Park Founder Park 2023-04-16 19:00 发表于北京 自从 GPT-4 发布以来&#xff0c;媒体高度关注 OpenAI 和其内外部相关人士&#xff0c;重要角色的视频、播客和文章访谈频频出现。为了节省…

下一个“AI王炸”,别只盯着OpenAI,DeepMind也在憋大招

过去几个月&#xff0c;OpenAI风头无两&#xff0c;各大科技公司争先恐后地跟进大语言模型&#xff08;LLM&#xff09;这一技术路线。 对比之下&#xff0c;OpenAI的老对手DeepMind&#xff0c;显得有些低调和沉默。微软靠OpenAI打了一场胜仗&#xff0c;而谷歌推出的Bard翻了…

2023年最好用的办公AI工具,让你工作效率提升10倍!

2023年是AI工具大爆发的一年&#xff0c;在效率办公领域&#xff0c;同样涌现出了很多优秀的AI办公工具&#xff0c;小编亲测了几款&#xff0c;都是宝藏好用的App&#xff0c;以下排名不分先后&#xff0c;一起来看看吧&#xff01; AI办公工具哪个好 GitMindNotion AI酷表C…

[论文速览] Sparks of Artificial General Intelligence: Early experiments with GPT-4

Sparks of Artificial General Intelligence: Early experiments with GPT-4 2023.3.22 微软官方发布了目前人类史上最强AI模型 GPT-4 的综合能力评估论文&#xff0c;总所周知&#xff0c;2023年是通用人工智能&#xff08;Artificial General Intelligence&#xff0c;AGI&a…

Python3常用其他API速查手册(持续更新ing...)

诸神缄默不语-个人CSDN博文目录 最近更新时间&#xff1a;2023.7.18 最早更新时间&#xff1a;2022.6.27 运算符 - * /" / “就表示 浮点数除法&#xff0c;返回浮点结果;” // "表示整数除法。取余% 指数**等式&#xff1a; > < > <不等于&#xff…

比chatPDF更优秀的国内平替

chatPDF是个非常不错的点子。基于openai的embeddeding接口。但是它有两个缺点。 1、当然是需要魔法才能访问。 2、它和微调不同。所有问题都是基于现有文档。而且每次都是根据你的提问&#xff0c;在文档转化成的向量数据里寻找相关联的内容&#xff0c;一同发给 chatGPT&…

我的plus也GG了

用的好好的4.0&#xff0c;突然就被封了&#xff0c;好在是把钱也退给我了&#xff0c;真是好人啊 刚才找到个chatGPT的镜像&#xff0c; 有GPT4,还可以上传word和pdf的网站ppword.cn

ChatGPT小技巧:如何提升提问效率

别人使用ChatGPT一天内能完成100个网站设计&#xff0c;而你却无法完成一个简单的小程序。原因很可能是你并不清楚自己到底想要什么&#xff0c;导致ChatGPT在没有明确需求的情况下无法生成满意的作品。 不用担心&#xff0c;今天我要分享的这个提示将帮助你解决这个难题。 只需…

经典论文-MobileNetV2论文及实践

**### 2019-MobileNetV2 MobileNetV2: Inverted Residuals and Linear Bottlenecks MobileNetV2: 倒置残差和线性瓶颈 作者&#xff1a;Mark Sandler, Andrew Howard, Menglong Zhu, Andrey Zhmoginov, Liang-Chieh Chen单位&#xff1a;Google 论文地址&#xff1a; https…

首次!中国移动在Nature 杂志子刊 Nature Electronics发表5G高能效通信技术文章

中国移动最新发表在Nature Electronics上的5G论文&#xff1a;面向绿色未来的高能效5G技术 中文版 中国移动首席科学家易芝玲博士、韩双锋博士和边森在最近发表在 nature electronics 的评论文章中分析了5G能效以及如何提高能效的方法。 摘要&#xff1a;能量效率 EE&#xf…

仿10086电信业务平台

目录 配置环境 框架图 模块分析 四大板块 功能代码段 语音播报 数据库调用 显示时间 总体框架 完整代码&#xff1a; 文末附完整代码链接 配置环境 VC6.0 东进语音卡 Access数据库 ADO接口技术 在VC6.0中&#xff0c;我们通过新建MFC&#xff08;微软基础类库&…

Mobile-Former: Bridging MobileNet and Transformer论文简述

本文的核心思想&#xff0c;就是将mobilenet与transformer结合起来&#xff0c;通过mobilenet提取局部特征&#xff0c;transformer来提取全局特征。比较突出的是&#xff0c;本文采用了一种全新的并行结构&#xff0c;而不是之前的将cnn模型穿插在VIT中的方法&#xff0c;并且…

【移动通信】 01-移动通信概论

移动通信概论 1G1.用户接入方式2.收发机的工作方式3.蜂窝技术4.移动通信系统基本结构 2G1.GSM系统打电话2.扩频3.m序列 2.5G3G4G 1G 1.用户接入方式 ​ FDMA&#xff08;频分复用&#xff09;&#xff1a;分割频段给用户且有间隔 ​ TDMA&#xff08;时分复用&#xff09;&am…

MobileNet系列论文

传统CNN&#xff0c;内存需求量大、运算量大&#xff0c;导致无法在移动设备以及嵌入式设备上运行。MobileNet是Google团队在2017年提出&#xff0c;专注于移动端或者嵌入式设备中的轻量级CNN网络。相比于传统的CNN&#xff0c;在准确率下幅度下降的前提下大大减少了模型参数与…

订单助手,拼多多,淘宝或者自定义商城,自动下单发货,无人值守店铺

之前做的小工具软件&#xff0c;拿出来赚钱生活费 无人值守商城店铺订单管理功能&#xff1a; 1、拼多多&#xff0c;淘宝等商城店铺客户下订单后&#xff0c;自动获取未发货订单&#xff0c;去第三方平台商城下单 2、第三方商城发货后&#xff0c;自动把发货物流数据同步过…

chatgpt赋能python:Python自动发货:将你的电商店铺做到极致!

Python自动发货&#xff1a;将你的电商店铺做到极致&#xff01; 随着电商市场的不断发展&#xff0c;电商平台越来越多&#xff0c;对于卖家而言&#xff0c;如何快速而又高效地管理订单和处理发货成为了一个重要的课题。传统的手动发货方式无疑是低效的&#xff0c;费时费力…

淘宝自动发货助手插旗API接口,实现订单插旗颜色标注,自动发货接口

淘宝自动发货助手插旗API接口&#xff0c;实现订单插旗颜色标注&#xff0c;自动发货接口