图书管理系统 C语言

图书管理系统 C语言,第1张

图书管理系统 C语言

前言

​  ​  这是我学习C语言的第三个较正式的小项目,同样也是目前代码量和难度最大的一个挑战。这个图书管理的开发整体框架图如下,我自己凭借我能够想到的做了这么一个框架图,然后不断地去实现这些划分出来的模块。

思路分析

 ​   整个系统是由一个个小的功能模块组成的,我将其用思维导图的方式展现出来更有利于去实现这些功能模块。

 ​   图书管理系统由图书信息系统和借阅系统组成,图书信息系统是管理图书库存的,通过它实现图书的增加、删除以及像用户展示图书信息的功能,而借阅系统则是实现用户借书还书以及查询借书情况功能。

 ​  通过不断细分的模块去实现这些功能,一边写一边调试。

具体实现
  1. 首先,经过思考,把这些功能模块用函数表达出来,尽量思考的全面,先通过函数声明以及定义把它们放到框架里面,然后一个一个具体的去写相应的代码。

    #define _CRT_SECURE_NO_WARNINGS  //用于scanf警告
    
    //头文件  
    #include
    #include //用于字符串比较 登陆系统以及查找信息
    #include
    #include //背景色 屏幕清除
    #include 	getch()函数
    
    //宏定义
    #define SIZE 20
    #define ACCOUNT_PASSWORD "beipiao_707770"
    #define LEN sizeof(struct book) //分配内存
    #define LEN1 sizeof(struct reader)
    #define ABC 'chaz'-'0' /*后面变量名太多 并且提示字符常量过多 用此表                        */
    
    /* 结构体定义 */
    
    //图书信息
    struct book{
        char name[SIZE];    //书名
    	char author[SIZE];  //作者
    	char publish[SIZE]; //出版社
    	int  amount;        //数量
    	float price;        //单价
    	struct book* next;
    };
    //借阅者信息
    struct reader{
        char rname[SIZE];  //姓名
    	char bname[SIZE];  //借阅书名
    	char date[SIZE];   //借阅时间
    	int rnum;          //数量
    	struct reader* next;
    };
    
    /* 函数声明 */
    
    //初始化页面
    void menu();
    //选择系统
    void SelectSystem();
    //书籍数量
    int NUM_BOOk();  //返回值为int类型
    //借书人信息
    int NUM_READER(); //返回值为int类型
    
    //图书管理系统
    void Library_System();
    //新建图书信息
    void New_Bulit();
    //删除图书信息
    void Delete();
    //查询图书信息
    void Inquire();
    //浏览图书信息 (打印)
    void Browse();
    //返回上一级  
    void Return(int i);
    
    //借阅系统
    void Lending_System();
    //借书
    void Lending();
    //还书
    void Repay();
    //查询借书情况】
    void Show_Lending();
    //查询信息
    void Show_Look();
    
    

 ​  这里面有我自己最开始就已经想到的,也有后面增加的,有的函数所实现的功能与我预想的不符,但还是可以用。

2.具体实现 函数定义

  • 通过函数来统计书籍的数量以及借阅者信息,返回值为int类型。为后面的循环提供条件。
/* 函数定义 */

//书籍数量信息
int NUM_BOOK()
{
    FILE*fp;
    int txcl=0,n;
    float tprice =0;
    char tname[SIZE]={'}',[tauthor]SIZE='}'{,[]tpublish=SIZE'}';{=fopen(
    fp"library.txt","r");//以只读形式打开文件for( =
    0 ;n!feof();++fp)//逐个打开文件    nfscanf( ,
        "%s%s%s%d%f",fp,,,tname&tauthor,tpublish&)txcl;--tprice;//n初始赋值为0
  	nfclose(  )
    ;//关闭文件fpreturn( )
    
    ;}n//借书人信息int
    NUM_READER

(
 ) *;int
 {
     FILE=p0
     , ID;char[n]
     = lname'}'SIZE,[{]='0},lsname[SIZE]={'ldate}SIZE;={fopen\("reader.txt",
     fp"r");//以只读方式打开文件for(=0 ;
     !feofn();++);fp//逐个打开文件fscanfn(,"%d%s%s%s "  ,
     	&,fp&,&,ID);lname--;ldate//n初始赋值为0lsnamefclose(
     n); return
     ( )fp;}
     
     //新建图书信息 voidnNew_Bulit(
 )

 ​   这三个页面我写的很粗糙,还可以进行优化,返回上一级这个函数我开始是没有想到的,但最开始写到这里时才发现不返回上一级很难处理,所以就加了一个返回上一级的函数,同样也可以进行优化。思路都是一样的,通过按键或者输入数据进行判断,调用上一级函数。

 ​   账号登录这里我没有进行分开处理,分开处理需要加加两个储存账户和密码的文件,和借阅者信息文件一样的,输入错误这里也是,我并没有具体的去实现重新输入。我这个是1.0版本,不出意外的话以后会进行优化,学习其他的语言之后可能也会做一个类似的项目,虽然目前这个我觉得都不能称之为项目(哈哈) 。,。
 ​  这里开始用了system()进行了屏幕清除,后面也有用到,头文件为#include


//返回上一级
void Return (int i)
{
    switch (i) {
        case 1: Library_System();
            break;
        case 2: Lending_System();
            break;
    }
}


//初始化页面
void menu()
{
	int i;
	char m[SIZE]; //账户及密码

	printf("****************************************************\n");
	printf("*              欢迎使用图书管理系统1.0             *\n");
	printf("*          1. 登录系统       2. 退出系统           *\n");
	printf("****************************************************\n");
	printf("\n");
	printf("请输:->");

	scanf("%d", &i);

	//登录 
	if (i == 1) {

		int ret_1; //比较结果

		//输入
		printf("输入账户及密码:");
		scanf("%s", m);
		//s_gets(m, SIZE);
	
		//判断是否正确  
		ret_1 = strcmp(m, ACCOUNT_PASSWORD);
		if (ret_1 == 0)
		{
			printf("登录成功!\n");
			system("cls");
			//选择系统
			SelectSystem();
		}	   
	}
	//退出
	else {
		return;
	} 
}


//图书管理系统
void Library_System()
{
	int i;

	system("cls");

	printf("****************************************************\n");
	printf("*          1.新建  2.删除       3.查询              *\n");
	printf("*          4.浏览  5.返回上一级  6.结束              *\n");
	printf("****************************************************\n");
	printf("\n");
	printf("请输:->");

	scanf("%d", &i);

	switch (i) 
	{
		case 1:New_Bulit();
			break;
		case 2:Delete();
			break; 
		case 3:Inquire();
			break; 
		case 4:Browse();
			break; 
		case 5:Return(1);
			break;
		case 6:return 0;
			break;
	}
}

//借阅系统
void Lending_System()
{
	int i;

	printf("****************************************************\n");
	printf("*                 1.借书       2.还书               *\n");
	printf("*                 3.查询       4.浏览               *\n");
	printf("*                 5.返回上一级  6.结束               *\n");
	printf("****************************************************\n");
	printf("\n");
	printf("请输:->");

	scanf("%d", &i);

	switch (i)
	{
		case 1:Lending();
			break;
		case 2:Repay();
			break;
		case 3:Inquire();
			break;
		case 4:Browse();
			break;
		case 5:Return(1);
			break;
		case 6:return 0;
			break;
	default:printf("输入有误,重新输入!\n");
			break;
	}
}
  • 新建图书信息这些功能都涉及了文件和链表 *** 作,文件的建立、读写,链表的增加、删除。
*
; char[]
{
    FILE =fp'0},bauthor[SIZE]={'
    '},bpublish[SIZE]={' bname0SIZE};{int\=0\;'float=
    0 bamount;system(
    "cls" bprice);if
    
    ((=fopen(
    "library.txt","r"fp))==NULL)//打开文件=fopen("library.txt", "w"
    {
        fp);//以只写的形式打开文件,若不存在则新建fclose();}=
        fopen(fp"library.txt",
    "a"
    fp);//以追加的形式打开文件,若不存在则新建printf("\n请按以下格式输入图书信息:\n 书名  作者  出版社   进库量  单价"); for
    (;!=27;
    ) //为了实现一次输入后按esc退出  这是我没有想到的printfi("请输入:\n"); scanf
    {
        ("%s%s%s%d%f",,,
        ,&,&bname)bauthor;bpublishfprintf(bamount,"%-9s%-14s%-16s%-7d%-.2f\n"bprice,,
        ,,fp,);bnameprintfbauthor(bpublish"继续输入请按回车,结束请按Esc\n"bamount)bprice;=
        _getch();//用getch 会有报错
        ifor(;!=13 &&
        != 27;i)/*证只能是CR和Esc才能退出循环,输入其他字符无用,暂停程序,按‘CR’继续*/=i_getch(); }
         ifclose();printf
    (
    " *** 作成功,按任意键返回上一级!\n")fp;Library_System
    ();}//删除图书信息
    voidDelete()
struct

  • 删除图书信息和新建图书类似,把删除后的链表覆盖到原有文件
book
* =NULL;
{
 	//头结点 structbookhead*,* ,
    * ;intp=0p1,=p20
    , tamount ,;floatn=0;jchark[
    ] tprice='}',
    [ tname]SIZE='}'{,[]tauthor=SIZE'}',{[]=tpublish'}'SIZE;char{[]=tnum'}'SIZE;//删除书籍的名字{char;*
    ; dnameifSIZE(({=fopen( "library.txt"
    , i"r"
    FILE )fp)
    
    ==NULL)fp//打开文件,判断system("cls");printf("\n记录文件不存在,按任意键返回!")getch (
    {
        );Return(1
        );}else:
        —//实现删除功能system("cls"
        ) ;printf("\n请输入要删除的书籍名字:"
    )
    ; scanf
    {
        ( "%s",);
        printf("\n确认删除请回车,取消请按Esc\n");
        =_getch()dname;for
        (;!=13&&
        i!=27;)=
        _getch ()i;if(i=27)//取消
            iReturn(1);
		=fopeni("library.txt", "r"
       		);=NUM_BOOK(
        fp);for(=0;<
        j;++)fsanf(
        
        , "%s%s%s%d%f"k,,,k,j&k,&
        {
			);fpif(strcmptname(tauthor,tpublish))tamount//将不同名字的信息复制到链表++tprice;//比较结果相同则n=0,不执行if,不同则执行
            if(==1dname)tname//建立链表= =
            {
                n(struct book
                *)nmalloc() ;
                {
                    p1=p2;}else =;=;=LEN(struct
                    headbookp1*
                )
                malloc
                {
                    p2->next(p1)
                    p2;p1//新建链表
                    p1}strcpy( ,);//复制书名strcpyLEN(, )
                ;
                //复制作者名字strcpyp1->name(tname,);
                //复制出版社=p1->author;tauthor//复制数量=;
                //复制单价}p1->publishiftpublish(== 0
                p1->amount)tamount//图书只有一项且这一项刚好和要删除的相同=
                p1->priceNULLtprice; }
            else  
            //建立链表的最后一个储存空间=n;=NULL ;
            {
                headfclose()
            ;
            } }
            {
                p2->next=p1fopen
                p1->next("library.txt",
                "w")fp;//清空文件,只写打开,然后关闭
            fclose
        (
       	
        fp);=fopen("library.txt","a")
        ;//追加文件fp=;
        fpfor(;!=NULL;)//把链表内容覆盖到文件fprintf
        p(head,
        
        "%-9s%-14s%-16s%-7d%-8.2f\n",,p,,,);
        {
            =;fp} fclose( p->name) p->author; p->publishsystem  p->amount( p->price"cls")
		p ; p->nextprintf
        (
        "\n删除成功 \n按任意键返回上一层\n")fp;_getch
	();//返回上一层Return
	(1);}
	}//查询图书信息voidInquire(
	)*;int=
    0
,
  • 查询相对而言简单,在文件中去查找匹配,根据结果输出
=
0 ,=0
{
    FILE ,fp=
    0 k;float=camount0;charm[]=n'}',[
    ] price='}',
    [ cname]SIZE='}'{;char;cauthorcharSIZE[]{='}';cpublishifSIZE(({=fopen(
    "library.txt" i,
    "r" target)SIZE)=={NULL)//打开文件
    
    system("cls"fp);printf("\n记录文件不存在,按任意键返回!");_getch(); Return
    {
        (1);}
        system("cls");
        =NUM_BOOK()
        ; for(=0
    ;
    <;++)fscanf
    m(,"%s%s%s%d%f",,
    
    ,,n&,&n)m;nif(
    {
        !strcmpfp(,)cname||cauthor!cpublishstrcmp(camount,)cprice)if
        (==0)printftarget(cname"查询结果:\n\n");printf(target"书名\t\t作者\t\t出版社\t\t库存量\t单价\n"cauthor);
        {
            }printfk("%-8s%-14s%-16s%-7d%-8.2f\n",
            {
                ,,,,)
                ;++;}}
			if
            (==0)cname//文件夹为空则输出无记录并返回上一级cauthorsystemcpublish(camount"cls"cprice);
            kprintf(
        "\n无符合记录!\n"
	)
    ;_getchk(); Return
    {
        (1);}
        fclose();//查询结束
        _getch();
        Return (1);
    }
    //浏览图书信息 voidfpBrowse()
    *;int=
    0 ;int=0
,
  • 浏览图书则是把文件中的信息遍历之后打印出来
=
0 ,=0
{
    FILE;fpfloat
    = n0;char
    [ k]='}'m,[]amount='}',
    [ price]='}'
    ; namecharSIZE;if{((=authorfopenSIZE("library.txt"{,"r")publish)SIZE==NULL{)system(
    "cls" i)
    
    ;printf(fp"\n记录文件不存在,按任意键返回!");_getch();Return(1)
    {
        ;}=NUM_BOOK(
        );if(==
        0)system(
        "cls" );printf(
    "\n无任何记录!"
    
    n);}=fopen
    ("library.txt"n,"r")
    {
        ;//打开只读文件system("cls"
        );printf("\t书名\t作者\t出版社\t\t出版社\t\t库存量\t单价\n"
	)
    
    fp;for(=0;<;++
    )//输出数据fscanf(,
    "%s%s%s%d%f",,,,
    
    &,m&);mprintfn(m"%-14s%-16s%-18s%-7d%-8.2f\n", ,
    {
        ,,fp,);name}authorfclosepublish()amount;printfprice("\n按任意键返回\n"
       );_getch( name) author; publishReturn amount( price1) 
    ;
    }//借书fpvoidLending
    ()*,*
    ;structbook*
    ; structbook*,
*
  • 借书 首先判断是否存在要借的书,再进行下一步记录借阅者信息 *** 作 具体 *** 作没太明白(copy了一段)
,
* ;int,
{
    FILE,fp,=fp20
    , =0head,
    = 0;pint=p10;p2int
    = i0loop;kfloatn=0;flagchar[]s='}',
    [ lnum ] ='}'
    , lamount [ ]=
    '}' lprice,[]
    = tname'}'SIZE,[{]='}'tauthor,SIZE[]{='}',tpublish[SIZE]={'}';systemttname(SIZE"cls"){;if(rname(SIZE=fopen{("library.txt",date"r"SIZE)){==NULL)tanamesystemSIZE("cls"{);printf
    
    ("\n图书馆无库存,按任意键退出!");_getch
    ();fpexit(0);}elseprintf("\n请输入借阅书名:\n请输入:")
    {
        scanf("%s",)
        ;=NUM_BOOK()
        ;for(=
        0;<;++
    )
    //先将图书信息建立链表,更改库存
    {
        fscanf(,"%s%s%s%d%f",,,,taname&,
        k&);++;
 		 
        if(i==1)i=k=i(structbook
        {
            *)fpmalloc()tname;tauthor=tpublish;}lamountelse=price;=
           n;=
           (structnbook*)
           {
               p1mallocp2(); }strcpy(,)LEN;//复制书名
               headstrcpyp1(
			,
            )
            {
            	p2->next;p1//复制作者
                p2strcpyp1(
                p1,); //复制出版社=;//复制现存量=LEN;//复制单价
            }
            if(p1->name== tname0)=
			NULL;p1->authorelse tauthor=;=
			NULL;p1->publishfclose tpublish();
			p1->amount } lamount}=
			p1->price ; tpricefor(
        ;
        !=NULLn;)if
       		head(!strcmp
        (
        {
            p2->next,p1)
            p1->next)//判断要借的书是否存在=
            1;fp=;
        (
    )
    p--head;
    
    }=;pif(&&(
    {
        0))//存在被借图书并且库存大于0,把库存量变化后的链表存入文件=p->namefopentaname("library.txt",
        {
            flag"w");
            loopfclosep->amount(
            )p->amount;=fopen
        (
        p"library.txt"p->next,
        "a")flag;=loop>;for( ;
        {
            fp != NULL;)fprintf (,"%-9s%-14s%-16s%-7d%-8.2f\n"
		,,fp,,
		fp , );=; }free(
		p ) head;

		fclose () p ; if((
		{
			=fopenfp( "reader.txt", p->name"r" p->author) p->publish) p->amount== p->priceNULL)
			p //建读者文件夹存入借书信息 p->next=
		fopen
		("reader.txt"p,"w"
		);fp//打开只读文件fclose

		( );fp2 } =fopen("reader.txt" ,"a") ; printf("\n请按以下格式输入读者信息:\n 证号 姓名 借书日期 借书书名\n请输入:"
		{
			fp2 ) ;//录入读者信息scanf( "%d %s %s %s",&,
			,,fp2);
		fprintf
		fp2 ( ,"\n%-8d%-23s%-18s%-10s\n",, ,,)

		;fclose();printf
		("借书成功!请两个月内归还!!!按任意键返回\n"); _getchlnum( rname) date; taname//返回Return
		(2fp2) ;//调用借阅系统 lnum} rname} date} taname//还书void
		Repay(fp2)*
		,*;*,
		*,*;struct
		book*=NULL;struct
        book    
    *
,
  • 还书 先确定还书者信息,与借阅者文件比较,存在则删去他的信息并且书籍库存量加一。
*
, *;int
{
	FILE=fp0,fp2;
    strcut readerfloathead=0p1;charp2[
    20 ]=lhead1'}',[
    20 ]=zp1'}',lp1[20lp2]
    = txcl'}',[i20
    ] tprice='}';
    int tname=0, = { 0 ,= tauthor0,= 0 { , =0
		tpublish,=0 ; { char [20 ttname]='}' , { [ 20]
	= ttzhenghao '}' ,[ tzhenghao 20 ]= n '}' ,[ k 20 ]= t '}' ;char flag = 0;
	system tmingzi("cls") ; { if (( triqi=fopen( "reafer.txt" { , "r") tzname)==NULL ) { //不存在借书人 system( ttzname"cls"); printf { ( "\n不存在借书人,按任意键退出!")
	; hitkey _getch ()
    
    ;system("cls")
  {
    ;Return(fp2);}elseprintf("\n请输入读者证号和书名:\n请输入:");scanf(
    {
        "%d %s",&,)
        ;//输入还书证号和书名=NUM_READER(
        );//获取读者文件夹信息个数for
        (=0;<
        ; ++)//读取读者文件夹信息fscanf
    (
    ,
    {
        {
            "%d%s%s%s\n ",&,,
			,);if (ttzhenghao( ttzname==)&&
			k ! strcmp(,))
			//如果证号书名存在,则标记为1 =i 1 ;} i fclose k( i);=
			{
				fopen(fp"reader.txt" ,"r" )tzhenghao; tmingzi//打开读者文件,删除借书信息 triqiif tzname()
				for (=ttzhenghao 0 tzhenghao; < ;++)ttzname//将读者文件复制到链表 tznamefscanf(,
					flag "%d%s%s%s\n " ,&
			,
			,,fp);
			fp //读取文件信息 if(!( (==)&&
			! strcmpflag(
			{
				, )i ) )++ i ; kif i(==1
				{
					)=fp= (struct readertzhenghao* tmingzi) triqimalloc tzname();
					//新建链表 =;}elsettzhenghao = tzhenghao; = ;=(ttznamestruct tznamereader*)
					{
						nmalloc(
						) ;n //新建链表 }=
						{
							p1 ; p2 //复制证号 strcpy( ,);//复制读者名字strcpyLEN1(,)
							head ; p1//复制日
						strcpy
						(
						{
							p2->next , p1)
							p2 ; p1//复制书名
							p1 } }if (==0)=LEN1NULL;else
						=
						p1->rnum ; tzhenghao=NULL
						;fclosep1->rname( tmingzi);}
						=fopenp1->date( triqi"reader.txt","w"
						);p1->bname//清空读者文件 tznamefclose()
					;
				=
				fopen (n "reader.txt" ,"a"
					head ) ;//追加信息
				=
				{
					p2->next ; p1for
					p1->next ( ;!=
					NULL;fp)//把链表内容覆盖读者文件
				fprintf
				fp ( ,"\n%-8d%-23s%-18s%-10s\n",, ,,);
				=;fp}free
				fp ( );fclose( );}}
				p } head}
				if () p //标记为1,即还书时更改库存 printf("确认还书请按回车!")
				{
					;forfp( ;!= p->rnum13 p->rname&& p->date!= p->bname27;
					p ) p->next=
				_getch
				()p;if
				(==fp13)
        printf
     (
   "成功!按任意键返回!"
 )
    ; =flag0;
	{
		{
			{
				=0;=fopen
				( "library.txt", hitkey "r" ) ; hitkey //打开图书馆文件 =NUM_BOOK(
					hitkey ) ;//获取图书馆文件个数for(
				= 0hitkey ; <;
					++)//将图书馆文件复制到链表fscanf(
				n , "%s%s%d%f", flag , ,&
				fp3 , &);//读取信息 ++;if(
				k == 1)==(
				struct booki * )malloc i ( k) i;//新建链表=
				{
					;}fp2else =;tname= tauthor; =txcl( structtpricebook*)
					nmalloc(
					) ;n //新建链表 }strcpy
					{
						lp1 ( lp2 , ); //复制书名strcpy(,)LEN;//复制作者strcpy
						lhead1 ( lp1,
					)
					;
					{
						lp2->next //复制出版社 lp1=
						lp2 ; lp1//复制现存量
						lp1 = ;//复制单价 }if(==0LEN)=NULL
					;
					
					}elselp1->name= tname;=NULL
					;fcloselp1->author( tauthor);}
					}}lp1->publish= tpublish;for(
					lp1->amount ; txcl!= NULL
					lp1->price ; tprice)if
				(
				! (n strcmp (,
				{
					lhead1 ) ))
				//寻找书名相同
				++
				{
					lp2->next ( lp1)
					lp1->next ; //现存量加1=
					;}fp2=fopen
				(
			"library.txt"
		,
		zp1 "w" lhead1)
		; //清空图书馆文件fclose zp1 ( );=
		{
			fopen ("library.txt","a")zp1->name; ttzname//追加信息=;for
				(;zp1->amount!=NULL;
			zp1 ) zp1->next//把链表内容覆盖图书馆文件
		fprintf
		fp2 ( ,"-9s%-14s%-16s%-7d%-8.2f\n",, ,,,)
		;=fp;}
		fp2 fclose ();_getch ();//返回
		zp1 Return lhead1(
		2 ); zp1 //调用借阅系统 }elseprintf(
		{
			"不存在此信息!按任意键返回!")fp2; _getch(
				 zp1->name) zp1->author; zp1->publish//返回 zp1->amountReturn zp1->price(2
			zp1 ) zp1->next;
		//调用借阅系统
		}//查询借书情况fp2voidShow_Lending
		()*;int
		=0,=0,
	=
	0
		,=0,=
	0;char[]
	='}',[]=
'}'
  • 查询借书情况,把所有的借书信息打印出来
,
[ ]='}'
{
    FILE;fpif
    ( ID(=fopenxcl("reader.txt".n"r"))i==NULL)j//打开只读文件system(
    "cls" name)SIZE;printf{("\n记录文件不存在,按任意键返回!")date_getchSIZE(){;Return(bname2SIZE);{}==NUM_BOOK
    ();fpif(==0)system("cls");printf(
    {
        "\na无任何记录!");}=
        fopen("reader.txt","r");system
        ("cls");printf
    (
    n"\n证号\t读者姓名\t\t借书日期\t书名\n");for(
    ;!nfeof()
    {
        ;)//输出信息  foef()是在文件已经打开的基础上用于验证文件是否读取结束fscanf(
        ,"%d%s%s%s\n",&,
    ,
    fp,);printf("\n%-8d%-23s%-18s%-10s\n",,
    ,,);}
    fclose();printf
    ("\n按任意键返回!\n");_getch(fp);Return(
    {
        2)fp;}//查询信息voidIDShow_Lookname(date)bname*;
        int=0,ID=name0date,bname=0
    ,
    =0fp,=
    0;char[]
    ='}',[
    ]='}',[
]
  • 查询一个人的借书情况, 输入要查找的证件号或者姓名到借阅者文件里面匹配,输出相应的结果。
=
'}' ;char=
{
	FILE0fp;
    char num[]=k'}';ifamount((=mfopen("reader.txt"n,"r")
   	) ID==SIZENULL){//打开只读文件system(date"cls"SIZE);{printf("\n记录文件不存在,按任意键返回!"bname)SIZE;_getch{();
    Return i(2)
    ; target}sizesystem({"cls");
    printf("请输入证件号或者姓名查询:\n"fp);scanf("%s",);system("cls")
    {
        ;=NUM_BOOK()
        ;for(=0
        ;<;++
        ) fscanf(,"%d%s%s%s"
    ,
    &,,,)
    ;if(!strcmp
    (,)||target()
    ==)if(==
    n0)printf("查询结果:\n\n"
    );nprintf("\n证号\t读者姓名\t\t借书日期\t书名\n"n)m;n}printf
    {
        ("\n%-8%-23s%-18s%-10s\n"fp,,,,num)name;date++bname;}
        }if(==0target)name//文件夹为空则输出无记录并返回上一级system(ABC"cls")num;
        {
            printf(k"\n无符合记录\n");
            {
                _getch();Return
                (2);}
            fcose
            ();_getchID(name)date;bnameReturn(
            k2)
        ;
    }
    k 
    {
        
        
        
        
    
    fp
    
    

总结
  • 通过这个小项目的练手,主要总结出了两方面的问题。

  •  ​  首先,我在准备的过程中,思考不足,很多地方没有想到,比如返回上一级这个功能。结果可想而知,在动手敲代码的时候总会有很多临时需求冒出来,很是痛苦。并且在准备的过程中我并没有很强的逻辑性,所以在后面写文档的时候需要重新整理思路,当然,在这个过程中我也收获了许多。在准备的时候我选择用思维导图的方式,我初步学习了如何制作思维导图,更加熟悉小工具的使用。准备周期长但准备效果并没有达到预期。
     ​   其次,就是在敲代码的过程中出现的问题。 万事开头难,这一次并没有出现明显开头难的问题,我对比上一次这次明显有进步,我自己先把大致的框架写了出来,然后具体去实现。初生牛犊不怕虎,很明显。然后就出现了问题,开始解决问题,有的问题还没有解决掉,可能是我自己经验知识点还不够,所以这些问题我会过一段时间再回过头来解决。有一个问题感觉很初级,就是变量命名,虽然这次涉及的变量命名不是很多,但我还是在命名上出现了问题,命名没有弄好的那注释就很重要(虽然注释本来就很重要),不然过段时间自己都不知道这些变量是什么意思。每次解决问题的过程就是提升自己的过程,这一次我已经有了不错的收获。
    下面是我的一些自我鼓励吧,也是心中的一些想法。
     ​  每当自己心里有一个想法的时候,我们要尽可能地去实现它,学编程真的得多敲代码,有时候在实际行动中会出现许多以前自己没有遇到过的问题,而解决这些问题就是提升自己的有效途径,这与学习书本知识是不一样的,而这也是我认为编程的魅力之处,虽然这个过程很痛苦,但痛并快乐着。
     ​  实践是检验真理的唯一标准,学习就得不断实践。每天坚持学习,哪怕每天进步一点点我们也会不断靠近我们的目标,制定好每天的计划然后努力完成,坚持下去,会有许多收获的,虽然可能别人无法理解,但我们自己要坚定我们所热爱的,朝着目标前进。可能是自学的原因,也有其他方面的影响,遇到很难的问题的时候我也会逃避, 但最后还是会花时间去解决,尽管问题有时候还是不能解决,但这很正常,我们过段时间后可能新学到的知识会让我们理解之前的一些问题。学习没有捷径可走,我相信笨鸟先飞、勤能补拙,我自己是不会轻易放弃的,总得去试一试,哪怕结果不如人意,但我还是想去看看风景,哈哈哈。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/921098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存