Tekrarlama Temelleri

Çoğu program, tekrarlama veya döngü içerir. Bir döngü, döngü devam koşulu doğru kaldığı sürece bilgisayarın tekrar tekrar yürüttüğü bir talimatlar grubudur. Tekrarlamanın iki anlamı vardır:

    1) Sayaç kontrollü tekrarlama    
    2) Sonlandırma kontrollü tekrarlama

Döngünün önceden kaç kere yürütüldüğünü önceden bildiÄŸimiz için sayaç kontrollü tekrarlama bazen belirli tekrarlama olarak adlandırılır. Döngünün tam olarak kaç kere yürütüleceÄŸini önceden bilinmediÄŸi için sonlandırma kontrollü tekrarlama bazen belirsiz tekrarlama olarak adlandırılır. 

Sayaç kontrollü tekrarlamada, tekrarlama sayısını sayısını saymak için bir kontrol değişkeni kullanılır. Kontrol değişkeni talimatlar grubunun yapıldığı her sefer ( genelde 1 ) arttırılır. Kontrol değişkeninin değeri doğru sayıda tekrarlamanın yapıldığı işaret ettiği zaman, döngü sonlanır ve yürütme, tekrarlama ifadesinden sonraki ifade ile devam eder.
    
    1) Kesin tekrarlama sayısı önceden bilinmediÄŸi,
    2) Döngü, döngünün yapıldığı her sefer veri alan ifadeler içerdiÄŸi zaman
tekrarlamayı kontrol etmek için sonlandırma değerleri kullanılır. Sonlandırma değeri "veri sonu" nu işaret eder. Sonlandırmalar, normal veriden farklı olmak zorundadır.

Sayaç Kontrollü Tekrarlama

Sayaç kontrollü tekrarlama:

    1) Kontrol deÄŸiÅŸkeninin ismi
    2)Kontrol deÄŸiÅŸkeninin baÅŸlangıç deÄŸeri
    3) Her döngü seferinde kontrol deÄŸiÅŸkeninin deÄŸiÅŸtirileceÄŸi arttırma ( veya azaltma)
    4) Kontrol deÄŸiÅŸkeninin son deÄŸeri

maddelerini gerektirir.

Aşağıdaki örnekte 1 'den 10 'a kadar sayıları ekrana yazan program yapılmıştır.

Örnek:

#include <stdio.h>

int main(void){
    
    unsigned int sayac = 1; // sayaça baÅŸlangıç deÄŸerinin verilmesi
    
    while( sayac <= 10) {
    
        printf("%u\n", sayac);
        ++sayac;  // arttırma iÅŸlemi
    } // while sonu
} // main fonksiyonu sonu


Ekran çıktısı:

1
2
3
4
5
6
7
8
9
10

Bu örneği inceleyelim:

Bu örnekte kontrol değişkenimiz "sayac" olarak isimlendirilmiştir. "unsigned int sayac = 1;" bu kod satırı ile kontrol değişkenimize değeri atanmıştır. "++sayac;" bu kod satırı ile ise, döngünün yapıldığı her sefer döngü sayacı 1 arttırır. while ifadesindeki döngü devam koşulu kontrol değişkeninin 10'dan küçük veya eşit olup olmadığını kontrol eder. Kontol değişkeni 10'u geçtiği zaman döngü sonlanır.

for Tekrarlama İfadesi

for tekrarlama ifadesi, sayaç kontrollü tekrarlamanın tüm detaylarını sağlar.

for döngüsü akış diyagramı



for ifadesinin genel biçimi:

for ( ifade1; ifade2; ifade3){
    ifade
}

Örnek:

1    #include <stdio.h>
2    
3    int main(void) {
4        
5        unsigned int sayac; // sayac tanımlanır
6    
7                    // baÅŸlangıç deÄŸeri verme, tekrarlama koÅŸulu ve arttırma'nın
       // tamamı for ifadesi baÅŸladığında dahil olmuÅŸtur.
9
10                 for ( sayac =1; sayac<=10; ++sayac){
11    
12            printf("%u\n", sayac);
13    
14        }// for sonu
15    
16    } // main sonu

Ekran çıktısı:

1
2
3
4
5
6
7
8
9
10

for ifadesi çalışmaya baÅŸladığı zaman, sayac kontrol deÄŸiÅŸkenine baÅŸlangıç deÄŸeri olarak 1 verilir. Sonra, sayac <= 10 döngü devam koÅŸulu kontrol edilir. sayac'ın baÅŸlangıç deÄŸeri 1 olduÄŸu için , koÅŸul saÄŸlanır, böylece 12. satır da sayac deÄŸerini, yani 1, yazar. sayac kontrol deÄŸeri daha sonra ++sayac ifadesi tarafından 1 arttırılır, ve döngü, döngü devam karşılaÅŸtırılması ile tekrar baÅŸlar. Kontrol deÄŸiÅŸkeni ÅŸimdi 2 olduÄŸu için, son deÄŸer aşılmamıştır, bu nedenle program  printf ifadesini  tekrar gerçekleÅŸtirir. Bu süreç, sayac kontrol deÄŸiÅŸkeninin son deÄŸeri 11 olana kadar devam eder.



Örnekler:

1) Kullanıcıdan alınan 3 sayıdan 25'e en yakın olan sayıyı bulan program:


#include <stdio.h>
int main(){
   int enyakinmesafe=25;
   int enyakinsayi=25;
   for(int i = 0;i<3;i++){
     int sayi;
     scanf("%d",&sayi);
     if((25-sayi)*(25-sayi)<enyakinmesafe){
                enyakinmesafe = (25-sayi)*(25-sayi);
                enyakinsayi = sayi;
     }
   }
   printf("en yakin sayi : %d",enyakinsayi);

Ekran çıktısı:

15
22
28
en yakin sayi : 22


2) Kullanıcıdan alınan sayıya kadar olan sayıların toplamı:


#include <stdio.h>

int main()
{
  int i,n,sonuc ;
  // degiÅŸkenler tanımlanıyor.
  
   // integer'e karşılık prinf ve scanf'te %d kullanırlır.
   
   printf("Bir sayi giriniz :");
   //Kullanıcıdan deÄŸerler alınıyor..
   
   scanf("%d", &n);
   // %d sayının tipini ifade ediyor. & sayısal olanlarda giriliyor.
   //  String bir ifade kullanmak istedeÄŸimizde & iÅŸaretini kullanmıyoruz.
   //
   
   sonuc=0;

   for  (i=1; i<=n; i++ )
   
   sonuc = sonuc + i;
   
   printf("istediginiz toplam: %d ", sonuc  );  
   // sonuç ekrana yazdırılıyor.. 
    // %f virgüllü sayılar
    // %s string ifadelerinde kullanıyoruz.
   
}
 
Ekran çıktısı:

Bir sayi giriniz :3
istediginiz toplam: 6 



3) Ä°ngiliz alfabesine A’dan Z’ye kadar harflei sıralayan bir C programı:

/* A-Z harflerini yazan for döngüsü. */
#include <stdio.h>
int main() {
    char c;
    for(c='A'; c<='Z'; ++c){
        printf("%c ",c);
    }
    return 0;
}

Ekran çıktısı:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 

4) Kullanıcıdan alınan sayıya kadar olan sayıların faktöriyelini hesaplayan program:

#include <stdio.h>
 
main()
{
    int faktoriyel = 1; 
    int sayi;
    
    printf("Bir sayi giriniz: ");
    scanf("%d",&sayi);
    
    for(int i = 1; i <= sayi; i++)
    {
        faktoriyel *= i;         // faktoriyel = faktoriyel * i;
        printf("%d ! = %d\n", i , faktoriyel);    
    }
         //printf("%d ! = %d ", sayi, faktoriyel);
}

Ekran çıktısı:

Bir sayi giriniz: 6
1 ! = 1
2 ! = 2
3 ! = 6
4 ! = 24
5 ! = 120
6 ! = 720



Kısa Yollar:

Aşağıdaki linkler ile C programlama ile ilgili olan diğer bölümlere ulaşabilirsiniz:





Kaynaklar:


https://bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/

https://www.cag.edu.tr/uploads/site/lecturer-files/programlamatemelleri-iJim.pdf

http://www.baskent.edu.tr/~tkaracay/etudio/ders/prg/c/questions/h05/h05_loops.pdf

https://www.kodbloklari.com/c-dili-for-dongusu/

Deitel Deitel c ve c++ 
Bu çalışmada raspberry pi üzerindeki cpu'nun sıcaklık değerini okuyacağız. Bu okuduğumuz sıcaklık değerini TCP ile oluşturacağımız server'a aktaracağız. Programlama dili olarak Python kullanacağız.

Hadi baÅŸlayalım. 

Öncelikle raspberry pi üzerindeki cpu'nun sıcaklığını ölçmek ile başlayalım.

import os
import time

def measure_temp():
    temp = os.popen("vcgencmd measure_temp").readline()
    return (temp.replace("temp= ",""))
while True:
    print(measure_temp)
    time.sleep(1)



Bir saniye aralıklarla console ekranında cpu sıcaklık değerini yazdıracaktır. Biz programı durdurana kadar devam edecektir.




Evet artık cpu sıcaklık deÄŸerini okuyabiliyoruz. Åžimdi client ve server'larımızı oluÅŸturabiliriz. 

Önce TCP için yapalım:

Server kısmı: 

import socket

host = "192.168.1.42"
port = 12345

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("socket oluÅŸturuldu")

s.bind((host, port))
print("socket {} nolu porta bağlandı".format(port))

s.listen(5)
print("socket dinleniyor")

except socket.error as msg:
print("Hata:", msg)

while True:
# Client ile bağlantı kurulursa
c, addr = s.accept()
print('Gelen bağlantı:', addr)

# Bağlanan client tarafına bağlandığını belirtelim
mesaj = 'Bağlantı sağlandı'
c.send(mesaj.encode('utf-8'))

# client tarafından gönderilen cpu sıcaklık değeri
yanit = c.recv(1024)
print( yanit.decode("utf-8") )

# Bağlantıyı sonlandıralım
c.close()

Client kısmı:

# -*- coding: utf-8 -*-
import socket                
#cpu temp
import os
import time


while True:
    # Socket oluÅŸturulması
    s = socket.socket()          
    
    # BaÄŸlanılacak adres ve port
    host = "192.168.1.42"
    
    port = 12345                

    try:
        # BaÄŸlantıyı yap
        s.connect((host, port))
        

        # serverden yanıtı al
        yanit = s.recv(1024)
        print(yanit.decode("utf-8"))
       
        #cpu sıcaklığı ölçülür ve server'a gönderilir
        temp = os.popen("vcgencmd measure_temp").readline()
        mesaj= temp
        s.send(mesaj.encode("utf-8"))
    

        # baÄŸlantıyı kapat
        s.close() 
    except socket.error as msg:
        print("[Server aktif deÄŸil.] Mesaj:", msg)
    
    time.sleep(1)

Biz server'dan baÄŸlantıyı kesene kadar, client cpu sıcaklık deÄŸerini göndermeye devam edecektir. 
Şimdi çalıştıralım:

Server'a herhangi bir bağlantı olmadan önce:



Client çalıştırılınca server:



Client çıktısı:


Bu şekilde TCP ile veri aktarımını başarılı bir şekilde tamamlamış olduk.