Lập trình cơ bản với Python

Danh sách bài tập

Note: Đề bài được tạo bằng pipeline scrape từ web trường (Moodle PHP) về, và reformat từng bài bằng Gemini 2.0 Flash (sửa lại markdown, nếu có ảnh, dịch ra latex hoặc sử dụng ASCII để minh họa). Để AI tự code rồi tự check trên Mimgo thì chắc cũng được nhưng mà thôi 🥴.


2.1 Dãy số

  • Hàm isAlt(a) thực hiện kiểm tra dãy số a có phải là dãy đan dấu hay không? Nếu đúng trả về giá trị là True Nếu sai trả về giá trị là False.
  • Hàm isGrow(a) thực hiện kiểm tra dãy số a có phải là dãy tăng hay không? Nếu đúng trả về giá trị là True Nếu sai trả về giá trị là False.
  • Hàm isMulti(a) thực hiện kiểm tra dãy số a có phải là cấp số nhân hay không? Nếu đúng trả về giá trị là True Nếu sai trả về giá trị là False.
  • Hàm isAdd(a) thực hiện kiểm tra dãy số a có phải là cấp số cộng hay không? Nếu đúng trả về giá trị là True Nếu sai trả về giá trị là False.
def isAlt(a):
    return all((a[i] > 0 and a[i+1] < 0) or (a[i] < 0 and a[i+1] > 0) for i in range(len(a)-1))

def isGrow(a):
    return all(a[i] < a[i+1] for i in range(len(a)-1))

def isMulti(a):
    if len(a) < 2: return False
    r = a[1] / a[0]
    return all(a[i+1] / a[i] == r for i in range(len(a)-1))

def isAdd(a):
    if len(a) < 2: return False
    d = a[1] - a[0]
    return all(a[i+1] - a[i] == d for i in range(len(a)-1))

2.2 Tam giác PASCAL

  • Hoàn thiện chương trình nhập vào số nguyên $m$, in ra tam giác PASCAL bậc $m$.
  • Ví dụ $m = 3$, kết quả in ra là
1 
1 1 
1 2 1 
1 3 3 1 
  • Chú ý kết quả có 1 dấu cách ở cuối mỗi dòng.
from math import comb

m = int(input())

for i in range(m + 1):
    for j in range(i + 1):
        print(comb(i, j), end=" ")
    print()

2.3 Ký tự xuất hiện nhiều nhất

  • Viết chương trình nhập vào một xâu S, in ra ký tự và số lần xuất hiện của ký tự xuất hiện nhiều nhất trong xâu S.
  • Kết quả in ra dưới dạng: #C #N
  • Trong đó #C là ký tự, #N số lần xuất hiện của ký tự #C.
s = input()
counts = {}
for c in s:
    counts[c] = counts.get(c, 0) + 1
max_char = max(counts, key=counts.get)
print(f"{max_char} {counts[max_char]}")

2.4 Kiểm tra ma trận ma phương

  • Viết chương trình nhập vào ma trận từ bàn phím, kiểm tra xem ma trận có phải là ma phương hay không? Ma trận ma phương là ma trận có tổng các hàng, các cột và các đường chéo bằng nhau.
  • Hàm isMagicSquare() là hàm kiểm tra tính chất ma phương của một ma trận.
  • Hàm inputMatrix() thực hiện việc nhập và trả lại một ma trận (mảng 2 chiều)  các số nguyên. + Mỗi hàng của ma trận được nhập trên 1 dòng, mỗi số cách nhau bởi 1 dấu tab (‘\t’) + Việc nhập kết thúc khi gặp dòng trống.
def inputMatrix():
    m = []
    while True:
        line = input()
        if line == '':
            break
        m.append(list(map(int, line.split('\t'))))
    return m

def isMagicSquare(m):
    if not m: return False
    n = len(m)
    s = sum(m[0])
    if any(sum(row) != s for row in m): return False
    if any(sum(m[i][j] for i in range(n)) != s for j in range(n)): return False
    if sum(m[i][i] for i in range(n)) != s: return False
    if sum(m[i][n-i-1] for i in range(n)) != s: return False
    return True

2.5 Sắp xếp tên

  • Viết hàm tách tên và họ đệm từ một chuỗi họ tên, sắp xếp danh sách  họ tên theo tên, nếu tên trùng nhau thì sắp theo họ đệm.
  • Hàm inputList() thực hiện việc nhập và trả lại danh sách họ tên từ bàn phím, mỗi chuỗi họ tên trên 1 dòng, việc nhập kết thúc khi gặp dòng trống.
  • Hàm getName(s) trả lại bộ gồm 2 chuỗi tương ứng là họ đệm và tên từ chuỗi s.
  • Hàm sortNamesList(names) thực hiện sắp xếp danh sách họ tên names theo tên, nếu tên trùng nhau thì sắp theo họ đệm, kết quả trả về một danh sách đã được sắp xếp theo Tên, họ đệm. Sinh viên tham khảo bài viết Sắp xếp tiếng Việt pymi.vn để biết cách sắp xếp xâu unicode theo ngôn ngữ. Trong requested file NamesSort.py đã đặt locale cho tiếng Việt. Sử dụng phương thức locale.strxfrm(s) để lấy chuỗi theo đúng thứ tự trong ngôn ngữ để so sánh.
# -*- coding: utf-8 -*-
import locale
locale.setlocale(locale.LC_ALL, 'vi_VN')

def inputList():
    names = []
    while True:
        line = input()
        if line == '': break
        names.append(line)
    return names

def getName(s):
    parts = s.strip().split()
    return (' '.join(parts[:-1]), parts[-1])

def sortNamesList(names):
    return sorted(names, key=lambda name: locale.strxfrm(getName(name)[1] + getName(name)[0]))

2.6 Sắp xếp các phần tử trong mảng

  • Viết chương trình thực hiện các chức năng sau: Nhập mảng.
  • Sắp xếp các phần tử trong mảng theo thứ tự tăng dần.
  • In mảng.

Ví dụ:

  • input: 1 2 4 5 3 6 0 9 8 7
  • output: 0 1 2 3 4 5 6 7 8 9
def inputArray():
    return list(map(int, input().split()))

def sort_array(array):
    return sorted(array)

def printArray(r):
    print(' '.join(map(str, r)))

arr = inputArray()
r = sort_array(arr)
printArray(r)

2.7 Tìm giá trị lớn thứ hai và nhỏ thứ hai trong mảng

  • Viết chương trình thực hiện các chức năng sau: Nhập mảng.
  • Tìm phần tử nhỏ thứ hai và lớn thứ hai trong mảng.

Ví dụ:

  • input: -1 1 0 1 2 -3 4
  • output: -1 2
def input_array():
    return list(map(int, input().split()))

def find_second_max_min(array):
    unique = sorted(set(array))
    if len(unique) < 2:
        return None, None
    return unique[1], unique[-2]

array = input_array()
a, b = find_second_max_min(array)
print(a, b)

2.8 Nhân ma trận

  • Viết chương trình cho phép nhập 2 ma trận A và B có kịch thước tương ứng là (NxM) và (MxD) từ bàn phím, thực hiện phép nhân ma trận AxB.
  • Hàm inputMatrix() thực hiện việc nhập kích thước ma trận, ma trận và trả lại một ma trận (mảng 2 chiều) các số nguyên.
  • Hàm multiMatrix(m1, m2) thực hiện việc nhân hai ma trận và trả lại một ma trận các số nguyên.
  • Hàm printMatrix(m) thực hiện in ra ma trận.

  • Input: ma trận A: NxM, ma trận B: MxD.
  • Output: ma trận C: NxD.

Ví dụ:

3 2 (Size of matrix 1) 1 2 4 5 7 8
2 3 (Size of matrix 2) 1 0 1 1 0 1 
def inputMatrix():
    size = list(map(int, input().split()))
    rows = size[0]
    return [list(map(int, input().split())) for _ in range(rows)]

def multiMatrix(m1, m2):
    return [[sum(m1[i][k] * m2[k][j] for k in range(len(m2))) for j in range(len(m2[0]))] for i in range(len(m1))]

def printMatrix(m):
    for row in m:
        print(' '.join(map(str, row)))

m1 = inputMatrix()
m2 = inputMatrix()
mm = multiMatrix(m1, m2)
printMatrix(mm)

2.9 Kiểm tra ma trận tam giác trên

  • Viết chương trình thực hiện các chức năng sau:
  • Nhập ma trận.
  • Kiểm tra xem ma trận đó có phải ma trận tam giác trên hay không?
def inputMatrix():
    m = []
    while True:
        line = input()
        if line == '': break
        m.append(list(map(int, line.split())))
    return m

def isUpperTriangleMatrix(m):
    return all(m[i][j] == 0 for i in range(1, len(m)) for j in range(i))

m = inputMatrix()
print(isUpperTriangleMatrix(m))

2.10 Ma trận chuyển vị

  • Viết chương trình thực hiện các chức năng sau:
  • Nhập ma trận vuông 2 chiều M: NxN.
  • Thực hiện phép chuyển vị cho ma trận M.
  • In ra ma trận chuyển vị.
def inputMatrix():
    m = []
    while True:
        line = input()
        if line == '': break
        m.append(list(map(int, line.split())))
    return m

def transpose(m):
    return [list(row) for row in zip(*m)]

def printMatrix(t):
    for row in t:
        print(' '.join(map(str, row)))

m = inputMatrix()
t = transpose(m)
printMatrix(t)