for döngüsü etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
for döngüsü etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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