CS50 Tanıtımı
CS50, bilgisayar bilimleri ve programlamanın sanatı üzerine bir giriş dersi olarak tanıtılmaktadır.
Ders, Harvard Üniversitesi'nde Dr. David Malan tarafından verilmektedir.
Dersin temel amacı, öğrencileri algoritmik düşünme ve etkili problem çözme konularında eğitmektir.
David Malan'ın Kişisel Deneyimi
David Malan, bilgisayar bilimleri dersine katılma isteğinin başlangıcında tereddüt yaşadığını belirtmektedir.
Bilgisayar biliminin yalnızca programlama değil, problem çözme ile ilgili olduğunu keşfetmiştir.
Ders sonundaki projelerini tamamlamanın getirisi olan tatmin ve gurur duygusu vurgulanmaktadır.
Bilgisayar Bilimi Nedir?
Bilgisayar biliminin temelinin problem çözme olduğunu ifade etmektedir.
Algoritmik düşünme, bilgi işleme ve doğru bir şekilde düşünme becerilerini geliştirdiği belirtilmektedir.
Bilgisayarların verileri temsil etme şekli, insan dillerinden farklıdır ve sayılar kullanır.
Veri Temsili: İkilik Sistemi ve ASCII
Bilgisayarlar yalnızca 0 ve 1 ile çalışan ikilik sistemini kullanır.
Verilerin temsilinde ASCII kodlaması tanıtılmakta ve harflerin sayılara karşılık geldiği açıklanmaktadır.
Örneğin, büyük harf A'nın sayısal karşılığı 65'tir.
Unicode ve Geniş Kapsamlı Karakter Temsili
Unicode sistemi, daha fazla karakter ve sembolü desteklemek için ASCII'ye ek olarak geliştirilmiştir.
Unicode ile 2^16 yani 65.536'ya kadar sembol temsil edilebilir.
Emojiler ve diğer karakterlerin temsili için Unicode standartları oluşturulmuştur.
Renk Temsili ve Bilgisayar Grafikleri
Renkler, RGB (Kırmızı, Yeşil, Mavi) kombinasyonu ile temsil edilir.
Her rengin belirli bir değeri (0-255 arası) olduğu ve bu değerlerin karıştırılarak yeni renklerin oluşturulabileceği belirtilir.
Her piksel, bir ekran üzerinde görülen görüntüyü oluşturur ve genellikle 24 bit ile temsil edilir.
Ses ve Video Temsili
Ses ve müzik, MIDI formatında temsil edilebilir ve notasal bilgilerle işlenir.
Video, ardışık görüntüler kullanılarak zaman boyutu eklenmiş bir temsil biçimidir.
Yüksek kaliteli görüntüler için sıkıştırma tekniklerinin kullanıldığı açıklanmaktadır.
Algoritmalar ve Problem Çözme
Algoritma, bir problemi çözmek için adım adım talimatlar veren bir kavramdır.
Örnek olarak, telefon rehberinde bir isim arama süreci algoritma olarak sunulmaktadır.
Arama yöntemlerinin etkinliği ve doğruluğu üzerinde durulmaktadır.
Programlamanın Anlamı
Programlama, mevcut düşünceleri ifade etme biçimidir.
Algoritmalar, problem çözme yollarının tanımlanmasında önemli rol oynar.
Farklı algoritmaların performans ve verimlilik analizi yapılır.
Algoritmaların Verimliliği
Algoritmanın karmaşıklığı, problem boyutu ve çözüm süresi ile ilgilidir.
İlk algoritma doğrudan ilişki sunarken, ikinci algoritma iki kat hızlı sonuç almayı sağlar.
Logaritmik algoritmalar, büyük veri setlerinde daha etkili çözümler sunar.
Pseudocode Tanıtımı
Pseudocode, bir algoritmanın İngilizce'ye benzer bir dil ile yazılmasını sağlar.
Adım adım süreçleri açıklamak için kullanılabilir.
Programın mantığını sade bir şekilde anlatmak için idealdir.
Scratch ile Programlamaya Giriş
Scratch, görsel programlama dili olarak kullanılır ve başlangıç seviyesindeki kullanıcılar için idealdir.
Farklı renk ve şekillerde bloklar, işlevlerin ve mantıksal akışların temsili için kullanılır.
Scratch içerisinde hareket, görünüm, ses ve kontrol gibi kategorilerde bloklar bulunmaktadır.
Doğal Dil ve İşlevsellik
Fonksiyonlar, belirli görevleri yerine getiren kod parçalarıdır.
Koşul ifadeleri (conditionals) belirli durumlara göre farklı davranışlar sergilemek için kullanılır.
Döngüler (loops), belirli bir işlemin tekrar edilmesini sağlar.
Değişkenler ve Kullanımı
Değişkenler, program içinde veri depolamak için kullanılır.
İşlevler, argümanlar ve dönüş değerleri gibi özelliklerle zenginleştirilebilir.
Abstraksiyon, karmaşık çözümleri daha basit ve okunabilir hale getirmek için kullanılır.
Sonsuz Döngü Kullanımı
Sonsuz döngü, programın sürekli dinlemesi için kullanılabilir.
Program, durana kadar sürekli çalışır.
Fare hareket ettiğinde kedi tepki vermeye başlıyor.
Video Tabanlı Etkileşim
Video hareketi belirli bir eşik değeri aştığında ses çalar.
Eylemler, videonun arka planda uygulanmasıyla daha interaktif hale getiriliyor.
Farklı hızlarda hareket eden el, sesli tepkiler veriyor.
Whack-a-Mole Oyun Geliştirme
Bir katılımcı sahneye davet edilerek, Whack-a-Mole oyunu oynatılıyor.
Kullanıcı kafasını moles'in çıktığı dikdörtgen ile hizalıyor.
Eğlenceli oyun dinamikleri ve zamanlama ile puan toplayarak hız test ediliyor.
Proje Oluştururken Temel Bloklar
Çeşitli bu oyun öğelerini bir araya getirerek karmaşık projeler oluşturulabiliyor.
Her bir yeni özellik, küçük parçalara ayrılarak ekleniyor.
Örnek proje geliştirirken adım adım ilerlemek mümkün.
Kullanıcı Arayüzü ve Etkileşim
Kullanıcı arayüzü tasarımı önem kazanıyor.
Kullanıcının kişisel etkileşimini artırmak için grafikler ve sesler ekleniyor.
Rastgele nesneler kullanarak oyun mekaniği çeşitlendiriliyor.
Karmaşık Oyun Mekanikleri
Karakterlerin birbirini takip etme gibi gelişmiş oyun mekaniği uygulanıyor.
Oyun hedefe ulaşmayı zorlaştıran yaramaz karakterler ekleniyor.
Oyun içerisindeki nesnelerin konumunu yönetmek için matematik kullanılıyor.
Oyun Sorunları ve Çözümleri
Özelleştirilmiş blokal kodlama ile karşılaşılan problemler çözülüyor.
Her aşamada oyun akışını kontrol eden koşullar ekleniyor.
Skor takibi için değişkenler belirleniyor ve güncelleniyor.
C Programının Oluşturulması
İlk C programı, 'Hello, World!' mesajını yazdırarak oluşturulur.
Kodun başında 'stdio.h' kütüphanesi eklenir.
Kod çalıştırılmadan önce kaydedilmesi gerektiği belirtilir.
Programı Çalıştırma
Programın çalıştırılması için komut satırı kullanılmalı, çift tıklama yerine komut yazılmalıdır.
Kaydedilen programın çalıştırılması için 'make hello' komutu girilir.
'./hello' komutunu kullanarak programın çıktısı alınabilir.
Makine Kodu ve Derleyici
C dilindeki kaynak kod, makine diline dönüştürülmelidir.
Bu dönüşüm için bir derleyici (compiler) kullanılır.
C dilinin bir derleyiciye ihtiyaç duyduğu belirtilir.
Bulut Tabanlı Programlama Ortamı
VS Code'un bulut tabanlı versiyonu kullanılarak program yazılabilir.
Bu ortam, herkesin aynı sayfada olmasını sağlar.
Terminal Penceresi
Terminal penceresi, komutları girmek için kullanılır.
Linux işletim sistemi kullanılarak komut satırı üzerinden program çalıştırılır.
Kod Satırları ve Hatalar
Kod değiştirildiğinde derleme sıklıkla yapılmalıdır.
Hatalar çıktısı dikkatlice incelenmelidir.
Girdi Alma ve Fonksiyonlar
Kullanıcıdan girdi almak için 'get_string' fonksiyonu kullanılır.
Fonksiyonlar, belirli bir veri türü döndürebilir.
printf Kullanımı
printf fonksiyonu, çıktıyı formatlamak için kullanılır.
Değişkenlerin çıktıda nasıl kullanılacağı anlatılır.
C Programlama Diline Giriş
C dilinde, bir işlevin çıktısının başka bir işlevin girdisi olabileceği bir konsept vardır.
printf işlevini kullanmak için, öncelikle uygun kütüphane dosyasının eklenmesi gerekir.
C dilinde ana program, 'int main(void)' ile başlar ve kod o blok içinde yazılır.
Kütüphaneler ve Header Dosyaları
Kütüphane, bilgilendirme işlevselliği sağlar, header dosyaları ise bu işlevleri kullanabilmek için gereklidir.
C programcıları, kütüphane dosyalarının içeriğini kullanarak fonksiyonları uygulamak için önceden tanımlanmış işlevlerle hazırlıkları yaparlar.
Veri Türleri ve Değişkenler
C dilinde temel veri türleri arasında int, float, double, char ve bool bulunur.
Veri türü, her bir verinin bellekte ne kadar yer kaplayacağını belirler.
Değişken tanımlanırken, veri türü ve bir başlangıç değeri belirlenmelidir.
Koşullu İfadeler ve Kontrol Akışları
Koşullu ifadeler, belirli koşulların karşılanıp karşılanmadığını belirlemek için kullanılır.
C dilinde 'if', 'else if' ve 'else' yapıları kullanılarak şartlı ifadeler oluşturulabilir.
Mantıksal ifadeler, programın işlem akışını yönlendirir.
Etkili Kod Yazımı ve İyileştirme
Kod yazarken, gereksiz tekrarları önlemek için sabit sayılar yerine değişkenler kullanılmalıdır.
Sabitler, programda kesin bir değerin değiştirilmesini engeller ve büyük harfle yazılması yaygındır.
Kodun temiz ve okunabilir olması, geliştirme sürecini kolaylaştırır.
Koşullu İfadeler ve Sözdizimi
C programlama dilinde bazı durumlarda noktalı virgül kullanılmaz.
Koşullu ifadelerde genelde noktalı virgül ihtiyaç duyulmazken, işlev sonunda kullanılır.
Çift eşittir işareti, eşitlik kontrolü için kullanılırken tek eşittir işareti atama işlemi içindir.
Parite Kontrol Programı
Kullanıcıdan bir sayı alarak bu sayının tek mi çift mi olduğunu kontrol eden bir program yazılır.
Remainder operatörü (%) kullanılarak bir sayının 0 ya da 1 ile bölünmesi sonucu tek veya çift olduğu belirlenir.
Eşitlik kontrolü için '==' operatörü kullanılır.
Kullanıcı Girdisi Alma
Kullanıcıdan evet veya hayır yanıtı almak için get_char fonksiyonu kullanılabilir.
Yanıtın durumunu kontrol etmek için 'if' ve 'else if' yapıları kullanılır.
Büyük/küçük harf duyarlılığına dikkat edilmeli; örneğin hem 'y' hem de 'Y' karşılanmalıdır.
Döngülerle Tekrar Etme
C dilinde bir işlemi tekrarlamak için while ve for döngüleri kullanılır.
While döngüsü bir koşul sağlandığı sürece sürekli çalışır.
For döngüsü ise belirli bir sayıda tekrarlar; başlangıç, bitiş ve artış değerleri döngü tanımında belirtilir.
Fonksiyonlar ve Prototipler
Fonksiyonlar belirli bir işi yapmak için tanımlanır, geri değer döndürme veya parametre alma kapasitesine sahiptir.
Fonksiyonu kullanmadan önce tanımlamak veya bir prototip belirtmek gereklidir.
Parametre sayısı değiştirilebilir; birden fazla parametre alabilen fonksiyonlar tanımlanabilir.
İndirim Hesaplama Fonksiyonu
İndirim oranı ve normal fiyatı alarak indirimli fiyatı hesaplayan bir fonksiyon tanımlanır.
Fonksiyon, hesaplamayı yaptığı sonucu return anahtar kelimesiyle geri döndürür.
Dışarıdan gelen parametrelerin etkisini anlamak için değişkenlerin kapsamı dikkate alınmalıdır.
Döngü Tasarımında İyileştirmeler
Döngülerin sonuna yerleştirilen komutlarla çıktıların daha düzenli hale getirilmesi.
Kullanıcıdan soru işareti veya madeni para miktarını almak için döngü yapılarının geliştirilmesi.
C programlama dilinde 'do while' döngüsünün kullanılması, koşulun en son kontrol edilmesini sağlar.
Döngü ve Kullanıcı Girdisi
'do while' döngüsü ile kullanıcıdan bir değer alınır ve kullanıcı uygun bir değer girene kadar döngü devam eder.
Değişkenlerin dinamik hale getirilmesi, kullanıcı girdisine göre çıktıların ayarlanması sağlanır.
Kullanıcının değer girmesi beklenmeden bazı işlemlerin önce yapılması gerektiği vurgulanır.
İç İçe Döngüler
Bir 'n x n' kare matris oluşturmak için iç içe döngülerin kullanılması.
Kullanıcıdan istenilen boyutta bir kare yapmak için ilk olarak sıra ve ardından sütun döngülerinin tanımlanması.
Döngüden sonra yeni bir satıra geçiş yapmak için 'newline' karakterinin kullanılması gerekliliği.
Sayılarla İşlemler ve Hassasiyet
Float türü ile kesirli sayılar arasında bölme işlemlerinin yanlış sonuçlar verebileceği açıklanır.
Tam sayı bölmesinin sonucu yalnızca tam kısmı döndüreceği ve kesir kısmının kaybolacağı belirtilir.
Tip dönüşümü kullanarak int değerini float olarak işlem yapmayı sağlayan yöntemler anlatılır.
Sonuçların Hassasiyeti ve Maliyet Hesaplamaları
Küçük değerlerde dahi kesirli sayılarda yaşanan hassasiyet sorunları.
Decimal yerine float kullanmanın neden olduğu sorunlar ve çözüm önerileri.
Döngülerin ve matematiksel işlemlerin güvenilir bir biçimde sağlanması için dikkatli bir şekilde programlama yapılması gerektiği.
Assembly Dili ve Temel Kavramlar
Assembly dili, bilgisayarın anlayabileceği en düşük seviyeli dil olarak tanımlanır.
Assembly dilinde, temel işlemler için kullanılan komutlar, geri bildirimde bulunarak bilgisayar işlemcisinde çalışır.
Her CPU, kendi talimat setine sahiptir, bu nedenle yazılımlar farklı platformlarda çalışmaz.
Derleme süreci, kaynak kodunu assembly diline ve ardından makine koduna dönüştürme işlemlerini içerir.
Bağlama ve Derleme
Kodun derlenmesi, yazılmış olan kodun makine dili olarak çalıştırılabilir hale getirilmesi sürecidir.
Bağlama işlemi, ayrı kaynak dosyalarını birleştirerek tek bir program dosyası oluşturur.
a.out, derlenen programların varsayılan dosya adıdır ve bu isim basit bir isimlendirme kuralıdır.
Hata Ayıklama Yöntemleri
Printf fonksiyonu, değişkenlerin değerlerini kontrol etmek için yararlı bir araçtır.
Debugging (hata ayıklama) süreci, kod hatalarını bulmak ve düzeltmek için kullanılan tekniklerdir.
Rubber duck debugging (lastik ördek ile hata ayıklama), bir nesne ile konuşarak sorunları çözme tekniğidir.
C Dilinde Veri Türleri ve Bellek Yönetimi
C dilinde int, float, char gibi temel veri türlerinin nasıl tanımlanacağı ve kullanılacağı anlatılır.
Veri türlerinin bellek üzerindeki boyutları ve yönetimi üzerine bilgi verilir.
Dizi (array) kullanarak birden fazla değişkeni tek bir isimle depolamak mümkündür.
Uygulama Örneği: Not Ortalaması Hesaplama
Kullanıcının notlarını almak ve bu notların ortalamasını hesaplamak için bir program örneği gösterilir.
Dizi kullanarak birden fazla notun depolanması ve ortalaması üzerine örnekler yapılır.
Kullanıcıdan giriş almak için get_int fonksiyonunun kullanımı gösterilir.
Programın Başlangıcı ve Hatalar
Programın cs50.h dosyasının eksik olduğunu fark ederek hatalar giderilmektedir.
Kullanıcıdan alınan not ortalamasını hesaplama programı, başlangıçta yalnızca üç notla sınırlıdır.
Kodun İyileştirilmesi
Kodun daha iyi bir tasarımına yönelik önerileri değerlendirilmekte.
Kullanım kolaylığı için döngülerden faydalanarak not alma işlemi basitleştirilmektedir.
Kullanıcıdan kaç not alınacağına dair bir girdi alma yöntemi tanıtılmaktadır.
Dizilerin Kullanımı ve Veri Türleri
Dizilerin, çok sayıda değişken adı yerine tek bir isim altında saklanmasını sağladığı açıklanmaktadır.
Farklı veri türlerinin (örneğin, int ve char) nasıl kullanılabileceği tartışılmaktadır.
Karakterlerin ASCII Değerleri
Karakterlerin sayısal karşılıkları ve ASCII sistemi açıklanmaktadır.
C dilinin, karakterleri sayısal değerlere otomatik olarak dönüştürme yeteneği olduğu belirtilmektedir.
Dizilerde Nul Karakterin Rolü
Dizilerde bir sonlandırıcı karakter olan nul karakterinin nasıl kullanıldığı açıklanmaktadır.
Bir stringin sonunu işaretlemek için hafıza yönetimi açısından nul karakterinin gerekliliği tartışılmaktadır.
String Uzunluğunu Hesaplama
Kullanıcıdan alınan bir stringin uzunluğunu hesaplamak için uygulama örneği sunulmaktadır.
Dinamik hafıza yönetimi ve stringlerin diziler olarak nasıl uygulanabileceği detaylandırılmaktadır.
C Kütüphanesi ve Kullanımı
C dilinin string.h kütüphanesi ve içinde bulunan önceden tanımlanmış işlevler tanıtılmaktadır.
strlen işlevinin, bir stringin uzunluğunu hesaplamak için mevcut olduğu gösterilmektedir.
Değişken Kullanımının Önemi
Değişkenler, kodda tekrarlanan değerlerin saklanması için kullanılır.
Bir işlevde en verimli sonuç için değişken kullanılarak sadece bir kez çağrılan değerler saklanabilir.
Program içindeki döngülerde ve koşullarda hafızada daha az yer kaplamak için değişken tanımlamak önemlidir.
Büyük Harf Yapma İşlevi
Girilen bir string'in başındaki harflerin büyük yapılması için bir program yazılmaktadır.
ASCII tablosuna bakılarak küçük harflerin büyük harflere dönüşümünde 32 sayısının çıkarılması gerektiği belirtilmektedir.
Her karakter için kontrol yapılır, eğer küçük harf ise, büyük harfle değiştirilir.
Standart Kütüphaneler ve Yeni Fonksiyonlar
C dilinde kullanılabilecek olan 'is-lower' ve 'to-upper' gibi standart fonksiyonların olduğunu görmek önemlidir.
Bu fonksiyonlar, kod yazımını daha basit hale getirir ve işlerimizi kolaylaştırır.
Kodda yapılan değişikliklerle beraber error handling (hata yönetimi) uygulanarak, kullanıcıdan alınan verinin doğruluğu kontrol edilir.
Komut Satırı Argümanları Üzerine
Komut satırı argümanları, kullanıcıdan verilerin alınmasını kolaylaştırır.
argc (argument count) ve argv (argument vector) yapıları kullanılarak argüman sayısı ve içeriği tanımlanır.
Kullanıcının programı çalıştırırken girdiği değerler argv dizisi üzerinde saklanır.
Çıkış Durumu ve Hata Yönetimi
C dilinde, programın çalıştırılmasından sonra bir değer döndürerek, programın başarılı ya da başarısız olarak bitip bitmediği belirtilebilir.
Başarılı bir çıkış için 0, başarısız bir çıkış için ise 1 kullanılabilir.
Çalışma mantığı açısından, kullanıcıdan doğru argüman alınmaması durumunda error handling uygulamak önemlidir.
Algoritma Verimliliği ve Zaman Ölçümü
Algoritmaların verimliliği, bellek kullanımı ve sonar başkalarının yazdığı kodlarla iş birliği yapma olasılığını artırarak tanımlanır.
Verimlilik, bir algoritmanın çalıştığı süre ile ölçülür ve bu süre Big O notasyonu ile ifade edilir.
Big O notasyonu, bir algoritmanın çalışmasıyla ilgili üst sınırları belirler ve zaman harcamalarını basit matematiksel ifadelerle tanımlar.
Algoritma Karşılaştırmaları
İlk algoritma sayfaları tek tek inceleyerek, ikinci algoritma ise sayfaları geri dönecek şekilde iki sayfa inceleyerek çalışır.
Üçüncü algoritma, 'divide and conquer' stratejisini kullanarak sayfaları ikiye ayırır, bu da daha hızlı bir çözüm sağlar.
Algoritmaların kıyaslamasında dikkat edilmesi gereken önemli bir nokta, büyük sayılarla çalıştıklarında(kullanıcı sayısı arttıkça) benzer performanslar sergileyebilmeleridir.
Lineer Arama Algoritması
Lineer arama algoritması, bir dizi içerisindeki öğeleri sırayla kontrol ederek doğru bulmayı hedefler.
Bu yöntemi kullanarak sonucu bulmak için, makul bir sıralama yapıldığında beklenen çalışma süresi O(n) şeklinde tanımlanır.
Görselleştirilen bir örnekte, sıralı kapılar arasında arama yaparak sonuçlar bulunmuştur.
İkili Arama Algoritması
İkili arama algoritması, sıralı verilere uygulanarak arama süresini minimuma indirir.
Sıralı bir veri setinde çalışırken zaman karmaşıklığı O(log n) olarak ifade edilir.
Bu yöntem, orta belli bir noktadan başlayarak arama yapar ve bu sayede daha az adımda sonuç bulunur.
Çalışma Zamanlarını Ölçme ve Stratejiler
Verilerin sıralanması durumu, arama işleminin verimliliğini büyük ölçüde etkiler.
Verimlilik kıyaslamalarında Bütün Veri Setinin sıralanması veya sadece doğrusal arama yönteminin kullanılması arasındaki ticaretin yapılması gerektiği vurgulanır.
Farklı kullanıcı talepleri ve yüksek veri hacmi gibi senaryolar bu stratejilerin seçiminde etkili olur.
Başlangıç ve Başarılı Çıkış Değeri
Bir döngü sonunda bir şey bulunamazsa, genellikle bir hata belirtmek için pozitif bir değer döndürülmelidir.
Ana fonksiyon başarılıysa, standart programlama kuralı olarak 0 döndürmek uygun bir uygulamadır.
Diziler ve Karakter Dizileri
Tamsayı dizisi yerine karakter dizisi (string) kullanarak isimleri saklama yöntemi tanıtılır.
String dizilerinde isimlerin tanımlanmasında 'string.h' kütüphanesi kullanılır.
Her bir ismin kontrol edilmesi için bir döngü kullanılarak arama yapılır.
Hatalı Karşılaştırma Hatası
Karakter dizilerini karşılaştırmak için 'strcmp' fonksiyonu yerine eşitlik operatörü kullanılamaz.
'strcmp' fonksiyonu, iki stringin karşılaştırılması sonucunda bir tamsayı döndürür ve bu değer sıralama yapmaya olanak tanır.
Telefon Rehberi Programı Geliştirme
İsimler ve telefon numaraları için iki ayrı dizi oluşturulması gerektiği gösterilir.
Kullanıcıdan bir isim arayarak eşleşirse, ilgili telefon numarasını bulma işlevi eklenir.
Dizilerin boyutunun sabit olmasının getirdiği sınırlama üzerinde durulur.
Veri Yapılarının Kullanımı
İsim ve telefon numarasını tutacak yeni bir veri yapısı (struct) tanımlanarak dizideki ilişkilerin güçlendirilmesi önerilir.
Struct ile verinin kapsüllenmesi, ilişkili bilgileri bir arada tutarak karışıklığı önler.
Sıralama Performansı
Sıralama algoritmalarının maliyetinin değerlendirilmesi yapılır.
Gerekli olan verinin sıralanması için farklı algoritmaların nasıl uygulanacağı üzerinde durulur.
Kısaca
Strcut kullanımı ile daha tutarlı ve yönetilebilir veri yapıları geliştirilir.
Kapsüllenmenin programlama güvenliğini artırdığı ve güncellemeleri kolaylaştırdığı vurgulanır.
Seçim Sıralama Algoritması
Algoritma, dizideki en küçük elemanı bulmak ve onu başa almak üzere tasarlanmıştır.
İlk olarak 8 eleman var; her iterasyonda en küçük bulunur ve konum değiştirilir.
Iterasyonlar ile problem boyutu giderek küçülür: 8, 7, 6, vb.
Seçim sıralama sürecinde her zaman en küçük elemanı bulmak için dizi taranır.
Zaman Karmaşıklığı
Seçim sıralamanın zaman karmaşıklığı O(n²) olarak tanımlanır.
Her eleman için dizinin tamamı taranır; bu durum n, n-1, n-2... elemanlarını içerir.
Sonuçta karmaşıklık, n (n+1)/2'ye eşit olur ve büyük n için n² terimi baskın hale gelir.
Balon Sıralama Algoritması
Balon sıralama, dizideki komşu elemanları karşılaştırarak en büyüklerin sona itilmesi üzerine çalışır.
Aynı dizi üzerinde sürekli tekrarlar yaparak işlem gerçekleştirir.
Balon sıralama da O(n²) zaman karmaşıklığına sahiptir ancak en iyi durum O(n) olabilir, eğer dizi zaten sıralıysa.
Yordamsal İyileştirmeler ve Yeni Yaklaşımlar
Her iki algoritmanın da sıralama sürecinin yavaş olmasının sebebi, tekrar tekrar aynı elemanları kontrol etmesidir.
Daha karmaşık ve daha verimli sıralama algoritmalarının keşfedileceği bilgisi verildi.
Yeni dizin sıralama algoritmaları için rekürsif yaklaşımın kullanılabileceği belirtilmiştir.
Hata Önleme ve Negatif Sayılar
Hataların önlenmesi için negatif sayıların kullanımının engellenmesi gerektiği belirtiliyor.
Merge Sort Nedir?
Merge sort, sıralama algoritları arasında yer alır ve diğer yöntemlere göre daha verimlidir.
Temel olarak, diziyi ikiye böler, sol ve sağ yarılar için sıralama yapıp birleştirir.
Recursion (özyineleme) kullanılarak uygulanan bir yöntemdir.
Merge İşlemi
İki sıralı listeyi birleştirme süreci, her iki listenin en küçük elemanını karşılaştırarak ilerler.
Birleştirme işlemi, her iki listenin başlangıcındaki elemanlar karşılaştırılarak yapılır.
Merge Sort Algoritmasını Uygulama
Daha karmaşık bir durumda, merge sort uygulanarak dizinin belirtilen elemanları sıralanır.
Sol ve sağ yarılar genişletilerek sıraya konur ve sonrasında merge işlemi yapılır.
Zaman Karmaşıklığı ve Bellek Kullanımı
Merge sort, genel olarak O(n log n) zaman karmaşıklığına sahiptir, bu da onu diğer sıralama yöntemlerinden daha verimli kılar.
Bellek kullanımı açısından merge sort, geçici diziler gerektirir ve bu nedenle daha fazla bellek tüketebilir.
Dört Haneli Hexadecimal Sistemi
Hexadecimal, bilgilendirmede ve bellekte sayıları daha kısa bir biçimde temsil etme imkanı sağlar.
Örneğin, 255 decimal sayısı hex formatında FF olarak gösterilir.
C Dilinde Bellek Erişimi
C dilinde bellek içinde verilere erişim sağlanabilir.
Bu güç güvenlik tehditlerine yol açabilir, diğer programların bellek verilerine erişim sağlamak mümkün olabilir.
Modern derleyiciler ve işletim sistemleri bu durumu biraz kontrol altına almaktadır.
Bellek Hataları
Bellek hatalarından biri yığın taşmasıdır, bu durumda hatalı bellek erişimi alınır.
Diğer hatalar arasında yığın ve bellek taşması gibi problemler bulunmaktadır.
Segmentation fault (segment hatası) en yaygın bellek hatalarından biridir.
Göstergelerin Kullanımı
Pointer (göstergeler) bellekteki adresleri tutar ve bu şekilde bellekteki verilere erişim sağlar.
C dilinde bir değişken tanımlandıktan sonra sadece ismi kullanılır, türü tekrar edilmez.
Gözlemler ve bellek adresi ile gösterim, birçok karmaşık yapı oluşturmaya olanak tanır.
Bellek Adreslendirme
C dilinde bellek adreslerine erişmek için * (yıldız) operatörü kullanılır.
Göstergenin içerdiği adrese gidildiğinde gösterilen değer alınır.
Bellekteki boşlukları etkili bir şekilde kullanmak için göstergelerin nasıl çalıştığını anlamak önemlidir.
Karmaşık Yapılar ve Dizi Gösterimi
Dilimler (strings) bellekte karakter dizileri olarak temsil edilir.
C'de diziler, bir karakterin adresini tutan bir pointer olarak ele alınır.
Gösterim ve dizilere erişim için kullanılacak yönetilen yöntemler örneklendirilmiştir.
Dizi Tanımlama
Bir dizi tanımlanarak, birlikte birkaç sayı otomatik olarak başlatılabilir.
Dizideki elemanlara doğrudan erişim ve printf ile baskı yapılabilir.
Pointer aritmetiği sayesinde, eleman sayılarına erişim kolaylaşır.
Pointer Aritmetiği
Pointer aritmetiği, veri türüne göre bellekteki kaydırmaları otomatikleştirir.
Programcı, ek asgari bilgilerle uğraşmadan dizi elemanlarına erişebilir.
Array ismi, dizinin ilk elemanının adresi olarak kullanılabilir.
String Kıyaslaması
Dizi karşılaştırmaları `==` ile değil, `strcmp` gibi fonksiyonlarla yapılmalıdır.
Stringler, bellekte farklı adreslerde saklanır; dolayısıyla, içerikleri aynı olsa da farklı sayılarla ifade edilir.
String kopyalama işlemleri için `strcpy` kullanılması önerilir.
Dinamik Bellek Yönetimi
Dinamik bellek tahsisi, `malloc` ile yapılır; `free` fonksiyonu ise bellek serbest bırakmak için kullanılır.
Bellek tahsis edilirken, yeterli bellek boyutu dikkatlice hesaplanmalıdır.
Dynamic memory allocation kullanımı ile programlar daha esnek hale gelir.
Bellek Hataları ve Otomatik Araçlar
Bellek taşmaları ve kayıpları, program çalışırken sorunlara yol açabilir.
Valgrind gibi araçlar, bellek hatalarını tespit etmek için kullanılabilir.
Doğru belleği yönetmek, performans ve güvenlik için kritiktir.
Bellek Sızıntıları ve Kontrol Araçları
Kodun sonunda belleği serbest bırakmak önemlidir.
Valgrind aracının kullanımı ile bellek sızıntılarını kontrol etme.
Garbage Değerler
Garbage değerler, başlatılmamış değişkenlerden kaynaklanır.
Başlatılmamış değişkenler rastgele veriler içerebilir, bu bellek güvenliğini tehdit eder.
Bellek Manipülasyonu ve Güvenlik Açıkları
Başlatılmamış değişkenler, kullanıcıların diğer kullanıcıların belleğini görmesine neden olabilir.
Bellek düzenleme yeteneği, güvenlik açıkları oluşturabilir.
Değişkenleri Değiştirme: İşlevler ve Geri Dönüşler
Fonksiyonlara değerlerin kopyaları gönderilir, bu nedenle değişiklikler ana değişkenlerde yapılmaz.
Referans işaretçileri (pointers) kullanarak değişkenlerin gerçek adreslerini geçirmenin avantajı.
Swapping Değişkenleri: Geçici Değişken Kullanımı
İki değişkenin değerlerini değiştirmek için geçici bir değişken kullanmak gereklidir.
Doğru geçici değişken kullanımı, bellekten değerlerin değiştirilmesi sürecini yönetir.
Güvenli Bellek Erişimi
Malloc ve calloc gibi dinamik bellek tahsis yöntemleri kullanılarak bellek güvenliği sağlanabilir.
Doğru bellek ayırma ve serbest bırakma, sistemin kararlılığını artırır.
Gizli Mesajın Filtrelenmesi
helpers.c dosyasında, resim filtresi uygulamak için oluşturulan bir filter fonksiyonu bulunmaktadır.
Fonksiyon, bir resmin yükseklik ve genişliğini, iki boyutlu bir dizi alır ve görüntüdeki her pikseli kontrol eder.
Mavi ve yeşil değerleri sıfırlayarak kırmızı filtre uygulayarak gizli bir mesajı ortaya çıkarmaktadır.
C Dilinin Yenilikleri ve Python'a Geçiş
C programlama dilinin beşinci haftasında son haftaya girilirken, Python'a geçileceği duyurulmaktadır.
Python, daha basit kod yazma imkanı sunarak, geliştirilmiş kütüphaneleri ve çerçeveleri kullanma olanağı tanır.
Bellek Yönetimi ve Veri Yapıları
Bellek, verilerin işlenebileceği bir tuval olarak ele alınır ve bu nedenle, byte'ların nasıl temsil edileceği üzerinde hakimiyet gerektirir.
Diziler, sıralı bellek alanlarıdır ve boyutları sabittir; ancak yeni veriler eklemek zor olabilir.
Veri yapıları konusunda daha esnek çözümler aramak amacıyla, dinamik bellek yönetimine ve yeni alanların yaratılmasına yönelik yöntemler keşfedilir.
Dizilere Veri Ekleme Sorunu
Dizilere veri eklendiğinde, mevcut bir dizi ile genişletmenin yolları açıklanır.
Genişletme işlemi sırasında hem zaman hem de bellek maliyetleri üzerinden alternatif çözümler sunulur.
Dinamik Bellek Yönetimi ve Malloc
Dizilerin boyutlarının değiştirilmesinde malloc ve realloc fonksiyonlarının kullanımı açıklanır.
malloc ile dinamik bellek tahsis edilirken, hâlâ bu belleği serbest bırakmanın önemi vurgulanır.
realloc, daha önce oluşturulmuş bir dizinin boyutunu değiştirebilen bir fonksiyondur ve tasarruf sağlar.
Bağlantılı Listeler
Bağlantılı listeler, bellek alanında verileri birbirine bağlamak için kullanılır ve her eleman sonraki elemanın adresini gösterir.
Bu yapı, bellekte parçalanmış verilerin yönetilmesine olanak tanırken, dizi boyutundan bağımsız veri ekleme imkanı sunar.
Noktalı işaretler (pointer) kullanarak birden fazla değer bir arada saklanabilir ve kolaylıkla erişilebilir.
Bellek Yönetimi
malloc, geçerli belleği ayırt etme işlevine sahiptir.
Heap ve stack bellek alanları hakkında bilgi verilmektedir.
Stack'teki geçerli ve geçersiz değerlerin yönetimi, derleyici tarafından sağlanmaktadır.
Node Kavramı
Node, bilgi kapsülleyen veri yapıları için genel bir terimdir.
C dilinde struct kullanarak bir node tanımlamak için typedef kullanılır.
Her node, bir sayı ve bir pointer içermektedir.
Bağlı Liste Oluşturma
Linked list oluşturulurken, her node için hafızadan alan istenir.
Öncelikle null olarak tanımlanmış bir liste değişkeni oluşturulur.
malloc ile yeni bir node oluşturulup, listeye eklenmektedir.
Node Ekleme
Her yeni eklenen node, önceki node'un next pointer'ına bağlanır.
Ekleme işlemleri için gerekli bellek kontrolü yapılmalıdır.
Node'un içindeki tüm alanlar uygun değerlerle başlatılmalıdır.
Linked List'te Gezinme
Bağlı listede gezinmek için pointer kullanımı gerekmektedir.
Yinelenen yapılar yerine for-loop ile traverse edilir.
Listeden bilgi okumak için mevcut node'a gidilir ve değerler ekrana basılır.
Hafıza Temizleme
Bağlı liste yapısındaki tüm node'lar serbest bırakılmalıdır.
Hafıza temizlenirken, listeyi takip eden bir geçici değişken kullanılmalıdır.
Serbest bırakma işlemleri, last in first out (LIFO) düzenine uygun şekilde yapılmalıdır.
Veri Yapısı ve Bellek Yönetimi
Sıralı verilerin güncellenmesi gerektiğinde dikkat edilmesi gerekenler.
Bellek tahsisi ve hafıza sızıntılarının önemi üzerinde duruldu.
Dinamik bellek tahsisi yapan veri yapılarında işaretçilerin kullanımı risklidir.
Sıralı Bir Listede Eleman Ekleme
Sıralı bir listeye eleman eklemek için izlenmesi gereken adımlar sergilendi.
Doğru sıraya göre noktalama, mevcut diğer noktaların bağlantılarını etkileyecektir.
Ekleme işlemleri esnasında önceki bağlantıların korunması gerektiğine dikkat çekildi.
İkili Ağaçların Tanımı
İkili ağaç yapısının her düğümünün iki alt çocuğu olabileceği anlatıldı.
İkili arama ağaçlarının hızlı veri arama imkânı sağladığına değinildi.
Ağaç yapılarında veri erişiminin nasıl çalıştığını göstermek için örnekler verildi.
Hafıza Yönetimi ve Bellek Temizleme
Ağaç yapılarında düğümlerin serbest bırakılmasının önemi vurgulandı.
Yinelenmeli yapıların kullanımı üzerinde duruldu.
Belirli bir düğümü iptal etmeden önce onun çocuklarının düzgün bir şekilde iptal edilmesi gerektiği anlatıldı.
Hash Table ve Kullanımı
Hash tablolarının veri yapılarını birleştirmede nasıl yardımcı olabileceği açıklandı.
Anahtar-değer eşleştirmelerinin nasıl işlediğine dair örnekler verildi.
Hash tablo yapısında çakışmaların nasıl işlendiği tartışıldı.
Hash Tablosu Temelleri
Hash tablosunun, dizi ve bağlı liste karışımı bir yapı olduğu açıklanır.
Aynı ilk harfe sahip olan elemanların bir bağlı listede zincirleme şeklinde depolandığı belirtilir.
Sıralı erişim sağlarken, uzun bağlı listelerin önlenmesine yönelik stratejiler tanıtılır.
Düğüm Yapısı ve Hash Tablosu Oluşturma
Bir bağlı listedeki düğüm yapısının nasıl tanımlanacağı açıklanır.
Hash tablosunun, düğümlerden oluşan bir dizi içerdiği belirtilir.
Çarpışmaları önlemek için daha fazla dizi oluşturma yöntemleri üzerinde durulur.
Hash Fonksiyonu ve Çarpışmaların Yönetimi
Hash fonksiyonunun, girdi olarak verilen bir ismin hash değerini hesaplayarak bir dizinin konumunu belirlediği anlatılır.
Çarpışma durumunun daha iyi yönetilmesi için girdi olarak iki harf kullanma önerisi yapılır.
Daha fazla düğüm ve kova içeren hash tablolarının avantajları tanıtılır.
Trie Veri Yapıları
Trie veri yapısının, isimlerin her harfi ile bir ağaç yapısı oluşturduğu açıklanır.
Shared data ile hafıza kullanımının optimize edildiği vurgulanır.
Arama ve yerleştirme zamanlarının bağımsız bir şekilde adım sayısına bağlı olduğu belirtilir.
Veri Yapılarının Performans Karşılaştırması
Hash tablosunun Big O notasyonu ile incelendiği ve en kötü senaryolarda O(n) performans gösterdiği belirtilir.
Trie yapısının, özellikle uzunluk bağımsız bir arama süresi sunduğu açıklanır.
Zaman ve hafıza arasındaki denge ile sistem tasarımında önemli noktalar üzerinde durulur.
Soyut Veri Yapıları ve Kullanım Alanları
Queue ve Stack veri yapılarının tanıtımı yapılır.
FIFO (First In, First Out) ve LIFO (Last In, First Out) yapıların kullanıldığı örnekler verilir.
Bu veri yapılarının yazılım ve gerçek dünya uygulamalarındaki önemine vurgu yapılır.
Söz Dizimi Farklılıkları
C dilinde süslü parantezler ve noktalı virgüller kullanılırken, Python'da bu unsurlar yerine girinti önemlidir.
Python'da koşul ifadeleri için parantez kullanımı gerekli değildir, bu da yazmayı kolaylaştırır.
Python'daki 'elif' ifadesi, 'else if' yerine kullanılır ve bu daha sade bir yapıdır.
Boole Verileri ve Dönüşüm
Python'da 'True' ve 'False' büyük harfle başlar.
Koşullu ifadelerinde Python, 'do while' yapısını desteklemez, bunun yerine döngüler daha basit bir yapı ile gerçekleştirilir.
Döngü Yapıları
Python'da bir döngü oluşturmak için 'for i in range(n)' ifadesi kullanılır; bu, belirli bir aralıkta yineleme sağlar.
Python'da listeler, bağlı listeler gibi yönetilir ve kullanılabilirlik açısından daha fazla esneklik sunar.
Python Veri Tipleri
Python, C diline göre daha az veri tipi içerir; bu türler yapılandırılmıştır ve Python otomatik olarak türü tahmin eder.
Python'ın veri yapıları arasında listeler, kümeler ve sözlükler yer alır.
Yükleme ve Bellek Yönetimi
Python'da bellek yönetimi otomatik olarak gerçekleşir; bu nedenle 'malloc' veya 'free' gibi işlevlere ihtiyaç yoktur.
Modül veya kütüphaneler Python'da sadece 'import' ile kullanılır; fonksiyonlar ayrıntılı olarak belirtilerek yüklenebilir.
Performans Karşılaştırması
Python, daha hızlı yazım kolaylığı sunarken, C dilinde yazılmış kodlar genellikle daha hızlı çalışır.
Büyük veri kümeleri üzerinde çalışırken C dilinde yazılmış kod kullanmak tercih edilebilirken, gelişim sürecini hızlandırmak için Python daha iyi bir seçenek olabilir.
Python ve Main Fonksiyonu
Python'da main fonksiyonu zorunlu değildir, bu, kod yazımını kolaylaştırır.
C dilinde main fonksiyonu bulunmasa derleme hatası alınır, fakat Python'da başlamak için gerekmez.
String Formatlama ve Kullanım
Python'da f-string ile değişkenleri kolayca yerleştirmek mümkündür.
Kıvrık parantezler olmadan değişkenler yerleştirilmez, bu yüzden dikkat edilmelidir.
Kullanıcı Girdisi ve Hata Yönetimi
Python'un input fonksiyonu, C dilindeki getString fonksiyonuna benzer.
Kullanıcıdan alınan değerler, string olarak döner ve tür dönüşümü gerektirir.
Hatalı kullanıcı girişi durumunda, Python'da exception yönetimi mümkündür.
Temel Hesaplama Fonksiyonu
Basit toplama işlemleri için Python'da doğrudan print komutu kullanılabilir.
Kullanıcıdan alınan girdiler string olarak döndüğü için, uygun dönüşümler yapılmalıdır.
Hata Ayıklama ve İzinler
Python'da çalışmayan hatalı kod durumlarında traceback bilgileri sağlanır.
Kütüphanelerdeki fonksiyonlar için namespace kullanımı önemlidir.
Döngü Kullanımı ve İşlevsellik
Python'da for döngüsü ile tekrarlayan işlemler basitçe yapılabilir.
Fonksiyon tanımlamaları ve çağırmaları ile kod daha düzenli hale gelir.
Input Kontrolü ve Negatif Değerler
Kullanıcıdan alınan değerin negatif olması durumu yönetilmelidir.
Bu durumda, kullanıcının tekrar giriş yapması için bir döngü kullanılabilir.
Python'da Do While Döngüsü Yaratma
Python'da doğrudan bir do while döngüsü yoktur.
Bununla birlikte, bir sonsuz döngü kullanarak bu mantığı başarıyla taklit edebilirsiniz.
Kullanıcıdan belirli bir değeri (örneğin, pozitif bir sayı) istedikten sonra döngüden çıkabilirsiniz.
Fonksiyon Tanımlama ve Kullanma
CS50 kütüphanesinin getInt fonksiyonu yerine bir get_height fonksiyonu tanımlamak.
Fonksiyona döngü içindeki işlemleri yerleştirip, doğru değeri bulduğunuzda geri dönebilirsiniz.
Python'da iç içe döngü değişkenlerinin kapsamı C'den farklıdır; döngüden sonra da erişilebilir.
Hatalarla Baş Etme Yöntemleri
Python'da try-except yapısı ile kullanıcıdan alınan girdi hatalarını yönetmek.
Yanlış bir girdi girildiğinde kullanıcıya hata mesajı vererek tekrar girdi istemek.
Bu süreçle programın çökmesini önleyerek kullanıcı deneyimini iyileştirmek.
Diziler ve Listeler
Python'da dinamik listeleri kullanarak kullanıcıdan veri almak.
Kullanıcıdan alınan değerleri dizide saklamak için append metodu kullanmak.
Python'da dizilerin boyutunun sabit olmadığını bilmek, eleman eklemeyi ve çıkarmayı kolaylaştırır.
Sözlükler ve Anahtar-Değer İlişkilendirmesi
Python’da anahtar-değer ilişkileri kurarak hızlı veri erişimi sağlamak için sözlükleri kullanmak.
Kullanıcının girdiği bir adı kullanarak o kişinin telefon numarasını almak.
Sözlük yapısının kolay erişim sağlaması ve kullanıcı dostu olması.
Python'da Sözlükler ile Veri Yönetimi
Python'da sözlükler, anahtar-değer çiftleri kullanarak veri Saklama yöntemi sunar.
Bir isimle bir numara almak için sözlükten veri çekmenin avantajları gösterilmiştir.
Sözlüklerde anahtarlar string olarak kullanılabilir, bu da veriye erişimi kolaylaştırır.
Phonebook.py Örneği
Phonebook.py dosyası, kullanıcıdan isim alarak karşılık gelen numarayı göstermektedir.
Programdaki hata, yanlış dosyanın çalıştırılmasından kaynaklanmıştır.
Kullanıcının isimleri girdiği ve karşılık gelen telefon numaralarını bulduğu bir telefon defteri uygulaması geliştirilmektedir.
CSV Dosyaları ile Veri Saklama
Veri kalıcılığı sağlamak için CSV (Virgül ile Ayrılmış Değerler) dosyaları kullanılmaktadır.
Program, kullanıcıdan isim ve numara alarak bunları CSV dosyasına eklemektedir.
CSV dosyaları, verilerin saklandığı basit metin dosyalarıdır ve kolayca okunabilirler.
Veri Analizi ile Örnek Uygulama
Kullanıcıların favori TV programlarını toplamak için bir Google Formu oluşturuldu.
CSV formatında indirilerek analiz yapılmak üzere bu veriler değerlendirildi.
Sonuçlar, hangi programların daha popüler olduğunu belirlemek için sayısal verilere dönüştürülmüştür.
Daha İleri Python Uygulamaları
Python'da ses tanıma ve yüz tanıma gibi ileri düzey uygulamalar için kütüphaneler tanıtıldı.
Kullanıcıdan ses alarak kişisel etkileşimler oluşturulması demo edilmiştir.
QR kodları üretme gibi eğlenceli özelliklerin de Python ile gerçekleştirileceği gösterildi.
Giriş ve Temizlik İşlemleri
Kullanıcı girdisinde boşlukları temizlemek için 'strip' fonksiyonu kullanılabilir.
Verileri tümünü büyük harfe dönüştürmek için 'upper' fonksiyonu kullanılmaktadır.
Python'da bir dizi fonksiyon çağrısını zincirleyerek daha düzenli kod yazmak mümkündür.
Dizi ve Set Kullanımı
Python'da dizilerden ziyade set kullanılarak, tekrar eden elemanların otomatik olarak filtrelenmesi sağlanabilir.
Veri sıralama işlemleri için Python'da 'sorted' fonksiyonu kullanılmaktadır.
Veri Sayma ve Sözlük Kullanımı
Kullanıcıdan gelen başlıkların sayısını tutmak için bir sözlük yapısı oluşturulabilir.
Bir başlık mevcutsa sayım artırılıp, yoksa başlangıç değeri olarak 1 atanmalıdır.
Kullanıcı girdilerinde büyük harf duyarlılığını önlemek için veriler her zaman büyük harfe dönüştürülmelidir.
Veri Analizi ve Hataları
Hataları gidermek için doğru anahtar yönetimi yapılarak, her başlığın sayımı izlenmelidir.
Excel ve Google Sheets gibi düz dosyalardan veritabanı oluşturmak için SQL kullanılabilir.
SQL'e Giriş
SQL, verileri oluşturma, okuma, güncelleme ve silme yeteneklerini barındıran bir dil olarak tanımlanır.
SQL ile tablolar oluşturularak veritabanları daha düzenli ve etkili şekilde yönetilebilir.
SQLite Kullanımı
SQLite, hafif bir SQL sürümüdür ve kullanımı oldukça yaygındır.
Kullanıcı girdilerini temizledikten sonra verilerin bir veritabanında depolanması sağlanabilir.
Veritabanı Oluşturma ve İlk Sorgular
CSV dosyasındaki verilerin favorites.db adlı bir SQLite veritabanına yüklendiği açıklanır.
SQLite3 arayüzünde veritabanı yapısının görüntülenmesi için .schema komutu kullanılır.
Otomatik olarak oluşturulan 'favorites' tablosunun üç metin sütunu: timestamp, title ve genres içerdiği belirtilir.
SQL Sorguları ile Veri İşleme
SELECT komutu kullanılarak titles alanından veriler çekilir.
Veri sorgulama sürecinin Python'da yazılan daha uzun kodların yerine SQL ile kısaltıldığı vurgulanır.
SELECT ile birden fazla sütun (örneğin, title ve genres) sorgulayarak sonuçlar elde edilir.
Veri Fonksiyonları ve Filtreleme
SQL'deki DISTINCT, COUNT, AVG gibi fonksiyonların kullanımı örneklendirilir.
WHERE koşulu ile belirli verilerin filtrelenmesi ve 'LIKE' anahtar kelimesinin kullanımı detaylandırılır.
Comma-separated values (CSV) yapısının veritabanı tasarımındaki zorlukları üzerinden geçilir.
Veritabanında Güncelleme ve Silme İşlemleri
UPDATE sorgusu ile mevcut verilerin değiştirilmesi gösterilir.
DELETE komutu ile belirli verilerin silinmesi gerektiği anlatılır.
Veritabanında değişikliklerin anlık olarak yansıtıldığı ve bunun yazılım uygulamalarındaki önemine değinilir.
Veri Mimarisi ve İlişkisel Veritabanı
İlişkisel veritabanlarını oluşturmak için birden fazla tablo (shows ve genres) kullanmanın avantajları vurgulanır.
Bir tabloya ait benzersiz kimliklerin (ID'ler) atanması ve verilerin daha anlamlı hale getirilmesi sağlanır.
Nesneler arası birçoktan bire ilişkilendirme üzerinde durulur.
Python ile SQL Entegrasyonu
Python'da SQL kodları ile veri erişimi ve işlemleri gerçekleştirilir.
cs50 kütüphanesi ile SQL kullanılarak veritabanı sorguları yapılır.
Kullanıcıdan alınan verilerin SQL komutlarıyla işlenmesi örneklenir.
Veri Tabanı Sorguları ve Sonuçlar
SQL sorgusu, belirli bir verinin sayısını döndürmeli ve sonuçları bir öğe sözlüğü şeklinde sunmalıdır.
Örnek olarak, 'The Office' başlıklı içerik toplam 12 kez bulunmuştur.
Veri Tabanı Yapılarıyla Çalışma
SQLite veritabanında tablolar ve veri türleri hakkında bilgiler verilmektedir.
Veri türleri arasında integer, text, numeric, ve BLOB bulunmaktadır.
İndeks Oluşturma ve Performans İyileştirme
SQL'de arama performansını artırmak için indeks oluşturulabilir.
İndeksler, verilerin daha hızlı erişimini sağlar ve bu sayede sorgu süreleri kısalır.
Join İşlemleri ile Birleştirme
Birden fazla tablo arasındaki verileri birleştirmek için JOIN ifadeleri kullanılır.
Kişi ID'si kullanılarak programcılar, belirli kişilere ait tüm programların başlıklarını sorgulayabilir.
SQL Enjeksiyon Saldırıları
Kötü niyetli kullanıcılar, SQL enjeksiyon saldırıları ile sistemlere zarar verebilir.
SQL sorgularında kullanıcı girdilerini yeterince filtrelemek önemlidir.
Yarış Koşulları ve Veritabanı Eşzamanlama
Çoklu kullanıcıların aynı anda veritabanına erişimi, yarış koşullarına yol açabilir.
Veritabanı işlemlerinin atomik olması, kullanıcıların verileri güvenli bir şekilde güncellemelerini sağlar.
Paralel İşlemler ve Problemler
İlk olarak, başlangıçta bir yumurta için 10 beğeni olduğunu varsayalım.
Kullanıcılar aynı anda beğeni butonuna tıkladığında, beğeni sayısı her kullanıcı için aynı kalabilir.
Veritabanına kaydedilmeden önce her iki istek de benzer sonuçlarla sonuçlanabilir.
Dışarıda İletişim Problemleri
İki kullanıcı, aynı değişkenin durumuna bakarak kararlara varır.
Sorunu çözmek için kullanıcılar arasında iletişimi sağlamak gerekir.
Yazılımlarda 'kilit' terimi, değişkenlerin güvenli bir şekilde güncellenmesini sağlamada kullanılır.
TCP/IP Protokolü
TCP/IP, veri paketlerinin yönlendirilmesi için kullanılan temel protokoldür.
IP adresleri, her bir cihazın internetteki benzersiz kimliğidir ve 32 bite kadar uzanabilir.
TCP, veri aktarımını güvence altına alarak paketlerin eksiksiz bir şekilde ulaşmasını sağlar.
HTTP ve HTTPS Protokolleri
HTTP, web tarayıcıları ve web sunucuları arasındaki iletişim için standart bir protokoldür.
HTTPS ise güvenli HTTP protokolüdür ve web içeriğinin korunması için kullanılır.
Web sayfaları ve içerikler arasında nasıl veri gönderileceği 'GET' ve 'POST' yöntemleri ile tanımlanır.
Veri İletişiminde Bağlantılar
Bir bağlantı isteği, istemci ve sunucu arasında iki aşamalı olarak gerçekleşir.
İstemci, bir URL talep ettiğinde, sunucu bu isteğe yanıt verir.
Her istek, belirli bir veri türünü geri döner ve bu veri türü içerik türleri ile tanımlanır.
HTTP Durum Kodları
HTTP 200 durumu, sayfanın doğru bir şekilde yüklendiğini gösterir.
HTTP 404 durumu, talep edilen sayfanın bulunmadığını belirtir.
Diğer yaygın HTTP durum kodları arasında 301 (kalıcı taşındı), 401 (yetkisiz) ve 500 (sunucu hatası) bulunur.
404 kodu, kullanıcının yanıtlanmayan bir sayfaya erişmeye çalıştığında görülen yaygın bir hatadır.
HTML ve CSS Dillerine Giriş
HTML, sayfaların yapısını oluşturmak için kullanılırken, CSS sayfaların stilini belirler.
HTML, etiketler ve nitelikler ile yapılandırılır; temel etiketler arasında ,
, veSayfa başlığı,
Web Sayfası Oluşturma
Kullanıcıların tarayıcıları ile taleplerinde HTML kodu göndermeleri gerektiği vurgulanır.
HTML'de paragraf oluşturmak için
etiketinin kullanılması gerektiği gösterilir.
Başlıklar için farklı HTML etiketleri (H1, H2, H3) tipik olarak farklı boyut ve vurgular sağlar.
Liste ve Tablo Oluşturma
HTML'de sıralı (OL) ve sırasız (UL) listeler oluşturulabilir.
Tablolar,
| ve | etiketleri ile oluşturulur. Tablo başlıkları, bilgilerin anlaşılmasını kolaylaştırmak için kullanılır. Görsel ve Medya Ekleme
Bağlantılar ve İframe'ler
Phishing Saldırıları ve HTML Kullanımı
Sayfalar Arası Bağlantılar ve Hedefleme
Responsive Tasarım
HTML Formları ve URL Parametreleri
CSS ile Stil Verme
CSS ile Seçici Kullanımı
Framework Kullanımı
JavaScript ile Etkileşim
Python ve Web Geliştirme
Flask Framework'e Giriş
Uygulama Oluşturma
HTML Şablonu Oluşturma
Flask Sunucusunu Çalıştırma
Dinamik İçerik Ekleme
Form Kullanımı Eklemek
POST Yönteminin Kullanımı
Hata Kontrolü ve Geliştirmeler
Şablon Düzenleme ve Yeniden Kullanım
GET ve POST İstekleri
MVC Yapısı
Form Oluşturma
Hata Yönetimi
Veri Saklama ve SQL Kullanımı
Flask Uygulamasını Çalıştırma
Veri Tabanı Durumu
Deregister İşlemi
POST ve GET İstekleri
Flask-Mail ile E-posta Gönderimi
Kullanıcı Oturumları ve Çerezler
Alışveriş Sepeti Uygulaması
JavaScript Entegrasyonu
JavaScript'in Temelleri
Sunucudan Veri Çekme
Veri Gönderiminin İyileştirilmesi
HTML ve JavaScript Entegrasyonu
Harvard CS50 – Full Computer Science University Course Harvard CS50 – Full Computer Science University Course |
|---|