PDA

Tam Sürümünü Görmek İçin : Sayinin içinde değer arama


utdemir
11/03/2008, 19:55
Arkadaşlar, sayıların tabanlarını dönüştüren bir kod toparlamaya çalışıyorum, ancak string kullanmadan... Bütün kod tamam ama, diyelimki kullanıcı 23734 sayısını girdi ve de 5 tabanında olduğunu söyledi. Programın sayının içerisinde 7 olduğundan dolayı 5 tabanında olamayacağını söylemesini istiyorum, fakat nasıl yapabileceğimi bulamadım... Yardım edebilirseniz sevinirim...

Aradığım tam olarak sayının içinde girilen rakamdan daha büyük bir bir rakam varsa uyarı vermesi...


acehreli
11/03/2008, 21:07
Kullanici sayi degil, karakterler girer. scanf gibi fonksiyonlar da bu karakterleri sayiya donustururler. Senin de amacin girilen karakterleri denetlemek oldugu icin, string kullanmadan yapamazsin. :D

Ali

utdemir
11/03/2008, 22:59
o zaman onca kodu tekrar yazmam gerekecek.. ne bileyim sanki modla basamaklari teker teker çıkarıp sinayabilirmisiz gibi gelmişti.. neyse.. teşekkürler..

FoX_
11/03/2008, 23:24
ne bileyim sanki modla basamaklari teker teker çıkarıp sinayabilirmisiz gibi gelmişti.. neyse.. teşekkürler..

Bu sekilde de yapabilirsin zaten...

acehreli
11/03/2008, 23:31
Ben anlamadim. Nasil yapabilir?

Ali

FoX_
11/03/2008, 23:57
Ben anlamadim. Nasil yapabilir?

Ali

Bir sayinin icinde belli bir rakamin olup olmadigini string islemleri kullanmdan da yapabilir demek istedim...

Once sayinin mod 10 'unu alir, cikan sayi istenen tabanda yer almiyorsa(yani cikan sayi >= istenen taban) uyari verir , istenen tabanda yer aliyorsa sayiyi 10'a boler.Sayiyi 10'a boldukten sonra cikan sayinin tekrar mod 10'unu alir ve boyle devam eder.Butun rakamlar kontrol edilince de donguden cikar.

acehreli
12/03/2008, 01:18
Anladim: taban 10'dan kucuk oldugu icin (ornegin 5), girilen sayiyi 10 tabanindaymis gibi aliyoruz ve once oyle denetliyoruz. Ondan sonra istedigimiz tabana ceviriyoruz.

Ornegin 5 tabaninda girilen sayi 234 ise, aslinda degeri 69 olsa bile (2x25 + 3x5 + 4) biz 234 diye okuyoruz. Ondan sonra 4, 3, ve 2 degerlerini dogru olarak kabul ediyoruz.

Ama program icinde deger olarak yine 69 kullanacagiz tabii...

Ali

Qonyali
12/03/2008, 02:50
...diyelimki kullanıcı 23734 sayısını girdi ve de 5 tabanında olduğunu söyledi. Programın sayının içerisinde 7 olduğundan dolayı 5 tabanında olamayacağını söylemesini istiyorum, fakat nasıl yapabileceğimi bulamadım... Yardım edebilirseniz sevinirim...

girilen sayinin basamaklarini for veya while ile teker teker gidersin ve herseferinde 5 tabani icin mesela < (kücük) mü degilmi diye bakarsin.. bütün basamaklarda bu sorgu evet kücüktür cikarsa demekki girilen sayi söylenilen tabana uyuyor.. aksi taktirde tabana uymuyor..


Aradığım tam olarak sayının içinde girilen rakamdan daha büyük bir bir rakam varsa uyarı vermesi....

döngüden sonra istedigin sonuc cikiyorsa uygun, cikmiyorsa uygun degil diyede ekrana yazdirirsin :)

Kolay gelsin

-aga-
12/03/2008, 08:50
Ama 10'dan büyük tabanları sayılarla ifade edemeyiz. En doğrusu bu programı karakterleri kullanarak yapmak. Çevirme işlemi sırasında geçersiz bir karakterle karşılaşılırsa mesajı yazdırıp, return ile fonksiyondan çıkarsın.

Sedosa
12/03/2008, 13:27
Bence de stringsiz yazamazsın. String le çok daha basit olur.

İlk önce int tipinde girdiğin sayıyı stringe çevir.

Karakter kontrol ettirme işlemi için bool tipinde method kullan.

acehreli
12/03/2008, 15:35
Sedosa, string'siz de yazilabilecegi gosterildi ya... Nasil string'siz yazamaz?

Ali

utdemir
12/03/2008, 15:55
Arkadaşlar çok teşekkürler.. Çok işime yaradı söyledikleriniz.. While dongusuyle basamaklari teker teker denetleyerek çözmeyi planlıyorum, evet string ile daha kolay olur ama şu anda benim için while döngüsü daha uygun.. Şu ana kadar gördüğüm en iyi türkçe programlama forumu burası.. Daha yeni yeni öğreniyorum ve de çok yardımci oluyor burası.. Fikirleriniz için sağolun..

utdemir
12/03/2008, 19:02
Önerileriniz ile aşağıdaki gibi bir kod yazdım ama, ne olursa olsun takılıyor bu koda, sürekli olamaz diyor... Hatasını da bulamadım... Sorun nerede?

i=onkuvvet=1;
for(i=1; (sayi>onkuvvet) ;i++)
{
onkuvvet=(UsHesapla(10,i));

if( ((sayi%onkuvvet)/i) >= taban1 )
{
cout<<sayi<<" sayisi "<<taban1<<" tabaninda bir sayi olamaz. Lutfen sayilari dogru girin..."<<endl<<endl;
goto tabanaritmetigi;
}
}

quasimodo
12/03/2008, 19:17
Kodun tamamini gorebilirmiyiz

utdemir
12/03/2008, 19:33
Kodun tamamı çok uzun, zaten switch çoğu, alakasız kısımları atıp koyuyorum tekrar buraya..

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <conio.h>

#define PI 3.14159265

long fakt(int s)
{
int z;
long fakt1;
fakt1=1;
for(z=1;z<=s;z++)
fakt1*=z;
return fakt1;
}

double UsHesapla(double taban, int us)
{
double sonuc = 1;
double katli_us = taban;

while (us>0) //döngü adedi = ( log(us)/log(2) ) + 1;
{
if ( (us & 1)==1 ) //en sağdaki bit 1 ise.
sonuc = sonuc * katli_us;

us = us/2; // ikiye bölünce 1 bit sağa kayar. (us=us>>1)
if (us==0) break;

katli_us *=katli_us;
}

return sonuc;
}

using namespace std;

int main(int argc, char *argv[])
{
cout<<endl;

programbasi:

char islem;
long double topla=0;
long double toplam=0;
long double cikar=0;
long double fark=0;
long double carpim;
long double carp;
long double bolen;
long double bolunen;
long double bolum;
long double taban;
long double us;
long double kuvvet;
long faktoriyel;
long x;
long fsonuc=1;
long xi;
long girdii;
bool asalliki=1;
long wbaslangic;
long wbitis;
long wson;
long wx;
long wy;
bool wasallik=1;
long wilk;
char wdevam;
char istek;
long double aci;
long double sinus;
long double kosinus;
long double tanjant;
long double kokgiris;
long double kok;
char kokcevap;
bool kokbool=1;
long perm1;
long perm2;
long permutasyon;
long kombinasyon;
long t=2;
long ebob1;
long ebob2;
long kucukebob;
long buyukebob;
char cikisistek;
char bilinmeyenkenar;
long double kenara;
long double kenarb;
long double kenarc;
int taban1, taban2, r1, r2;
long sayi;
long onkuvvet,i;



cout<<"islemler: "<<endl<<endl;
cout<<"t = topla - c = cikar"<<endl;
cout<<"x = carp - b = bol"<<endl;
cout<<"u = us al - k = kok al"<<endl;
cout<<"f = faktoriyel - m = mod al "<<endl;
cout<<"a = asallik deneme (bolen bulma) - w = asal ara"<<endl;
cout<<"q = sinus / kosinus/ tanjant - p = permutasyon / kombinasyon"<<endl;
cout<<"o = ebob / ekok - g = pisagor bagintisi "<<endl;
cout<<"s = matematiksel sabitler - r = taban aritmetigi"<<endl;
cout<<" 0 = cikis"<<endl;

cout<<endl<<"Seciminizi giriniz:"<<endl<<"--> ";
islem=getch();

switch(islem)
{
case 'R':
case 'r':
{
system("CLS");
cout<<"Taban Aritmetigi Modu"<<endl<<endl;
tabanaritmetigi:
cout<<"Sayiyi girin:"<<endl<<"--> ";
cin>>sayi;
while(sayi<0)
{
cout<<"Sayi negatif olamaz, lutfen pozitif bir sayi girin"<<endl<<"--> ";
cin>>sayi;
}

cout<<"Girdiginiz sayinin tabanini girin:"<<endl<<"--> ";
cin>>taban1;

while( (taban1<2) || (taban1>10) )
{
cout<<"Lutfen 2-10 arasinda bir taban giriniz: "<<endl<<"--> ";
cin>>taban1;
}

//baslangic - sayi tabana uygun mu
/*
i=onkuvvet=1;
for(i=1; (sayi>onkuvvet) ;i++)
{
onkuvvet=(UsHesapla(10,i));

if( ((sayi%onkuvvet)/i) >= taban1 )
{
cout<<sayi<<" sayisi "<<taban1<<" tabaninda bir sayi olamaz. Lutfen sayilari dogru girin..."<<endl<<endl;
goto tabanaritmetigi;
}
}
*/
// bitis - sayi tabana uygun mu


cout<<"Cevirmek istediginiz tabani girin:"<<endl<<"--> ";
cin>>taban2;

while( (taban2<2) || (taban2>10) )
{
cout<<"Lutfen 2-10 arasinda bir taban giriniz: "<<endl<<"--> ";
cin>>taban2;
}

r1 = i = 0;

while (sayi != 0)
{
r1 += (sayi % 10) * (int) pow (taban1, i);

sayi /= 10;

i ++;
}

i = 0;

while (r1 > pow (taban2, i)) i++;

cout<<"Yeni sayi: ";


while (i > 0)
{
r2 = r1 / (int) pow (taban2, i - 1);

r1 -= r2 * (int) pow (taban2, i - 1);

cout<<r2;

i --;

}

break;
}




}//switch sonu

cout<<endl<<endl;
system("PAUSE");
return EXIT_SUCCESS;
}

-aga-
13/03/2008, 09:53
utdemir, kodunu tam anlayamadım, ama for döngüsü sanırım istediğimiz sonucu vermez. Şunu bir dene.
İlk whilede sayıyı on tabanına çeviriyoruz.
İkincide yeni tabana.

//sayı1=Girilen sayı
//taban1=Sayının tabanı
//taban2=Çevrilecek taban
//el=Sonuç

int el=sayi1,kuvvet=1,onluk=0;
while (el>0)
{
onluk+=kuvvet*(el%10);
el/=10;
kuvvet*=taban1;
}
el=0;
kuvvet=1;
while(onluk>0)
{
el+=(onluk%taban2)*kuvvet;
kuvvet*=10;
onluk/=taban2;
}
cout <<"Sonuç : "<<el;

Matematiğim iyi, c bilgim kötü. İnşaallah doğru çalışır.

-aga-
13/03/2008, 11:29
Tamam anladım sayıları kontrol ediyorsun. Şöyle olabilir.:)

do
{
cout <<"Sayiyi girin";
cin >>sayi;
int el=sayi;
while (el>0 && sayi>0)
{
if (el%10>=taban1)
{
cout<<"Lütfen doğru bir sayı girin.";
sayi=0;
}
else
el/=10;
}
}while (sayi=0);

pipopim
13/03/2008, 13:42
sanki ödeve benziyor herkez kodu koymus ama :)

-aga-
13/03/2008, 13:52
Arkadaş, armut piş ağzıma düş demedi ki.
İsminede aşinayız(En azından ben).
Yazdığımda beş para etmez birşey(4 işlem):)
Ödev diye de hiç düşünmedim. :)

utdemir
13/03/2008, 18:43
İstediğim kodun ödevle hiçbir alakası yok...
Lise 1'de okuyorum, bilgisayar dersimiz bile yok.. :D
Matematikte hoca taban aritmetiğini gösterdi de, belki ödevlerde felan yardımcı olur diye uğraşıyorum.. Tek ilgisi bu ödevle..

-aga- nın çözümünü deniyorum şimdi, sorun çıkarsa söylerim...

Hepinize cevaplarınız için teşekkürler...