Ben yine ornek vermek istedim.
Is yerinde benden soyle bir sey yapmami istediler.
"Relative unit" diye bir sey varmis. "arctan(1.0 / x)" Formulu ile hesaplaniyormus. Bana bir tablo verdiler 100, 50,33.3, 20, 10...(En asagida kodda tablonun geri kismi var. ) gibi
bunlara denk gelen relative unitleri veren bir kod yazmami istediler. Fakat 70 gelirsede 50 degerine yakinsasin istiyorlar. Yani tabloda olmayan bir deger verdiklerinde bir onceki degere yakinsasin. 70 icin bile arctan(1/50) calissin.
Asagidaki kodda bizim icin onemli kisimlar:
void RelativeUnitMap::print( double val )
{
std::cout << " upperbound: " << relativeValsConstantMap.upper_bound(val)->first;
std::cout << " lowerbound: " << relativeValsConstantMap.lower_bound(val)->first;
}
int main()
{
RelativeUnitMap test;
test.print(50);
// upperbound: 100 lowerbound: 50 yazdiriyor
test.print(75);
// upperbound: 100 lowerbound: 100 yazdiriyor
}
Dikkatini cektiyse tablodaki tam deger ile cagirdigimda upperbound 100 donmus lowerbound ise 50. Yani bir tane olsa bile upper_bound bir sonrakine goturebiliyor.
Ben suna benzer bir fonksiyon kullandim :
void RelativeUnitMap::taKendisiYadaBirOnceki( double val )
{
std::cout << " upperbound: " << (--relativeValsConstantMap.upper_bound(val))->first;
}
Ve istenilen sonuc:
int main()
{
RelativeUnitMap test;
test.taKendisiYadaBirOnceki(75); // 50
test.taKendisiYadaBirOnceki(50); // 50
test.taKendisiYadaBirOnceki(125); // 100
test.taKendisiYadaBirOnceki(25); // 20
}
Kodun projeden kismen alip online derleyicede derledigim bir kismi :
#include <iostream>
#include <string>
#include <iomanip>
#include <map>
#include <cmath>
class RelativeUnitMap
{
public:
RelativeUnitMap();
void print(double val);
private:
void InitConstantMap();
std::map<double, double> relativeValsConstantMap;
};
void RelativeUnitMap::InitConstantMap()
{
const double tempArray[] = {std::numeric_limits<double>::max(), 100,50,33.3,20,10,9.5,9,8.5,8,7.5,7,6.5,6,5.5,5,4.5,4,3.5,3,2.5,2,1.5,1,0.9,0.8,0.7,0.6,0.5,
0.4,0.3,0.2};
//Bizim kodda C++11 olmadigi icin uniform initilization kullanamiyoruz.
for ( size_t i = 0; i < sizeof(tempArray)/sizeof(double); i++ )
{
relativeValsConstantMap.insert( std::make_pair(tempArray[i], atan(1.0 / tempArray[i]) ) );
}
}
RelativeUnitMap::RelativeUnitMap()
{
InitConstantMap();
}
void RelativeUnitMap::print( double val )
{
std::cout << " upperbound: " << relativeValsConstantMap.upper_bound(val)->first;
std::cout << " lowerbound: " << relativeValsConstantMap.lower_bound(val)->first;
}
int main()
{
RelativeUnitMap test;
test.print(50);
}
Ben sorulari cevaplarken bir suru sey ogreniyorum. Ve zaten bende cok soru soruyorum. Cevaplar faydali oluyorsa ne mutlu.
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]