Nerde yanlış yapıyorum

Kodla Büyü
Mesajlar
27
Kod:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <locale.h>
#include <math.h>
main(void)
{
	setlocale(LC_ALL, "Turkish");
	float s1;
	int s2;
	printf("Ondalıklı Sayı Giriniz= ",s1);
	scanf("%f",&s1);
	int tam = s1;
	int ond = round((s1-tam)*100);
	int kalan,sayac = 0,kare,i;
	printf("Tam Kısım = %d\n",tam);
	printf("Ondalıklı Kısım = %d\n", ond);
	if(tam < ond){
		kalan = ond - tam;
		printf("Kalan Sayı = %d\n",kalan);
	}
	else{
		kalan = tam - ond;
		printf("Kalan Sayı = %d\n",kalan);
	}
	for(i = 1; i < 1000; i++)
	{
		kare = i*i;
		if(kare<=kalan)
		{
		
			sayac=i+1;
		}
	
	}
	printf("Kalan Sayıya En Yakın Sayının Karesi = %d\n",sayac);
	printf("%d Karesi = %d\n", sayac,sayac*sayac);
	
	getch();

}
C++ Ondalıklı girilen sayının Tam ve Ondalıklı Kısmının Farkına En yakın sayının karesini bulan kod. Ama bir yerde yanlış yapıyorum galiba yardım edermisiniz???
 
e son kısımda kalana eşitse yine artırıyor sayacı, sadece < koysan bile belki de en yakın odur ama yine bir sonrakine geçiyor sayaç

mesela kalan 16 ise sayaç 4 ü atlar 5 e geçer
kalan 17 ise de aynı olur 25 bulur
 
1. kalan için if else koymana da gerek yok mutlak değer kullanabilirsin sanırım fabs () fonksiyonu

kodu nasıl düzeltirsin.. şöyle:
1. en son if bloğundaki = silersin
2. yine aynı if bloguna else ekleyip içine break eklemelisin
3. alttaki printf lerden önce

if(fabs((sayac-1)^2-kalan)<fabs(sayac^2-kalan)){sayac=sayac-1;) gibi bi blok eklemelisin yanlış yazmadıysam
kendin dene uğraş biraz da
 
Hocam örnek değerler vererek istediğin sonucu yazar mısınız? Mesela 10.5 girdiğimizde bulmasını istediğiniz sonuç nedir? 6 mı? Bir iki örnek verirseniz daha iyi anlayabiliriz.
 
11,48 Girilince kalan 37 bu sayıya yakın en sayı 36, 36 nın karesi 6
18,60 Girilince kalan 42 bu sayıya en yakın sayı 36, 36 nın karesi 6


Bunun gibi hocam.
 
Telefondan bakıyorum. Deneme şansım yok. Bence döngü içindeki if bloğunu şöyle değiştirmelisiniz.

if (kare>kalan)
{
sayac=i-1;
break;
}
 
Ayrıca bir uyarı. O döngü hata verebilir. Sebebi kare değişkeninin int olması. Sayı yükseldikçe int sınırları dışına çıkacaktır. double olabilir. impetus23 hocamızın dadediği gibi ilk if blokları daha kısa hale getirilebilir. Ancak böyle de çalışır.
 
Bu başlığı görünce evet nerde yanlış yapıyorum.Ah keşke iceriğe baksaymışım.Saçımı başımı yoldum resmen :verymad: Allahtan baktım yorum yazdığıma göre :mrgreen:
 
kemal_ari' Alıntı:
Telefondan bakıyorum. Deneme şansım yok. Bence döngü içindeki if bloğunu şöyle değiştirmelisiniz.

if (kare>kalan)
{
sayac=i-1;
break;
}

13,75 girince kod yanlış çalışıyo kalan 62 yakın olan 64 ün katını değil 49 un karesini buluyor
 
Hocam örnek üzerinde düzeltme yapmışsınız. Aynı yeri aşağıdaki gibi değiştirin.

if (kare>kalan)
{
sayac=i-1;

if (kare-kalan < kalan-(sayac*sayac))
{
sayac=i;
}
break;
}
 
Bence döngüye ihtiyaç yok. Döngü olacaksa da sayac'a gerek yok, i değişkeni de yeterdi. Bence en güzeli aradaki farkın sqrt ile karekökünü alıp round ile yuvarlamak. round en yakın tam sayıya yuvarlıyor zaten. o sayıda cevap olur gibi geldi bana.
 
hyrgul' Alıntı:
Bence döngüye ihtiyaç yok. Döngü olacaksa da sayac'a gerek yok, i değişkeni de yeterdi. Bence en güzeli aradaki farkın sqrt ile karekökünü alıp round ile yuvarlamak. round en yakın tam sayıya yuvarlıyor zaten. o sayıda cevap olur gibi geldi bana.
Evet hocam seninki çok daha mantıklı aslında.
 
Geri
Üst