Thread Nedir?

Bir thread, bir process içerisindeki yürütme birimidir. Bir process'in aynı anda birden fazla iÅŸi yapmasını saÄŸlayan yapılardır. Bir process, yapısında birden fazla thread bulundurabilir, bu yapılara multithreading denir. 

Process Nedir?

Process, ihtiyaç duyulan tüm kaynaklar ile birlikte belleğe yüklenmiş bir programdır. Her process'in ihtiyaç duyduğu temel kaynaklar; register, counter ve stack'tir. Her processin ayrı bir bellek adresi vardır, bu da her işlemin bağımsız olarak çalıştığı ve diğer işlemlerden izole edildiği anlamına gelir. Yani bir process çalışırken yalnızca kendini çalışıyor zanneder. Diğer işlemlerde paylaşılan verilere doğrudan erişemez.

Process vs Thread

  • Bir thread’in oluÅŸturulması ve sonlandırılması process’lere göre daha kısa sürer
  • Process’ler birbirinden izole bir ÅŸekilde çalışırken, thread’ler aynı bellek kaynağını paylaşır
  • Process’ler, thread’lere göre daha fazla kaynak tüketimi yaparlar
  • Bir process bloklanırsa baÅŸka bir process iÅŸlemini gerçekleÅŸtiremez. Öncelikle ilk process’in iÅŸini bitirmesini bekler. Ancak bu durum thread’lerde geçerli deÄŸildir. Bir thread baÅŸka bir thread bloklansa bile çalışabilir.
  • Ölçeklenebilirlik açısından thread’ler daha avantajlıdır. Process’lerin ölçeklendirilmesi için çok iÅŸlemcili yapı gerekmektedir. Bu da processler’de ölçeklendirmenin donanımsal olarak yapıldığını bizlere gösteriyor. thread’lerde ise çok çekirdekli iÅŸlemcilerde birden fazla thread farklı çekirdeklerde çalıştırılabilir.

C Programlamada Thread OluÅŸturma

Linux işletim sistemini kullanarak thread'leri kolaylıkla oluşturabiliriz. Şimdi ilk örneğe bakalım:

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

void *worker_thread(void *arg)

{

        printf("This is worker_thread()\n");

        return NULL;

}

int main()

{

        pthread_t my_thread;

        int ret;

        printf("In main: creating thread\n");

        ret = pthread_create(&my_thread, NULL, &worker_thread, NULL);

   if(ret != 0) {

                printf("Error: pthread_create() failed\n");

        }

        pthread_join(my_thread, NULL);

        return 0;

}
Çıktı:



Main thread, worker_thread yürütmek için bir thread oluşturacaktır. Main de pthread_t türünde my_thread adında bir değişken bildirdik. Bir thread oluşturmak için pthread_create() fonksiyonunu kullandık. Bu fonksiyon 4 tane değişken alır. Bunlar:
  • İlki, my_thread için bir pointer,
  • İkincisi, nitelikleri belirtir,
  • Üçüncüsü, thread için yürütülecek olan fonksiyon,
  • Dördüncüsü, worker_thread fonksiyonuna argüman göndermek için kullanılır.
pthread_join fonksiyonu ile, bir thread'in sonlanmasını bekleyebiliriz. Bu fonksiyonun kullanıldığı thread, sonlanması beklenen thread sonlanana kadar bloklanacaktır.

Başka bir örnek daha, bu örnekte 5 tane thread oluşturduk:

 

#include <pthread.h>

#include <stdio.h>

#include <stdlib.h>

#define N 5

void *worker_thread(void *arg)

{

        printf("This is worker_thread #%ld\n", (long)arg);

        return NULL;

}

int main()

{

        pthread_t my_thread[N];

        long id;

   int ret;

        printf("In main: creating thread\n");

        for(id = 1; id <= N; id++) {

                ret =  pthread_create(&my_thread[id], NULL, worker_thread, (void*)id);

                if(ret != 0) {

                        printf("Error: pthread_create() failed\n");

                }

        }

        for(id = 1; id <= N; id++) {

pthread_join(my_thread[id], NULL);

  }

        return 0;

}


Çıktı:





Kaynaklar:

http://alpegeakarsu.com/process-ve-thread-nedir/

https://demirten.gitbooks.io/linux-sistem-programlama/content/threads/types.html

https://devnot.com/2021/thread-nedir-detayli-bir-thread-incelemesi/

https://www.elektrikport.com/teknik-kutuphane/thread-nedir-thread-cde-nasil-kullanilir-ve-nasil-yazilir/23510#ad-image-0 






     Projelerle arduino ve proteus serisine baÅŸlamaya karar verdim. Çünkü, bu ÅŸekilde hem proteus hem de arduino beraber kolaylıkla öğrenilebilecektir. 

    Hadi ilk bölüme baÅŸlayalım

Proteus da Arduino ile Led Yakma


    Ã–ncelikle proteus'a arduino kütüphanesinin eklenmiÅŸ olmalıdır. Ben arduino kütüphanesinin ekli olduÄŸunu varsayarak devam edeceÄŸim.

    Proteus da devremizi kurmak ile baÅŸlayalım. 

    Arduino uno, bir direnç ve bir led'e ihtiyacımız vardır. Gerekli olan kompanentleri eklediÄŸimizde devremiz aÅŸağıdaki gibi olacaktır.


    Arduinonun 9 numaralı pinine direncimizi baÄŸlayacağız. Ve hemen ardına ledimizi baÄŸlayacağız. Devrenin tamamlanması için ground baÄŸlantısını da yapmamız gerekmektedir.


Arduino kodumuz ise:

int led = 9;

void setup() {

  pinMode(led,OUTPUT);

}


void loop() {

  digitalWrite(led,HIGH);

  delay(1000);

  digitalWrite(led,LOW);

  delay(1000);

}

    Bu kodda int led = 9; ile adı led olan bir deÄŸiÅŸken tanımlanmaktadır ve deÄŸeri de 9 olarak atanmıştır. Bu bizim arduino da ledmizi baÄŸladığımızı pini temsil etmektedir. 

pinMode(led,OUTPUT); ile 9 numaralı olan pinimizi OUTPUT olarak yani çıkış olarak tanımlamış olduk.

digitalWrite(led,HIGH); ile 9 numaralı pine 5 V verdik yani 9 numaralı pinin çıkışını lojik 1 yaptık.

delay(1000); ile 1 saniye bekledik.

digitalWrite(led,LOW); ile 9 numaralı pinin çıkışını lojik 0 yaptık yani 9 numaralı pine 0 V verdik.


    Bu ÅŸekilde 9 numaralı pine baÄŸlı olan led 1 saniye yandıktan sonra 1 saniye de sönecektir.


    Yazdığımız bu kodu arduino ya yüklemek için, kodun .hex uzantılı dosyasına ihtiyacımız vardır. Bu dosyayı elde edebilmek için ise; arduino da Dosya > Tercihler bölümüne gelmemiz gerekmektedir. Burada; aÅŸağıdaki iÅŸlem sırasında detaylı çıktı göster kısmındaki derleme ve yükle'nin seçili olması gerekmektedir.


    Bu iÅŸlemi yaptıktan sonra yazığımız kodu derleyelim. Derleme iÅŸlemini yaptıktan sonra teminalde .hex uzantılı dosya konumunu bulmamız gerekecektir. Bu dosya konumunu kopyalamamız lazım. AÅŸağıda gösterildiÄŸi gibidir.


    Kopyaladığımız bu .hex uzantılı olan dosya konumunu aÅŸağıda iÅŸaretli olan alana yapıştıracağız.


    Bu iÅŸlemlerden sonra arduinoya kodumuz yüklenmiÅŸ olacaktır. Simülasyonu baÅŸlattığımızda doÄŸru bir ÅŸekilde çalışacaktır.






 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);