问与答 (随课程进展不断更新)
日期 问题和回答
2005.10.19 有的时候比如用动态顺序表时,如果在定义中将表改为指针,每次用一个strlen函数可以得到长度, 这样就可以避免占用内存了。
还有,您能在网上贴出用vc 编程时常见的错误提示的意思是什么,以及原因是什么吗?比如: unexpected end of file; the address cannot be written ...这样我们可以很快查到错误, 有时看不懂意思是什么。 ————Chao Wang

答:用动态顺序表也同样需要内存,你需要动态分配空间保存表的内容。

错误信息在错误窗口显示,选择错误信息行后按F1,系统会给出提示和实例。你去看它们吧。 我找不到完整的一个说明文件,各种错误信息有几千种,无法一一解释。
如果你有看不懂的信息,可以问辅导老师或者问我(email,留言或者当面)。你提到的两条错误很 容易解释,见下:

unexpected end of file
通常是你的括号不配对(如花括号),因此编译器认为程序还没完,但你的源程序文件却结束了。

the address cannot be written
这是动态运行错,通常是有非法的指针间接访问。如定义了指针,但没有给指针赋值(没让它指向 有效存储位置)就向被指处保存数据(你所说的“避免占用内存”,可能就是这个错误的原因)。

2005.10.14 我写了一个关于火车进站的程序:有五辆火车按顺序等待进站,它们可以随意选择出站或留下 来,但先留下来的火车必须等待后面留下来的车离开后才可以出站。问共有多少种出站情况?
程序发现了所有的可能,但不能正确输出每种可能。希望老师能帮我修改一下。程序可以运行。 文件rrecord.txt中是输出结果,以及我的一些疑惑和解释,希望老师先看这个。 --宋承根

答:程序太不清楚,很难理解。你不给我解释,我很难理解你程序里的想法,找出问题就 更困难了。我也没理解可以“发现所有的可能”,但“不能输出每种可能”是什么意思?
我们可以把这个火车进出站问题看作一个搜索问题:每个时刻只有两种可能,或者是一列火 车进站,或者是一列火车出站。很容易把它描述为一个递归的问题,也不难借助于一个栈实现。 这里也有些特殊问题,包括输出录所有的出站序列。
建议你按照这种想法重新设计,重新写出程序。这样程序可以很清晰,是不是对也很容易检查。
你的程序完全按朴素的想法做,这样就很有可能考虑不周,或编程中有点疏忽,留下一点错误, 自己或者别人都很难检查和纠正。所以,良好的问题分析和建模在程序工作中非常重要。

2005.10.13 两个算法的时间复杂性都是O(n^k),是否就认为它们同样 优秀(不考虑空间复杂性)?如果无法改进算法的O(n^k)复杂性,改进其常量因子也有意义吗? --周帆(00401068)

从理论上说,两个算法同样优秀。但如果一个算法比另一个快100倍(常量),从实践的观点看 就会认为它们的价值很不一样。改进常量因子在实践中当然很有价值。试想如果我们能把人的 寿命延长一倍,且不说是100倍了。

2005.10.10 我处理在文件中查找字符串的方法是把文件内容全部放到目标串中再进行模式匹配,而文件很大时 这样的目标串不能做出来(即我的程序运行时函数createformlist(创建并初始化一个PSeqString) 会显示overflow,即在某次用realloc重新分配空间时失败),处改用c++外,有无别的解决办法? 我总觉得把整个文件放在一个串里似乎不太好。 李蔚明(00401123) 2005.10.10

答:第一个问题与使用C语言或者C++无关,和你用的C系统有关。如果你用的是TURBO C,你试试修 改一下系统的 Options/Compler/Model。原来的默认设置(我记得)是Small,你把它改为 Large 就能有比较大的数据空间了(1024K,我记得不准确了,你可以查看TURBO C的联机帮助)。
你关于不读入整个文件的想法很好,如果内存有限,就需要这样做。这件事可以通过技术实现:设 置一个固定大小的区域,读入文件的一部分,处理完之后再读入后面的部分。这样做时需要处理可 能出现跨部分的匹配情况。采用这种方式时,无回溯性质就很有价值了。

2005.10.9 用realloc 函数时分配的空间在哪里?是否占用了原有 的空间? Chao Wang

答:关于realloc究竟在哪里分配的问题,完全由实现标准库的程序决定。它可能在 原来的地方扩充,也有可能全部另行分配(想想,如果现在要扩大存储块,而后面 的地方已经被分配出去另有他用了,你怎么可能在原位扩充呢?)。具体情况我们 不必考虑,从抽象的层次上理解其功能就够了。

2005.10.9 裘老师: 我在做上机选做题四时,尝试用记时的方法比较两种算法的时间效率,可每次运 行时得到的时间都不一样,而且有一次朴素算法所用时间比无回溯型还少,请问 其原因? 李蔚明(00401123) 2005.10.8

答:实际程序的运行时间受各种环境因素影响,因为它不是在真空中运行,这很自 然。如果你在只安装了DOS系统的机器上运行程序,时间的变化可能就比较小。 Windows 是非常复杂的系统,有很多系统程序和你的程序一起在环境中运行,它们 会影响你程序的运行时间。人们在做时间测试时,常常做许多次后求平均值。
朴素匹配未必总比无回溯算法慢,依赖于实际例子。如果你看到这种情况,可以分 析一下为什么这次它比较快。

2005.10.7 动态的数组应该用那种方式进行扩大才能更有效?-王超

答:你所说的有效是什么意思?存储空间的有效利用,还是时间上的高效? 在数据结构网页中有《从问题到程序》一书的“动态存储分配”一节,其中有关于这个问题的 详细讨论。你可以到那里去看。如果还有问题,再提出来。

本页及相关页面(除另声明者外)由裘宗燕创建维护,可自由用于各种学习活动。 其他使用需得到作者许可。

(最新更新: 2015-11-28