-3

工作在小范围的圆圈编。我一直无法解决调试阶段出现的问题。诸如“变量在外部引用...”之类的错误以及其他不会处理简单方程的错误(例如,半径 = 面积 / PI * 半径)。我尝试了很多方法来解决这个问题,除了重写整个 prog,但没有任何效果。我的解决方案要么产生新问题,要么不解决手头的问题。我已经学习了三个星期的 Python,但确实有使用 COBOL 的编码经验,所以我了解函数和流程图的概念。

当您没有解决问题的头脑或工具时,您会怎么做?我想自己解决这些问题。寻求帮助是明智的,但最终你必须自己飞行。

谢谢你的帮助。

通量

添加:

圆和半径的面积:

# Exercise 1 Area of Circle
# This prog will ask for circle dimensions and compute
# area/radius for the user, then display figures, and
# allow to repeat.

import sys
import pdb
PI = 3.14
radius = 0


print ('''Welcome to Ursavion, the leader in math apps
This app allows you to quickly and easily find
either the area or radius for a circle.''')
print ( )


def chooseAR ( ):
    print ('Do you need to find circle area or circle radius? Enter A/a or A/r. ')
    choice = input ( )
    if choice in ['A', 'a']:
        areaSol ( )

    elif choice in ['R', 'r']:
        radSol (radius)

    else:
        print ('Please enter either A/a or R/r. ')
        chooseAR ( )

def areaSol ( ):
    radius = 0
    radius = input ('What is the radius of the circle? ')
    radius = int (radius)

    area = PI * radius**2 

    radius = str(radius)
    area = str(area)

    print ('The area of a circle with radius ' + radius + ' is ' + area + ' units '         squared')
    print ( )
    print ('Calculate another? y/n ')
    again = input ( )
    if again in [ 'y', 'n']:
        chooseAR ( )

    else:
        print ('Thank you for using this app.')


def radSol (radius):
    #pdb.set_trace( )                   #r = 1.128 for A = 4 
    area = input ('What is the area of the circle? ')
    area = int(area)
    radius = int(radius)

    radius = area / 3.14 * radius       #prog will not eval this formula; float pt prob


    radius = str(radius)
    area = str(area)    

   print ('The radius of a circle with area ' + str(area) + ' is ' + str(radius) + '   units')
   print ( )
   again = input ('Calculate another? y/n ')
   if again in ['Y', 'y', 'N', 'n']:
       chooseAR( )

   else:
        print ('Thank you for using this app.')


chooseAR ( )  # This function is one problem. Program initializes all 
              # functions on first pass, but it needs "chooseAR" here to allow the 
              # program to start, else it never runs; however, the "chooseAR" sets up
              # an infinite loop if it exists here. 
4

2 回答 2

3

好吧,据我了解,您不想提供特定的代码示例,因为您想弄清楚如何自己进行调试?如果不了解您要调试的内容,这有点难以回答

编码时可能会出现几种类型的问题

  • 错别字
  • 语法错误
  • 逻辑错误

错别字

别笑,这将是您遇到的最常见的错误。如何调试它们?最好的方法是校对您的代码。它还高度依赖于 IDE。如果您正在使用 Microsoft Studio IDE 或 Apple 的 Xcode IDE 之类的东西进行开发,它会给您提示您正在尝试输入的内容,并且您可以自动完成输入。如果提示没有出现……你可能打错了。

对于您在文本编辑器中编程的东西(如 shell、python 等),这些选项通常不可用。一个技巧是复制粘贴你的变量名。这样你就不会出现意外的错字。小心你从哪里复制粘贴......你不想在整个代码中粘贴以前的错字:)

有时,您可能正盯着错字,却看不到它。最好的方法是检查你的变量。同样,对于各种 IDE,有内置的调试器可以让您做到这一点。在其他人身上,只需回显/打印/输出您的变量并自己检查它们的值。如果您期望变量中有一个值,并且它出现空白(或者更好的是,出现“未定义变量”类型错误),您现在可以专注于查看名称中是否有错字

语法错误

语法错误实际上更容易看到,因为它们通常会产生某种错误(在编译时或在运行时)。你对这门语言的经验越多,你犯的语法错误就越少。谷歌为您尝试使用的特定结构的代码示例和手册页,并了解它们的语法。Stackoverflow 也是一个很好的来源。不要害怕提出有关语法错误的问题。这个解释可能会让你更清楚,而不是盲目地使用试验-n-错误。

通常,只需在引号中搜索错误消息即可为您提供修复它所需的所有信息。

逻辑错误

这些是最难调试的,因为它们不是计算机错误,而是您的设计问题。解决这些问题的能力纯粹来自经验和编程能力。Stackoverflow 是提出问题的理想场所,其他人会为您提供可能的解决方案和变通方法。即使解决方案对您的情况不起作用,它会让您的思维朝着正确的方向思考并为您提供想法。

如果您有经验,请转到您以前编写的程序,看看您是如何解决类似问题的。

例子

所以,在你的例子中,你没有给我们太多:
radius = area / PI * radius
这实际上不是一个简单的陈述。有:

  • 变量赋值
  • 变量引用
  • 算术运算
  • 操作优先级

其中任何一个都可能带来问题。所以要调试,首先简化表达式:

  • 先打印变量
    print area
    print PI
    print radius

您应该会看到带有预期值的输出。如果其中任何一个为空白,则您可能输入了变量名。即使它在这里拼写正确,也许你在第一次声明它并给它一个值时拼错了它。

  • 接下来,做一个简单的操作,liketemp = PI * radius然后打印结果print temp。验证该值是否符合预期。由于数据类型的兼容性,您可能会遇到语法错误(这里不是这种情况)

但要总结这一点,根据您对“外部引用的变量”的引用,这可能是一个范围问题。通常,您不能引用在其范围之外声明的变量(例如,在函数内声明的变量不能被调用该函数的同一个更高块引用),但是像这样的事情在语言定义中。你只需要知道你正在编程的语言。

如果您是编程新手,并且阅读一本巨大的语言定义书太令人生畏,您至少应该阅读每种语言中常见的这些东西(但不同)

  • 变量声明和引用
  • 运营商
  • 变量范围
  • 常见结构
  • 函数声明和调用
于 2013-01-03T16:08:32.263 回答
2

正如您自己所说的那样,这与经验有关。您获得的经验越多,您就越不可能就每个小问题向某人询问。

但是为了获得这种经验并取得进步,你必须克服这些小问题,所以询问绝对是一种有效的方法。

只要您尝试从错误中吸取教训(如果可以这样称呼他们),一切都应该是好的。

无论如何,一些调试器可能会让人很头疼

于 2013-01-03T15:25:38.813 回答