调试碰壁;不是编码问题,而是编程经验问题

2024-05-14 00:21:23 发布

您现在位置:Python中文网/ 问答频道 /正文

在小范围的圆形程序上工作。调试阶段出现的问题我一直没能解决。错误,如“外部引用的变量…”和其他无法处理简单公式的错误(例如半径=面积/PI*半径)。我尝试了很多方法来解决这个问题,除了重写整个程序之外,什么都不管用。我的解决方案要么产生新问题,要么解决不了眼前的问题。我已经学习了三个星期的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. 

Tags: orofthetoinyouforinput
2条回答

好吧,据我所知,你不想提供一个特定的代码示例,因为你想知道如何自己进行调试?如果不了解您要调试的内容,就很难回答这个问题。你知道吗

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

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

打字错误

别笑,这是你遇到的最常见的错误。如何调试它们?实际上,最好的方法是校对代码。它还高度依赖于IDE。如果您使用的是microsoftstudioide或Apple的Xcode IDE,它会提示您要键入什么,并且您可以自动完成键入。如果提示没有出现。。。你可能在打字。你知道吗

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

有时,你可能盯着打字错误看不见。最好的方法是检查变量。同样,对于各种ide,有内置的调试器可以让您这样做。在其他情况下,只需回显/打印/输出变量并自己检查它们的值。如果您希望在变量中有一个值,而它是空的(或者更好的是,有一个“undefined variable”类型错误),您现在可以集中精力查看名称中是否有输入错误

语法错误

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

通常,只需在谷歌上用引号搜索错误消息,就可以得到修复错误所需的全部信息。你知道吗

逻辑错误

这些是最难调试的,因为它们不是计算机错误,而是设计问题。解决这些问题的能力完全来自于经验和编程能力。Stackoverflow是提出问题的最佳场所,其他人将为您提供可能的解决方案和解决方法。即使解决方案不适用于您的案例,它也会让您的思维朝着正确的方向思考,并为您提供想法。你知道吗

如果你有经验,去你以前写的程序,看看你是如何解决类似的问题在那里。你知道吗

示例

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

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

任何一个都有可能带来麻烦。所以要调试,首先简化表达式:

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

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

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

但最后,基于您对“外部引用的变量”的引用,这可能是一个范围问题。通常不能引用在外部声明的变量它是作用域(例如,在函数中声明的变量不能被调用该函数的同一个更高的块引用),但类似的内容在语言定义中。你只需要知道你正在编程的语言。你知道吗

如果你是编程新手,读一本巨大的语言定义书让人望而生畏,你至少应该读一读每种语言中常见的(但又不同的)东西

  • 变量声明和引用
  • 操作员
  • 可变范围
  • 常见构造
  • 函数声明和调用

正如你自己正确地说的,这与经验有关。你的经验越丰富,你就越不可能就每一个小问题问别人。你知道吗

但是为了获得这种经验和进步,你必须克服这些小问题,所以提问无疑是一种有效的方法。你知道吗

只要你试着从错误中吸取教训(如果有人这么说的话),一切都应该是好的。你知道吗

不管怎么说,有些调试器真的很麻烦。你知道吗

相关问题 更多 >