联系方式

  • QQ:99515681
  • 邮箱:99515681@qq.com
  • 工作时间:8:00-23:00
  • 微信:codinghelp

您当前位置:首页 >> C/C++编程C/C++编程

日期:2018-07-18 01:09

/******头文件(.h)***********/

#include "stdio.h"   /*I/O函数*/

#include "stdlib.h" /*标准库函数*/

#include "string.h"/*字符串函数*/

#include "ctype.h" /*字符操作函数*/

#include <windows.h>



#define M 50  /*定义常数表示记录数*/


typedef struct /*定义数据结构*/

{

  char num[20]; /*书号*/

  char name[20];  /*书名*/

  char auther[20];  /*作者*/

  char money[20];  /*单价*/

  char quantity[20]; /*数量*/

  char type[50];  

}ADDRESS;


int enter(ADDRESS t[]); /*输入记录*/

void list(ADDRESS t[],int n); /*显示记录*/

void search(ADDRESS t[],int n); /*按书号查找显示记录*/

int  dele(ADDRESS t[],int n); /*删除指定书号记录*/

int  add(ADDRESS t[],int n); /*插入记录*/

void save(ADDRESS t[],int n); /*记录保存为文件*/

int load(ADDRESS t[]);  /*从文件中读记录*/

void display(ADDRESS t[]); /*按书号查找显示记录*/

void sort(ADDRESS t[],int n); /*按数量排序*/

void qseek(ADDRESS t[],int n); /*快速查找书号记录*/

void copy();  /*文件复制*/

void print(ADDRESS temp); /*显示单条记录*/

int find(ADDRESS t[],int n,char *s) ; /*查找函数*/

int menu_select();  /*主菜单函数*/

void gotoxy(int x,int y);


/******主函数开始*******/

void main()

{

ADDRESS adr[M];  /*定义结构体数组*/

  int length;  /*保存记录长度*/

  system("cls");  /*清屏*/

printf("\n");

printf("\n");

printf("\n");

printf("\n");

printf("\n");

printf("\n");

printf("          ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");

printf("                         ☆☆☆☆☆☆☆☆☆☆                     \n");

printf("                                                                  \n");

printf("                         欢迎来到图书管理系统                     \n");

printf("                                                                  \n");

printf("          ★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");

printf("                         ★★★★★★★★★★                     \n");

getchar();


  for(;;)/*无限循环*/

  {

     switch(menu_select())   /*调用主菜单函数,返回值整数作开关语句的条件*/

     {

case 0:length=enter(adr);break;/*输入记录*/

case 1:list(adr,length);break; /*显示全部记录*/

case 2:search(adr,length);break; /*查找书号记录*/

case 3:length=dele(adr,length);break; /*删除指定的书号记录*/

case 4:length=add(adr,length);  break;   /*插入记录*/

case 5:save(adr,length);break; /*保存文件*/

case 6:length=load(adr); break; /*读文件*/

case 7:display(adr);break;  /*按书号显示记录*/

case 8:sort(adr,length);break; /*按入住人数排序*/

case 9:qseek(adr,length);break; /*快速查找指定的书号记录*/

case 10:copy();break; /*复制文件*/

case 11:exit(0); /*如返回值为11则程序结束*/

     }

  }

}




menu_select()

{

  char s[80];

  int c;

  getchar(); /*读入任意字符*/

  system("cls"); /*清屏*/

  gotoxy(0,0);

  printf("﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡\n");

  printf("﹡                                                          ﹡\n");

  printf("﹡ *                  欢迎来到图书管理系统                * ﹡\n");

  printf("﹡ *                                                      * ﹡\n");

  printf("﹡ *                     张特    测151班                  * ﹡\n");

  printf("﹡ *                                                      * ﹡\n");

  printf("﹡ *                        150932                        * ﹡\n");

  printf("﹡ *                                                      * ﹡\n");

  printf("﹡ *                     0. 输入图书信息                  * ﹡\n");

  printf("﹡ *                     1. 列出图书信息                  * ﹡\n");

  printf("﹡ *                     2. 搜索图书信息                  * ﹡\n");

  printf("﹡ *                     3. 删除图书信息                  * ﹡\n");

  printf("﹡ *                     4. 添加图书信息                  * ﹡\n");

  printf("﹡ *                     5. 保存图书信息                  * ﹡\n");

  printf("﹡ *                     6. 读取图书信息                  * ﹡\n");

  printf("﹡ *                     7. 按命令显示记录                * ﹡\n");

  printf("﹡ *                     8. 整理新文件                    * ﹡\n");

  printf("﹡ *                     9. 快速查找记录                  * ﹡\n");

  printf("﹡ *                    10. 将文件复制到新文件            * ﹡\n");

  printf("﹡ *                    11. 退出                          * ﹡\n");

  printf("﹡                                                          ﹡\n");

  printf("﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡﹡\n");

  do{

     printf("\n 请输入您的选项(0~12):"); /*提示输入选项*/

     scanf("%s",s); /*输入选择项*/

     c=atoi(s); /*将输入的字符串转化为整型数*/

  }while(c<0||c>11); /*选择项不在0~11之间重输*/

  return c; /*返回选择项,主程序根据该数调用相应的函数*/

}



/*输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/

int  enter(ADDRESS t[]){

  int i,n;

  system("cls"); /*清屏*/

  printf("\n请输入数字 \n"); /*提示信息*/

  scanf("%d",&n); /*输入记录数*/

  printf("请输入记录 \n"); /*提示输入记录*/

  printf("书号        书名      作者      单价      数量\n");

  printf("------------------------------------------------\n");

  for(i=0;i<n;i++)

  {

     scanf("%s%s%s%s%s",t[i].num,t[i].name,t[i].auther,t[i].money,t[i].quantity);  /*输入记录*/

     printf("----------------------------------------------\n");

  }

  return n;  /*返回记录条数*/

}


/*显示记录,参数为记录数组和记录条数*/

void list(ADDRESS t[],int n)

{

  int i;

  system("cls");

  printf("\n\n*******************ADDRESS******************\n");

  printf("书号        书名      作者      单价      数量\n");

  printf("------------------------------------------------\n");

  for(i=0;i<n;i++)

  printf("%-10s%-10s%-10s%-10s%-10s\n",t[i].num,t[i].name,t[i].auther,t[i].money,t[i].quantity);

  if((i+1)%10==0)   /*判断输出是否达到10条记录*/

  {

     printf("请按任意键继续...\n"); /*提示信息*/

     getchar();  /*压任意键继续*/

  }

  printf("************************end*******************\n");

  getchar();

}


/*查找记录*/

void search(ADDRESS t[],int n)

{

  char s[20];   /*保存待查找书号字符串*/

  int i;   /*保存查找到结点的序号*/

  system("cls");   /*清屏*/

  printf("请输入待查书号\n");

  scanf("%s",s); /*输入待查找书号*/

  i=find(t,n,s); /*调用find函数,得到一个整数*/

  if(i>n-1)  /*如果整数i值大于n-1,说明没找到*/

     printf("没有找到\n");

  else

     print(t[i]);  /*找到,调用显示函数显示记录*/

}

/*显示指定的一条记录*/

void print(ADDRESS temp)

{

  system("cls");

  printf("\n\n********************************************\n");

  printf("书号        书名      作者      单价      数量\n");

  printf("------------------------------------------------\n");

  printf("%-10s%-10s%-10s%-10s%-10s\n",temp.num,temp.name,temp.auther,temp.money,temp.quantity);

  printf("**********************end***********************\n");

  getchar();

}

/*查找函数,参数为记录数组和记录条数以及姓名s */

int find(ADDRESS t[],int n,char *s)

{

  int i;

  for(i=0;i<n;i++)/*从第一条记录开始,直到最后一条*/

  {

     if(strcmp(s,t[i].num)==0)  /*记录中的书号和待比较的书号是否相等*/

     return i;   /*相等,则返回该记录的下标号,程序提前结结束*/

  }

  return i;  /*返回i值*/

}

/*删除函数,参数为记录数组和记录条数*/

int dele(ADDRESS t[],int n)

{

  char s[20];  /*要删除记录的姓名*/

  int ch=0;

  int i,j;

  printf("请输入要删除的书号\n"); /*提示信息*/

  scanf("%s",s);/*输入书号*/

  i=find(t,n,s); /*调用find函数*/

  if(i>n-1)  /*如果i>n-1超过了数组的长度*/

     printf("没有找到要删除的记录\n"); /*显示没找到要删除的记录*/

  else

  {

     print(t[i]); /*调用输出函数显示该条记录信息*/

     printf("确定是否要删除(1/0)\n");  /*确认是否要删除*/

     scanf("%d",&ch);  /*输入一个整数0或1*/

     if(ch==1)  /*如果确认删除整数为1*/

     {

for(j=i+1;j<n;j++)  /*删除该记录,实际后续记录前移*/

{

   strcpy(t[j-1].num,t[j].num); /*将后一条记录的书号拷贝到前一条*/

   strcpy(t[j-1].name,t[j].name); /*将后一条书名拷贝到前一条*/

   strcpy(t[j-1].auther,t[j].auther); /*将后一条记录的作者拷贝到前一条*/

strcpy(t[j-1].money,t[j].money); /*将后一条记录的单价拷贝到前一条*/

   strcpy(t[j-1].quantity,t[j].quantity); /*将后一条记录的数量拷贝到前一条*/

}

n--;  /*记录数减1*/

     }

  }

  return n;  /*返回记录数*/

}

/*插入记录函数,参数为结构体数组和记录数*/

int add(ADDRESS t[],int n)/*插入函数,参数为结构体数组和记录数*/

{

  ADDRESS temp;  /*新插入记录信息*/

  int i,j;

  char s[20]; /*确定插入在哪个记录之前*/

  printf("请输入插入记录\n");

  printf("************************************************\n");

  printf("书号        书名      作者     单价      数量\n");

  printf("--------------------------------------------------\n");

  scanf("%s%s%s%s%s",temp.num,temp.name,temp.auther,temp.money,temp.quantity); /*输入插入信息*/

  printf("------------------------------------------------\n");

  printf("请输入插入的书号 \n");

  scanf("%s",s); /*输入插入位置的书号*/

  i=find(t,n,s);  /*调用find,确定插入位置*/

  for(j=n-1;j>=i;j--)   /*从最后一个结点开始向后移动一条*/

  {

     strcpy(t[j+1].num,t[j].num); /*当前记录的书号拷贝到后一条*/

     strcpy(t[j+1].name,t[j].name); /*当前记录的书名拷贝到后一条*/

     strcpy(t[j+1].auther,t[j].auther); /*当前记录的作者拷贝到后一条*/

 strcpy(t[j+1].money,t[j].money); /*当前记录的单价拷贝到后一条*/

     strcpy(t[j+1].quantity,t[j].quantity); /*当前记录的数量拷贝到后一条*/

  }

  strcpy(t[i].num,temp.num); /*将新插入记录的书号拷贝到第i个位置*/

  strcpy(t[i].name,temp.name); /*将新插入记录的书名拷贝到第i个位置*/

  strcpy(t[i].auther,temp.auther); /*将新插入记录的作者拷贝到第i个位置*/

  strcpy(t[i].money,temp.money); /*将新插入记录的单价拷贝到第i个位置*/

  strcpy(t[i].quantity,temp.quantity); /*将新插入记录的数量拷贝到第i个位置*/

  n++;   /*记录数加1*/

  return n; /*返回记录数*/

}

/*保存函数,参数为结构体数组和记录数*/

void save(ADDRESS t[],int n)

{

  int i;

  FILE *fp;  /*指向文件的指针*/

  if((fp=fopen("record.txt","wb"))==NULL)  /*打开文件,并判断打开是否正常*/

  {

     printf("不能打开\n");/*没打开*/

     exit(1);  /*退出*/

  }

  printf("\n保存文件\n"); /*输出提示信息*/

  fprintf(fp,"%d",n);  /*将记录数写入文件*/

  fprintf(fp,"\r\n");  /*将换行符号写入文件*/

  for(i=0;i<n;i++)

  {

     fprintf(fp,"%-20s%-20s%-20s%-20s%-20s",t[i].num,t[i].name,t[i].auther,t[i].money,t[i].quantity);/*格式写入记录*/

     fprintf(fp,"\r\n"); /*将换行符号写入文件*/

  }

  fclose(fp);/*关闭文件*/

  printf("****文件保存成功***\n"); /*显示保存成功*/

  getchar();

}

/*读入函数,参数为结构体数组*/

int load(ADDRESS t[])

{

  int i,n;

  FILE *fp; /*指向文件的指针*/

  if((fp=fopen("record.txt","rb"))==NULL)/*打开文件*/

  {

     printf("不能打开文件\n");  /*不能打开*/

     exit(1);  /*退出*/

  }

  fscanf(fp,"%d",&n); /*读入记录数*/

  for(i=0;i<n;i++)

     fscanf(fp,"%20s%20s%20s%20s%20s",t[i].num,t[i].name,t[i].auther,t[i].money,t[i].quantity); /*按格式读入记录*/

  fclose(fp);  /*关闭文件*/

  printf("你已经成功保存文件!!!\n"); /*显示保存成功*/

  return n; /*返回记录数*/

  getchar();

}

/*按序号显示记录函数*/

void display(ADDRESS t[])

{

  int id,n;

  FILE *fp; /*指向文件的指针*/

  if((fp=fopen("record.txt","rb"))==NULL) /*打开文件*/

  {

     printf("不能打开文件\n"); /*不能打开文件*/

     exit(1);  /*退出*/

  }

  printf("请输入序号...\n"); /*显示信息*/

  scanf("%d",&id);  /*输入序号*/

  fscanf(fp,"%d",&n); /*从文件读入记录数*/

  if(id>=0&&id<n) /*判断序号是否在记录范围内*/

  {

     fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/

     print(t[id]); /*调用输出函数显示该记录*/

     printf("\r\n");

  }

  else

     printf("序号不合理!!!\n ",id); /*如果序号不合理显示信息*/

  fclose(fp);  /*关闭文件*/

}

/*排序函数,参数为结构体数组和记录数*/

void sort(ADDRESS t[],int n)

{

  int i,j,flag;

  ADDRESS temp; /*临时变量做交换数据用*/

  for(i=0;i<n;i++)

  {

     flag=0;  /*设标志判断是否发生过交换*/

     for(j=0;j<n-1;j++)

     if((strcmp(t[j].num,t[j+1].num))>0) /*比较大小*/

     {

flag=1;

strcpy(temp.num,t[j].num);  /*交换记录*/

strcpy(temp.name,t[j].name);

strcpy(temp.auther,t[j].auther);

 strcpy(temp.money,t[j].money);

strcpy(temp.quantity,t[j].quantity);

strcpy(t[j].num,t[j+1].num);

strcpy(t[j].name,t[j+1].name);

strcpy(t[j].auther,t[j+1].auther);

 strcpy(t[j].money,t[j+1].money);

strcpy(t[j].quantity,t[j+1].quantity);

strcpy(t[j+1].num,temp.num);

strcpy(t[j+1].name,temp.name);

strcpy(t[j+1].auther,temp.auther);

strcpy(t[j+1].money,temp.money);

strcpy(t[j+1].quantity,temp.quantity);

     }

     if(flag==0)break;  /*如果标志为0,说明没有发生过交换循环结束*/

  }

  printf("排序成功了!!!\n"); /*显示排序成功*/

  getchar();

}

/*快速查找,参数为结构体数组和记录数*/

void qseek(ADDRESS t[],int n)

{

  char s[20];

  int l,r,m;

  printf("\n查找之前请确认记录是否已经排序!\n"); /*提示确认在查找之前,记录是否已排序*/

  printf("请输入书号进行排序\n"); /*提示输入*/

  scanf("%s",s); /*输入待查找的书名*/

  l=0;r=n-1;  /*设置左边界与右边界的初值*/

  while(l<=r) /*当左边界<=右边界时*/

  {

     m=(l+r)/2; /*计算中间位置*/

     if(strcmp(t[m].num,s)==0) /*与中间结点姓名字段做比较判是否相等*/

     {

print(t[m]); /*如果相等,则调用print函数显示记录信息*/

return ; /*返回*/

     }

     if(strcmp(t[m].num,s)<0)  /*如果中间结点小*/

l=m+1;  /*修改左边界*/

     else

r=m-1; /*否则,中间结点大,修改右边界*/

  }

  if(l>r)   /*如果左边界大于右边界时*/

     printf("没找到\n"); /*显示没找到*/

}

/*复制文件*/

void copy()

{

  char outfile[20]; /*目标文件名*/

  int i,n;

  ADDRESS temp[M];  /*定义临时变量*/

  FILE *sfp,*tfp; /*定义指向文件的指针*/

  system("cls");/*清屏*/

  if((sfp=fopen("record.txt","rb"))==NULL) /*打开记录文件*/

  {

     printf("不能打开文件信息\n"); /*显示不能打开文件信息*/

     exit(1); /*退出*/

  }

  printf("请输入目标文件名,例如 c:\\f1\\te.txt:\n"); /*提示信息*/

  scanf("%s",outfile); /*输入目标文件名*/

  if((tfp=fopen(outfile,"wb"))==NULL) /*打开目标文件*/

  {

     printf("不能打开文件信息\n"); /*显示不能打开文件信息*/

     exit(1); /*退出*/

  }

  fscanf(sfp,"%d",&n); /*读出文件记录数*/

  fprintf(tfp,"%d",n);/*写入目标文件数*/

  fprintf(tfp,"\r\n"); /*写入换行符*/

  for(i=0;i<n;i++)

  {

     fscanf(sfp,"%20s%20s%20s%20s%20s\n",temp[i].num,temp[i].name,

temp[i].auther,temp[i].money,temp[i].quantity); /*读入记录*/

     fprintf(tfp,"%-20s%-20s%-20s%-20s%-20s\n",temp[i].num,

temp[i].name,temp[i].auther,temp[i].money,temp[i].quantity); /*写入记录*/

     fprintf(tfp,"\r\n"); /*写入换行符*/

  }

  fclose(sfp); /*关闭源文件*/

  fclose(tfp); /*关闭目标文件*/

  printf("复制成功!!!\n"); /*显示复制成功*/

}






void gotoxy(int x,int y) //cursor an gewuenschte position auf dem bildschirm setzen

{

CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //variablendklaration

HANDLE hConsoleOut;


hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);

GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);


csbiInfo.dwCursorPosition.X = x; //cursorposition X koordinate festlegen

csbiInfo.dwCursorPosition.Y = y; //cursorposition Y koordinate festlegen

SetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition); //den cursor an die festgelegte koordinate setzen

}


版权所有:留学生编程辅导网 2020 All Rights Reserved 联系方式:QQ:99515681 微信:codinghelp 电子信箱:99515681@qq.com
免责声明:本站部分内容从网络整理而来,只供参考!如有版权问题可联系本站删除。 站长地图

python代写
微信客服:codinghelp