Necati Ergin Hocamın kendi sayfasında bulunan çalışma sorularını ve cevaplarını burada yanıtlamaya çalıştım. Sorulara buradan ulaşabilirsiniz.
Bir tamsayının tam kare olup olmadığını sınayan is_perfect_square isimli işlevi tanımlayınız:
int is_perfect_square(int val);
|
İşlevimiz kendisine gönderilen tamsayı tam kare ise sıfır dışı bir değere aksi halde 0 değerine geri dönmeli. Bu soruda yazdığınız işlevin doğru olmasının yanı sıra verimliliği de önem taşıyor.
Yanıt:
İlk çözüm olarak aklımıza döngü içinde her adımda yapmak gelebilir. Aslında bu bir çözüm ama verimli bir kod olmuyor, o yüzden geçersiz bir çözüm. Merak edenler için kod aşağıda.
#include <stdio.h> int main() { int i; int num; printf("Enter a number: "); scanf("%d", &num); for(i = 0; i <= num; i++) { if (num == (i * i)) { printf("%d Perfect Square", num); return 0; } } printf("NO !!"); return 0; }
math.h başlık dosyasında olan sqrt() fonk kullanmak çözüm için doğru yol. Bir tam kare sayının karekökü bir tam sayıdır. O zaman bir sayının karekökü tam sayı mı değil mi bilgisine ulaşır isek sorunun çözümüne de ulaşmış olacağı. Bunun için tür dönüşümü özelliğinden faydalanacağı. Sayının karekökünü bir float sayıyı yükleyeceğiz ve ardından bu değeri bir int sayıya atayacağız. Eğer sayının karekökü tam sayı ise float sayıdan int sayıya değer atamada değer kaybı olamayacaktır. Bu sayede sonuca da ulaşmış olacağız. Örnek geçerli çözüm kodu aşağıdadır.
#include <stdio.h> #include <math.h> int main() { float fSqr; int iSqr; int num; printf("Enter a number: "); scanf("%d", &num); fSqr = sqrt(num); iSqr = fSqr; if ((iSqr*iSqr) == num) { printf("%d Perfect Square", num); return 0; } printf("NO !!"); return 0; }
Hiç yorum yok:
Yorum Gönder
Son Ütücü