c programlama örnekleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
c programlama örnekleri etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
 Bu örnekte C programlama dilinde, kullanıcıdan alınan sayının tek sayımı yoksa çift sayı mı olduğunu bulan programı yazdık:




#include <stdio.h>

void tekcift(int x){
    if(x%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
}

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    tekcift(sayi);

    return 0;
}

---------

#include <stdio.h>

int main() {
    int sayi;
    printf("Sayi giriniz: ");
    scanf("%d",&sayi);

    if(sayi%2==0){
        printf("Cift");
    }
    else
        printf("Tek");
    return 0;
}


 

Bu yazımızda, C programlamanın en önemli elemanlarında bir olan yapılar (struct) konusuna değineceğiz. 



Yapı (Struct) Nedir ?

Yapılar -bazen topluluklar diye anılır- tek bir isim altında onunla ilgili değişkenlerin olduğu koleksiyonlardır. Yapılar, sadece aynı veri türünde öğeleri içeren dizilerin aksine farklı veri türünde değişkenler içerebilir. Yapılar, diziler gibi belleğe sürekli biçimde yerleşen nesnelerdir. Dizilerde olduğu gibi başlangıç adresleri içerilerek fonksiyonlara kolaylıkla aktarılabilirler. 

Yapıların Bildirimi

Yapılar türetilmiş veri türleridir. Yapılar diğer türdeki nesneleri kullanarak inşa edilirler. Yapı bildiriminin genel biçimi:

struct [yapı_ismi] {
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    <tür> <yapı_elemanı>;
    ...
};


Yukarıdaki genel biçimde:

struct :             Bildirim için gerekli anahtar sözcüktür.
yapı_ismi :      Yapıyı anlatan isimlendirme kurallarına uygun herhangi bir isim olabilir. / yapı                                         etiketidir.
yapı_elemanı : Yapıyı oluşturan değişken isimleridir; isimlendirme kurallarına uygun herhangi bir isim                           olabilir.

!! Bildirimin küme parantezinden sonra noktalı virgül ile sonlandırıldığına dikkat ediniz.!!

Örneğin, düzlemde bir nokta x ve y bileşenlerinden oluştuğuna göre, bu aynı elemanlar yerine bir yapı biçiminde de bildirebiliriz:

struct NOKTA {
    int x;
    int y;
};
...


Benzer biçimde, tarih bilgileri de hiçbiri int türünden üç ayrı değişken yerine, yapı kullanılarak mantıksal bir bütünlük içinde ifade edilebilir:

struct DATE {
    int day;
    int month;
    int year;
};

Yukarıdaki bildirimde DATE yapının ismi; day, month ve year ise int türünden yapı elemanlarıdır.

Yapı bildirimiyle derleyici yalnızca yapılar hakkında bilgi edinir; bellekte onlar için herhangi bir yer ayrılmaz. Yapı bildirimlerini bir çeşit şablon tanımlaması gibi düşünebilirsiniz. Tıpkı fonksiyon prototiplerinde olduğu gibi yapı bildirimleri de yalnızca derleyiciyi bilgilendirmek amacıyla kullanılmaktadır.

Yapı Değişkenlerinin Tanımlanması

Bellekte yer ayırma işlemi yapı değişkenlerinin tanımlanmasıyla oluşur. Yapı değişkenlerinin tanımlanması aşağıdaki iki biçimde yapılır:

struct <yapı_ismi> <yapı_değişkeninin_ismi>;

veya

struct [yapı_ismi] {
    ...
} [değişken_listesi];

Yağı değişkenlerinin yapı bildiriminde sonra tanımlanması zorunludur. 

Örneğin:

struct NOKTA {
    int x;
    int y;
};
...

struct NOKTA a;

veya

struct NOKTA {
    int x;
    int y;
}a;
...


benzer biçimde DATE yapısı türünden bir d değişkeni:

struct DATE {
    int day;
    int month;
    int year;
};
...
struct DATE d;

veya

struct DATE {
    int day;
    int month;
    int year;
}d;
...

Yapı Değişkenlerine İlk Değerin Verilmesi

Yapı değişkenlerine dizilerde olduğu gibi küme parantezleri içerisinde ilk değer verilir. 

Örneğin:

struct date {
    int day;
    int month;
    int year;
};
...
struct date d = {1,4,1995};


Derleyici ilk değerleri yapı elemanlarına sırasıyla yerleştirir. Yani yukarıdaki örnekte yapı elemanlarının alacağı değerler şöyledir:

d.day => 1
d.month => 4
d.year => 1995


Yapı Üyelerine Erişim

Yapı üyelerine erişmek için iki operatör kullanılır: Yapı üyesi operatörü (.) (aynı
zamanda nokta operatörü olarak da bilinir) ve yapı işaretçisi operatörü ( ->) (aynı zamanda ok
operatörü olarak da adlandırılır). Yapı üyesi operatörü yapının değişken ismiyle yapı üyesine erişir. 

Örneğin:

printf("%d",d.day);

Yapı işaretçisi operatörü -aralarında herhangi bir boşluk olmayan eksi (-) işareti ve büyüktür (>) işaretinden oluşan - yapıda bir işaretçi üzerinden bir yapı üyesine erişir.

struct data *x;
printf("%d", x-> year);

Örnek:

#include <stdio.h>

struct card {
char *face;
char *suit;
};

int main( )
{
struct card aCard;
struct card *cardPtr;

aCard.face = "Ace";
aCard.suit = "Spades";

cardPtr = &aCard;

printf( "%s%s%s\n%s%s%s\n%s%s%s\n", aCard.face," of ", aCard.suit,
cardPtr->face," of ",cardPtr->suit,
(*cardPtr).face," of ",(*cardPtr).suit);
return 0;
}
Ekran Çıktısı:

Ace of Spades
Ace of Spades
Ace of Spades

İç İçe Yapılar

Bir yapının içende başka bir yapı nesnesi tanımlanabilir. İç içe yapıların tanımlanması C'de iki biçimde yapılmaktadır:

1) İçerideki yapının bildirimini daha yukarıda yaparak. Bu durumda derleyici doğal akış yönünde ilerlerken bildirilen yapıyı tanıyabilir.

struct date{
    int day, month, year;
};
...
struct person {
    char name[30];
    struct date bday;
};

2) İçerideli yapının dışındaki yapının içerisinde bildirilmesiyle. Bu durumda değişken tanımlanması da yapılmalıdır:

struct person {
    char name[30];
    struct date{
        int day, month, year;
    }bday;
};

Yapıların Fonksiyonlara Parametre Olarak Geçirilmesi

C'de parametrelerin kopyalanarak fonksiyonlara geçirildiğini hatırlayalım. Yapı değişkenleri de fonksiyonlara kopyalanarak parametre olarak geçirilebilirler. 

Örnek:

#include <stdio.h>

struct date{
int day,month,year;
};

void dispDate(struct date x){
printf("Year: %d\n",x.year);
printf("Month: %d\n",x.month);
printf("Dat: %d\n",x.day);
}

int main() {
// Write C code here
struct date n;

n.day = 4;
n.month = 5;
n.year = 1995;
dispDate(n);

}
Ekran Çıktısı:

Year: 1995
Month: 5
Dat: 4




C programlama ile ilgili olan diğer konulara aşağıdaki linkten ulaşabilirsiniz:




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