Chce napisać takie coś :
napisac program ktory dla danego M wyrzuci na ekran tabelke M na M, gdzie kazda komorka bedzie SKROCONYM ulamkiem wiersz/kolumna,
np dla M = 3
1 1/2 1/3
2 1 2/3
3 3/2 1
ze skruceniem ułamków nie będzie problemu skorzystam z algorytmu Euklidesa na NWD ale jak do "jedenj komórki " wpakować ułamek ? bo z pojedyncza liczbą nie ma problemu ale za bardzo nie wiem jak wprowadzić ułamek , moja wstępna propozycja
W tedy w pod jednym odwołaniem tablicy masz 2 liczby )) możesz mieszać też rożne typy w strukturze
Kod:
struct XXX{
int aaa;
bool cos;
string bbb;
}
inymy słowy to jest już nowy TYP DANYCH jak masz proste typy np. INT, STRING... itp.. tak tutaj tworzysz nowy typ który sam nazywasz, a potem deklarujesz obiekty tego typu
Struktura od klasy się różni tym, że do struktury każdy i wszędzie ma jawnie dostęp(przez kropkę), a klasie deklarujesz prawa dostępu
Pomyśl.... programowanie to sztuka oszustwa... nie szukaj rozwiązania gotowego którego nie ma, bo ułamku 1/3 nie zapiszesz dziesiętnie, zawsze wyjdzie niedokładność, a jak nauczysz program liczenia innym sposobem, możesz liczyć bardzo dokładnie np.
1/3 + 1/3 + 1/3 normalnym liczeniem wyjdzie Ci 0,9(9) a jak nauczysz program liczenia że jak mianowniki takie same to dodaje liczniki i jak licznik i mianownik taki sam to jest 1. to masz 100% dokładność ))
ucz się kombinowania Ja takim sposobem wygrałem zakład o 5 na koniec z Paradygmatów Programowania w C++ Gościu powiedział że da się napisać programu w C++ który policzy silnie z 1000! bo braknie zakresu liczbowego dla Int64 nawet... ja zrobiłem swój typ na liście i strukturze
Liczba
Wskaźnik
Wskaźnik
"liczba" przechowywała tylko jedną cyfrę ! a wskaźniki wskazywały(linkowały) do następnej, poprzedniej cyfry.... Program jeździł po pamięci jak chciał... w teorii nieskończona długość liczb, program policzył silnie z 25 000! wynik wyszedł taki że liczba zapisana w notatniku zajęła 100KB wynikiem było coś koło 100 000 cyfr koło siebie(nie da się tego nazwać normalnie). Program wymagał aby nauczyć go liczenia(dodawania i mnożenia) pod kreskę algorytm mało efektowny ale udało się zamknąć w ok 700linijkach kodu
Więc pamiętaj tylko wyobraźnia Cię ogranicza
Dostałem pochwalę że program zajmował przy silni 25000! tylko 12MB w pamięci w momencie końcowym, ale liczył 8h non stop na Core2Duo(1 rdzeń na 100%), jego program w Matlabie liczył 1minutę, ale zajął ok 1,5GB pamięci... pytanie, który program policzy silnie z 1mln mój czy jego... bo u niego może pamięci braknąć, a mój jest nie efektowny, mnóstwo konwersji nie potrzebnych, da się to jeszcze z optymalizować xD
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
/*napisac program ktory dla danego M wyrzuci na ekran tabelke M na M, gdzie kazda komorka bedzie SKROCONYM ulamkiem wiersz/kolumna,
np dla M = 3
1 1/2 1/3
2 1 2/3
3 3/2 1*/
#include <cstdlib>
#include <iostream>
using namespace std;
int const n =100;
struct ulamek{
int licznik;
int mianownik;
};
int main(){
int size;
ulamek tab[n][n];
int c,zm;
cout << "Podaj rozmiar " << endl;
cin >> size;
for (int i=0; i<size;i++){
for(int j=0;j<size;j++){
while(c != 0){
c = i % j;
i = j;
j = c;
}
zm=i;
cout << "NWD to " << zm << endl;
int costam = i/nwd // 1/0 Pamiętaj cholero nie dziel przez zero
po za tym źle to rozumujesz !
Kod:
tab[i][j].licznik = i;
tab[i][j].mianownik = nwd;
Teraz tak powinno zadziałać i masz dla danej wartości tablicy trzymane liczby ułamkowe, jak chcesz wyświetlić je jako ułamek zwykły to cout << tab[i][i].licznik << "//" << tab[i][i].mianownik <<endl;
Jak chcesz w ułamku dziesiętnym, to: cout << tab[i][i].licznik / tab[i][i].mianownik <<endl;
ALE musisz sprawdzić czy nie ma 0(zera) w mianowniku
Widzę że nadal nie zakapowałeś po co jest struktura i jak to się używa ona zmusza do innego typu myślenia, tworzysz nowy typ danych uczysz(programujesz) system obsługi go i na nim działasz, a typy proste już poznałeś(int,bool,double, itp..) one są już zaprogramowane i wszelkie znaki arytmetyczne też są zaprogramowane )
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
if (nwd != 0)//pamiętaj... nie dziel przez zero
{
licznik = licznik / nwd;
mianownik = mianownik /nwd;
}
w pętli wyniki wypisujesz, ale sprawdzasz
if (mianownik != 1) cout << "/" <<mianownik; // jeżeli mianownik to 1 czyli np. 2/1 to to samo co 2 więc nie ma sensu wypisywania tego w ułamku.
rozumiesz?? czy mam Ci gotowiec napisać?
aha... nie kopiuj tego bo nie zadziała trzeba to na C++ przełożyć i tam tablice przez strukturę, bo to jest tylko wycinek kodu pisany z głowy na szybko - taki lekko pseudo kod
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
Błąd że nie podstawiłem zmiennych przy szukaniu nwd tylko skorzystałem z indexu rozumie ,to że muszę zacząć od 1 bo mi zcina 1 kolumne/wiersz , ale "cholero nie dziel przez zero " warunek if (nwd==0) to zbędne chyba wkońcu indexując od 1 jest niemożliwe dla liczb > 0 aby nwd było 0
Kod:
/*napisac program ktory dla danego M wyrzuci na ekran tabelke M na M, gdzie kazda komorka bedzie SKROCONYM ulamkiem wiersz/kolumna,
np dla M = 3
1 1/2 1/3
2 1 2/3
3 3/2 1*/
#include <cstdlib>
#include <iostream>
using namespace std;
int const n =100;
struct ulamek{
int licznik;
int mianownik;
};
int main(){
int size;
ulamek tab[n][n];
int zm;
cout << "Podaj rozmiar " << endl;
cin >> size;
for (int i=1; i<size;i++){
for(int j=1;j<size;j++){
int ii = i, jj = j,c=1;
while(c != 0){
c = ii % jj;
ii = jj;
jj = c;
}
zm=ii;
//cout << "NWD to " << zm << endl;
tab[i][j].licznik = i / zm;
tab[i][j].mianownik = j / zm;
Mimo że pominołem w kodzie warunek który sprawdza czy nwd jest ==0 tablica jest wyświetlana poprawnie .
P.S jaką książkę polecił byś mi do nauki C++ bo np w Symfoni (o dupę otłuc) na temat Struktur jest 1 strona i wszystko co tam jest to jak ją zadeklarować ... Najlepiej żeby była to książka na mój poziom (jaki poziom mam sam widzisz )
Błąd że nie podstawiłem zmiennych przy szukaniu nwd tylko skorzystałem z indexu rozumie ,to że muszę zacząć od 1 bo mi zcina 1 kolumne/wiersz , ale "cholero nie dziel przez zero " warunek if (nwd==0) to zbędne chyba wkońcu indexując od 1 jest niemożliwe dla liczb > 0 aby nwd było 0
Maniek ja nie wiem ;=P ja po prostu wiem że przez 0 się nie dzieli, więc jak coś takiego jest to albo wiem że nie będzie zera(nigdy!) albo zabezpieczam, a nad Twoim programem się nie zastanawiałem, wiem że mnie w Debagerze wyskoczyło że dzieli przez zero, no to zabezpieczyłem )) nie zastanawiałem się w którym miejscu xD po prostu przeanalizowałem kod i tam gdzie może wystąpić jakimś cudem zero to je wyłapuje Po jakimś czasie powinno wejście Ci to w nawyk.
maniek910 napisał/a:
Mimo że pominołem w kodzie warunek który sprawdza czy nwd jest ==0 tablica jest wyświetlana poprawnie .
Ponieważ tak się zastanawiam, masz ustawione C=1, wcześniej tego nie miałeś, a C było NIE USTALONE, wiec kompilator brał losową liczbę, albo walił błędem... a warunek w While jest sprawdzany jako pierwszy, gdybyś miał petle do{}while(/*warunek*/); to byś mógł to zostawić jak wcześniej, ale nie chciałem Ci mieszać z pętlami
Książkę... ????? A co to takiego
1. Google
2. Wymyślasz zadanie dla siebie czegoś nie wiesz? wracasz pk.1, nie wiesz nadal wracasz pk.1, nadal nie wiesz, pytasz na forum(tu, tam..), w między czasie pk.1
3. Jeżeli udało Ci się zakończyć pomyślnie pk.2 wracasz do niego, z innym programem(zadaniem), poziom wyżej
Wsio, ogólnie ja nie zakupiłem żadnej książki do programowania, ja mam to "we krwi", na studiach kupiłem 2 książki(aktualnie piszę pracę dyplomową - 4lata studiowałem):
Anatomia PC musiałem wykuć Biosa, CD, HDD, i procesory na pamięć
Zbiór zadań z elektrotechniki... myślałem że zadania będą właśnie z tego ... spudłowałem ;-P
maniek910 napisał/a:
wkońcu indexując od 1
Indeksy tablicy zawsze są od 0(ZERA) w C/C++/C# nigdy nie da się utworzyć tablicy bez elementu zerowego !
W Pascalu dało radę, ponieważ deklarowało się OD ... DO ...
co po kolei aby zakumać programowanie(na studiach masz na to 1semestr - na zaocznych ja tak miałem):
1. nauka na pamięć podstawowych typów danych(int, string, char, bool, float, double, z przedrostkiem unsigned(dla niektórych), Int64 lub long long int)
2. Ja wydrukowałem sobie zakresy tych zmiennych wraz z ich rozmiarem(ile bitów zajmują), co prawda ja mam długą tabelę bo to z Pascala(Delphi) tam było więcej i lekko inne nazewnictwo, ale zakres taki sam.
3. Tablice, jedno, dwu wymiarowe + DYNAMICZNE tablice
4. Pętle(for, while, do while)
5. Struktury
6. Wyjątki i ich łapanie Try{..}Catch(){}Finally{/*z reguły tej części się nie używa*/}
7. Wskaźniki (jak zakapujesz struktury, dopiero masz 50% szans zrozumienia po co jest wskaźnik)
8. Klasy(class) + wszystko do nich(konstruktory, funkcje inline, metody dostępu, przeciążanie operatorów, destruktor) tutaj dopiero na tych obiektach widać prawdziwy sens wskaźników, po pewnym czasie stwierdzasz że programowanie na strukturach jakiegoś większego programu to katorga i klasy to błogosławieństwo z przeciążonymi operatorami i metodami dostępu.
9. klasa Vector to C++ odpowiednik Listy w C# stwierdzasz że Tablice są bez sensu
10. referencje A tutaj stwierdzasz, że wskaźniki są do Du... i są zbędne
11. operator 3-argumentowy ?(tak, znak zapytania) zdarza się często w kodzie C++ w linuxach, ja go nie stosuje
nwd==0 ? prawda : falsz ;
[warunek] ? [jeżeli prawda to to się wykonuje] : [jeżeli fałsz to to się wykonuje]
takie coś na wzór If {} else {}, przydatne do krótkich zapytań:
dzielna?cout<<"nie dzieli sie przez zero\n":cout<<dzielnik/dzielna<<endl;
Wszystko ;-P
W C# nie ma wskaźników, tam domyślnie są referencje, a do funkcji są delegacje(taka odmiana referencji), głownie w C# stosuje się klasy, a struktury są dla tych co nie umią zadeklarować prostej klasy... Tablice są zbędne ponieważ sa listy. innymi słowy, C# to zaawansowany C++ ogólnie jest dużo prościej, tylko trzeba to zakumać
_________________ Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum