Hackerrank C Çözümleri - 1 - Introduction(5 Soru)


Hackerrank sitesindeki C programlama dili için sorulmuş olan 25 sorudan ilk 5 sorunun (Introduction) çözümlerini bu yazıda sizlerle Türkçe bir biçimde anlatmaya çalışacağım. Bu sorular sırasıyla: "Hello World!" in C, Playing With Characters, Sum and Difference of Two Numbers, Functions in C ve Pointers in C. Soruların cevaplarını da ayrıca GitHub linkinde paylaştım: https://github.com/TolgaKilinckaya/HackerrankSolutions/tree/main/C



1. "Hello World!" in C
   
    Bu soruda temel olarak bizden input (girdi) ve output (çıktı) işlemlerini kullanmamızı istiyor. C'de input almak için <stdio.h> kütüphanesinde tanımlı olan scanf() fonksiyonunu, output vermek içinse printf() fonksiyonunu kullanmalıyız.

#include <stdio.h>

int main() 
{
    
    char s[100];
    scanf("%[^\n]%*c", &s);
    printf("Hello, World!\n%s",s);
       
    return 0;
}
   
    "%[^\n]" sembollerini kullanmamızın sebebi, input işleminin "\n" işaretini görene kadar sürmesini istiyoruz. Eğer bu işareti kullanmadan scanf() fonksiyonunu kullancak olursak, program kullanıcıdan gelen input'u sadece space (boşluk) karakterini görene kadar alacaktır. printf() fonksiyonundaki "\n" işareti ise bir alt satıra geçmek istediğimiz için.

2. Playing With Characters


    Bu soruda string ifadelerin nasıl input ve output edileceğini soruyor. Sırasıyla 1 karakter (char), 1 kelime (string) ve 1 cümle (sentence) input almamızı, ardından da bunları alt alta output vermemizi istemiş. Öncelikle main() fonksiyonun üstünde bir MAX_LEN tanımlayalım ve bunu 120 olarak belirleyelim. Çünkü soruda bize karakter sayısının 100'den biraz fazla olacağını söylüyor. Ardından 3 verimizi de tanımlayalım. Bunları da sırayla scanf() fonksiyonu yardımıyla input alalım. scanf("\n") kullanmamızın sebebi, string ifadeden sonra bırakılacak olan satır başını görmezden gelmemiz. En sonunda da printf() yardımıyla hepsini alt alta yazdıralım.

#include <stdio.h>
#define MAX_LEN 120

int main() 
{
    char ch;
    char s[MAX_LEN];
    char sen[MAX_LEN];
    scanf("%c",&ch);
    scanf("%s",&s);
    scanf("\n");
    scanf("%[^\n]%*c", sen);
    printf("%c\n%s\n%s",ch,s,sen);
       
    return 0;
}

3. Sum and Difference of Two Numbers


    Bu soruda 2 tane integer(tam sayı) ve 2 tane de float(ondalıklı sayı) olmak üzere 4 değişken tanımlamalıyız. Sonrasında ise bunları input olarak ikişerli almalıyız. Önce integer değerleri ve sonra float değerleri. Ardından soruda bizden asıl istenen şey, önce integer değerlerin toplamını ve farkını yazdırmak, ardından float değerlerin toplamını ve farkını yazdırmak. Fakat float değerlerin toplam ve farkının noktadan sonra 1 basamak olacak şekilde yazdırılması gerekiyor. Bunu da "%.1f" ile sağlıyoruz.

#include <stdio.h>

int main()
{
    int a, b;
    float c, d;
    
    scanf("%d %d",&a,&b);
    scanf("%f %f",&c,&d);
    printf("%d %d\n",a+b,a-b);
    printf("%.1f %.1f",c+d,c-d);
    
    return 0;
}

4. Functions in C

    Sorunun linki: https://www.hackerrank.com/challenges/functions-in-c/problem?isFullScreen=true

    Bu soruda max_of_four() fonksiyonu içerisinde 4 sayıyı kıyaslamamızı istiyor. Sonuç olarak da en büyük sayıyı döndürmeliyiz. Öncellikle biggest adında bir değişken tanımlayalım. İlk 2 sayının yani a ve b'nin kıyasından büyük olanı bu değişkenin içine atalım. Sonra da diğer iki sayıyı da biggest değişkeni ile yani a ve b'den büyük olanla kıyaslarsak en büyük olanı bulabiliriz.
#include <stdio.h>

int max_of_four(int a,int b,int c,int d){
    int biggest;
    if(a>b){
        biggest = a;
    }
    else{
        biggest = b;
    }
    if(biggest<c){
        biggest = c;
    }
    if (biggest<d) {
        biggest = d;
    }
    return biggest;
}

int main() {
    int a, b, c, d;
    scanf("%d %d %d %d", &a, &b, &c, &d);
    int ans = max_of_four(a, b, c, d);
    printf("%d", ans);
    
    return 0;
}

5. Pointers in C


    Pointer'lar (Gösterici) C dilinde önemli bir yere sahiptir. Kısaca anlatmak gerekirse bir pointer, değişkenin bellekteki adresi ve değeri gibi değerleri tutar. "&" işareti değişkenin adresini verirken, "*" işareti ise değişkenin değerini verir. Bu soruda kullanıcıdan alınan a ve b değişkenlerinin adresleri *pa ve *pb pointerları ile gösterilmiş. Bizden de update() fonksiyonun içerisinde, bu pointerların tuttuğu adreslerdeki değerlerin toplamını ve farkını bulmamız isteniyor. Fakat dikkat etmemiz gereken noktalar birisi farkın mutlak değer olması, yani büyükten küçüğü çıkarmalıyız.
#include <stdio.h>

void update(int *a,int *b) {
    int sum = *a + *b;
    int dif;
    if(*a>*b){
        dif = *a - *b;
    }
    else{
        dif = *b - *a;
    }
    *a = sum;
    *b = dif;
}

int main() {
    int a, b;
    int *pa = &a, *pb = &b;
    
    scanf("%d %d", &a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);

    return 0;
}
    Bu soruyla da birlikte Hackerrank C Introduciton sorularını bitirmiş olduk. C programlama diline giriş için gayet öğretici sorular ve çözümle olduğunu düşünüyorum. Umarım işinize yaramıştır ve bir şeyler katabilmişimdir.

1 yorum:

Pages