2023年7月22日 星期六

TQC~ 程式語言 python3

第一類
list,list7 = [] 用 append(n),
tuple ,tup7 = (),用 +=(n,),不能用 tup7 = tuple()。
set ,set7 = set(),用 add(n)。記得要加set,不然變成tuple。
dic,dic7 = {},用 dic7[key] = value。
  1. 題目:輸入四個數字,每個數字欄寬為5,先印靠左(兩個數字一行,且前後要有 | ),在印靠右。感謝SY talkoffice指南分享資訊。
    DIY:用print( ' | {:>5}{:>5}'.format(變數1,變數2) ),可以寫四行並調整題目要的,但為了練習程式,用兩個for,第一個for處理靠左、靠右。第二個for處理變數奇數不斷行,變數偶數斷行。這樣輸入幾個數字都沒問題???嗎???
  2. 題目:輸入四個浮點數,欄寬為7,一樣要靠左靠右,但數字中間要空一格空白。
    DIY:跟第一題一樣要用兩個for,差別在print( ' | {:>7.2f}{:>7.2f}'.format(變數1,變數2) )
  3. 題目:這是改成字串,欄寬為10。
    DIY:跟第一題一樣,數字改成10。
  4. 題目:輸入半徑,顯示半徑,周長,與面積。
    DIY:要記住先寫好format框架,print(' {} '.format())
    新的方法,print(f '  { x : >5 .2f} ' )。表示變數X佔五格(包含兩個小數點)靠右。
  5. 題目:輸入高、寬,顯示高、寬、周長、面積
    DIY:想要輸入兩個數字,直接給定兩個變數,用split()只能轉成字串,所以搭配map才行,感謝howard分享
    w, h = map(float, (input("請輸入寬高,用空白區隔")).split())
  6. 題目:給幾分幾秒及跑多少公里,要換算時速英哩。(一英哩 = 1.6公里)
    DIY:粗心,除法還是要用括號括起來。原本是( 英哩 / 秒數 /3600 ),其中,秒數/3600沒有括起來,所以導致一個蛋糕,先分給十個人,再分給十個人,得到的蛋糕就更少。正確是 ( 英哩 /  (秒數 /3600 ) ),所以十個人除以十個人等於分給一個人。
  7. 題目:輸入五個數字,算出總和與平均。感謝嗡嗡地隨手筆記分享map轉list。
    DIY:在想說是否可以用list的sum??答案是可以的~
    但這邊要用eval(input()),因為有可能輸入整數或浮點數
  8. 題目:給兩點座標,算出歐式距離 ( (x1-x2)**2 + (y1-y2)**2 ) **0.5
    DIY:答案可以區分出是整數還是浮點數然後顯示出來耶@@我是直接用浮點數計算。
    一定要用 eval(input()),因為要顯示小數點(float)或是整數(int)
  9. 題目:給一個正數,求五邊形面積。有提示要用math的pow及 tan。
    DIY:math.pow(s,2)表示s**2。
    s^2(是平方),會錯意,以為是開更號@@
  10. 題目:給N邊,S邊長,算出N邊形的面積。
    DIY:( n * math.pow(s,2) ) / ( 4 * math.tan( math.pi / n ) )
第二類
  1. 題目:輸入一個整數,判斷是奇數還是偶數
    DIY:用%2來處理
  2. 題目:判斷是3或5的倍數。若同時是3與5的倍數要另外列出喔
    DIY:最先判斷是否同時為3、5倍數,接著判斷3或5或不是。
  3. 題目:判斷閏年,四百潤,一百不潤,四年潤。
    DIY:先判斷四百,再判斷一百,再判斷四,最後都不是。
  4. 題目:輸入兩個數字及一個運算子,印出答案。
    DIY:因為輸入的運算子是字串,所以判斷後將兩個數作處理。
    // 取商, %取餘數,
  5. 題目:輸入一個字元,判斷是大小寫、數字或是其他字元。
    DIY:所以是要變成ASCII嗎???感謝Khan分享。要用ord('a'),就會列出97
    wiki表:48~57(表示數字0~9)、65~90(大寫字母A~Z)、97~122(小寫a~z)
    要注意,條件要包含等於喔(第一次做忘了加,就一直錯),例如 if n1>=48 and n1<=57 :
    ord(字串) 可以變成數字, chr(數字) 變成字母
  6. 題目:輸入數字,顯示其等級
    DIY:記得條件要加判斷,另外沒有提到超過的數字,自行多處理(好嗎???)
  7. 題目:消費金額達到多少,就折扣多少~
    DIY:由金額大的過濾到最小的
  8. 題目:給個0~15數字,轉成16進位
    DIY:想說用list,所以輸入的的數字直接列出陣列中的字。之前是ord(字串)=數字,現在用chr(數字)=字串
  9. 題目:給個座標,判斷是否在15以內。歐式距離 ( (x1-x2)**2 + (y1-y2)**2 ) **0.5
    DIY:計算出距離後判斷
  10. 題目:給三邊,檢查是否可以組成三角形,任意兩邊大於第三邊
    DIY:一開始用x+y>z or x+z>y or y+z>x,產生錯誤。不能用or,要用 and
第三類
  1. 題目:用迴圈,輸入兩個數字a,b (a<b),從a 加總到 b。
    DIY:用 range(a,b+1),再搭配一個sum=0的變數累加
  2. 題目:用迴圈,輸入兩個數字a,b (a<b),從a 到 b 的偶數加總
    DIY:跟上一題一樣,但加個%2==0判斷是否為偶數
  3. 題目:給個數字N,排出N邊的三角形,且是用相乘出來的數字排成的
    DIY:用雙迴圈,且都是range(1,n+1) ,range(1,i+1)。若是一開始是0,會跑不出來@@
  4. 題目:輸入一個數字N,加總從1~N的5倍數。
    DIY:加個%5==0判斷是否為5倍數。
  5. 題目:輸入一個正整數N=123456,將其數值反轉輸出。
    DIY:找出長度 len(N),從最後的字串先輸出for i in range(len(N)-1, -1, -1)。
    長度=6,所以要減1,最後是0,但要包括0,所以也要減1,從最大到最小,也減1。
    另一個作法是取餘數,搭配商數,關鍵點是當商數 ! = 0,就繼續求餘數與商數。
  6. 題目:給個N值,計算出N!的數值。
    DIY:這次直接用 for i in range(n):  sum *= (i+1)
  7. 題目:給個數值N,列出 N*N  的乘法表,其中N運算元、運算子欄寬為2,乘積欄寬為4,皆靠左。
    DIY:print('{:<2} * {:<2} = {:<4}'.format((i+1), (j+1), (i+1)*(j+1) ), end='' )
  8. 題目:要先輸入一個數字,表示後面有幾組數字要輸入@@(沒看清楚題目)
    接著輸入一串數字,計算出每個數字的總和。
    DIY:sum += int(n[i])
  9. 題目:輸入金額N、收益率R、M個,計算出M個月的存款總額。
    DIY:原本用sum +=,但這樣會變成倍數成長@@,所以應該用 n = n + (n*r/1200),其中記得要除以1200(12個月,年收益要除以100) 注意空格
  10. 題目:給數字N(N>1),計算出類似等差級數總和,(1/(1+2**0.5) )+ (1/(2**0.5 +3**0.5) )+ (1/(3**0.5 + 4**0.5)) + ... (1/ ((N-1)**0.5 + N**0.5))
    DIY:注意for迴圈從2開始,for i in range(2,n+1): sum += ( 1/((i-1)**0.5 + i**0.5) ) 應該要下條件,x=1,while x<N:這樣比較符合題目
第四類
  1. 題目:輸入十個數字,找出最小值
    DIY:用for i in range(10):,將數字存入list2中 list2.append(n),再使用min(list2)
  2. 題目:輸入N個數字,找出最小值
    DIY:用while(n!=9999),list2.append(n),再使用min(list2)
  3. 題目:輸入兩數當區間,找出4與9的倍數,個數及總合。一行列出十個,欄寬為4
    DIY:用list,個數→len(list),總和→sum(list),列出list時,i==9時,加print()
    每10行,是要用 %10 == 0來計算
  4. 題目:輸入一個數字,顯示翻轉數字
    DIY:因為輸入數字時,預設是字串,但在for的時候沒有加step的 -1,要注意喔@@
    for i in range(len(n), 0, -1):
  5. 題目:不定迴圈來北對PGA成績level
    DIY:忘記在while迴圈中加入n = int(input()),會一直跑出成績
  6. 題目:輸入身高體重,求出BMI,直到輸入-9999結束迴圈
    DIY:跟上題一樣。但要在輸入身高時,多加 h == -9999: break
  7. 題目:不定迴圈求閏年
    DIY:分別從400,100,4判斷
  8. 題目:輸入十個整數,計算出幾個奇數偶數。
    DIY:用 if n %2 == 0: 來區分為 odd、even
  9. 題目:輸入數字投票,1給一號、2給二號候選人,其他數字給nobody,列出最高票候選人
    DIY:先區分數字看是投給哪位,並搭配dict來找出最多票的人,還有其他限制(若兩人同時高票或是nobody高票時,顯示沒人當選)
  10. dict2 = {n1:'NO.1:Nami', n2:'NO.2:Chopper', n3:'nobody'}
    max(dict2)可以找出n1、n2、n3哪個最大(就是dict2最大的keys) dict2[max(dict2)] 可以顯示 dict2的values
  11. 題目:輸入數字N,畫出N層的等腰三角形(用*來顯示)
    DIY:等腰三角形,假設N=7,最底層 左邊有六個*,中間一個*,右邊六個*
    原本想要用print(' '*(n-i),'*'*(i), '*'*i-1)但會有空一格@@, 所以找出規律 print(' '*(n-i),'*'*(i*2-1))
第五類
  1. 題目:寫個函式,可以讓使用者輸入系所、學號、姓名,將其顯示出來
    DIY:用def寫出函式
  2. 題目:寫個函式,傳入參數a,b,傳回乘積
    DIY:用 return 傳回數值
  3. 題目:寫個函式,傳入參數a,b,傳回a連加到b的和
    DIY:for i in range(a, b+1): sum += i
  4. 題目:寫個函式,傳入參數a,b,傳回a的b次方
    DIY:return a**b
  5. 題目:輸入字元、行數、列數,印出
    DIY:字元是字串,行數列數是數字,所以兩個要分開擷取
  6. 題目:輸入a,b,c解X,ax**2 + bx + c = 0,但沒給解X的公式@@
    DIY: (-b +- (b**2 - 4*a*c )**0.5) / (2*a),記得要括號,切記切記。
    還少了無解的輸出,重點在(b**2-4*a*c)<0就是無解。
    順序性的意思,-b+q 先列印,-b-q。q = 
    (b**2 - 4*a*c )
    解答是要有逗號分開喔~
  7. 題目:輸入數值,顯示是否為質數
    DIY:範例<=1的都不是質數,且利用數值一半的商(q = n//2) 來跑迴圈檢測是否為質數,若有一個以上,就不是質數 題目要求會回傳True / False,再來判斷是否為質數。
  8. 題目:求最大公因數
    DIY:用最小的數來跑range,每個數值 % i == 0,記錄下來,找出最大的就是了
    max = 0不能放在for裡面,不然永遠都是0。也可用eval(真強大)
    x , y = eval (input() ),裡面不用加int 或 float區分,且input()時只能區分逗號。
    雖然return 可以顯示答案,但最後要用print列印出來。
  9. 題目:兩個分數相加(要最簡分數)
    DIY:先通分,再找最大公因數約分
  10. 題目:給數值N,列出費氏數列
    DIY:用陣列來儲存,list2 = [0,1],for i in range(2,n): fn = list2[i-1] + list2[i-2]

第六類
  1. 題目:輸入12個數字進list,3個一列靠右對齊(欄寬3),並將偶數(0、2、4、...10)的list相加列出
    DIY:之前有遇過0%3也會等於0,這次在取for值,先將i 從1開始, i in range(1, len(list2)+1):  就不用擔心list[0]就先換行,但取偶數位的時候要將 減1喔~~ sum += list2[i-1]  
  2. 題目:輸入五張撲克牌的數值(J、Q、K、A代表11、12、13、1),計算其總和
    DIY:因為用"ord(字串) 可以變成數字, chr(數字) 變成字母"但ord只能一個字元,所以遇到10(兩個字元)就當機。所以要先下判斷if len(n) > 1: n = int(n) 之後  else:  n = ord(n)
  3. 題目:輸入十個數字放入陣列,取最大的三個數字
    DIY:有土法煉鋼一個一個比對,但題目說要放入陣列,就試試看用sorted排大小
    若用for印出答案,最後一個數字會有空白,所以必須一個一個列印。
    sorted(list3, reverse=1))  #reverse=1,由大排到小。
  4. 題目:輸入十個數字,找出眾數及其次數
    DIY:使用dict{items : values }將出現過的items的values加1,但最後找出最多是網路上找到的方法(感謝TechinDelight)
    print(max(dic2, key=dic2.get))  #找出最大values的items
    print(max(dic2.values()))     #找出最大的values
  5. 題目:輸入十個數字,去掉最大最小值,剩下的加總並算平均(小數兩位)
    DIY:用sorted(list),再跑for i in range(1,len(slist)-1): 計算  
  6. 題目:輸入兩個數,代表二維陣列的大小,並將數列放入(要看圖片比較清楚)
    DIY:忘記如何產生二維(感謝黃健庭老師:先產生二維,在修改裡面數值)
    後來測試可以先建立list3 = [],第一個for那邊再建立一個list4,第二個for將數值加入到list4,完成後再加list4加入到list3即可
    要如何找出幾維陣列呢? len(A)可以看出幾列,len(a[0])可以看出每列有幾個@@
    改天來看看陣列與影音數位化
  7. 題目:輸入三位學生,五個成績,計算總分及平均數
    DIY:可以利用sum(list3)來計算總分
  8. 題目:輸入九個數字(不重複)分別放入(3*3矩陣),找出最大、最小的索引值
    DIY:先新增兩個陣列,這樣輸入的時候就可以比對資料了~
    Max = [0,0,0] 、min = [100,0,0],但看起來應該是要用迴圈跑一次尋找大小 並使用。 錯誤訊息:TypeError: 'list' object is not callable,原因是我又用min陣列,又使用python的min函式,兩個起衝突。
  9. 題目:建立兩個 2*2矩陣(三維),顯示矩陣1、2內容,相加的結果
    DIY:兩個矩陣相加只是拉長(變成二維),numpy可以處理,但這裡就一個一個取出再相加乘另一個矩陣
  10. 題目:輸入四周各三天的溫度,算出四周的平均、最高、最低溫度
    DIY:用雙矩陣,sum(list2)、max(list2)、min(list2)做紀錄後比較大小或相加
    原本用變數來解決,例如max10 = 0,每次輸入就比較並記錄最大的,但這題不能這樣做@@要用list找最大及最小值。
第七類
  1. 題目:使用tuple(數組),輸入N個數字(直到-9999結束),算出幾個,最大、最小、總和
    DIY:用陣列???好像比前面的簡單,還是前面的不能用陣列的方法@@
  2. 題目:輸入兩組,N個數字(-999結束),先合併並顯示,再排序並顯示
    DIY:使用tuple(數組) (感謝通訊雜記,可以用for來搭配 tuple2 += (i,) )
  3. 題目:輸入五個字串( 'end' 結束),列出前三個跟後三個元素
    DIY:tuple可以切片,前三tuple2[:3],後三tuple2[-3:]
  4. 題目:使用set(集合),輸入一堆數字(-9999結束),求長度、最大、最小、總和
    DIY:可以用 set2.add(n) ,也可用len(set2)、max(set2)、min(set2)、sum(set2)
    忘記有內建sum可以計算,就自行增加sum來加總,導致相衝
  5. 題目:輸入三組(set),數字各5、3、9個。看看是否為子集合或超集合。
    DIY:(感謝steam教育學習網)注意是issubset (是S喔),不是issubnet (不是T喔)
  6. 題目:檢查英文句子,是否有包含26個字母。
    DIY:建立新的s1 =set() 是用小括號,且裡面是要字串或數字(感謝wasowski分享快速建立a-z的set)。並將輸入的字串轉成小寫的字母。
    且issubset不要搞錯方向喔@@  set(letters).issubset(s1)
  7. 題目:XY兩組輸入各自的科目,顯示所有的科目、共同的科目、Y有X沒有、XY彼此沒有的(參考steam教育學習網,交集、聯集、差集)
    DIY:利用(交集 & ,X有Y有)、(聯集 | ,XY全包)、(差集 Y-X,Y有X沒有)、(對稱差集 ^,全包 - 交集)
  8. 題目:輸入兩個字典(用end當結束)將兩組合併,由小到大,重複刪除。
    DIY:感謝自學成功道分享dict合併是用a.update(b)。感謝eason分享排序
    不能用dict3 = a.update(b),要先dict3 = a.copy(),dict3.update(b)。
    土法,用for跑一次,搭配key取出value。
  9. 題目:輸入顏色字典,根據key由小到大排列輸出
    DIY:這裡分享一下dict合併遇到的問題,想要用 dic3 = dic1.update(dic2) 竟然不成功,只能先 dic3 = dic1.copy(),dic3.update(dic2),簡單說就是不能用等號變成另一個字典,只能字典本身update@@
  10. 題目:先輸入多組電話與人名(end結束),再輸入一組電話號碼看看是否有在字典中
    DIY:感謝自學成功道分享用in檢查是否有在字典中。
    豆豆漿有分享用 dic2._ _ contains_ _('搜尋的字')
第八類
  1. 題目:輸入一個字串,顯示每個字元的索引
    DIY:用for就可以了嗎???
  2. 題目:輸入字串,顯示ASCII碼,並加總
    DIY:asc2 = ord(s[i])
  3. 題目:輸入一個句子(以空白隔開)輸出最後三個詞
    DIY:list2 = input().split() 因為用for,所以最後一個有空白,導致錯誤,必須一個一個列印。 可以用print(' '.join(listx)),但這限於string的陣列。
  4. 題目:輸入句子,將其都變成大寫,每個詞的第一個字母大寫
    DIY:大寫可以用s.upper()。
    每個詞第一個字母都大寫就用for,搭配s.capitalize()
  5. 題目:輸入python,顯示左右兩邊都有 |(欄寬10),一個靠左,至中,靠右
    DIY:感謝STEAM分享。至中是使用^, print(f'|{s:^10}|')
  6. 題目:寫出函式,輸入句子,輸入一個字元,計算出字元在句子中出現的次數
    DIY:本想用 in,但不行計算,所以用for 來比對
  7. 題目:輸入五個數字,加總並計算平均
    DIY:原本想要map,但map不能用在list上。所以用for,將輸入的字串改成數字。
  8. 題目:輸入ddd-dd-dddd(d表示數字)格式正確印出valid SSN,否Invalid SSN。
    DIY:用 if 將 - 排除,再判斷是否為數字(48 <= ord(s[i]) <= 57)
  9. 題目:輸入密碼,至少要八個字母,只能包含英文與數字,至少要有一個大寫
    DIY:48~57(表示數字0~9)、65~90(大寫字母A~Z)、97~122(小寫a~z)
    跑好久喔@@原來是while一直跑裡面的for。解決辦法是在for完後加個break
  10. 題目:輸入K組數字(每組隨意個數字),算出最大減最小的值
    DIY:第七題遇到多組數字不能用map,其實是可以的,感謝howard分享
    list123 = list(map(int, input().split()))
    注意喔,用f'{某個變數:.2f}',{}與某個變數之間不能有空格喔
第九類
  1. 題目:輸入五筆資料,寫入到write.txt(UTF8格式)
    DIY:先用 f = open('tqc1.txt', 'w', encoding='utf8') ,再用for跑五筆並加上f.write('\n'),最後f.close(),感謝STEAM分享,並用with就不用close()
  2. 題目:讀取read.txt,內容為一堆數字(空白隔開)將其加總後列出。
    DIY:f = open('read.txt', 'r'),取出來是str,所以就map到list,列出sum(list)
  3. 題目:輸入五個姓名,加到data.txt(已經有內容了)的後面
    DIY:f2 = open('data.txt', 'a', encoding='utf8') 用a加到最後,read()就可以讀取全部檔案
    因為TXT的最後沒有換行,所以程式要先加'\n'換行
  4. 題目:讀取檔案(有名字、身高、體重,空白隔開)。顯示內容,平均身高、體重,最高者、最重者
    DIY:發現讀取檔案用for跑不出來,(找出問題了,因為有先用.readlines(),所以seek(0)將指針歸零,且中途不能列印出來看看,指針會跑掉),還是用while比較方便(感謝wsrsw分享,注意喔,外面先跑readline(),裡面也要跑喔)。有replace可以取代('\n')
    這題做很久@@因為上面取出list,然在在從list中做加總及辨別,有經驗後應該會更快@@
    DIY2發現,readline()只能先replace('\n', ''),不能先split(),可能是readline就只能讀取一行,若用split就會變成陣列???
  5. 題目:輸入檔案名稱:data.txt與水果(字串),先顯示內容,接著顯示刪除水果的內容,並存檔
    DIY:這邊出了小問題,想說在顯示的同時,也刪除水果並儲存到另一個list,但因為兩個list都放for外面,所以導致最後的list會有多個陣列,應該一個放在i的外面,一個放在j的外面。這邊原想用lambda直接列出裡面的值,但還是列出陣列。
    第三次的時候用到W+,導致txt內容變空白@@所以還是要用 r+
  6. 題目:輸入檔名,字串1、字串2,先列出原本內容。字串2取代字串1,再列出取代後內容。
    DIY:可以直接用read(),就可以列出每一行(所有)的東西了(readline是將一行的東西放在陣列中)。試試看用with open(filename) as f:。
    感謝stackoverflow的大大分享雙層with open,第五題也改寫一下。
  7. 題目:輸入檔案名,顯示行數、單字數、字元數(不含空白),瑋哥也有寫TQC
    DIY:with open就類似字串陣列(但不能直接列印出來,必須搭配for 將其列出) @@為了不含空白,要split()
  8. 題目:輸入檔名、數字。秀出幾次(數字)的單字,由小到大排序。
    DIY:用dict,感謝自學成功道分享。用for x in dict3:,這時x就是一個tuple,可以用X[1]來取出數字比對。這邊注意,若是數字是3時,會顯示Python,但其實Python有四個,只是會後一個Python.有句點,所以雖然說不含空白,但其實也要將其他標點符號給刪除。(後來發現,給的資料沒有標點符號。
    list8.count(i),要在陣列中計算(這樣可以一個一個計算)。
    不能在fr.read()計算,例如a,經過apple時,他也會計算增加一個。
  9. 題目:寫入五個人的姓名與電話(空白隔開),輸入後列出。
    DIY:用input直接寫入,但好像不能用雙層with,所以分開with
  10. 題目:讀取data.dat,有欄位(用空白隔開),計算出男生女生的人數
    DIY:fr後,for x in fr一行一行取出,再將x.split()變成陣列,依序取出性別的欄位並分辨是男是女累加起來。


題目:
DIY:

沒有留言:

張貼留言

注意:只有此網誌的成員可以留言。