Jump to content

Puchacz1

Stały użytkownik
  • Content Count

    477
  • Joined

  • Last visited

Community Reputation

0 Neutralna

About Puchacz1

  • Rank
    Uczestnik

Contact Methods

  • Strona WWW
    http://
  • GG
    6100391

Profile Information

  • Skąd
    z hipermarketu TESZCO
  1. pytanie nr. 6 To pytanie bardziej w kwestii algorytmiki niż samego C++. Potrzebuję zrobić menu w którym będę mógł cofać się wstecz. Chyba zrobiłbym to nieskończoną pętlą while() i ewentualnie warunkami.Ogólnie wyglądałoby to tak: while(true){ switch zmienna { case:0 while(true) { if przerwij == 1 break; else while() <--kolejny poziom menu } case:1 while(true) { if przerwij == 1 break; else while() <--kolejny poziom menu } }}oczywiście odpowiednio bym sobie tym sterował tak abym uzyskał przejście z menu do podmenu jednak zastanawiam się czy nie ma innego sposobu. Poza goto bo to zapewne jest złą praktyką :)
  2. nie jestem aż tak biegły żeby ogarnąć szablony (jeszcze) niemniej jednak dzięki i na pewno się przyda!. Dopiero co wkroczyłem w świat programowania obiektowego a problem z pytania nr. 2 rozwiązałem najprościej jak się tylko dało. Tworzę o 1 większą tablicę i wpisuję w nią wartość charakterystyczną którą mam pewność, że nie wystąpi. Napisałem funkcję rozmiar przelatującą po tablicy aż do momentu znalezienia tej liczby i zwracającej rozmiar. Rozwiązanie ma wiele wad ale nic bardziej zaawansowanego nie było mi po prostu potrzebne. Kolejne pytanie: 4. Jak stworzyć własny operator i nie chodzi tutaj o przeładowanie operatorów np. += tylko o tworzenie własnego operatora działającego na danej klasie (np. operator ^T) w tym przypadku dokonujący transpozycji macierzy. Nie mogłem tego nigdzie znaleźć a i książki nie wiele mi powiedziały. 5. Jak pisać funkcję tak aby środowisko zamiast wyświetlania podpowiedzi typu (int x, bool y) wyświetlało (podpowiedź 1, podpowiedź2). Wydaje mi się, że trzeba jakoś inaczej zapisać prototyp funkcji ale nie mogłem tego znaleźć.
  3. mam taki oto prosty program który pod środowiskiem kompiluje się poprawnie (ale przy uruchamianiu wyrzuca: terminate called after throwing an instance of 'std::logic_error' what(): basic_string::_S_construct NULL not valid ) natomiast przy kompilacji (g++ -Wall -pedantic -o nazwa nazwa.cpp) wyrzuca jakieś niezrozumiałe instrukcje których tu nie będę przytaczał bo jest tego bardzo dużo.Powiedzcie co robię źle. #include <iostream>#include <fstream>#include <string>using namespace std;struct Osoba{ string nazwisko; string imie; string wiek;};bool wczytaj(string &nazwa, Osoba *&dane, int &ile){ ofstream plik; plik.open(nazwa.c_str(), ios::in | ios::out); plik << ile; if(ile!=0) { dane = new Osoba [ile]; for(int i=0; i<ile; ++i) { if(plik.good()) { plik << dane[i].imie << dane[i].nazwisko << dane[i].wiek; } } return 1; } else { cerr << "Pusty plik bądź brak informacji o rozmiarze"; return 0; }}void wypisz(ostream &plik, Osoba &dane){ plik << dane.imie << dane.nazwisko << dane.wiek;}int main(int argc, char *argv[]){ string pl_wej(argv[1]); string pl_wyj(argv[2]); int ile; // Osoba *dane; if(!wczytaj(pl_wej, dane, ile)) { cerr << "[gluteus maximus] zbita"; } wypisz(cout, dane[2]); return 0;}
  4. Pozwólcie, że będę tu pytał o nurtujące mnie pytania związane z językiem programowania C++. Pytanie nr. 1: Dlaczego tworząc dynamiczną tablicę w funkcji zwracającej tą tablicę (przez wskaźnik) nie muszę zwalniać zaalokowanej przez nią pamięć przy kończeniu pracy programu. [przykładowy kod] int *tablica(n){ int *asd = new int [n]; return asd;}int main(){ int *zmienna = tablica(10); return 0;}Pytanie nr. 2: Dlaczego nie mogę określić rozmiaru tablicy zadeklarowanej w funkcji zwracającej wskaźnik na pierwszy element tablicy. Czy nie jest to przypadkiem dlatego, że zwracając wskaźnik na pierwszy element gubię informację gdzie kończy się tablica? (mogę wędrować po "nieswojej" części pamięci?). Czy rozwiązaniem nie byłoby zwracaniem tablicy wskaźników na pierwszy i ostatni element? Oczywiście mogę to rozwiązać tworząc tablicę zawsze o 1 element większą i zapisując w niej jakąś umowną wartość a następnie napisać funkcję sprawdzająca rozmiar jednak chodzi o sam fakt "dlaczego tak się dzieje". int *tablica(n){ int *asd = new int [n]; return asd;}int main(){ int *zmienna = tablica(10); //tu chcę zbadać rozmiar tablicy (np. sizeof) return 0;}Pytanie nr.3 Czy mając tablicę wskaźników mogę wpisywać do takiej tablicy wskaźniki na różne typy danych? (string, int, double) i to chwilowo wszystko :)
  5. Chcę przemnożyć macierz n x n przez wektor (kolumnowy) o rozmiarze n jednak coś mi nie wychodzi float *MacierzWektor(float **Mac, float *X, int n){ for(unsigned short int i=0; i<n; ++i) for(unsigned short int j=0; j<n; ++j) X[i]+=Mac[i][j]*X[j]; return X;}prosiłbym o wskazanie błędu.
  6. problem w tym, że kompilatorem jest GCC w wersji 4.5.2. Jakby tego było mało to kilka dni wcześniej pisałem program wykonujący podobne obliczenia i on działał... Dlaczego zmienna temp wyrzuca -inf bądź -nan bądź 0. Nie mogę tego zrozumieć. Próbowałem to kompilować na: Code::Blocks pod: Windows7, Ubuntu 11.04, Ideone.com - wszędzie zwraca takie błędy więc to nie może być kwestia kompilatora.
  7. mam taki prościutki kod.Funkcja f zwraca poprawne wyniki natomiast działania w main to jakieś wierutne bzdury :). Nie jestem w stanie podzielić nic poprawnie bo zwraca -inf -nan albo po prostu 0.000000 w zmiennej a. Pętla specjalnie wykonuję się tylko jeden raz. Dla diagnostyki wyniku. Pomóżcie :) float f(float (&a)[9], float x){ float y=0; y=a[2]*pow(x,a[3])+a[4]*pow(x,a[5])+a[6]*pow(x,a[7]); return y;}int main(){ float tab[9]={-1,1,1,3,-1,1,-1,0,0.001}; float a=tab[0]; float b=tab[1]; float temp[2]={0,0}; float EPS0=tab[8]; float x; float y; float z; float c; unsigned short int i=0; while(i<1) { x=f(tab,a); y=f(tab,b); z=b-a; c=x+y; temp[0]=a+(z/c)*x; cout.precision(5); cout << fixed << x << " " << y << " " << z << " " << "a: " << a; if((i!=0)&&(a-a<EPS0)) break; i++; } return 0;}
  8. jak w temacie, wprowadzam dane raz w taki sposób: long double *wprowadz(){ long double wprowadzone[9] = {0}; while(wprowadzone[0]<2 || wprowadzone[0]>7) { cout << "Podaj liczbę węzłów (min. 2, max.7)" << endl; cin >> wprowadzone[0]; } // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[1]; cout << "podaj potege x: " << endl; cin >> wprowadzone[2]; // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[3]; cout << "podaj potege x: " << endl; cin >> wprowadzone[4]; // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[5]; cout << "podaj potege x: " << endl; cin >> wprowadzone[6]; // cout << "podaj poczatek przedzialu: " << endl; cin >> wprowadzone[7]; cout << "podaj koniec przedzialu" << endl; cin >> wprowadzone[8]; return wprowadzone;}2 sposób sprawdza poprawność wyników: long double dane[9] = {7,15,4,32,15,-1,1,2,5};i ten drugi sposób działa, a ten pierwszy daje wyniki z kosmosu... tak jest to wywoływane: int main(){ //long double *dane = wprowadz(); long double dane[9] = {7,15,4,32,15,-1,1,2,5}; int n = dane[0]; int a = dane[7]; int b = dane[8]; long double *x = zbiornik(n, a, b); long double wynik = (czebyszew(x, a, b, n, dane)*(b-a))/n; printf("Twoim wynikiem jest: %1.10Lf", wynik); return 0;}dlaczego wprowadzając dane na te 2 sposoby otrzymuje całkiem różne wyniki? sorki za trucie d*py
  9. Nie, nie Gdańsk ;). Oczywiście printf pomogło. Zauważyłem jednak, że sama funkcja chyba liczy coś nie tak. Czasem daje dziwne wyniki i nie wiem czym to jest spowodowane. #include <iostream>#include <cmath>#include <cstdio>using namespace std;long double *wprowadz(){ long double wprowadzone[9] = {0,0,0,0,0,0,0,0,0}; cout << "Podaj liczbę węzłów (max.7)" << endl; cin >> wprowadzone[0]; // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[1]; cout << "podaj potege x: " << endl; cin >> wprowadzone[2]; // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[3]; cout << "podaj potege x: " << endl; cin >> wprowadzone[4]; // cout << "podaj współczynnik a: " << endl; cin >> wprowadzone[5]; cout << "podaj potege x: " << endl; cin >> wprowadzone[6]; // cout << "podaj poczatek przedzialu: " << endl; cin >> wprowadzone[7]; cout << "podaj koniec przedzialu" << endl; cin >> wprowadzone[8]; return wprowadzone;}long double *ti(int n){ //pierwszy element tablicy jest jej rozmiarem. //drugi element tablicy jest rozmiarem tworzonej tablicy x'ów if(n==2) { long double *t = new long double [3]; t[0] = 3; t[1] = 2; t[2] = 0.577350; return t; } else if(n==3) { long double *t = new long double [5]; t[0] = 5; t[1] = 6; t[2] = 0.707107; t[3] = 0.000000; t[4] = 0.707107; return t; } else if(n==4) { long double *t = new long double [6]; t[0] = 6; t[1] = 8; t[2] = 0.794654; t[3] = 0.187592; t[4] = 0.187592; t[5] = 0.794654; return t; } else if(n==7) { long double *t = new long double [6]; t[0] = 6; t[1] = 7; t[2] = 0.883862; t[3] = 0.529657; t[4] = 0.323912; t[5] = 0; } else { return 0; }}long double *zbiornik(int n, int a, int b){ long double *t = ti(n); int rozmiar = t[1]; // 2 element tablicy, poznaję rozmiar tablicy! cout << "t[1]: " << rozmiar << endl; int z = 2; long double *x = new long double [rozmiar]; for(int i=0; i<rozmiar; i+=2) { x[i+1] = (0.5)*(b + a) + ((0.5)*(b - a) * t[z]); x[i] = (0.5)*(b + a) + ((0.5)*(b - a) * (t[z] * (-1))); z++; cout << x[i] << " :x: " << x[i+1] << endl; } return x;}long double czebyszew(long double *wezly, int a, int b, int n, long double *xxx){ int rozmiar = 2; //musi być dynamicznie. Nie wiem jak sprawdzić rozmiar tablicy wezly[]. Jakaś sztuczka z sizeof() pewnie. long double suma = 0; for(int i=0; i<rozmiar; ++i) { suma = suma + (xxx[1]*pow(wezly[i],xxx[2])+xxx[3]*pow(wezly[i],xxx[4])+xxx[5]*pow(wezly[i],xxx[6])); //cout << suma << " = " << xxx[1] << " * " << pow(wezly[i],xxx[2]) << "+" << xxx[3] << " * " << pow(wezly[i],xxx[4]) << "+" << xxx[5] << " * " << pow(wezly[i],xxx[6]) << endl; } return suma;}void wypisz(long double *co, int n){ for(int i=0; i<n; ++i) //funkcja na razie nie potrzebna. { cout << co[i] << endl; }}int main(){ //long double *dane = wprowadz(); //funkcja działa ale dla sprawdzenia kodu stosuje tablice [opis poniżej] long double dane[9] = {2,1,5,2,2,1,0,1,4}; //pierwsze od lewej "2" to nasze n. wyrażenie jest w postaci z*x^c + z2*x^c + z*x^c. Ostatnie dwie cyfry to przedział (od 1-4, można zmienić). Całość w ogóle można zmienić, pamiętając jednak, że zaimplementowane jest jedynie n=2,3,4,7. int n = dane[0]; int a = dane[7]; int b = dane[8]; long double *x = zbiornik(n, a, b); long double wynik = (czebyszew(x, a, b, n, dane)*(b-a))/n; // tu kończymy prace mnożąc wynik przez (b-a)/n printf("%1.10Lf", wynik); return 0;} może Wy mi wskażecie błąd.
  10. napisałem takie malutkie narzędzie do liczenia przybliżonego pola pod całką met. Czebyszewa jednak zastanawia mnie skąd biorą się tak duże zaokrąglenia w obliczeniach między mną a np. kalkulatorem online. Na przykład dla n=2 i przykładu x^2+2x+1 mój kalkulator wyświetla 39.0 a kalkulator online 38.99250. Oczywiście ja stosuję double więc teoretycznie powinienem otrzymać dość dokładny wynik. Liczyłem kalkulatorem i to mój program tak dziwacznie zaokrągla. Ja tego nie chcę wobec czego chciałbym się dowiedzieć jak to zmienić :) double czebyszew(double *wezly, int a, int b, int n, double *xxx){ int rozmiar = 4; //musi być dynamicznie. double suma = 0; for(int i=0; i<rozmiar; ++i) { suma = suma + (xxx[1]*pow(wezly[i],xxx[2])+xxx[3]*pow(wezly[i],xxx[4])+xxx[5]*pow(wezly[i],xxx[6])); //cout << suma << " = " << xxx[1] << " * " << pow(wezly[i],xxx[2]) << "+" << xxx[3] << " * " << pow(wezly[i],xxx[4]) << "+" << xxx[5] << " * " << pow(wezly[i],xxx[6]) << endl; } return suma;}problemy zaczynają się w tej funkcji. O ile tablica wezly[] jest ok i wydawać by się mogło, że zwróci dokładny wynik to przy kolejnych obrotach pętli wynik jest po prostu zaokrąglany. Niby wynik nie jest jakiś z kosmosu różny ale jednak. Po zwrócenia sumy robię jeszcze tak: double calka = ((b-a)/n) * czebyszew(parametry); może coś doradzicie.
  11. dobra, już wiem co było źle. Jednak nadal pozostają problemem te liczby rzeczywiste z przedziału które nie wiem jak uzyskać. mam coś takiego: tablica = rand() * 100.00000 / RAND_MAX;
  12. dobra, a jak z tego wyświetlić liczby losowe rzeczywiste. Niby google wie, ale jak to wklepuje to wypluwa tylko kilka liczb rzeczywistych, reszta to 0...
  13. chciałem otrzymać liczby losowe... zawarłem więc #include <ctime> i #include <cstdlib> float *wypelnij(float *tablica, unsigned int rozmiar, int gora, int dol){ srand(time(NULL)); for(unsigned int i=0; i<rozmiar; ++i ) { tablica[i] = rand()%(gora-dol)+dol; } return tablica;} jednak to nie działa... otrzymuje same 1. pyt. 2 jak w argumentach funkcji main przekazać rozmiar tabeli "rozmiar"?. Przecie *argv[] jest tablicą charów int main (int argc, char *argv[]){ int rozmiar = ?}
  14. nie za bardzo rozumiem o czym piszesz ale domyślam się, że chodzi o sztywne wbijanie współczynników itd... tak właśnie robię :) ps. napisałem funkcję licząca całkę metodą trapezów jednak nie jestem pewien prawidłowości jej działania. Mianowicie mam wrażenie czasem daje mało dokładne wyniki mimo dość dużej liczby kroków (10000) double *calkuj(int liczbaKrokow, float start, int stop, float a, float pot, float b, float pot2, float c, float pot3, float d, float pot4, float C ){ float krok = (sqrt(pow(stop-start,2)))/liczbaKrokow; //wartosc o jaka bedziemy przeskakiwali (np. 0,25) cout << "krok co:" << krok << endl; double *wynik = new double [liczbaKrokow]; //tworzymy dynamiczna tablice z liczba krokow. double y[2] = {0.00000000}; for(int i=0; i<liczbaKrokow; ++i) { if(i==0) { y[1] = a*pow(start,pot) + b*pow(start,pot2) + c*pow(start,pot3) + d*pow(start,pot4) + C; y[2] = a*pow(start+krok,pot) + b*pow(start+krok,pot2) + c*pow(start+krok,pot3) + d*pow(start+krok,pot4) + C; wynik[i] = ((y[1]+y[2])/2)* krok; if(wynik[i]<0) { wynik[i] *= -1; } } else if(i!=0) { y[1] = y[2]; y[2] = a*pow(start+krok,pot) + b*pow(start+krok,pot2) + c*pow(start+krok,pot3) + d*pow(start+krok,pot4) + C; wynik[i] = ((y[1]+y[2])/2)*krok; if(wynik[i]<0) { wynik[i] *= -1; } } start+=krok; } return wynik;} zastanawiam się czy na pewno jest to dobrze napisane.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.