Tuesday, January 12, 2016

(ENG/TR) Algorithm to find prime number (Prime number bulmak için algoritma)

ENGLISH

Question: Find if inputted number(n) is prime or not.

ANSWER

First of all, we should think that how we find prime numbers in real life. We take a number(ex. 11), and try to find its dividers except 1(if there is). 
In example of 11, first we look 2. "11%2" not equals 0. So continue with 3. "11%3" not equals 0... We continue like that until the end(which is 11%5). As you see, our last element which will be checked is half of given number. Because we can not find integer multiplier for integer greater than half of number. So if we check these conditions, we can find if this number is prime or not.

You can update this algorithm like that: check 2 in anywhere else, then start from 3, increase value by 2. It may increase performance a little bit; but we accept that for large numbers, these two algorithms have same complexity.

TÜRKÇE

Soru: Girilen sayının(n) asal olup olmadığını bulunuz.

CEVAP

İlk olarak, gerçek hayatta bir sayının asal olup olmadığını nasıl anladığımızı düşünmeliyiz. Bir sayı alıyoruz(örn. 11), ve o'nun 1 dışındaki bölenlerini bulmaya çalışıyoruz(eğer varsa).
11 örneğinde, ilk olarak 2'ye bakarız. "11%2", 0'a eşit değildir. Dolayısıyla 3 ile devam ederiz. "11%3", 0'a eşit değildir... Bu şekilde devam ederiz sona kadar(yani 11%5) devam ederiz. Gördüğünüz üzere, kontrol edilecek son eleman, sayımızın yarısıdır. Çünkü sayımızın yarısından büyük tam sayılar için, tam sayı olan bir çarpan bulamayız. Bundan dolayı bu durumları kontrol edersek, bu sayının asal sayı olup olmadığını bulabiliriz.

Bu algoritmayı şu şekilde güncelleyebilirsiniz: 2'yi başka bir yerde kontrol edin, Sonra 3'ten başlayıp, değeri 2 arttırın. Bu, performansı birazcık arttırabilir; ama biz her iki algoritma içinde, çok büyük sayılar için, bu algoritmaların aynı karmaşıklığa sahip olduğunu kabul ederiz.

(C Language) (ENG/TR) Dynamic memory allocation (Dinamik hafıza tahsis etme)

ENGLISH

Actually, C language does not provide us a function for this work. However, there are functions in "stdlib.h" library about this.

malloc(), calloc(): These functions allocate space about determined size(n) for you, and return pointer. In other words, it returns an address. We can make steps for this purpose:
1)Initialize a pointer: int *ptr;
2)Get an integer n from user(or determine yourself)
3)Allocate determined memory space for pointer: ptr = (double*)malloc(n*sizeof(double));
Let's read this function from left to right: "We have double pointer. Allocate 'n times double' size for it."
After this, we can use this pointer as array! Like: ptr[0], ptr[1], ..., ptr[n - 1]
3)If we write this part again with calloc(): ptr = (double*)calloc(n,sizeof(double));
Let's read this function: "We have double type pointer. Allocate 'n times double' size for it."
Logic is the same actually. Only basic different is: 
malloc(): allocates memory about determined byte. 
calloc(): allocates determined size for array.
However, in both types, we can use this pointer as array like: ptr[0], ptr[1], ..., ptr[n - 1]
And we can write which type we want instead of double's;


When our work is done with this memory, then we should "free" this memory with free(name of pointer) function to improve performance. Because we don't want to carry "useless" weight anymore. 
Example: free(ptr);

However, we may want to change the size of pointer. That is why we use "dynamic memory allocation". The function we have to use is realloc(). I think it is relevant to "reallocation".
 ptr = realloc(ptr, new size); is the example of usage. You can write the new size as integer.




Aslında C dili bize bu iş için bir fonksiyon sunmuyor. Ama "stdlib.h" kütüphanesinde bununla ilgili fonksiyonlar mevcut.

malloc(), calloc(): bu fonksiyonlar sizin için belirli bir büyüklük(n) kadar yer ayırır ve pointer olarak return eder. Yani döndürdüğü değer bir adrestir. Kullanımını şu şekilde adımlara sokabiliriz:
1)Bir pointer initialize edin: double *ptr;
2)Kullanıcıdan bir integer(tam sayı) n değeri alın(veya siz verin)
3)Pointer'a istediğiniz büyüklükte bir bellek alanı ayırın: ptr = (double*)malloc(n*sizeof(double));

Bu fonksiyonu soldan sağa okursak: "double bir pointer'ımız var. Buna n tane double'lık yer ayır." anlamına gelir. Aslında basit bir İngilizce bilgisiyle kolayca anlaşılabilir bir yapıya sahip. Bunu tanımladıktan sonra pointer'ımızı bir array olarak kullanabiliriz: örnek: ptr[0], ptr[1], ..., ptr[n - 1]

3)Bu kısmı calloc() ile yazarsak: ptr = (double*)calloc(n,sizeof(double));

Bu fonksiyonu okuyalım: "double tipinde bir pointer'ımız var. Bu pointer'a n tane double'lık yer ayır." Mantık aynı aslında. Sadece temelindeki fark: 
malloc() kullanırken istenilen byte kadar yer ayırırız.
calloc() kullanırken array için istenilen kadar yer ayırırız. 
Ama iki türlü de ptr'mizi array olarak kullanabiliriz. 
ptr[0], ptr[1], ..., ptr[n - 1]

Ve double'lar yerlerine istediğimiz type'ı yazabiliriz.

Bu array ile işimiz bittikten sonra, performans için, hafızamızda bize yük olmasını istemeyiz. Bu yüzden hafızayı "serbest" bırakırız. Bu terim gerekli fonksiyonun özellikle aklınızda kalmasını sağlayabilir:
 free(ptr); .Yani free(pointer ismi) yazıp hafızamızı serbest bırakıyoruz.


Ama hafızamızı değiştirmek isteyebiliriz. Aslında dinamik hafızayı kullanmamızın nedeni de budur. Kullanmanız gereken fonksiyon realloc() tur. Yani ingilizce "reallocation" (yeniden tahsis) kelimesiyle alakalıdır sanıyorum. 
ptr = realloc(ptr, yeni alan); 
bu kullanımın bir örneğidir. "yeni alan" yerine girmek istediğiniz yeni alanı yazabilirsiniz.

(ENG/TR) Algorithm to find digits of number (Sayının numaralarını bulmak için algoritma)

ENGLISH

How to find digits of N-digit number. It means we don't know how many digits does number have.

Ex.
N = 6
Number = 153756

ANSWER

First way:

Actually, first of all, we have to think that how we find number of digits of number in real life?
-When we read the number, actually we simplify this number. For example: 1324. How we read it? 
-One thousand three hundred twenty four.
-Actually we split number into digits. Then, second question: How we split it in programming world?
-Dividing by 10! Yes, every time we divide this number, we lose last digit. And when we finally lost last digit(which is 1 for 1324) we will have 0.
-So if we copy this number to another variable(so that we won't lose it while dividing), then count how many times we divide this number to get zero; we can find the number of digits.
-Now we have number of digits N! What we do is get the modulus 10 of number (to find last digit because when we divide number with 10 and look remainder, we see last digit of number) and save it to array, then divide ten, N times.

Second way(more efficient):

You can find digits of number while dividing 10. Up to get zero, take last digit and divide number with 10. It is more simple and complicated way.

TÜRKÇE

Birinci yol:

Aslında burada sizden istenen, girilen bir sayının kaç basamaklı olduğunu bulmanızdır. Örnek verelim: 10562. Bu sayının 5 basamaklı olduğunu anlamak için aslına bakarsanız basamaklarına ayırıyoruz. "on bin beş yüz altmış iki" diye okuyunca 5 basamaklı olduğunu anlıyoruz. O zaman bu sayıyı programlama dilinde de basamaklarına ayırmalıyız. Aslında bu işlemin nasıl yapıldığını biliyorsunuz: Sürekli 10'a bölerek. Ta ki 0 kalana kadar. O zaman yapmamız gereken bir "counter" la bu işlemi kaç kere yaptığımızı saymak.
Tabii ki bölmeden önce sayımızı farklı bir variable'a atayalım ki o sayımızı kaybetmeyelim.
Daha sonra sayımızın son rakamını bulup, bunu bir array'e atayıp ardından tekrar 10 a bölüp tekrar son rakamı bulabiliriz. Son rakamı bulmak için 10'a bölüp kalana bakarız. Bu da mod 10 demektir. Yani ilk önce mod 10'unu alıp sonra 10'a böleriz. Bu işlemi de basamak sayısı kadar tekrarlarız.

İkinci yol(daha etkili):

Daha etkili bir yol olarak 0 elde edene kadar 10'a bölüp her böldüğünüzde son basamağı bulabilirsiniz. Bu daha etkili ve daha basit bir yöntem olur.

(C Language) (ENG/TR) Correct Mistakes In The Code 1 (Koddaki hataları düzeltiniz 1)

void main()
{
  int x,y;
  char *secim;
  float sonuc;
  printf("iki Sayi Giriniz=");
  scanf("%d %d",&x,&y);
  printf("Seciminiz=");
  scanf("%s",&secim);
  switch (secim)
  {
    case '+':sonuc=x+y;break;
    case '-':sonuc=x-y;break;
    case '/':sonuc=x/y;break;
    case '*':sonuc=x*y;break;
    default :
      printf("Yanlis islem");break;
  }
printf("Sonuc = %f\n",sonuc);
getch();
}

Resource/Kaynak: http://www.frmtr.com/c-ve-c-/6767426-c-ve-c-da-char-sorunu.html#post61080352

Question Owner/Soru Sahibi: hemdehtml

ENGLISH

When you try to create string of characters (like char *secim), this string -if you don't initialize with values- it's last element
-which is our only element- will be null.

"char *secim;" actually means "char *secim = {'\0'}". When you try to assign new value in this pointer, you are trying to resize it which can not be possiblw. Because we should always have null value at the end of string.

You can improve your code by initializing x and y as floats. Because if our result is float, then we lost data because of int initialization. Because at the end if our result is 10/7 = 1,..., the result will be 1 because inputs are integer.

The full code is below.

TÜRKÇE

Bir karakter dizisi yaratmaya çalıştığınızda (char *secim gibi), bu dizi -initialize durumunda bir değer atamazsanız şayet- son elemanını (yani bizim var olan tek yerimizi) "null" karakteriyle dolduruyor. Somutlaştırırsak:

"char *secim;" demek aslında "char *secim = {'\0'};" demekle aynı şeydir. Ve siz yaptığınız işlemde bu "null" karakterinin yerine başka bir karakter atamaya çalışıyorsunuz. Yani "secim[1]" i "secim[2]" yapmaya çalışıyorsunuz. Çünkü bildiğimiz üzere her dizinin son elemanı "null" yani '\0' olmak zorundadır.

Sorununuzu "char secim[2];" yazarak basitçe çözebilirsiniz.

siz bir pointer tanımladınız. pointerlar yanına yıldız koymazsanız adresi tanımlarlar. O yüzden switch içerisindeki "secim" in solunda yıldız olmalı. ve sadece "secim" yazarsak bir adresi belirteceği için, scanf fonksiyonunun içinde "secim" in yanına "address-of" operatörünü koymamalıyız.

kodunuzu iyileştirmek için integer olarak tanımladığınız x ve y 'yi float olarak tanımlayabilirsiniz. Çünkü int karakterlerle işlem yaparken küsürlü bir sonuç elde ederseniz, bu sonucun sadece tam kısmı tutulur. Dolayısıyla bu kısmı float'a aktarırken veri kaybı yaşarsınız. Örnek olarak 10/7=1,... olması gerekirken, int olarak tanımlamanızdan dolayı sonucu 1 olarak çıktıda görürsünüz.

Kodun tamamını aşağıda bulabilirsiniz.

CODE/KOD


void main()
{
  float x, y;
  char secim[2];
  float sonuc;
  printf("iki Sayi Giriniz=");
  scanf("%d %d", &x, &y);
  printf("Seciminiz=");
  scanf("%s", secim);
  switch (*secim)
  {
    case '+':sonuc = x + y; break;
    case '-':sonuc = x - y; break;
    case '/':sonuc = x / y; break;
    case '*':sonuc = x*y; break;
    default:
      printf("Yanlis islem"); break;
  }
printf("Sonuc = %f\n", sonuc);
getchar();
}

(ENG/TR) Algorithm to Sort Given Names (Verilen isimleri sıralamak için algoritma)

ENGLISH

You have to sort given names with selection sort algorithm.

Resource: http://www.frmtr.com/c-ve-c-/6765984-dizilerde-siralama-algoritmalari.html#post61077366

Question Owner: desera53



TÜRKÇE

Verilen isimleri "seçerek sıralama" algoritmasını kullanarak sıralayınız.

Kaynak: http://www.frmtr.com/c-ve-c-/6765984-dizilerde-siralama-algoritmalari.html#post61077366

Soru Sahibi: desera53

(C Language) (ENG/TR) Increment-Detriment (Kar-Zarar)

ENGLISH


You win X TL from lottery and deposit to bank. This person can get 150% of X as loan from bank.
This person get some money(Y) from bank before get loan. Then get loan, after that, get all of his/her money from bank.
This person should pay loan to the bank with 15% interest. Draw flow diagram of this operations which also computes person's increment or detriment.
And write C program of these operations.

Resource: http://www.frmtr.com/c-ve-c-/6761814-zarar-hesaplayan-algoritma.html#post61077115
Question Owner: babayara123

ANSWER



TÜRKÇE

"X TL piyango çıkan bir kişi bu parayı bir hesaba yatırmıştır. Hesap
açılışından sonra hesabında X TL bulunan bu kişinin çekebileceği kredi ise
hesabındaki paranın %150’sidir. Kredi çekmeden önce bir miktar para (Y) çeken
hesap sahibi kendi hak ettiği kredinin tamamını ve kendi hesabındaki parayı
çekecektir. Bir müddet sonra hesap sahibi çektiği krediyi %15 faizi ile birlikte
bankaya ödeyecektir. Bu hesap sahibinin varsa zararını hesaplayan akış
diyagramını çiziniz ve C programını yazınız. ( X ve Y klavyeden girilecektir X>Y)"

Kaynak: http://www.frmtr.com/c-ve-c-/6761814-zarar-hesaplayan-algoritma.html#post61077115
Soru Sahibi: babayara123