Zawsze używałem iostream ale tutaj mi kompilator to załączył i się pomieszało(wcześniej używałem devc++ ale mniejsza z tym). To ma wypisywać logarytm o podstawie 2 z podanej liczby.
#include "StdAfx.h"
#include "math.h"
int main()
{
long long int a;
do
{
scanf ("%a");
a = log10(a);
printf("%a", a/log10(2));
} while (scanf("%d") == 1);
return 0;
}
No to printf raz, że przyjmuje string formatujący jako pierwszy, to raz, a dwa “long double log(2)” to nie jest poprawna konstrukcja C++.
Albo użyć IO z C++, czyli std::cout << log(2); albo jeśli chcesz printf to printf("%f", log(2));. No i powtórzę się, raczej niezalecane jest mieszanie iostream z cstdio.
#include "StdAfx.h"
#include "math.h"
int main()
{
long long int a;
do
{
scanf ("%a");
a = log10(a);
printf("%f", a/log10(2));
} while (scanf("%d") == 1);
return 0;
}
Teraz wyskakuje:
1>------ Build started: Project: a, Configuration: Debug Win32 ------
1> a.cpp
1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(10): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> d:\microsoft visual studio 10.0\vc\include\stdio.h(304) : see declaration of 'scanf'
1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(11): error C2668: 'log10' : ambiguous call to overloaded function
1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'
1> while trying to match the argument list '(__int64)'
1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(12): error C2668: 'log10' : ambiguous call to overloaded function
1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'
1> while trying to match the argument list '(int)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Zupełnie niepoprawnie używasz scanf - nie podajesz żadnych adresów pod które ma wczytać dane plus nie ma określonego specyfikatora %a. Może użyj iostream, jeśli cstdio jest zbyt trudne dla Ciebie?
Nie ma co być złośliwym, naprawdę. Denerwuje mnie to, że wiem co mam zrobić a wyskakują mi jakieś dziwne błędy i potem zaczynam przez to popełniać kolejne. Dlaczego? Bo kod wygląda mi na poprawny więc zaczynam gmerać w nim losowo(w tym wypadku w printf i scanf) i wychodzą z tego potworki. Fakt, powinienem wkleić tu wersję pierwotną, mea culpa.
#include "StdAfx.h"
#include "math.h"
int main()
{
long long int a;
do
{
scanf ("%a", a);
a = log10(a);
printf("%f", a/log10(2));
} while (scanf("%d") == 1);
return 0;
}
Teraz już dobrze? Możemy przejść do właściwej części tam gdzie wyskakuje błąd?
Scanf przyjmuje adresy na zmienne, a więc &a. Long long nie występuje w C++, to rozszerzenie poza standardem. Specyfikator dla long long, przynajmniej w g++, to %Ld.
Robisz dwa odczyty, nie wiem czy to to czego chcesz, ale raczej nie. Raczej zapisuj wynik scanf i potem sprawdzaj go w warunku pętli.
Co do błędu, który dostałeś, to myślę że jasno wyjaśnia co jest nie tak - wywołujesz funkcję przeładowaną i kompilator nie wie którą wybrać (choć na g++ nie dostaję tego błędu). Podejrzewam, że wystarczy napisać literał odpowiedniego typu, czyli nie 2, a 2.0
Aha, no i wszystkie te funkcje powinny być w przestrzeni nazw std.
Wprowadziłem poprawki i pozostaje ten sam błąd co na początku.
using namespace std;
#include "StdAfx.h"
#include
#include
int main()
{
long int a;
while (scanf("%Ld", &a) == 1)
{
a = log10(a);
printf("%Ld", a/log10(2.0));
}
return 0;
}
1>------ Build started: Project: a, Configuration: Debug Win32 ------
1> a.cpp
1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(10): warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
1> d:\microsoft visual studio 10.0\vc\include\stdio.h(304) : see declaration of 'scanf'
1>d:\adam\moje dokumenty\visual studio 2010\projects\program\a\a.cpp(12): error C2668: 'log10' : ambiguous call to overloaded function
1> d:\microsoft visual studio 10.0\vc\include\math.h(577): could be 'long double log10(long double)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(529): or 'float log10(float)'
1> d:\microsoft visual studio 10.0\vc\include\math.h(121): or 'double log10(double)'
1> while trying to match the argument list '(long)'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Problemem w tym przypadku jest “ambiguous call to overloaded function”. Twoje odwołanie do funkcji log10 usiłuje wywołać ją dla argumentu long int, ale taka funkcja nie istnieje w math.h (nie istnieje przeciążenie tej funkcji dla argumentu całkowitego) - zatem nastąpi konwersja do najlepszego dopasowania, ale kompilator nie jest w stanie sam zdecydować które jest najlepsze (niejednoznaczność/ambiguous) - musisz jawnie rzutować argument np. na double:
log10( (double) a);
przy każdym wywołaniu tej funkcji lub po prostu zamiast long long int a zastosować double a.