Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Dnia 17.01.2011 o 00:58, Sigu napisał:

Mam nadzieję, że to dobry temat na moje pytanie ^^
A mianowicie:
Czy możecie polecić mi jakiś dobry kompilator C++? Przy Microsoft Visual Studio 2010
Express wymiękłem po kilku godzinach obczajania jak mam skompilować prosty program -.-''

Cóż, kilka wskazówek do VS.

Po pierwsze - aby cokolwiek skompilować, musisz stworzyć projekt i do niego dodawać pliki. File->New Project->Visual C++->Empty Project (najlepiej, bo inaczej lubi dodać pełno śmiecia, którego prawdopodobnie nie potrzebujesz). Potem dodajesz plik cpp i tam wrzucasz swój kod. Potem Build->Build Solution. Albo Debug->Start Without Debugging, żeby go odpalić i ewentualnie skompilować.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

C++
Mam do was taką sprawę. Potrzebuję komendy pozwalającej mi zapętlić program, powodującej wyłącznie programu po wpisaniu "0" oraz kasującej zawartość monitora. Mógłby mi ktoś pomóc?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 24.01.2011 o 23:30, Sigu napisał:

C++
Mam do was taką sprawę. Potrzebuję komendy pozwalającej mi zapętlić program, powodującej
wyłącznie programu po wpisaniu "0" oraz kasującej zawartość monitora. Mógłby mi ktoś
pomóc?


znak = ''\0'';
while(znak != ''0'')
{
while(!kbhit()) sleep(100);
znak = getch();
}
clearScreen();
exit(0);

Funkcję sleep musisz sam napisać lub użyć jakiejś konkretnej.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam pytanko: mamy zbudować program, który z tablicy wyszukuje największą i najmniejszą wartość:
int max,min,tab[100];
max=tab[0];
min=tab[0];
for(int i=1;i<100;i++)
{
if(tab>max)max=tab;
if(tab<min)min=tab;
}
Z tym, że ma być to rekurencyjnie.
Ma ktoś jakiś pomysł?
Oczywiście tablica nie posortowana ( :) )



Wiem, że ma to odbywać się na podstawie porównywania dwóch sąsiednich komórek, a potem poprzestawiania liczb itd itd.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 18.02.2011 o 13:43, Jackal-pl napisał:

Z tym, że ma być to rekurencyjnie.
Ma ktoś jakiś pomysł?
Oczywiście tablica nie posortowana ( :) )

Jesteś pewien że ta tablica ma być przy okazji posortowana? tylko wtedy rekurencja miała by jakieś znamiona sensu.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 18.02.2011 o 15:46, Jackal-pl napisał:

Nie wiem, jak uważasz. Za jakikolwiek działający kod - albo wskazówki będę wdzięczny


to może taka funkcja:

int minimalna(int *tab, int pocz, int kon)
{
if (pocz=kon) return tab[pocz] else
{
int min1 = minimalna(&tab, pocz, pocz+floor((kon-pocz)/2));
int min2 = minimalna(&tab, pocz+floor((kon-pocz)/2)+1, kon);
if (min1<min2) return min1
else return min2;
}
}

działania nie sprawdzałem tak na szybko napisałem więc się pewnie nie skompiluje od razu ale po drobnych poprawkach powinno działać.
Założenie jest takie że rekurencyjnie dzielisz tablicę na dwie części mniej więcej równe aż tablica się podzieli na poszczególne elementy, które są zwracane w "górę", następnie są porównywane i zwracany jest mniejszy aż do początku. pocz i kon są to indeksy pierwszego i ostatniego elementu tablicy. Mam nadzieję, że pomogłem.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 18.02.2011 o 15:46, Jackal-pl napisał:

Nie wiem, jak uważasz. Za jakikolwiek działający kod - albo wskazówki będę wdzięczny

W sumie to wysmażyłem taki kod, nawet się kompiluje (ale nie wiem czy będzie działał zgodni z założeniami)


int min,max, minmax[2], tab[100];
void minimaxi (int minmax[], int tab[]);
main ()
{
minmax[0] = 0;
minmax[1] =0;
minmax[2] = 0;
minimaxi (minmax,tab);
min= minmax[1];
max= minmax[2];
}
void minimaxi (int minmax[], int tab[] )
{
int i=0;
i = minmax[0];
if (i<=100)
{
if (tab < minmax[1]) minmax[1] = tab;
else if (tab > minmax[2]) minmax[2] = tab;
i=i+1;
minmax[0]=i;
minimaxi (minmax,tab);
}
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

jednak będą błędy, forum "wycięło" np i w nawiasach kwadratowych przy tab, być może coś jeszcze. Jak byś miał problem z przywróceniem mu używalności daj maila albo info gdzie to można bezpiecznie wkleić i tu linknąć.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

I znowu się edit skończył, może za 3 posty pod rząd bana nie dostanę. proponuję małą modyfikację deklaracji komórek tablicy minmax na
minmax[0] = tab[0];
minmax[1] =tab[0];
minmax[2] = 1;


To na wypadek jak by user był złośliwy i dał same ujemne cyfry do tabeli (co prawda min i tak powinien zadziałać ale max został by na zerze czyli błędnej wartości).

ps screen coby łatwiej było dodane przez forum bugi usunąć

20110218202559

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam pytanie dotyczące C++. Moim zadaniem jest utworzenie klasy pozwalającej na wykonywanie standardowych operacji na liczbach zmiennoprzecinkowych, czyli użytkownik podaje mantysę oraz wykładnik liczb, a program ma bez zamiany na "normalną" liczbę potrafić je dodawać, odejmować, mnożyć i dzielić. I problem mój dotyczy małych liczb, z wykładnikiem powiedzmy -7. O ile normalizacja idzie gładko, o tyle przy próbie inkrementacji (+1) ta "mała" część jest obcinana i wynikiem tejże inkrementacji jest po prostu 1. Analogicznie z dekrementacją, zresztą przy dodaniu bardzo małej do bardzo dużej liczby wynikiem jest tylko ta duża liczba. Można to jakoś obejść, żeby program zapamiętywał na przykład 0.200000000123 a nie obcinał końcówkę? Bo trochę użyteczność programu mi się sypie :) Zmienna mantysa jest już typu long double, ale i tak obcina te końcówki i to już przy wykładniku -7 (tak do -5 działa poprawnie). Zresztą analogicznie jest przy dużych liczbach, 10^10 + 10^17 wypisuje jako 10^17. Algorytm dodawania jest zgodny z tym na Wikipedii (nie zrównuję do tych samych wykładników, bo by się sypało jeszcze bardziej) a nie bardzo widzę sposób na obejście problemu. Z góry dzięki za pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2011 o 20:44, Erton napisał:

Mam pytanie dotyczące C++. Moim zadaniem jest utworzenie klasy pozwalającej na wykonywanie
standardowych operacji na liczbach zmiennoprzecinkowych, czyli użytkownik podaje mantysę
oraz wykładnik liczb, a program ma bez zamiany na "normalną" liczbę potrafić je dodawać,
odejmować, mnożyć i dzielić. I problem mój dotyczy małych liczb, z wykładnikiem powiedzmy
-7. O ile normalizacja idzie gładko, o tyle przy próbie inkrementacji (+1) ta "mała"
część jest obcinana i wynikiem tejże inkrementacji jest po prostu 1. Analogicznie z dekrementacją,
zresztą przy dodaniu bardzo małej do bardzo dużej liczby wynikiem jest tylko ta duża
liczba. Można to jakoś obejść, żeby program zapamiętywał na przykład 0.200000000123 a
nie obcinał końcówkę? Bo trochę użyteczność programu mi się sypie :) Zmienna mantysa
jest już typu long double, ale i tak obcina te końcówki i to już przy wykładniku -7 (tak
do -5 działa poprawnie). Zresztą analogicznie jest przy dużych liczbach, 10^10 + 10^17
wypisuje jako 10^17. Algorytm dodawania jest zgodny z tym na Wikipedii (nie zrównuję
do tych samych wykładników, bo by się sypało jeszcze bardziej) a nie bardzo widzę sposób
na obejście problemu. Z góry dzięki za pomoc.

Z tego co sam wyczytałem na wiki, to zarówno mantysę, jak i wykładnik powinieneś przechowywać w postaci liczb całkowitych. A zatem skąd u Ciebie long double? Dodam, ze w typowej implementacji C++ long double to synonim double.
W zasadzie, skoro nie chodzi tu o szybkość działania (bo używałbyś wtedy zapewne zwykłego double''a), to możesz trzymać mantysę w postaci ciągu znaków.
Inna sprawa, to, że działanie 10^10 + 10^17 na zwykłych doublach też daje 10^17 po wyświetleniu coutem (mimo, że binarnie reprezentacja jest inna, a zatem liczby się różnią). Jeśli używasz cout''a do wyświetlania, to pogrzeb w nagłówku iomanip z ustawieniem precyzji wyświetlania.
I nie bardzo wiem jak można dodać te liczby bez zrównania wykładników.
Z tego co kojarzę, to aby zmniejszyć błędy zaokrąglenia, to mimo, że double mają 64 bity, to obliczenia wykonuje się na tymczasowych typach 80-bitowych.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2011 o 21:29, Vel_Grozny napisał:

Z tego co sam wyczytałem na wiki, to zarówno mantysę, jak i wykładnik powinieneś przechowywać
w postaci liczb całkowitych. A zatem skąd u Ciebie long double? Dodam, ze w typowej implementacji
C++ long double to synonim double.

Znaczy no ja akurat wyczytałem, że mantysa winna być liczbą ułamkową :) Bo co to za oszczędność, jak liczba jest postaci 21314142112321 * 10^1 ? No ale tak czy siak nie zmienia to problemu, co najwyżej przesuwa granicę liczb "nieobcinanych". Zmieniłem te granica mantysy na przedział <1,10), ale to niewiele daje. Jeszcze ewentualnie kombinowałem, żeby (przy mantysie z przedziału od 1/10 do 1) trzymać jako liczbę całkowitą to co jest po zerze (czyli 0.231 trzymać jako 231), ale to bym musiał zachachmęcić jeszcze jedną zmienną pamiętającą jak to potem numerować. Chociaż może nie byłoby to takie głupie?

Dnia 08.03.2011 o 21:29, Vel_Grozny napisał:

W zasadzie, skoro nie chodzi tu o szybkość działania (bo używałbyś wtedy zapewne zwykłego
double''a), to możesz trzymać mantysę w postaci ciągu znaków.

W sensie typu string? o_0 To jak mam potem robić operacje matematyczne?

Dnia 08.03.2011 o 21:29, Vel_Grozny napisał:

Inna sprawa, to, że działanie 10^10 + 10^17 na zwykłych doublach też daje 10^17 po wyświetleniu
coutem (mimo, że binarnie reprezentacja jest inna, a zatem liczby się różnią). Jeśli
używasz cout''a do wyświetlania, to pogrzeb w nagłówku iomanip z ustawieniem precyzji
wyświetlania.
I nie bardzo wiem jak można dodać te liczby bez zrównania wykładników.

Na wiki jest taki zgrzebny wzorek, trochę skomplikowany, ale uwierz mi- wyrównywanie wykładników działa jeszcze gorzej.

Dnia 08.03.2011 o 21:29, Vel_Grozny napisał:

Z tego co kojarzę, to aby zmniejszyć błędy zaokrąglenia, to mimo, że double mają 64 bity,
to obliczenia wykonuje się na tymczasowych typach 80-bitowych.

Tylko że moim skromnym zdaniem nawet 64 bity to powinno być aż nadto, żeby trzymać liczbę znormalizowaną o wykładniku -7.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 08.03.2011 o 22:17, Erton napisał:

W sensie typu string? o_0 To jak mam potem robić operacje matematyczne?

Ręcznie, pod kreskę i dodajemy :) Lepiej tego uniknąć.

Mogę jeszcze zasugerować zastanowienie się jak to, że korzystasz z bazy 10, zamiast 2 wpływa na dokładność wyników. Z pewnością coś przez to tracisz.
Generalnie musisz sprawdzić po kolei jakie operacje wykonujesz i gdzie tracisz dokładność.

Więcej Ci chyba niestety nie pomogę. Trochę beznadziejne zadanie. Nie bardzo rozumiem po co pisać własną liczbę zmiennoprzecinkową, która wewnętrznie korzysta z liczb zmiennoprzecinkowych. W zasadzie nie bardzo rozumiem po co w ogóle to pisać :D

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Aha, dodam jeszcze co miałem na myśli pisząc o mantysie w liczbie całkowitej. Skoro wiesz, że mantysa zawiera się w przedziale <1,10), to kropka znajduje się ZAWSZE po pierwszej cyfrze. Nie ma więc potrzeby na trzymanie tego w ułamkach. Po prostu wiesz gdzie jest część całkowita, a gdzie ułamkowa.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dnia 08.03.2011 o 22:34, Vel_Grozny napisał:

Mogę jeszcze zasugerować zastanowienie się jak to, że korzystasz z bazy 10, zamiast 2
wpływa na dokładność wyników. Z pewnością coś przez to tracisz.
Generalnie musisz sprawdzić po kolei jakie operacje wykonujesz i gdzie tracisz dokładność.

No zasadniczo to potem mam zrobić program testujący i tam po kolei operacje- inkrementacja, dekrementacja, dodawanie, odejmowanie itd. No i już przy inkrementacji się pojawia tenże problem. Bo w sumie jak do czegoś bardzo małego dodajemy 1, to to bardzo małe się usuwa. No i bieda z nędzą

Dnia 08.03.2011 o 22:34, Vel_Grozny napisał:

Więcej Ci chyba niestety nie pomogę. Trochę beznadziejne zadanie. Nie bardzo rozumiem
po co pisać własną liczbę zmiennoprzecinkową, która wewnętrznie korzysta z liczb zmiennoprzecinkowych.
W zasadzie nie bardzo rozumiem po co w ogóle to pisać :D

No ja też nie, to takie zadanie rozruchowe z Programania Obiektowego. C++ to ja się uczę od piątku (od zera- wcześniej łoiłem w C), więc dla mnie takie zadanie to wielka sprawa. Przeciążanie operatorów, klasy- w ogóle szał :)

Dnia 08.03.2011 o 22:34, Vel_Grozny napisał:

Aha, dodam jeszcze co miałem na myśli pisząc o mantysie w liczbie całkowitej. Skoro wiesz, że mantysa >zawiera się w przedziale <1,10), to kropka znajduje się ZAWSZE po pierwszej cyfrze. Nie ma więc potrzeby na >trzymanie tego w ułamkach. Po prostu wiesz gdzie jest część całkowita, a gdzie ułamkowa.

No fpytę, tylko że nie wiem w jakiej formie użytkownik poda mantysę, więc nie będę wiedział później jak ją dostosować do przedziału <1,10). Bo u mnie to działa tak, że użytkownik podaje mantysę w dowolny sposób, wykładnik dowolny całkowity, potem jest to konwertowane na postać znormalizowaną (i tu jeszcze żadnych strat nie ma), a potem lecą działania (inkrementacja, dodawanie, mnożenie itede) i tu już się sypią problemy z dokładnością.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Panie i panowie, mam następne ważne pytanie. Co prawda nikogo tu nie ma o tak nieludzkiej na programowanie porze, ale może komuś się zachce odpowiedzieć.

Mianowicie, jak pozwolić, by przeciążanie operatorów miało możliwość mieszania w danych prywatnych klasy. Chodzi mi konkretnie o przeciążenie przypisania i cin. Coś czytałem o funkcjach zaprzyjaźnionych, ale to chyba nie ma związku. Cały czas wyskakuje mi spodziewany komunikat, że struktura jest "read-only". Więc moje pytanie brzmi, jak to się robi, bo że się robi, to chyba jest normalne?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 12.03.2011 o 22:57, Erton napisał:

Panie i panowie, mam następne ważne pytanie. Co prawda nikogo tu nie ma o tak nieludzkiej
na programowanie porze, ale może komuś się zachce odpowiedzieć.

Mianowicie, jak pozwolić, by przeciążanie operatorów miało możliwość mieszania w danych
prywatnych klasy. Chodzi mi konkretnie o przeciążenie przypisania i cin. Coś czytałem
o funkcjach zaprzyjaźnionych, ale to chyba nie ma związku. Cały czas wyskakuje mi spodziewany
komunikat, że struktura jest "read-only". Więc moje pytanie brzmi, jak to się robi, bo
że się robi, to chyba jest normalne?

A jednak właśnie funkcje zaprzyjaźnione do tego służą.
http://en.wikipedia.org/wiki/Friend_function
Tutaj masz prosty przykład. Co prawda na zwykłej funkcji, ale operatory się niczym nie różnią od innych funkcji w tym względzie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować