Strona Główna     FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy


Poprzedni temat :: Następny temat
C++ program
Autor Wiadomość
maniek910


Skąd: Kalisz
Wysłany: 2011-09-03, 13:50   C++ program

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

Kod:
#include <cstdlib>
#include <iostream>

using namespace std;

int const n = 20;
int const m = 20;

int main()
{
    int tab[n][m],size;

    cout << "Podaj wymiar boku macierzy" << endl;
    cin >> size;

    cout << "tablica" << endl;
    cout << "uzupełnij tabele" << endl;



    for(int i=0;i<size;i++){
    for(int j=0;j<size;j++){
    cin >> tab[i][j];
    }
       }
    for(int i=0;i<size;i++){
            cout << endl;
    for(int j=0;j<size;j++){
    cout << tab[i][j] << " " ;
         }
            }


    system("PAUSE");
    return EXIT_SUCCESS;
}


oczywiście puki co liczby wpisuje z klawiatury ...
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-03, 14:24   

W nawiązaniu do mojej prośby z poprzedniego tematu xD

Struktura ;-)

Kod:
struct Ulamek
 {
  int licznik;
  int mianownik;
 }
int n = 10;
Ulamek TabLiczb[n];

//Odwołanie:
for (int i=0; i<n; i++)
{
 TabLiczb[i].licznik = 90;
 TabLiczb[i].mianownik = 9876;
}

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...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-09-03, 15:02   

a więc chciałem sobie zobaczyć tą strukture napisałem takie coś

Kod:
#include <cstdlib>
#include <iostream>

using namespace std;

int const n =10;

int main(){

    int tab[n];

    struct ulamek{
        int licznik;
        int mianownik;
    }

    for (int i=0; i<n; i++){
        cin >> tab[i].licznik ;
        cin >> tab[i].mianownik;

    }
    for(int i=0;i<n;i++)cout << tab[i] << " ";

    system("PAUSE");
    return EXIT_SUCCESS;
}


niestety program wyświetlił mi :

error: expected unqualified-id before "for"
error: `i' was not declared in this scope
error: expected `;' before ')' token
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-03, 18:13   

Sorry zapomniałem.... o średniku ;-P a pisałem to z głowy xD

Kod:
// Maniek2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <cstdlib>
#include <iostream>

 using namespace std;

 struct ulamek{
    int licznik;
    int mianownik;
 };           // tutaj musi być średnik, a jak masz kilka struktur to po każdej musi być średnik

      int const n = 5;

int _tmain(int argc, _TCHAR* argv[])
{

      ulamek tab[n];
      for (int i=0; i<n; i++){
          cin >> tab[i].licznik ;
          cin >> tab[i].mianownik;
      }
      for(int i=0;i<n;i++)cout << tab[i].licznik << "/" << tab[i].mianownik << "; ";

      system("PAUSE");
      return EXIT_SUCCESS;
  }


Sprawdziłem w Viusalu 2010, teraz działa ;-) zobacz że Strukturę deklarujesz po za MAIN, przeanalizuj to i zobacz jak to działa ;-)

aha, Ty maina sobie zmień na swojego(tą linijkę, bo visual ma _tmain i tam coś jeszcze, oraz nagłówek stdafix)
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-09-04, 18:18   

A więc napisałem , potrafię znaleźć dla odpowiedniego wiersza kolumny Największy wspólny dzielnik aleeeeee :P gdy poprostu podstawię go na zasadzię
Kod:
tab[i][j].licznik = i/nwd;
         tab[i][j].mianownik = j/nwd;


wyskakuje błąd ;/ mój code

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 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;

        tab[i][j].licznik = i;
        tab[i][j].mianownik = j;
        }
    }
    for(int i=0;i<size;i++){
        cout << endl;
        for(int j=0;j<size;j++){
        cout << tab[i][j].licznik << "/" << tab[i][j].mianownik << "; " ;
        }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}


_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-04, 18:39   

i = 1
NWD = 0

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...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-09-04, 21:42   

nie rozumie ... co mi da
Kod:
tab[i][j].licznik = i;
                                           tab[i][j].mianownik = nwd;


np dla pozycji 2,2 wyjdzie mi ze i = 2; i nwd tez 2 ale ja chce to skrucić żeby wyświetliło mi 1/1 ;/
_________________
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-04, 22:18   

Licznik == i;
mianownik == j;

nwd = NWD(i, j);

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 8)
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-04, 22:39   

Addd///

Kilka byków zrobiłeś, popatrz, przeanalizuj ;-)
aaaa... kuźwa wcięcia są ważne i układ nawiasów, jak masz kilka to idzie się zgubić...

Kod:
// maniek3.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

 #include <cstdlib>
 #include <iostream>

 using namespace std;

 int const n = 100;

 struct ulamek{
         int licznik;
         int mianownik;
     };

int _tmain(int argc, _TCHAR* argv[])
{
     int size;
     ulamek tab[n][n];
     int c,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;
            if (zm != 0)
            {
                tab[i][j].licznik = i / zm;
                tab[i][j].mianownik = j / zm;
            }
            else
            {
                tab[i][j].licznik = i;
                tab[i][j].mianownik = j;
            }
        }
     }
     for(int i=1;i<=size;i++)
    {
         cout << endl;
         for(int j=1;j<=size;j++)
        {
            cout << tab[i][j].licznik << "/" << tab[i][j].mianownik << "; " ;
         }
     }
     system("PAUSE");
     return EXIT_SUCCESS;
 }
_________________
Moderatora grzecznie się słuchamy,
nie spamujemy, nie bluzgamy...


 
 
   
maniek910


Skąd: Kalisz
Wysłany: 2011-09-05, 14:55   

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;

        }
    }
    for(int i=1;i<size;i++){
        cout << endl;
        for(int j=1;j<size;j++){
            if(tab[i][j].licznik == tab[i][j].mianownik){
                cout << tab[i][j].licznik << " ;  " ;
            }
            else
        cout << tab[i][j].licznik << "/" << tab[i][j].mianownik << "; " ;
        }
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}


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 )
_________________
 
   
crooleeck 
Wymiata!


Pomógł: 25 razy
Skąd: Miedziana Dzioora...
Wysłany: 2011-09-05, 15:36   

maniek910 napisał/a:
jaką książkę polecił byś mi do nauki C++

Cytat:
C++ dla każdego

autor: Jesse Liberty.

Trochę wcześniej wprowdziłbym tablicę, ale ta książka nauczyła mnie wiele - na studiach tylko ja ogarniałem programowanie.
_________________
#pctown.pl @ PolNet
http://crooleeck.jogger.pl/
 
 
   
ExeQtoR 
Moderator



Pomógł: 38 razy
Skąd: K.P.
Wysłany: 2011-09-05, 22:40   

maniek910 napisał/a:
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...


 
 
   
Wyświetl posty z ostatnich:   
Dodaj do: WypowiedÄ˝ dla Wykop  WypowiedÄ˝ dla Facebook  WypowiedÄ˝ dla Wyczaj.to  WypowiedÄ˝ dla Gwar  WypowiedÄ˝ dla Delicious  WypowiedÄ˝ dla Digg  WypowiedÄ˝ dla Furl  WypowiedÄ˝ dla Google  WypowiedÄ˝ dla Magnolia  WypowiedÄ˝ dla Reddit  WypowiedÄ˝ dla Simpy  WypowiedÄ˝ dla Slashdot  WypowiedÄ˝ dla Technorati  WypowiedÄ˝ dla YahooMyWeb
Odpowiedz do tematu
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
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
system walidacji dla gości opracował Petermechanic
Forum komputerowe
Strona wygenerowana w 0,17 sekundy. Zapytań do SQL: 12