Ebob-Ekok Oluşturucu (Python Kod)

Etiketler :
"Ebob-Ekok Oluşturucu" Python programı, özellikle ortaokul seviyesindeki öğrenciler için matematiksel kavramların daha iyi anlaşılmasına yardımcı olmak amacıyla geliştirilmiştir. Bu yazılım, rastgele seçilen sayılarla EBOB (En Büyük Ortak Bölen) ve EKOK (En Küçük Ortak Kat) hesaplamalarını otomatikleştirerek, öğretmenlerin ve öğrencilerin alıştırma yapmalarını kolaylaştırır. Bu programın temel amacı, öğrencilerin EBOB ve EKOK kavramlarını uygulamalı bir şekilde öğrenmelerini sağlamaktır. Öğrenciler, rastgele oluşturulan sayı gruplarının asal çarpanlarını ayırarak bu değerleri hesaplamayı öğrenirler. Ayrıca, programın çıktısı olan PDF dosyaları, öğretmenlerin sınıf içi etkinliklerde veya ödevlerde kullanabileceği alıştırma sayfaları sunar. 
Çarpan ve Katlar konusunda EBOB ve EKOK işlemleinin daha iyi anlaşılması için 300 den küçük sayılar arasından rasgele sayılar seçerek, ikili ya da üçlü sayı grupları oluşturup, bunların EBOB - EKOK değerlerinin bulunması şeklinde alıştırma sayfasını oluşturan PYTHON kodlaması aşağıda verilmiştir. Program arayüzü aşağıdaki gibidir: 
Kodlamada istediğiniz şekilde özelleştirmelerde bulunabilir, yeni özellikler ve iyileştirmeler yapabilirsiniz. Programda en fazla 100 kadar işlem oluşturulabilmekte ve sayı grupları 2'li veya 3'lü grup olarak seçilebilmektedir. 
Program çıktısı A4 sayfa düzenine göre hazırlanmıştır. Programın Python kodu aşağıdaki gibidir. Aşağıdaki kod düzenini kopyalayarak üzerinde istediğiniz gibi değişikliklikler yapabilirsiniz. Özellikle ortaokul kademesinde alıştırma yaprakları oluşturmada program büyük kolaylık sağlayacaktır. Program sayesinde hazırlanan etkinlikler yardımıyla öğrenciler, öğretmen rehberliğinde sınıf içi etkinliklerde alıştırmalarla EBOB ve EKOK hesaplamalarını öğrenebilirler. Ayrıca evde yapacakları ödevlerle konuyu pekiştirme imkânı bulurlar. Sınav hazırlığı sürecinde de bu pratik alıştırmalar sayesinde konuyu daha iyi anlama fırsatı yakalarlar. Öğretmenler ise sınıf seviyesine uygun zorlukta, özelleştirilmiş alıştırmalar hazırlayarak öğrencilerin ihtiyaçlarına yönelik destek sağlayabilirler. Kadir PANCAR
import random
import math
import os
import platform
import subprocess
from fpdf import FPDF
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
from collections import Counter

son_gruplar = []

def ortak_bolen_var_mi(grup):
    ebob = math.gcd(grup[0], grup[1])
    if len(grup) == 3:
        ebob = math.gcd(ebob, grup[2])
    return ebob > 1

def rastgele_grup(grup_boyutu):
    if grup_boyutu == "karisik":
        grup_boyutu = random.choice([2, 3])
    else:
        grup_boyutu = int(grup_boyutu)
    while True:
        grup = random.sample(range(2, 300), grup_boyutu)
        if ortak_bolen_var_mi(grup):
            return grup

def pdf_olustur(dosya_adi, toplam_grup_sayisi, grup_boyutu):
    global son_gruplar
    son_gruplar = []

    pdf = FPDF()
    pdf.add_page()
    pdf.set_font("Arial", "B", 14)
    pdf.cell(0, 15, "EBOB EKOK Islemleri", ln=1, align="C")
    pdf.set_font("Arial", size=12)
    pdf.multi_cell(0, 10, "Asagidaki sayilarin EBOB ve EKOK degerlerini bulunuz. Her bir sayiyi asal carpanlarina ayiriniz.")
    pdf.ln(10)

    sutun_sayisi = 4
    sayfa_genisligi = 210
    kenar_bosluk = 10
    satir_bosluk = 20
    sutun_genislik = (sayfa_genisligi - 2 * kenar_bosluk) / sutun_sayisi

    grup_sayaci = 0
    while grup_sayaci < toplam_grup_sayisi:
        gruplar = [rastgele_grup(grup_boyutu) for _ in range(sutun_sayisi)]
        y_start = pdf.get_y()
        max_h = 0
        for i, grup in enumerate(gruplar):
            if grup_sayaci >= toplam_grup_sayisi:
                break
            x = kenar_bosluk + i * sutun_genislik
            pdf.set_xy(x, y_start)
            grup_str = "  ".join(f"{s:>3}" for s in grup)
            pdf.cell(sutun_genislik, 8, grup_str, border=0, ln=0, align="L")
            max_h = max(max_h, 8)
            son_gruplar.append(grup)
            grup_sayaci += 1
        pdf.ln(max_h + 10)

    pdf.output(dosya_adi)

def ekok_hesapla(a, b):
    return abs(a * b) // math.gcd(a, b)

def ekok_liste(grup):
    if len(grup) == 2:
        return ekok_hesapla(grup[0], grup[1])
    else:
        return ekok_hesapla(grup[0], ekok_hesapla(grup[1], grup[2]))

def asal_carpan_ayir(n):
    i = 2
    carpanlar = []
    while i * i <= n:
        while n % i == 0:
            carpanlar.append(i)
            n //= i
        i += 1
    if n > 1:
        carpanlar.append(n)
    return carpanlar

def carpanlari_ussu_ile_yaz(carpanlar):
    sayac = Counter(carpanlar)
    return "*".join(
        f"{p}^{sayac[p]}" if sayac[p] > 1 else f"{p}"
        for p in sorted(sayac)
    )

def cevap_pdf_olustur():
    if not son_gruplar:
        messagebox.showinfo("Uyarı", "Henüz işlem PDF'si oluşturulmadı.")
        return

    sat_aralik = 5

    pdf = FPDF()
    pdf.add_page()
    pdf.set_font("Arial", "B", 14)
    pdf.cell(0, 15, "EBOB EKOK Cevaplari", ln=1, align="C")
    pdf.set_font("Arial", size=11)
    pdf.ln(10)

    sutun_sayisi = 3
    sayfa_genisligi = 240
    kenar_bosluk = 8
    sutun_genislik = (sayfa_genisligi - 2 * kenar_bosluk) / sutun_sayisi

    grup_sayaci = 0
    while grup_sayaci < len(son_gruplar):
        satir_gruplar = son_gruplar[grup_sayaci:grup_sayaci + sutun_sayisi]
        y_start = pdf.get_y()
        max_h = 0

        for i, grup in enumerate(satir_gruplar):
            x = kenar_bosluk + i * sutun_genislik
            pdf.set_xy(x, y_start)
            grup_str = "  ".join(f"{s:>3}" for s in grup)
            pdf.cell(sutun_genislik, sat_aralik, grup_str, ln=0, align="L")

            ebob = math.gcd(grup[0], grup[1])
            if len(grup) == 3:
                ebob = math.gcd(ebob, grup[2])
            ekok = ekok_liste(grup)

            y = y_start + sat_aralik
            pdf.set_xy(x, y)
            pdf.cell(sutun_genislik, sat_aralik, f"EBOB= {ebob}", ln=0, align="L")
            y += sat_aralik
            pdf.set_xy(x, y)
            pdf.cell(sutun_genislik, sat_aralik, f"EKOK= {ekok}", ln=0, align="L")

            uslu_carpanlar = []
            for sayi in grup:
                y += sat_aralik
                carpanlar = asal_carpan_ayir(sayi)
                uslu = carpanlari_ussu_ile_yaz(carpanlar)
                pdf.set_xy(x, y)
                pdf.cell(sutun_genislik, sat_aralik, f"{sayi} = {uslu}", ln=0, align="L")
                uslu_carpanlar.append(Counter(carpanlar))

            ortak_ekok = Counter()
            for c in uslu_carpanlar:
                for prime in c:
                    ortak_ekok[prime] = max(ortak_ekok.get(prime, 0), c[prime])

            y += sat_aralik
            ekok_uslu = "*".join(
                f"{p}^{ortak_ekok[p]}" if ortak_ekok[p] > 1 else f"{p}"
                for p in sorted(ortak_ekok)
            )
            pdf.set_xy(x, y)
            pdf.cell(sutun_genislik, sat_aralik, f"EKOK = {ekok_uslu}", ln=0, align="L")

            max_h = max(max_h, y - y_start + sat_aralik)

        pdf.ln(max_h + 12)
        grup_sayaci += sutun_sayisi

        if pdf.get_y() > 250:
            pdf.add_page()

    pdf.output("cevaplar_ebob_ekok.pdf")
    pdf_ac("cevaplar_ebob_ekok.pdf")

def pdf_ac(dosya_adi):
    try:
        sistem = platform.system()
        if sistem == "Windows":
            os.startfile(dosya_adi)
        elif sistem == "Darwin":
            subprocess.call(["open", dosya_adi])
        elif sistem == "Linux":
            subprocess.call(["xdg-open", dosya_adi])
    except Exception as e:
        messagebox.showerror("PDF Açma Hatası", f"PDF açılırken hata oluştu:\n{e}")

def olustur_ve_goster():
    girilen = giris.get()
    if not girilen.isdigit():
        messagebox.showerror("Hata", "Lütfen geçerli bir sayı girin.")
        return
    adet = int(girilen)
    if adet < 1 or adet > 100:
        messagebox.showerror("Hata", "Lütfen 1 ile 100 arasında bir sayı giriniz.")
        return
    try:
        pdf_olustur("sayilar_ebob_ekok.pdf", adet, grup_boyutu.get())
        pdf_ac("sayilar_ebob_ekok.pdf")
        giris.delete(0, tk.END)
    except Exception as e:
        messagebox.showerror("Hata", str(e))

pencere = tk.Tk()
pencere.title("EBOB-EKOK PDF Oluşturucu")
pencere.geometry("400x230")
pencere.resizable(False, False)

etiket = tk.Label(pencere, text="Kaç tane EBOB-EKOK işlemi olsun? (1-100)", font=("Arial", 11))
etiket.pack(pady=5)

giris = ttk.Entry(pencere, font=("Arial", 12), width=10, justify="center")
giris.pack(pady=5)
giris.focus()

grup_boyutu = tk.StringVar(value="2")

secenek_frame = tk.Frame(pencere)
secenek_frame.pack(pady=5)

tk.Label(secenek_frame, text="Sayı Grubu Seçimi:", font=("Arial", 10)).pack()

radio_frame = tk.Frame(secenek_frame)
radio_frame.pack()

tk.Radiobutton(radio_frame, text="2'li", variable=grup_boyutu, value="2").pack(side="left", padx=5)
tk.Radiobutton(radio_frame, text="3'lü", variable=grup_boyutu, value="3").pack(side="left", padx=5)
tk.Radiobutton(radio_frame, text="Karışık", variable=grup_boyutu, value="karisik").pack(side="left", padx=5)

buton_frame = tk.Frame(pencere)
buton_frame.pack(pady=10)
# Kadir PANCAR
ttk.Button(buton_frame, text="PDF Görüntüle", command=olustur_ve_goster).grid(row=0, column=0, padx=10)
ttk.Button(buton_frame, text="Cevaplar", command=cevap_pdf_olustur).grid(row=0, column=1, padx=10)

pencere.mainloop()


 

0 yorum:

Fayda vermeyen ilimden Allah'a sığınırım. İlim; amel etmek ve başkalarıyla paylaşmak içindir. Niyetimiz samimiyetle insanlara yararlı olmaktır, akıbetimiz bu vesileyle güzel olsun. Dua eder, dualarınızı beklerim...

"Allah'ım; bana fayda sağlayacak ilimleri öğret ve ilmimi ziyadeleştir."

“Allahım! Sana teslim oldum, sana inandım, sana güvendim. Yüzümü, gönlümü sana çevirdim. İşlediğim tüm günahlarımı affeyle! Ey kalbleri çeviren Allahım! Kalbimi dînin üzere sâbit kıl. Beni Müslüman olarak vefât ettir ve beni sâlihler arasına kat!”

“Rabbim! Bizi doğru yola ilettikten sonra kalplerimizi eğriltme! Bize tarafından bir rahmet bağışla.Öne geçiren de sen, geride bırakan da sensin. Muhakkak ki lütfu en bol olan Sen’sin. Senden başka ilâh yoktur."

Lâ ilâhe illallah Muḥammedürrasulüllâh


KADİR PANCAR

Aşağıdaki Yazılar İlginizi Çekebilir!!!