在控制台中构建功能。 第一部分

图片

最可能有一个合理的问题:为什么?

从务实的角度来看,这是没有必要的。)您始终可以使用条件钨丝,如果需要在python中进行此操作,则可以使用不太难掌握的特殊模块。

但是,如果您突然被赋予了这样的任务,或者像我一样真的很喜欢编程,那么您将有很多令人兴奋的(有时不是很长时间)编写程序并对其进行调试)

在编写此杰作时,我们确实需要逐步调试,因此请下载PyCharm,VS或其他具有此功能的东西。 对于构建表,缺少此功能并不是很关键,但是对于绘制...

那么,我的程序将是什么。 在输入处,它将采用三个值:我们要在其上看到我们的功能的线段的开始和结束以及将要移动的步骤。 接下来,我们将从输入数据指定的值范围中的每个点绘制一个函数值表。 好了,然后我们将使用移动的y轴绘制函数本身的图形。

所以走吧

首先,我将声明几个我们将考虑其值的函数。 我会特别简单

from math import sqrt def y1(x): return x**3 - 2*x**2 + 4*x - 8 def y2(x): return 1 - 1/x**2 def y3(x): return sqrt(abs(y1(x)*y2(x))) 

现在我们有三个函数,其中两个具有断点。 从存储所有数学包子(包括余弦,反正切和其他三角函数)的数学模块中,我们导入sqrt,即平方根。 我们需要它来读取函数y3。

之后,我们需要通过x读取函数的范围以及遍历该范围的步骤。 为此,我将使用地图。

作为第一个参数,此函数采用某种方式以某种方式转换我们需要的数据,而作为第二个参数,则为我们需要处理的某种数据表

 from_x, to_x, pace_x = map(float, input("Enter the first and the last"\ " x-coordinates and a pace dividing them by a"\ " space:").split()) 

我们读取通过空格输入的三个值,然后用空格将它们划分为元素(使用split方法,当不带参数调用该方法时,它将自动将您指定的字符串除以空格)。 默认情况下,使用input()输入的数据的类型为str,即字符串,因此此处不会出现任何错误。

由于范围边界数可以是分数,因此我们使用float函数将结果数组的每个元素转换为实数。

请注意,在声明变量时未指定数据类型。 它是自动确定的(您尝试分配给变量的值的数据类型),或者使用str,int,float等函数确定 通过变量手动设置,将这些相同的功能应用于值。 整个程序中,相同的变量可以具有不同的数据类型-只需使用不同的数据类型为其分配新值即可。

举个例子

 auxiliary_variable = "" #   str auxiliary_variable = 2 #   int auxiliary_variable = 9.218 #   float 


让我们回到我们的程序。 我们需要检查输入的数据是否正确。

如果出现以下情况,程序应打印输入的数据不正确:

  • 步长为0
  • 范围的下限大于上限,并且步长为正(即,我们具有xn = from_x + progress_x *(n-1)形式的算术级数,其中from_x> to_x 。由于speed_x> 0,此级数将增加并且我们永远不会to_x
  • 范围的下限小于上限,并且步长为负(相似的推理)
  • 由一个点组成的图没有提供信息,因此构造函数的线段必须至少包含两个值

我们在代码中制定这些条件。 显然,第一项很容易设置。 如果您注意到第一个(from_x)和最后一个(to_x)之间的差异的符号应与步骤符号重合,则第二个和第三个可以组合为一个。 好吧,第四点也并不那么复杂:第一个值和最后一个值之差的模数应不小于阶跃模块。

由于模块的原因,我们可能会遇到差异的符号和步长不一致的情况,但是第二个条件将切断这些情况,因此该条件是正确的。

结果,这三个条件将如下所示:

 if (pace_x != 0) and (to_x - from_x)*pace_x >= 0 and abs(to_x - from_x): #-  else: print("Incorrect input") 

我们直接进入表格。 为了便于调试,我将创建几个具有语音名称的变量,这些变量将负责数字的准确性,数字前的空格数,数字后的空格数等。

 dials_precision = "%10.6g" #   spaces_in_the_title = int((int(dials_precision[1:3])) / 2) length_of_table_lower_bound = (int(dials_precision[1:3]) + 2) * 4 + 5 delimiter = ' ' is_sequence_decreasing = to_x - from_x < 0 min_y1_value, max_y1_value, x_copy = y1(from_x), y1(from_x), from_x negative_value_exists = False 

那么这是怎么回事?

图片

 dials_precision = "%10.6g" #   

在这一行中,我设置数字的精度。 整数最多10个字符,小数部分最多6个字符。 如果我们对于该范围的值太大,则会出现各种e-15或类似的东西。

 spaces_in_the_title = int((int(dials_precision[1:3])) / 2) 

Dials_precision是一个字符串,因此我们可以对此字符串进行切片,即某种子字符串。 在这种情况下,我们需要获取数字10,因此我们采用1和2索引处的字符,然后将此子字符串转换为整数数据类型,除以2并四舍五入。

我们需要此变量,以便表标题中的题词位于单元格的中心

 length_of_table_lower_bound = (int(dials_precision[1:3]) + 2) * 4 + 5 

顾名思义,此变量负责函数值表的单元格下边界的长度。 该数字总共占据10个位置,这意味着该列不能少于10个宽;当我们使用e-15格式的数字(如上所述)时,该值将占据11-12个位置。 因此,我们在10上添加了另一个平局。

4代表列数(x,y1,y2,y3),5代表限制行中单元格的字符数。

其余变量似乎很直观,因此让我们继续进行印刷

 print("|" + (spaces_in_the_title + 1) * delimiter + 'x' + spaces_in_the_title * delimiter + '|' + spaces_in_the_title * delimiter + "y1" +\ spaces_in_the_title* delimiter\ + '|' + spaces_in_the_title * delimiter + 'y2'\ + spaces_in_the_title * delimiter + '|' +\ spaces_in_the_title * delimiter\ + "y3" + spaces_in_the_title * delimiter + "|\n"\ + length_of_table_lower_bound * '-') 

如果我们连接已经编写的所有代码,那么在控制台中,我们将看到以下内容:

图片

现在我们需要自己打印值。 为此,您需要一个循环。 由于输入的数据可能是小数,因此使用范围将无效,因此我将使用常规循环。

由于我们既可以具有X的递减序列,又可以具有递增的X序列,所以必须设置循环条件,以便同时考虑这两个选项。 我们有一个先前创建的变量,以0或1的形式存储有关序列性质的答案。因此,考虑两种情况并为每种情况选择适当的条件就足够了

 while(is_sequence_decreasing and x_copy >= to_x) or\ (not is_sequence_decreasing and x_copy <= to_x): 

由于对于图我们需要绘制的图y1的最小值和最大值,因此我们引入了负责最小值和最大值的特殊变量

 y1_cur_value = y1(x_copy) min_y1_value = (min_y1_value > y1_cur_value) * y1_cur_value + \ (min_y1_value <= y1_cur_value) * min_y1_value max_y1_value = (max_y1_value < y1_cur_value) * y1_cur_value + \ (max_y1_value >= y1_cur_value) * max_y1_value negative_value_exists += y1_cur_value < 0 

本质上,该构造仅通过布尔不等式重复if:... else:...的构造。 y1_cur_value存储函数的当前值。 我创建了一个变量,以便在需要某个值时不会不断调用该函数。
我们还需要存在负值以进行绘图。

图片

现在直接打印值。 我希望所有内容都美观并且位于每个单元格的中央,因此我必须手动处理每个值以检查数字的长度,并根据它选择空格数以对齐值。

注意事项
从字面上居中将不起作用。 负责精度的变量具有参数g。 他说,为某个数字保留一定数量的数字(在我们的情况下,默认为10个)。 如果未拨10位数字,则空白位置将位于填充位置的左侧。 因此,我们只能将10个位置排成一行。


 aux_x = dials_precision % x_copy aux = len(aux_x) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_x) == int(dials_precision[1:3]) + 1 print('|' + delimiter * aux + aux_x + delimiter * (aux - aux_2) + '|', end='') 
aux_x-已经以给定的精度带入视图的字符串。 现在,我们需要检查数字的长度并选择所需的空格数。 由于不需要在每一侧有多个空格,因此bool eva变量非常适合作为这些相同空格数量的守护者。 aux_2捕获数字长度为11的情况。

我们也为三个函数的值做

  aux_y1 = dials_precision % y1_cur_value aux = len(aux_y1) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y1) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y1 + delimiter * (aux - aux_2) + '|', end='') if (x_copy != 0): aux_y2 = dials_precision % y2(x_copy) aux = len(aux_y2) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y2) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y2 + delimiter * (aux - aux_2) + '|', end='') aux_y3 = dials_precision % y3(x_copy) aux = len(aux_y3) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y3) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y3 + delimiter * (aux - aux_2) + \ "|\n" + length_of_table_lower_bound * '-') else: print((spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + '|' \ + (spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + "|\n" \ + length_of_table_lower_bound * '-') x_copy += pace_x 

就像我刚开始所说的那样,第二个和第三个函数都有断点-两个函数在x = 0时都不存在。因此,我们还需要抓住这些情况。

好吧,不要忘记增加当前的x值,这样我们就不会得到无尽的循环。

让我们在一个程序中收集所有代码并运行它,例如,在测试-1.2 3.6 0.3上

图片

 from math import sqrt def y1(x): return x**3 - 2*x**2 + 4*x - 8 def y2(x): return 1 - 1/x**2 def y3(x): return sqrt(abs(y1(x)*y2(x))) from_x, to_x, pace_x = map(float, input("Enter the first and the last"\ " x-coordinates and a pace dividing them by a"\ " space:").split()) if (pace_x != 0) and (to_x - from_x)*pace_x >= 0 and abs(to_x - from_x): dials_precision = "%10.6g" #   spaces_in_the_title = int((int(dials_precision[1:3])) / 2) length_of_table_lower_bound = (int(dials_precision[1:3]) + 2) * 4 + 5 delimiter = ' ' is_sequence_decreasing = to_x - from_x < 0 min_y1_value, max_y1_value, x_copy = y1(from_x), y1(from_x), from_x negative_value_exists = False print("|" + (spaces_in_the_title + 1) * delimiter + 'x' + spaces_in_the_title * delimiter + '|' + spaces_in_the_title * delimiter + "y1" + spaces_in_the_title * delimiter \ + '|' + spaces_in_the_title * delimiter + 'y2' \ + spaces_in_the_title * delimiter + '|' + spaces_in_the_title * delimiter \ + "y3" + spaces_in_the_title * delimiter + "|\n" \ + length_of_table_lower_bound * '-') while (is_sequence_decreasing and x_copy >= to_x) or \ (not is_sequence_decreasing and x_copy <= to_x): y1_cur_value = y1(x_copy) min_y1_value = (min_y1_value > y1_cur_value) * y1_cur_value + \ (min_y1_value <= y1_cur_value) * min_y1_value max_y1_value = (max_y1_value < y1_cur_value) * y1_cur_value + \ (max_y1_value >= y1_cur_value) * max_y1_value negative_value_exists += y1_cur_value < 0 aux_x = dials_precision % x_copy aux = len(aux_x) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_x) == int(dials_precision[1:3]) + 1 print('|' + delimiter * aux + aux_x + delimiter * (aux - aux_2) + '|', end='') aux_y1 = dials_precision % y1_cur_value aux = len(aux_y1) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y1) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y1 + delimiter * (aux - aux_2) + '|', end='') if (x_copy != 0): aux_y2 = dials_precision % y2(x_copy) aux = len(aux_y2) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y2) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y2 + delimiter * (aux - aux_2) + '|', end='') aux_y3 = dials_precision % y3(x_copy) aux = len(aux_y3) != int(dials_precision[1:3]) + 2 aux_2 = len(aux_y3) == int(dials_precision[1:3]) + 1 print(delimiter * aux + aux_y3 + delimiter * (aux - aux_2) + \ "|\n" + length_of_table_lower_bound * '-') else: print((spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + '|' \ + (spaces_in_the_title - 2) * delimiter + " " \ + (spaces_in_the_title - 2) * delimiter + "|\n" \ + length_of_table_lower_bound * '-') x_copy += pace_x else: print("Incorrect input") 

在创建的第二部分中,我们将构建图

图片

待续...

Source: https://habr.com/ru/post/zh-CN426373/


All Articles