现在的位置: 首页 > 综合 > 正文

实训C++语言设计——BookManage图书管理系统

2012年12月16日 ⁄ 综合 ⁄ 共 4143字 ⁄ 字号 评论关闭

平台:VC++ 2005 测试通过!
.vcproj
这是使用应用程序向导生成的 VC++ 项目的主项目文件。
它包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
StdAfx.h, StdAfx.cpp
这些文件用于生成名为 twod.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。
这些都是使用应用程序向导生成的 VC++ 文件故不列出
我只列出程序主要部分!

// BookManage_FILE.h

#include <iostream>
#include <fstream>
#include <list>
#include <algorithm>
#include <string>
using namespace std;

const char* szDbName = "output.data";
const char* szFileName = "bookinfo.txt";

typedef struct {
 char key[14];//要多分配一个单元用来存放'/0'
    string BookName;
 string Author;
    string Publisher;
 string PubDate;
} BookRecord;

typedef list<BookRecord> BookList;

//从文本文件中读取图书信息,文本的格式为
//7-05-012050-5|计算机算法|李劲|高等教育出版社|2002-5-1
bool readDataFromFile(BookList& BL);
void genDB(const BookList& BL);
void PrintBookInfo(const BookList& BL);
bool KeyComp(const BookRecord& br1, const BookRecord& br2);
bool NameComp(const BookRecord& br1, const BookRecord& br2);
bool AuthorComp(const BookRecord& br1, const BookRecord& br2);
bool PubDateComp(const BookRecord& br1, const BookRecord& br2);

bool KeyComp(const BookRecord& br1, const BookRecord& br2){  
 if (br1.key[0] < br2.key[0]) return true;
 else return false;
}

bool NameComp(const BookRecord& br1, const BookRecord& br2){
 if (br1.BookName < br2.BookName) return true;
 else return false;
}

bool AuthorComp(const BookRecord& br1, const BookRecord& br2){
 if (br1.Author < br2.Author) return true;
 else return false;
}

bool PubDateComp(const BookRecord& br1, const BookRecord& br2){
 if (br1.PubDate < br2.PubDate) return true;
 else return false;
}

void PrintBookInfo(const BookList& BL){ 
 if( BL.empty() )
  cout<<"没有图书信息!";
 else{
     /*定义遍历链表的迭代子*/
  list<BookRecord>::const_iterator iter = BL.begin();  
  for(int i = 0; i<BL.size(); i++ ){
      cout<<(*iter).key<<" | "
           <<(*iter).BookName<<" | "
           <<(*iter).Author<<" | "
        <<(*iter).Publisher<<" | "
        <<(*iter).PubDate<<endl;             
         iter++;
        }
        cout << endl;
 }
}

 

bool readDataFromFile(BookList& BL){
         //打开图书文本文件
      ifstream bkFile(szFileName);
         if ( !bkFile ) {
               cerr << "不能打开文件 -" <<szFileName;
      cout<<endl;
               return false;
         }  
   //存放一条图书记录
   string strBookRec;
   BookRecord abookRec;        
   while( getline(bkFile,strBookRec) ){            
            /*将strBookRec按'|'进行分解*/
            int pos;
      pos = strBookRec.find_first_of('|');     
      strcpy(abookRec.key, strBookRec.substr(0,pos).c_str());                           
      strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串
     
      pos = strBookRec.find_first_of('|');
      abookRec.BookName = strBookRec.substr(0,pos); // 前面的n个字符
               strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串
     
      pos = strBookRec.find_first_of('|');
      abookRec.Author = strBookRec.substr(0,pos); // 前面的n个字符
               strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串
     
      pos = strBookRec.find_first_of('|');
      abookRec.Publisher = strBookRec.substr(0,pos); // 前面的n个字符
               strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串
     
      pos = strBookRec.find_first_of('|');
      abookRec.PubDate = strBookRec.substr(0,pos); // 前面的n个字符
               strBookRec = strBookRec.substr(pos+1,strBookRec.length()); // 从中间第n+1字符到未尾的字符串     
                    
      BL.push_back(abookRec);     
   }
   return true;
}

void genDB(const BookList& BL){
         ofstream outfile(szDbName);
   list<BookRecord>::const_iterator iter = BL.begin();  
  
   if(!outfile)
    cerr << "无法创建图书信息数据库!";
   else {       
       for(int i = 0; i<BL.size(); i++ ){
    outfile <<(*iter).key<<" | "
              <<(*iter).BookName<<" | "
              <<(*iter).Author<<" | "
           <<(*iter).Publisher<<" | "
           <<(*iter).PubDate<<endl;             
         iter++;
              } //end for
   }
  

// BookManage_FILE.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "BookManage_FILE.h"

//下面定义了一个比较函数指针数组
bool (*sort_func_addrs[4])(const BookRecord&, const BookRecord&) = {
              KeyComp, NameComp, AuthorComp, PubDateComp
};

int _tmain(int argc, _TCHAR* argv[])
{
 BookList  aBookList;
 if (readDataFromFile(aBookList)){
      cout <<"请选择书籍信息的排序标准"<<endl
         <<"0. 书号, 1. 书名, 2. 作者, 3. 出版日期 :";
         int sortcriterion = 0;
      cin >> sortcriterion;         
         aBookList.sort(sort_func_addrs[sortcriterion]);
      PrintBookInfo(aBookList);
   genDB(aBookList);
 }
 
 return 0;
}

 

抱歉!评论已关闭.