2个回答
2013-12-28
展开全部
一、问题描述 图书信息管理系统设计设计一图书信息管理系统,使之能提供以下功能:系统以菜单方式工作�8�5图书信息录入功能(图书信息用文件保存)图书信息浏览功能--输出�8�5查询和排序功能:�8�5 按书名查询
�8�5 按作者名查询
图书信息的删除与修改(可选项)图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。 二、总体设计 1.问题分析对图书管理系统的设计,按照课程设计的要求,我们的设计总体构思是:先从问题描述抽象出一个结构体(book_inf),其中包括图书的登陆号(bknum )、图书名(bkm)、作者(bkzz)、分类号(bkkind)、出版单位(bkcb)、出版时间(bkcbt)、价格(bkprice);系统以菜单方式工作,则由主函数调用菜单函数,再在菜单函数中根据用户的不同需要分别调用其他子函数。而对问题要求的功能,主要从以下方面分析:①.录入图书信息当没有图书信息时,用来新建图书信息,当已有图书信息时,在已有信息尾追加录入新的图书信息。②.图书信息浏览 打印输出已有的图书信息。③.图书信息查询提供3种方式供用户查询图书信息。 ④.图书信息排序提供8种方式供用户对图书信息排序。 ⑤.修改图书信息 提供2种方式供用户对图书信息进行修改。 ⑥.删除图书信息 提供2种方式供用户删除图书信息。 2.方案描述①.首先,我们对应该实现怎样的功能进行了全面的分析,根据问题的要求及平时对图书管理的了解,我们对图书管理的流程如下:运行本程序之后,会显示出程序的菜单信息,然后由用户根据自己所需要的功能进行选择。如果在第一次进入程序时,因为此时并无已保存的图书信息,当用户选择2-6的选项,将会由程序带领用户进入选项1——录入图书信息,当用户选择选项7则结束程序。②.考虑到图书信息需要保存,于是采用一个二进制文件来保存图书信息,在使用时更为方便的进行保存、浏览、修改、删除等操作。③.为了方便于程序的修改、调试,我们决定以多文件结构形式完成此程序。 三、详细设计 文件组成表源 文 件 包含函数 实现功能 book.c main 主函数 menu 菜单处理 menu_slect 菜单选择 bkload 读取图书信息 quit 结束程序运行 add_skim.c bkadd 添加图书信息 bkskim 浏览图书信息 bkxs 显示图书信息 bkorder 图书信息排序 find.c bkfind 查找菜单处理 bkmfind 按图书名查找 bkzfind 按作者名查找 bkhfind 按图书登陆号查找 xg_del.c bkxg 修改菜单处理 bkdel 删除菜单处理 bkxg_h 按图书登陆号修改 bkxg_m 按图书名修改 bkdel_h 按图书登陆号删除 bkdel_m 按图书名删除 ①.头文件 book.h 在头文件中,对程序中的包含的文件、函数的原型的声明、以及对数据结构的定义。 本系统中,图书的信息都可以用一个BOOK的结构体变量来保存。用SUM宏定义程序中涉及的图书总量。全局变量booknum用来表示已保存的图书信息的数量。字符数组用来存放用户输入的功能指令及清空程序缓冲区内存。 ②.主函数文件 book.c 此文件中,除主函数外,还有菜单处理及菜单选择函数,图书信息读取函数和退出程序函数。一、主函数函数原型:void main(void)功能:控制程序参数:无返回值:无详细:在主函数中,先为结构体数组分配储存空间,然后打印程序欢迎界面,最后调用菜单函数。 二、菜单函数函数原型:void menu(void)功能: 菜单处理参数:无返回值:无详细:通过调用菜单选择函数对其返回值处理后进入其他功能函数。 三、菜单选择函数函数原型:int m_slect(void)功能:接受用户选择的命令代码,返回处理不同菜单函数的整数代码参数:无返回值:int详细:打印菜单信息,等待用户输入处理菜单的整数值,若输入的代码不符合规定则要求重新输入,最后返回命令代码的整数值。 四、图书信息读取函数函数原型:void bkload(void)功能:读取图书信息参数:无返回值:无详细:把bk_info文件中保存的图书信息读取出并存如程序的结构体数组中。 五、退出程序函数函数原型:void quit(void)功能:结束程序参数:无返回值:无详细:退出程序。 ③ .录入、浏览、显示、排序函数文件 add_skim.c 一、录入函数 函数原型:void bkadd(void) 功能:将录入的图书信息保存至文件bk_info中 参数:无 返回值:无详细:调用bkload()函数,然后在结构体数组后继续添加图书信息,最后在询问用户是否保存且得到肯定的指令时,把数组中的图书信息保存到bk_info文件中,若不再继续添加新的图书信息,则返回主菜单。当输入的图书信息的登陆号与已有图书的登陆号重复时,提示保存失败。 二、浏览函数 函数原型:void bkskim(void) 功能:浏览图书信息 参数:无 返回值:无 详细:当首次进入程序,找不到保存图书信息的bk_info文件时,询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有保存的图书信息时,通过调用函数bkload()把图书信息存入结构体数组book中,最后调用函数bkxs()。 三、显示函数 函数原型:void bkxs(void) 功能:显示图书信息 参数:无 返回值:无 详细:打印输出结构体数组book中的所有图书信息。 六、排序函数 函数原型:void bkorder(void) 功能:对图书信息排序 参数:无 返回值:无 详细:当没有图书信息时,通过询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有图书信息时,提供8种排序方式供用户选择,若用户输入的排序指令有误,提示重新输入。排序方法主要采用冒泡排序法。排序完成之后,询问用户是否显示图书信息,若得到肯定的指令则调用函数bkxs()。最后返回主菜单。 ④.查找函数文件 find.c 此文件中共有查找菜单函数,图书名查找函数,图书作者名查找函数及图书登陆号查找函数。一、查找菜单函数函数原型:void bkfind(void)功能:处理查找菜单参数:无返回值:无详细:当没有图书信息时,通过询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有图书信息时,打印查找菜单,提供3种查找方式。接受用户选择的功能代码,调用对应的函数进行操作。若输入的代码不符合规定,则提示要求重新输入。最后询问用户继续或是返回主菜单。 二、图书名查找函数函数原型:void bkmfind(void)功能:按图书名查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书名,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息。 三、图书作者名查找函数函数原型:void bkzfind(void)功能:按图书作者名查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书作者名,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息。 四、图书登陆号查找函数函数原型:void bkhfind(void)功能:按图书登陆号查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书登陆号,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息 ⑤.修改、删除函数文件此文件共有修改菜单函数、按图书登陆号修改函数、按图书名修改和删除菜单函数、按图书登陆号删除函数、按图书名删除函数。一、修改菜单函数函数原型:void bkxg(void)功能:处理修改菜单参数:无返回值:无详细:当没有保存的图书信息时,通过询问用户根据需要进入图书信息录入或返回主菜单。如已有图书信息,则打印修改菜单,根据用户输入的指令调用不同的修改函数处理。调用修改子函数结束后,通过子函数的返回值及询问选择是否保存图书信息。 二、删除菜单函数函数原型:void bkdel(void)功能:处理删除菜单参数:无返回值:无详细:当没有保存的图书信息时,通过询问用户根据需要进入图书信息录入或返回主菜单。如已有图书信息,则打印删除菜单,根据用户输入的指令调用不同的删除函数处理。调用删除子函数结束后,通过子函数的返回值及询问选择是否保存图书信息。 三、按登陆号修改函数函数原型:int bkxg_h(void)功能:按登陆号修改图书信息参数:无返回值:int详细:定义一个BOOK型结构体变量temp用于存放修改的中间变量,根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的登陆号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,通过用户输入新的图书信息(由于登陆号为每条图书信息的唯一标识,故登陆号无法更改)存入temp中,把temp整体赋值给要修改的那条图书信息,最后返回整型值1。如果没有匹配的图书信息即cnt等于0,提示用户并返回整型值0。 四、按图书名修改函数函数原型:int bkxg_m(void)功能:按登陆号修改图书信息参数:无返回值:int详细:定义一个BOOK型结构体变量temp用于存放修改的中间变量。根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的图书名号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,通过用户输入新的图书信息(由于登陆号为每条图书信息的唯一标识,故登陆号无法更改)存入temp中,把temp整体赋值给要修改的那条图书信息,最后令cnt等于整型值1返回。当cnt大于1即有同名图书时,调用函数bkxg()回到修改菜单。当cnt等于0即没有匹配的图书信息,提示用户并令cnt等于整型值0返回。 五、按登陆号删除函数原型:int bkdel_h(void)功能:按登陆号删除图书信息参数:无返回值:int详细:定义一个整型变量t存放查找到的与用户输入的登陆号匹配的图书信息所在数组book中的序号,根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的图书登陆号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,则通过从数组的第t+1个元素开始循环把数组的元素依次前移一个位置,然后返回整型值1。当cnt等于0时,则打印提示用户并返回整型值0。 六、按图书名删除函数原型:int bkdel_m(void)功能:按图书名删除图书信息参数:无返回值:int详细:定义一个整型变量t存放查找到的与用户输入的图书名匹配的图书信息所在数组book中的序号,根据用户输入的图书名在结构体数组book中查找对应的变量,若有与用户输入的图书名匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,则通过从数组的第t+1个元素开始循环把数组的元素依次前移一个位置,然后返回整型值1。当cnt大于1即有同名图书时,调用函数bkdel ()回到修改菜单。当cnt等于0时,则打印提示用户并返回整型值0。 1.程序调试 本程序在编写过程中,是先确定框架,再分函数编写,在调试过程中遇到很多实际的问题。在编写每个函数结束后,起初都无法通过编译,最常见的错误主要是缺少‘{’和‘;’导致的语法错误。其次是函数和变量的书写前后不符合导致的一些函数和变量的未声明、未定义。还有是变量的重复定义以及全局变量的使用时导致的错误等。遇到这一类的问题,大多属于编写过程中不细心导致的,此时可以通过程序的提示及结合前后代码观察,或用/**/屏蔽部分代码或剪切掉部分代码调试发现问题。 在连接过程中,出现的多则是一些如undefined symbol _print in modula xxx的错误,其原因主要是由于函数书写错误。 运行测试时,出现很多逻辑错误,或者是程序非正常退出。当遇到这一类的问题时,只有在观察程序出现逻辑错误的前后设置断点分布调试,在调试过程中锁定跟踪一切可能出现错误的变量来找出发生逻辑错误的关键。另外,在程序运行检测时,最初容易遇到的就是在想要接收一个变量时,程序不执行接收数据这一环节而直接跳过。开始是考虑更换变量的类型接收,同样不能解决此类问题,只好去google上查找后才明白这类问题是由于在scanf语句控制接收变量时,输入的一些如空格,回车等都是与当次scanf控制的类型不匹配,此时程序自动把这些放入程序的缓冲区内,而在遇到下一个scanf语句或gets等需要输入数据时直接把缓冲区的数据输入到scanf语句中的控制变量中从而导致的问题。网上建议在scanf语句后都最好加一个函数fflush(stdin),此函数是清除缓冲区内存的函数,包含在stdio.h的头文件中。由于对此函数并不是很熟悉,经过多次尝试之后决定定义一个全局字符数组char end[100],此数组在接收缓冲区数据的同时,还可以用来存放本程序中用户每次的选择的功能代码。 其次在程序中多处环节需要用户输入数据时,若用户输入的数据不符合要求则提示输入错误,而怎样又能让程序在提示错误之后不用整体重新输入,故选择采用foe(;;)型循环,当输入错误时提示错误并使循环变量自减1达成想要的效果。另外,在录入图书信息并保存后,当浏览图书信息时发现程序从文件读取的图书信息的最后一项总是把第二个图书信息的第一项同时输出,而不能达到预期的效果。后反复进入函数及在程序中输入数据测试,最后在尝试每次保存一个结构体变量后再向文件写入一个结束符‘\0’才解决此问题。最后,在实现对图书信息的修改与删除问题上,由于对文件的操作只存在读与写两种方式,不可能修改与删除,考虑到以写方式打开文件和以只读方式打开文件的不同,决定采取对文件不同的打开方式来实现修改与删除。在修改与删除的功能上,即先用只读方式打开保存图书信息的文件,然后把图书信息转入程序中的结构体数组中,关闭文件。再在用户完成修改或删除之后,以写方式打开文件将数组中的数据存入文件。此时就等效性的完成了对文件中的图书信息的修改与删除。
�8�5 按作者名查询
图书信息的删除与修改(可选项)图书信息包括:登录号、书名、作者名、分类号、出版单位、出版时间、价格等。 二、总体设计 1.问题分析对图书管理系统的设计,按照课程设计的要求,我们的设计总体构思是:先从问题描述抽象出一个结构体(book_inf),其中包括图书的登陆号(bknum )、图书名(bkm)、作者(bkzz)、分类号(bkkind)、出版单位(bkcb)、出版时间(bkcbt)、价格(bkprice);系统以菜单方式工作,则由主函数调用菜单函数,再在菜单函数中根据用户的不同需要分别调用其他子函数。而对问题要求的功能,主要从以下方面分析:①.录入图书信息当没有图书信息时,用来新建图书信息,当已有图书信息时,在已有信息尾追加录入新的图书信息。②.图书信息浏览 打印输出已有的图书信息。③.图书信息查询提供3种方式供用户查询图书信息。 ④.图书信息排序提供8种方式供用户对图书信息排序。 ⑤.修改图书信息 提供2种方式供用户对图书信息进行修改。 ⑥.删除图书信息 提供2种方式供用户删除图书信息。 2.方案描述①.首先,我们对应该实现怎样的功能进行了全面的分析,根据问题的要求及平时对图书管理的了解,我们对图书管理的流程如下:运行本程序之后,会显示出程序的菜单信息,然后由用户根据自己所需要的功能进行选择。如果在第一次进入程序时,因为此时并无已保存的图书信息,当用户选择2-6的选项,将会由程序带领用户进入选项1——录入图书信息,当用户选择选项7则结束程序。②.考虑到图书信息需要保存,于是采用一个二进制文件来保存图书信息,在使用时更为方便的进行保存、浏览、修改、删除等操作。③.为了方便于程序的修改、调试,我们决定以多文件结构形式完成此程序。 三、详细设计 文件组成表源 文 件 包含函数 实现功能 book.c main 主函数 menu 菜单处理 menu_slect 菜单选择 bkload 读取图书信息 quit 结束程序运行 add_skim.c bkadd 添加图书信息 bkskim 浏览图书信息 bkxs 显示图书信息 bkorder 图书信息排序 find.c bkfind 查找菜单处理 bkmfind 按图书名查找 bkzfind 按作者名查找 bkhfind 按图书登陆号查找 xg_del.c bkxg 修改菜单处理 bkdel 删除菜单处理 bkxg_h 按图书登陆号修改 bkxg_m 按图书名修改 bkdel_h 按图书登陆号删除 bkdel_m 按图书名删除 ①.头文件 book.h 在头文件中,对程序中的包含的文件、函数的原型的声明、以及对数据结构的定义。 本系统中,图书的信息都可以用一个BOOK的结构体变量来保存。用SUM宏定义程序中涉及的图书总量。全局变量booknum用来表示已保存的图书信息的数量。字符数组用来存放用户输入的功能指令及清空程序缓冲区内存。 ②.主函数文件 book.c 此文件中,除主函数外,还有菜单处理及菜单选择函数,图书信息读取函数和退出程序函数。一、主函数函数原型:void main(void)功能:控制程序参数:无返回值:无详细:在主函数中,先为结构体数组分配储存空间,然后打印程序欢迎界面,最后调用菜单函数。 二、菜单函数函数原型:void menu(void)功能: 菜单处理参数:无返回值:无详细:通过调用菜单选择函数对其返回值处理后进入其他功能函数。 三、菜单选择函数函数原型:int m_slect(void)功能:接受用户选择的命令代码,返回处理不同菜单函数的整数代码参数:无返回值:int详细:打印菜单信息,等待用户输入处理菜单的整数值,若输入的代码不符合规定则要求重新输入,最后返回命令代码的整数值。 四、图书信息读取函数函数原型:void bkload(void)功能:读取图书信息参数:无返回值:无详细:把bk_info文件中保存的图书信息读取出并存如程序的结构体数组中。 五、退出程序函数函数原型:void quit(void)功能:结束程序参数:无返回值:无详细:退出程序。 ③ .录入、浏览、显示、排序函数文件 add_skim.c 一、录入函数 函数原型:void bkadd(void) 功能:将录入的图书信息保存至文件bk_info中 参数:无 返回值:无详细:调用bkload()函数,然后在结构体数组后继续添加图书信息,最后在询问用户是否保存且得到肯定的指令时,把数组中的图书信息保存到bk_info文件中,若不再继续添加新的图书信息,则返回主菜单。当输入的图书信息的登陆号与已有图书的登陆号重复时,提示保存失败。 二、浏览函数 函数原型:void bkskim(void) 功能:浏览图书信息 参数:无 返回值:无 详细:当首次进入程序,找不到保存图书信息的bk_info文件时,询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有保存的图书信息时,通过调用函数bkload()把图书信息存入结构体数组book中,最后调用函数bkxs()。 三、显示函数 函数原型:void bkxs(void) 功能:显示图书信息 参数:无 返回值:无 详细:打印输出结构体数组book中的所有图书信息。 六、排序函数 函数原型:void bkorder(void) 功能:对图书信息排序 参数:无 返回值:无 详细:当没有图书信息时,通过询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有图书信息时,提供8种排序方式供用户选择,若用户输入的排序指令有误,提示重新输入。排序方法主要采用冒泡排序法。排序完成之后,询问用户是否显示图书信息,若得到肯定的指令则调用函数bkxs()。最后返回主菜单。 ④.查找函数文件 find.c 此文件中共有查找菜单函数,图书名查找函数,图书作者名查找函数及图书登陆号查找函数。一、查找菜单函数函数原型:void bkfind(void)功能:处理查找菜单参数:无返回值:无详细:当没有图书信息时,通过询问用户当得到肯定的指令时,调用函数bkadd()进入图书信息录入,否则返回主菜单。当已有图书信息时,打印查找菜单,提供3种查找方式。接受用户选择的功能代码,调用对应的函数进行操作。若输入的代码不符合规定,则提示要求重新输入。最后询问用户继续或是返回主菜单。 二、图书名查找函数函数原型:void bkmfind(void)功能:按图书名查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书名,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息。 三、图书作者名查找函数函数原型:void bkzfind(void)功能:按图书作者名查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书作者名,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息。 四、图书登陆号查找函数函数原型:void bkhfind(void)功能:按图书登陆号查找图书信息参数:无返回值:无详细:调用函数bkload()把文件bk_info中的图书信息存入结构体数组book中。要求用户输入查找的图书登陆号,然后在数组中查找,若找到则打印输入图书信息,找不到也提示用户无信息 ⑤.修改、删除函数文件此文件共有修改菜单函数、按图书登陆号修改函数、按图书名修改和删除菜单函数、按图书登陆号删除函数、按图书名删除函数。一、修改菜单函数函数原型:void bkxg(void)功能:处理修改菜单参数:无返回值:无详细:当没有保存的图书信息时,通过询问用户根据需要进入图书信息录入或返回主菜单。如已有图书信息,则打印修改菜单,根据用户输入的指令调用不同的修改函数处理。调用修改子函数结束后,通过子函数的返回值及询问选择是否保存图书信息。 二、删除菜单函数函数原型:void bkdel(void)功能:处理删除菜单参数:无返回值:无详细:当没有保存的图书信息时,通过询问用户根据需要进入图书信息录入或返回主菜单。如已有图书信息,则打印删除菜单,根据用户输入的指令调用不同的删除函数处理。调用删除子函数结束后,通过子函数的返回值及询问选择是否保存图书信息。 三、按登陆号修改函数函数原型:int bkxg_h(void)功能:按登陆号修改图书信息参数:无返回值:int详细:定义一个BOOK型结构体变量temp用于存放修改的中间变量,根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的登陆号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,通过用户输入新的图书信息(由于登陆号为每条图书信息的唯一标识,故登陆号无法更改)存入temp中,把temp整体赋值给要修改的那条图书信息,最后返回整型值1。如果没有匹配的图书信息即cnt等于0,提示用户并返回整型值0。 四、按图书名修改函数函数原型:int bkxg_m(void)功能:按登陆号修改图书信息参数:无返回值:int详细:定义一个BOOK型结构体变量temp用于存放修改的中间变量。根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的图书名号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,通过用户输入新的图书信息(由于登陆号为每条图书信息的唯一标识,故登陆号无法更改)存入temp中,把temp整体赋值给要修改的那条图书信息,最后令cnt等于整型值1返回。当cnt大于1即有同名图书时,调用函数bkxg()回到修改菜单。当cnt等于0即没有匹配的图书信息,提示用户并令cnt等于整型值0返回。 五、按登陆号删除函数原型:int bkdel_h(void)功能:按登陆号删除图书信息参数:无返回值:int详细:定义一个整型变量t存放查找到的与用户输入的登陆号匹配的图书信息所在数组book中的序号,根据用户输入的登陆号在结构体数组book中查找对应的变量,若有与用户输入的图书登陆号匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,则通过从数组的第t+1个元素开始循环把数组的元素依次前移一个位置,然后返回整型值1。当cnt等于0时,则打印提示用户并返回整型值0。 六、按图书名删除函数原型:int bkdel_m(void)功能:按图书名删除图书信息参数:无返回值:int详细:定义一个整型变量t存放查找到的与用户输入的图书名匹配的图书信息所在数组book中的序号,根据用户输入的图书名在结构体数组book中查找对应的变量,若有与用户输入的图书名匹配的变量则打印输出该图书信息并同时cnt自加1。当cnt等于1时,则通过从数组的第t+1个元素开始循环把数组的元素依次前移一个位置,然后返回整型值1。当cnt大于1即有同名图书时,调用函数bkdel ()回到修改菜单。当cnt等于0时,则打印提示用户并返回整型值0。 1.程序调试 本程序在编写过程中,是先确定框架,再分函数编写,在调试过程中遇到很多实际的问题。在编写每个函数结束后,起初都无法通过编译,最常见的错误主要是缺少‘{’和‘;’导致的语法错误。其次是函数和变量的书写前后不符合导致的一些函数和变量的未声明、未定义。还有是变量的重复定义以及全局变量的使用时导致的错误等。遇到这一类的问题,大多属于编写过程中不细心导致的,此时可以通过程序的提示及结合前后代码观察,或用/**/屏蔽部分代码或剪切掉部分代码调试发现问题。 在连接过程中,出现的多则是一些如undefined symbol _print in modula xxx的错误,其原因主要是由于函数书写错误。 运行测试时,出现很多逻辑错误,或者是程序非正常退出。当遇到这一类的问题时,只有在观察程序出现逻辑错误的前后设置断点分布调试,在调试过程中锁定跟踪一切可能出现错误的变量来找出发生逻辑错误的关键。另外,在程序运行检测时,最初容易遇到的就是在想要接收一个变量时,程序不执行接收数据这一环节而直接跳过。开始是考虑更换变量的类型接收,同样不能解决此类问题,只好去google上查找后才明白这类问题是由于在scanf语句控制接收变量时,输入的一些如空格,回车等都是与当次scanf控制的类型不匹配,此时程序自动把这些放入程序的缓冲区内,而在遇到下一个scanf语句或gets等需要输入数据时直接把缓冲区的数据输入到scanf语句中的控制变量中从而导致的问题。网上建议在scanf语句后都最好加一个函数fflush(stdin),此函数是清除缓冲区内存的函数,包含在stdio.h的头文件中。由于对此函数并不是很熟悉,经过多次尝试之后决定定义一个全局字符数组char end[100],此数组在接收缓冲区数据的同时,还可以用来存放本程序中用户每次的选择的功能代码。 其次在程序中多处环节需要用户输入数据时,若用户输入的数据不符合要求则提示输入错误,而怎样又能让程序在提示错误之后不用整体重新输入,故选择采用foe(;;)型循环,当输入错误时提示错误并使循环变量自减1达成想要的效果。另外,在录入图书信息并保存后,当浏览图书信息时发现程序从文件读取的图书信息的最后一项总是把第二个图书信息的第一项同时输出,而不能达到预期的效果。后反复进入函数及在程序中输入数据测试,最后在尝试每次保存一个结构体变量后再向文件写入一个结束符‘\0’才解决此问题。最后,在实现对图书信息的修改与删除问题上,由于对文件的操作只存在读与写两种方式,不可能修改与删除,考虑到以写方式打开文件和以只读方式打开文件的不同,决定采取对文件不同的打开方式来实现修改与删除。在修改与删除的功能上,即先用只读方式打开保存图书信息的文件,然后把图书信息转入程序中的结构体数组中,关闭文件。再在用户完成修改或删除之后,以写方式打开文件将数组中的数据存入文件。此时就等效性的完成了对文件中的图书信息的修改与删除。
2013-12-28
展开全部
你好哦楼主~
很高兴看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
对于你的问题我爱莫能助!
可能是你问的问题有些专业了,或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也会比较热心,能快点帮你解决问题。
快过年了,
最后祝您全家幸福健康快乐每一天!
很高兴看到你的问题。
但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。
对于你的问题我爱莫能助!
可能是你问的问题有些专业了,或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也会比较热心,能快点帮你解决问题。
快过年了,
最后祝您全家幸福健康快乐每一天!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询