Arduino da bağlı ola iki LED'i farklı aralıklar ile yakacağız. Bir LED 1 saniye de 10 kere yanarken, diğer LED 1 saniye de 1 kere yaranacak.


Arduino'nun 2 ve 3 numaralı pinlerine LED'lerimizi bağlayacağız.


Devre Şeması:



Arduino Kodu:

int a = 0;

void setup() {

  // put your setup code here, to run once:

  pinMode(2,OUTPUT);

  pinMode(3,OUTPUT);

}


void loop() {

  // put your main code here, to run repeatedly:

  digitalWrite(2,1);

  delay(50);

  digitalWrite(2,0);

  delay(50);

  a++;

  if(a>5){

    digitalWrite(3,1);

  }

  if(a>10){

    a=0;

    digitalWrite(3,0);

  }

}

https://github.com/sumeyyevarmis/arduino-led-blink


https://create.arduino.cc/projecthub/sumeyye-varmis/arduino-2-led-blink-24c93c





Bu çalışmada, arduino da nextion ekran kullanarak hesap makinesi yapacağız.

Nextion Editor kullanarak arayüzümüzü tasarlayacağız. Ben bu uygulama için 2.8 inch ekranı kullandım.

Tasarlanan Arayüz



Devre






Arduino Kodu


#include "Nextion.h"

SoftwareSerial HMISerial(0, 1); // RX, TX

#define NETXION_PAGE_ID 0
#define NETXION_TEXT 1
#define NETXION_BUTTON_1 2
#define NETXION_BUTTON_2 3
#define NETXION_BUTTON_3 4
#define NETXION_BUTTON_4 5
#define NETXION_BUTTON_5 6
#define NETXION_BUTTON_6 7
#define NETXION_BUTTON_7 8
#define NETXION_BUTTON_8 9
#define NETXION_BUTTON_9 10
#define NETXION_BUTTON_0 11
#define NETXION_BUTTON_ENTER 12
#define NETXION_BUTTON_CL 13
#define NETXION_BUTTON_Plus 14
#define NETXION_BUTTON_Moins 15
#define NETXION_BUTTON_Mul 16
#define NETXION_BUTTON_Div 17

NexButton Button_0  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_0, "Btn0");
NexButton Button_1  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_1, "Btn1");
NexButton Button_2  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_2, "Btn2");
NexButton Button_3  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_3, "Btn3");
NexButton Button_4  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_4, "Btn4");
NexButton Button_5  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_5, "Btn5");
NexButton Button_6  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_6, "Btn6");
NexButton Button_7  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_7, "Btn7");
NexButton Button_8  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_8, "Btn8");
NexButton Button_9  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_9, "Btn9");
NexButton Button_CL  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_CL, "BtnCL");
NexButton Button_ENTER  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_ENTER, "BtnEnter");
NexButton Button_Plus  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_Plus, "BtnPlus");
NexButton Button_Moins  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_Moins, "BtnMoins");
NexButton Button_Mul  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_Mul, "BtnMul");
NexButton Button_Div  = NexButton(NETXION_PAGE_ID, NETXION_BUTTON_Div, "BtnDiv");

NexText Text = NexText(NETXION_PAGE_ID, NETXION_TEXT, "Text");

 
NexTouch *nex_listen_list[] = 
{
    &Button_0,
    &Button_1,
    &Button_2,
    &Button_3,
    &Button_4,
    &Button_5,
    &Button_6,
    &Button_7,
    &Button_8,
    &Button_9,
    &Button_CL,
    &Button_ENTER,
    &Button_Plus,
    &Button_Moins,
    &Button_Mul,
    &Button_Div,
    NULL
};

unsigned char N_Str[10]={0}, i=0, Affichage[10];
float Pile[4]={0}, N; 

void button_0_Callback(void *ptr)
{


  N_Str[i]='0';
  Text.setText(N_Str);
  i++;
}

void button_1_Callback(void *ptr)
{
  N_Str[i]='1';
  Text.setText(N_Str);
  i++;
}

void button_2_Callback(void *ptr)
{
  N_Str[i]='2';
  Text.setText(N_Str);
  i++;
}

void button_3_Callback(void *ptr)
{
  N_Str[i]='3';
  Text.setText(N_Str);  
  i++;
}

void button_4_Callback(void *ptr)
{
  N_Str[i]='4';
  Text.setText(N_Str);
  i++;
}

void button_5_Callback(void *ptr)
{
  N_Str[i]='5';
  Text.setText(N_Str);
  i++;
}

void button_6_Callback(void *ptr)
{
  N_Str[i]='6';
  Text.setText(N_Str); 
  i++;
}

void button_7_Callback(void *ptr)
{
  N_Str[i]='7';
  Text.setText(N_Str);
  i++;
}

void button_8_Callback(void *ptr)
{
  N_Str[i]='8';
  Text.setText(N_Str);
  i++;
}

void button_9_Callback(void *ptr)
{
  N_Str[i]='9';
  Text.setText(N_Str); 
  i++;
}


void button_CL_Callback(void *ptr)
{
  Text.setText("");
  
  //Remise à "0" de N_Str
  for(int b=0; b<10 ; b++) N_Str[b]=0;  

  //Remise à "0" de la pile
  for(int b=0; b<4 ; b++) Pile[b]=0; 
}

void button_Plus_Callback(void *ptr)
{
  N=atof(N_Str);
  //Décalage de la pile vers le haut
  if(N!=0)
  {
    Pile[3]=Pile[2];
    Pile[2]=Pile[1];
    Pile[1]=Pile[0];

    Pile[0]=N;
  }

  Pile[0] = Pile[0] + Pile[1];
  dtostrf(Pile[0],6,3, Affichage);
  Text.setText(Affichage); 

  Pile[1]=Pile[2];
  Pile[2]=Pile[3];
  Pile[3]=0;

  for(int b=0; b<10 ; b++) N_Str[b]=0;  
  i=0;
}

void button_Moins_Callback(void *ptr)
{
  N=atof(N_Str);

  if(N!=0)
  {
    Pile[3]=Pile[2];
    Pile[2]=Pile[1];
    Pile[1]=Pile[0];

    Pile[0]=N;
  }

  Pile[0] = Pile[1] - Pile[0];
  dtostrf(Pile[0],6,3, Affichage);
  Text.setText(Affichage); 

  Pile[1]=Pile[2];
  Pile[2]=Pile[3];
  Pile[3]=0;

  for(int b=0; b<10 ; b++) N_Str[b]=0;  
  i=0;
}

void button_Mul_Callback(void *ptr)
{
  N=atof(N_Str);

  if(N!=0)
  {
    Pile[3]=Pile[2];
    Pile[2]=Pile[1];
    Pile[1]=Pile[0];

    Pile[0]=N;
  }

  Pile[0] = Pile[0] * Pile[1];
  dtostrf(Pile[0],6,3, Affichage);
  Text.setText(Affichage); 

  Pile[1]=Pile[2];
  Pile[2]=Pile[3];
  Pile[3]=0;

  for(int b=0; b<10 ; b++) N_Str[b]=0;  
  i=0;
}

void button_Div_Callback(void *ptr)
{
  N=atof(N_Str);
  
  if(N!=0)
  {
    Pile[3]=Pile[2];
    Pile[2]=Pile[1];
    Pile[1]=Pile[0];

    Pile[0]=N;
  }

  Pile[0] = Pile[1] / Pile[0];
  dtostrf(Pile[0],6,3, Affichage);
  Text.setText(Affichage); 

  Pile[1]=Pile[2];
  Pile[2]=Pile[3];
  Pile[3]=0;

  for(int b=0; b<10 ; b++) N_Str[b]=0;  
  i=0;
  
}

void button_Enter_Callback(void *ptr)
{
 
  Pile[3]=Pile[2];
  Pile[2]=Pile[1];
  Pile[1]=Pile[0];


  Pile[0]=atof(N_Str);

  Text.setText("");

  for(int b=0; b<10 ; b++) N_Str[b]=0;  
  i=0;
}



void setup() {

  nexInit();

  Button_0.attachPush(button_0_Callback, &Button_0);
  Button_1.attachPush(button_1_Callback, &Button_1);
  Button_2.attachPush(button_2_Callback, &Button_2);
  Button_3.attachPush(button_3_Callback, &Button_3);
  Button_4.attachPush(button_4_Callback, &Button_4);
  Button_5.attachPush(button_5_Callback, &Button_5);
  Button_6.attachPush(button_6_Callback, &Button_6);
  Button_7.attachPush(button_7_Callback, &Button_7);
  Button_8.attachPush(button_8_Callback, &Button_8);
  Button_9.attachPush(button_9_Callback, &Button_9);
  Button_CL.attachPush(button_CL_Callback, &Button_CL);
  Button_ENTER.attachPush(button_Enter_Callback, &Button_ENTER);
  Button_Plus.attachPush(button_Plus_Callback, &Button_Plus);
  Button_Moins.attachPush(button_Moins_Callback, &Button_Moins);
  Button_Mul.attachPush(button_Mul_Callback, &Button_Mul);
  Button_Div.attachPush(button_Div_Callback, &Button_Div);
  
}

void loop() {
    nexLoop(nex_listen_list);

}








Arduino da nextion ekranı kullanarak led yakma ve led söndürme uygulaması gerçekleştireceğiz. Nextion ekran kullanacağımız için Nextion Editor uygulamasını indirmemiz gerekmektedir. Bu uygulama sayesinde ekranımız için istediğimiz arayüzü tasarlayabileceğiz. Basit bir ara yüze sahiptir.

Nextion Editor indirmek için aşağıdaki linkten ulaşabilirsiniz:

https://nextion.tech/nextion-editor/

Bu uygulama da 2.8 inch ekran kullanılmıştır. 

Tasarlanan Arayüz


Arduino Kodu:


#include "Nextion.h"
#include <SoftwareSerial.h>

SoftwareSerial HMISerial(0,1);

// b0 led on, b1 led off

NexDSButton b0 = NexDSButton(0,1,"b0");// sayfa, id, isim
NexDSButton b1 = NexDSButton(0,2,"b1");
NexText t0 = NexText(0,3,"t0");

// butonların durumları
uint32_t led_on = 0;
uint32_t led_off = 0;

const int led = 13;

void setup(){
  dbSerialPrintln("setup begin");
  nexInit();
  dbSerialPrintln("stup done");

  pinMode(led,OUTPUT);
}

void loop(){
  b0.getValue(&led_on);
  b1.getValue(&led_off);

  delay(200);
  if(led_on == 1){
    t0.setText("Led On");
    digitalWrite(led,HIGH);
  }
  if(led_off == 1){
    t0.setText("Led Off");
    digitalWrite(led, LOW);
  }
}



Kod ve ekran arayüz tasarımına aşağıdaki linkten ulaşabilirsiniz:


 Arduinoya baÄŸlanan bir butona ne kadar süre basıldığını bulmak için millis() fonksiyounu kullanılır. Millis() fonksiyonu, arduinoya enerji verildiÄŸi zaman otomatik olarak çalışmaya baÅŸlar. Bulunan zaman deÄŸeri milisaniye cinsindendir. 


Devre şeması:



Arduino kodu:

const int button = 3;

unsigned long time1 = 0;

unsigned long time2 = 0;

void setup()

{

  pinMode(button,INPUT);

  Serial.begin(9600);

}


void loop()

{

  while(digitalRead(button)==0){}

  while(digitalRead(button)==1){}

  Serial.println(digitalRead(button));

  

  while(digitalRead(button)==0){

    Serial.println("while 1");

    Serial.println(digitalRead(button));

  }

  time1 = millis();

  while(digitalRead(button)==1){ 

    Serial.println("while 2");

    Serial.println(digitalRead(button));

  }

  time2 = millis() - time1;

  

  Serial.println(time2);

  delay(1000);

  

}

1) Metindeki kelimeleri, sayıları ve cümlelerin sayısını bulan C programı

Çözüm 1:

#include<stdio.h>

#include<string.h>


const char* metin = "Bu gun hava cok guzel ama yaz mevsimi icin biraz serin.\

Bu sene bir turlu yaz gelemedi. Gelse ne olacak ki? Salgin yuzunden kimse bir\

 yere gidemiyor. Kalabaliklardan uzak durmak zorunda olmak berbat bir sey. Bu gun gunlerden Persembe.\

Bu gun pazara gittim. Pazardan 3 kg elma, 2 kg portakal aldım. Saat 9'u 25 gece geldim. Ben 1999 yılında dogdum.";


int main()

{

int kelime = 0;

int cumle = 0;

int sayi = 0;

int uzunluk = strlen(metin);

for (int i = 0; i < uzunluk; i++) {

if (metin[i] == ' ') {

kelime = kelime + 1;

}


if (metin[i] == '.' || metin[i] == '?') {

cumle += 1;

if (metin[i + 1] != ' ') {

kelime = kelime + 1;

}

}

if (metin[i] == '1' || metin[i] == '2'||metin[i] == '3' || metin[i] == '4' ||

metin[i] == '5' || metin[i] == '6' || metin[i] == '7' || metin[i] == '8' ||

metin[i] == '9')  {

if(metin[i-1] == '1' || metin[i-1] == '2' || metin[i-1] == '3' || metin[i-1] == '4' ||

metin[i-1] == '5' || metin[i-1] == '6' || metin[i-1] == '7' || metin[i-1] == '8' ||

metin[i-1] == '9')

sayi = sayi - 1;

sayi = sayi + 1;

}

}

printf("%d", kelime);

printf("\n%d", cumle);

printf("\n%d", sayi);

return 0;

}


Çözüm 2: 

#include <stdio.h>

#include <ctype.h>

#include <string.h>

int main()

{

    const char* cc = "Bu gun hava cok guzel ama yaz mevsimi icin biraz serin.\

 Bu sene bir turlu yaz gelemedi. Gelse ne olacak ki? Salgin yuzunden kimse bir\

 yere gidemiyor. Kalabaliklardan uzak durmak zorunda olmak berbat bir sey. Bu gun gunlerden Persembe.\

 Bu gun pazara gittim. Ben pazardan 3 kg elma, 2 kg portakal aldim. Saat 9 da geldim. Ben 1999 yilinda dogdum.";

    

    int kelime = 0;

    int cumle = 0;

    int sayi = 0;

    int result1;

    int result2;

    int result3;

    

  


    for (int i = 0; i < strlen(cc); i++)

    {

        // Kelime sayısı bulunur

        result1 = isspace(cc[i]);


        if (result1 != 0)

        {

            kelime = kelime + 1;

        }

        

        

        //Noktalama iÅŸaretleri bulunur

        result2 = ispunct(cc[i]);

        if (result2 != 0)

        {

            if(cc[i]!=',')

                cumle= cumle + 1;

        }

        

        // sayıların bulunması

        result3 = isdigit(cc[i]);

        if (result3 != 0) {

            if(isdigit(cc[i+1]) == 0)

                sayi = sayi + 1;

        }

       

    }

    // kelime sayısına bir eklenir.

    kelime = kelime + 1;


    printf("\nKelime sayisi = %d\n", kelime);

    printf("\nCumle sayisi = %d\n", cumle);

    printf("\nSayi sayisi = %d\n", sayi);

    return 0;

}

2) strhcr ile aynı işlevi yapan fonksiyon:

#include<stdio.h>
#include<string.h>

const char* my_strchr(const char*,const char);

int main() {

const char* r = "Merhaba";
const char s = 'e';
const char* q = my_strchr(r, s);
printf("Girilen kelimeden sonraki kisim = %s\n", q);
return 0;
}

const char* my_strchr(const char* c, const char s)
{
const char* t = NULL;
if (c != NULL)
{
do
{
if (*c == s)
{
t = c;
break;
}
} while (*c++);
}
return t;
}

3) Verilen kelimenin indisini bulan program:

#include<stdio.h>
#include<string.h>

int indis(const char*, const char);

int main() {

const char* r = "Merhaba";
const char s = 'e';
int x = indis(r, s);
printf("Harf indisi= %d\n", x);

return 0;
}

// gönderilen kelimenin indisini bulur
int indis(const char* c, char s) {
int i;
bool var = false;
const char* ptr = c;
if (ptr == NULL) {
return -1;
}
for (i = 0; *ptr != '\0'; i++) {
if (*ptr ==s) {
var = true;
break;
}
++ptr; 

}
return (var ? i : -1);
}
}

4) Kullanıcı "exit" yazana kadar sürekli kullanıcıdan metin alan program:

#include <string.h>
#include <stdio.h>
int main() {
char ss[512] = "merhaba";
char s[512] = "exit";
int result;
while (true)
{
printf("Kelime gir: ");
scanf("%s",ss);
result = strcmp(ss, s);

if (result == 0)
{
printf("ayni\n");
break;
}
else
{
printf("degil");
}
}

}

5) strcat, malloc, free ve strcpy ile strcat'ın ilk parametresindeki karakter dizisine, ikinci parametresindeki karakter dizisini ekleme:

Çözüm 1:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

char* s1;
char* s2;
s1 = (char*)malloc(8);
s2 = (char*)malloc(6);
strcpy(s1, "merhaba");
printf("String = %s,  Address = %u\n", s1, s1);
strcpy(s2, "dunya");
printf("String = %s,  Address = %u\n", s2, s2);
s1 = (char*)realloc(s1,13);
strcat(s1, s2);
printf("String = %s,  Address = %u\n", s1, s1);
free(s1);
free(s2);
return 0;
}

Çözüm 2:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* my_strcat(char*, char const*);
int main() {
        char* s1;
char* s2;


s1 = (char*)malloc(8);
s2 = (char*)malloc(6);

strcpy(s1, "merhaba");
printf("String = %s,  Address = %u\n", s1, s1);
strcpy(s2, "dunya");
printf("String = %s,  Address = %u\n", s2, s2);

printf("String = %s", my_strcat(s1,s2));
return 0;
}

char* my_strcat(char* s1, char const* s2) {
int i, j;
for (i = 0; s1[i] != '\0'; i++);
for (j = 0; s2[j] != '\0'; j++) {
s1[i + j] =s2[j];
}

s1[i + j] = '\0';
return s1;

}
6) malloc ve free fonksiyonlarını kullanarak kullanıcıdan alınan sayıların toplamını bulan program:

#include <stdio.h>
#include <stdlib.h>

int main() {
int n, i, * ptr, sum = 0;
printf("Kac sayi gireceksiniz: ");
scanf("%d", &n);
// bellekten yer ayırma
ptr = (int*)malloc(n * sizeof(int));
// Bellek ayrılmazsa 
if (ptr == NULL) {
printf("Hata, bellek ayrilamadi");
exit(0);
}
printf("Sayi giriniz: ");
for (i = 0; i < n; i++) {
scanf("%d", ptr + i);
sum += *(ptr + i);
}

printf("Toplam = %d\n", sum);
//belleğin serbest bırakılması
free(ptr);

return 0;
}

6) C programlamada derleme işlemi kaç aşamadan gerçekleşir ?

Cevap :

4 aÅŸamadan oluÅŸur. Bunlar:
1) Ön işleme (Preprocess): Bu aşamada yorum satırları kaldırılır, kütüphaneler eklenir ve makrolar eklenir. Bu aşama sonrasında çalışma dizininde ".i" uzantılı dosya oluşur.
2) Derleme(Compilation): ".i" dosyası derlenir ve ".s" dosyası oluşur. C kodları Assembly kodlarına çevrilir.
3) Çevirme(Assembly): Assembly kodları Assembler yardımı ile makine diline çevrilir. Çıktı olarak ".o" dosyası oluşur.
4) Bağlama(Linker): Kodun ihtiyaç duyduğu harici fonksiyon çağrılarını tanımlarıyla birlikte programa bağlar.

7) Bir karakterin bayt değerini gösteren program:

#include<stdio.h>  
int main() {
printf("Size of char : %d\n", sizeof(char));
return 0;
}

8) Kendi statik kütüphane kodları:

StaticLib.cpp


#include "pch.h"
#include "framework.h"
#include "My_Library.h"

int sayi_sayisi(const char* c)
{
    int sayi = 0;

    for (int i = 0; c[i] != '\0'; i++) {
        if (c[i] == '1' || c[i] == '2' || c[i] == '3' || c[i] == '4' ||
            c[i] == '5' || c[i] == '6' || c[i] == '7' || c[i] == '8' ||
            c[i] == '9') {
            if (c[i - 1] == '1' || c[i - 1] == '2' || c[i - 1] == '3' || c[i - 1] == '4' ||
                c[i - 1] == '5' || c[i - 1] == '6' || c[i - 1] == '7' || c[i - 1] == '8' ||
                c[i - 1] == '9')
                sayi = sayi - 1;
            sayi = sayi + 1;
        }
    }
    return sayi;
}

int indis(const char* c, char s)
{
    int sayac = 0;
    for (int i = 0; c[i] != '\0'; i++)
    {
        if (c[i] == s) {
            sayac = i;
            break;
        }
    }
    if (sayac == 0) {
        return -1;
    }
    return sayac;
}

int cumle_sayisi(const char* c)
{
    int cumle = 0;

    for (int i = 0; c[i] != '\0'; i++)
    {
        if (c[i] == '.' || c[i] == '?') {
            cumle = cumle + 1;
        }
    }
    //printf("Cumle sayisi = %d\n", cumle);
    return cumle;

}

int uzunluk(const char* c)
{
    int uzunluk = 0;
    for (int i = 0; c[i] != '\0'; i++) {
        uzunluk = uzunluk + 1;
    }
    //printf("Uzunluk = %d\n", uzunluk);
    return uzunluk;
}

int kelime_sayisi(const char* c) {
    int kelime = 0;

    for (int i = 0; c[i] != '\0'; i++)
    {
        if (c[i] == ' ') {
            kelime = kelime + 1;
        }
        if (c[i] == '.' || c[i] == '?') {

            if (c[i + 1] != ' ') {
                kelime = kelime + 1;
            }
        }
    }
    //printf("Kelime sayisi = %d\n", kelime);
    return kelime;
}

const char* my_strhcr(const char* c, const char s) {
    if (c != nullptr)
    {
        do
        {
            if (*c == s)
            {
                return c;// t = c;
                //break;
            }
        } while (*c++);
    }
    return nullptr;
}

My_Library.h


#ifndef H_MY_LIBRARY
#define H_MY_LIBRARY

int sayi_sayisi(const char* c);
int indis(const char* c, char s);
int cumle_sayisi(const char* c);
int uzunluk(const char* c);
int kelime_sayisi(const char* c);
const char* my_strhcr(const char* c, const char s);

#endif 

9) Bir thread tek sayıları bukur iken diğer thread ise çift sayıları bulmaktadır. Samaphore kullanrak bu iki threadin cıktılarını ekrana sırasıyka yazan program (1,2,3,4....)

Çözüm:

#include <pthread.h>
#include <stdio.h>
#include <semaphore.h>

sem_t tek;
sem_t cift;
// tekleri yazan thread
void* thread1(void* arg){

    int i;
    for(i=0;i<10000;i++){
        sem_wait(&tek);
        if(i%2 != 0){

            printf("Bu thread calisti %ld tek sayi = %d\n",(long)arg, i);
        }
        sem_post(&cift);
    }

    return NULL;
}
// çiftleri yazan thread
void* thread2(void* arg){

    int i;
    for(i=0;i<10000;i++){
        sem_wait(&cift);
        if(i%2 == 0){

            printf("Bu thread calisti %ld cift sayi = %d\n",(long)arg, i);
        }
        sem_post(&tek);
    }

    return NULL;
}
int main(){
    sem_init(&tek,0,1);
    sem_init(&cift,0,1);
    pthread_t t1,t2;
    long one =1;
    long two = 2;
    pthread_create(&t1,NULL,thread1,(void*)one);

    pthread_create(&t2,NULL,thread2,(void*)two);
    pthread_join(t1,NULL);
    pthread_join(t2,NULL);
    sem_destroy(&tek);
    sem_destroy(&cift);


 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++