練習內容:判斷多個坐標是否在同一條直線上
完整代碼和注釋如下
print('請輸入幾個點的橫縱坐標,程序將會返回這幾個點是否在同一條直線上')
def coor_nums():#獲得每個值的橫縱坐標
int_list=[]#初始化坐標列表
wrong_list=[]#初始化錯誤列表
judgement=''#判斷是否需要修正坐標值
while True:
nums=input('應以x1 y1 x2 y2...的格式輸入:\n')
num_list=nums.split()
if len(num_list)%2!=0:#如果輸入的坐標長度不是偶數 說明輸入錯誤
print('請輸入每個點的橫縱坐標')
continue
for n in num_list:#對輸入的每個值
try:
num=float(n)
int_list.append(num)#嘗試將輸入的值轉為浮點類型添加到坐標列表中
except Exception as e:#如果發生異常
print('你輸入的第'+str(num_list.index(n)+1)+'個值為:'+n+',它不是數字 請按照要求輸入')#提示修改
wrong_list.append([num_list.index(n),n])#將錯誤坐標值的索引和錯誤坐標值都添加到錯誤列表
int_list.append(n)#同時也將錯誤坐標值添加到坐標列表 便於修改
judgement='need'#判斷為need 即需要修改
return int_list,wrong_list,judgement
int_list,wrong_list,judgement=coor_nums()
def adjust(wrong_list):#調整錯誤列表並且修改對應坐標列表
right_list=[]#初始化修改后的列表
for wrong_num in wrong_list:#對於每個錯誤值
while True:#循環修改直到修改正確
right_num_input=input('正在修改第{}個值,原值為:{},現值為:\n'.format(wrong_num[0]+1,wrong_num[1]))
try:
right_num=float(right_num_input)
right_list.append([wrong_num[0],right_num])#將修改值添加到正確列表
break
except Exception as e:
print('修改值仍然錯誤,請再次修改')
continue
return right_list
def k_line_judge(int_list,wrong_list,judgement):#判斷輸入點是否在同一條直線
if judgement=='need':#如果為need則需要調整初次輸入的坐標值
right_list=adjust(wrong_list)
for n in right_list:
int_list[n[0]]=n[1]#把每個修改后的值賦予坐標列表
point_judge=list(set(int_list))
if len(point_judge)==1:#如果輸入的每個值相同 說明是同一個點
return print('所有點是同一個點 為({},{})'.format(point_judge[0],point_judge[0]))
k_list=[]#初始化直線斜率列表
for n in range(3,len(int_list),2):#處理坐標列表
try:
k=(int_list[n]-int_list[n-2])/(int_list[n-1]-int_list[n-3])#斜率公式k=(y2-y1)/(x2-x1)
k_list.append(k)#嘗試向斜率列表中增加每兩個點的斜率
except ZeroDivisionError as e:#如果出現了x2-x1=0的情況 暫時先略過
pass
if n==len(int_list)-1 and len(k_list)==0:#如果循環到最后 直線斜率列表長度仍然為0
return print('所有點在直線x={}上'.format(int_list[0]))#說明輸入的坐標都在直線x=x1上
set_k_list=list(set(k_list))
if len(set_k_list)==1 and set_k_list[0]==0:#如果直線斜率列表長度為1 並且k=0 說明輸入坐標都在y=y1上
print('所有點在直線y={}上'.format(int_list[1]))
elif len(set_k_list)==1 and set_k_list[0]!=0:#如果直線斜率列表長度為1 並且k不等於0
line_k=set_k_list[0]#說明在一條y=kx+b的直線上
line_b=int_list[1]-int_list[0]*line_k#b=y-kx
if float(line_b)<=0:#分為b>0和b<=0兩種打印情況
print('所有點在直線y={}x{}上'.format(round(line_k,5),line_b))
else:
print('所有點在直線y={}x+{}上'.format(round(line_k,5),line_b))
elif len(set_k_list)!=1:#如果斜率列表長度不為1說明不在同一條直線上
print('所有點不在同一條直線上')
k_line_judge(int_list,wrong_list,judgement)