Forum Oficjalnego Klubu Mitsubishi - MitsuManiaki Strona Główna Forum Oficjalnego Klubu Mitsubishi - MitsuManiaki


FAQFAQ  SzukajSzukaj  UżytkownicyUżytkownicy  GrupyGrupy
RejestracjaRejestracja  ZalogujZaloguj  AlbumAlbum
 Ogłoszenie 


W myśl ustawy RODO, akceptując regulamin wyrażasz zgodę na gromadzenie i przetwarzanie swoich danych osobowych w celach związanych z przyznaniem dostępu do forum / wstąpieniem do klubu.
Administratorem danych jest Oficjalny Klub Mitsubishi - MitsuManiaki
Jeśli nie akceptujesz powyższych informacji, prosimy o kontakt z Administracją w celu usunięcia konta.

Poprzedni temat «» Następny temat
C++; ktoś się orientuje?
Autor Wiadomość
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 18-12-2011, 14:19   

Elegancko. Sortowanie działa z i bez optymalizacji. :)

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

using namespace std;

int main()
{
    const int n=10;
    int tab[n];
    int x;
    int cykl = 0;
    int porownan = 0;
   
   
    srand(time(NULL));
    for ( int n=0; n<10; n++)
    {
       int wylosowana;       
       wylosowana=rand()%10+1;
       tab[n]=wylosowana;
       cout<<tab[n]<<" ";
     
    }
     cout<<" "<<endl;
     
       for (int g=0; g<n; g++)
       {
        cykl++;
           
         for (int k=0; k<n; k++)
         { 
          porownan++;
            if(tab[k]>tab[k+1])
            {     
               x=tab[k];
               tab[k]=tab[k+1];
               tab[k+1]=x;
            }
            cout << tab[ k ]<< " ";
        }   
        cout << endl;
      }
      cout <<"Ilosc cykli:"<<cykl<<endl;
      cout <<"Ilosc porownan:"<<porownan<<endl;   
   
    cin.ignore ();
    cin.get ();
}


Teraz pozostaje problem z tą funkcją bool. Próbowałem coś naskrobać, ale nie mam BLADEGO pojęcia jak to ugryźć, a co dopiero, czy jest to dobrze. :lol:


Kod:


     bool sortowanie (jakie argumenty?);
      {   
      if(tab[k]>tab[k+1])
        {
         
          x=tab[k];
          tab[k]=tab[k+1];
          tab[k+1]=x;
          x=true;
        }
      else
          x=false;
           
      }
_________________
 
 
jawlo 
Forumowicz

Auto: SS DiD mint silver
Kraj/Country: Polska
Pomógł: 17 razy
Dołączył: 09 Sty 2006
Posty: 1196
Skąd: Beskidy
Wysłany: 18-12-2011, 21:40   

Funkcja bool to funkcja, która zwraca wartość typu bool czyli prawda lub fałsz.
W takim razie fragment
Kod:
      if(tab[k]>tab[k+1])

musisz zastąpić:
Kod:
      if( wiekszy(tab[k],tab[k+1]) == true )

lub prościej
Kod:
      if( wiekszy( tab[k],tab[k+1]) )


i dodatkowo wcześniej zdefiniować funkcję
Kod:
bool wiekszy( int x, int y)
{
    if( x > y )
        return true;
    else
        return false;
}
 
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 19-12-2011, 16:06   

Działa, ale jakoś... dziwnie? Nie sortuje wszystkich liczb i samej optymalizacji też tutaj nie widzę. Tak, tak, wiem, że w tym przypadku wszystko zależy od wylosowanych liczb. :wink:
W kilku próbach wychodzi tak czy inaczej 10 cykli i 100 porównań. Przy 50 elementowej tablicy jest to odpowiednio 50 cykli i 2500 porównań.

_________________
 
 
jawlo 
Forumowicz

Auto: SS DiD mint silver
Kraj/Country: Polska
Pomógł: 17 razy
Dołączył: 09 Sty 2006
Posty: 1196
Skąd: Beskidy
Wysłany: 19-12-2011, 16:32   

Pokaż kod programu.
 
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 19-12-2011, 17:02   

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

using namespace std;

   bool sortowanie( int x, int y)
{
    if( x > y )
        return true;
    else
        return false;
}

int main()
{
    const int n=10;
    int tab[n];
    int x;
    int cykl = 0;
    int porownan = 0;
   
    srand(time(NULL));
    for ( int n=0; n<10; n++)
    {
       int wylosowana;       
       wylosowana=rand()%10+1;
       tab[n]=wylosowana;
       cout<<tab[n]<<" ";
    }
     cout<<" "<<endl;
     
       for (int g=0; g<n; g++)
       {
        cykl++;
           
         for (int k=0; k<n; k++)
         {
          porownan++;
           if( sortowanie( tab[k],tab[k+1]) )
              cout << tab[ k ]<< " ";
        }   
        cout << endl;
      }
      cout <<"Ilosc cykli:"<<cykl<<endl;
      cout <<"Ilosc porownan:"<<porownan<<endl;   
   
    cin.ignore ();
    cin.get ();
}
_________________
 
 
jawlo 
Forumowicz

Auto: SS DiD mint silver
Kraj/Country: Polska
Pomógł: 17 razy
Dołączył: 09 Sty 2006
Posty: 1196
Skąd: Beskidy
Wysłany: 19-12-2011, 17:46   

Z instrukcji IF niepotrzebnie wyciąłeś fragment zamiany elementów miejscami.
Instrucja cout << tab[ k ]<< " "; powinna być poza instrukcją IF.
 
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 19-12-2011, 18:19   

jawlo napisał/a:
Z instrukcji IF niepotrzebnie wyciąłeś fragment zamiany elementów miejscami.
Instrucja cout << tab[ k ]<< " "; powinna być poza instrukcją IF.


Teraz działa elegancko. :D Ciemny jestem niesamowicie nawiasem mówiąc. :wink: Nie wiem co mnie tknęło żeby usunąć temat instrukcje. Pomimo prawidłowego działania, nadal nie widzę tutaj żadnej optymalizacji. Bez zmian zostaje 10 cykli i 100 porównań. Zostaje jeszcze jeden problem, co by zbyt różowo nie było. Optymalizacja numer jeden, czyli:

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

using namespace std;

int main()
{
    const int n=10;
    int tab[n];
    int x;
    int cykl = 0;
    int porownan = 0;
   
   
    srand(time(NULL));
    for ( int n=0; n<10; n++)
    {
       int wylosowana;       
       wylosowana=rand()%10+1;
       tab[n]=wylosowana;
       cout<<tab[n]<<" ";
     
    }
     cout<<" "<<endl;
     
       for (int g=0; g<n; g++)
       {
        cykl++;
           
         for (int k=0; k<n-1-g; k++)
         {
          porownan++;
            if(tab[k]>tab[k+1])
            {     
               x=tab[k];
               tab[k]=tab[k+1];
               tab[k+1]=x;
            }
            cout << tab[ k ]<< " ";
        }   
        cout << endl;
      }
      cout <<"Ilosc cykli:"<<cykl<<endl;
      cout <<"Ilosc porownan:"<<porownan<<endl;   
   
    cin.ignore ();
    cin.get ();
}


po dodaniu przy forze "n-1-g" program zostaje zoptymalizowany, ale źle wyświetlają się posortowane liczby. Zamiast sortowania, liczba posortowana zostaje odjęta i niewyświetlona. W czym tkwi błąd?
_________________
 
 
jawlo 
Forumowicz

Auto: SS DiD mint silver
Kraj/Country: Polska
Pomógł: 17 razy
Dołączył: 09 Sty 2006
Posty: 1196
Skąd: Beskidy
Wysłany: 19-12-2011, 19:46   

Wiersze na wydruku są coraz krótsze gdyż wewnętrzna pętla za każdym razem robi jedno porównanie mniej (efekty optymalizacji).
Aby poprawnie wyświetlać tabelę, najlepiej stworzyć funkcję wypisującą tabelę:

Kod:
void  wypisz_tabele(int t[], int n)
{
    for (int i=0; i<n; i++)
          cout << t[ i ]<< " ";
    cout << endl;     
}

i wywołać ją na końcu zewnętrznej pętli:
Kod:

     for (int g=0; g<n; g++)
       {
         .....
         wypisz_tabele(tab,  n);
       }

oczywiście istniejące cout z pętli należy wyciąć :)
 
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 12-01-2012, 17:16   

Znowu ja. :wink: Muszę napisać program wyświetlający tablicę dwuwymiarową 10x10 wypełnioną zerami. Na przekątnych mają znajdować się jedynki. Wyświetlanie i wypełnianie zerami mam zrobione tylko problem polega na tym, że wszystko wyświetla się w jednym ciągu, a nie 10 liczb w jednym wersie, drugie 10 w drugim wersie, itd. Kombinowałem ale nic nie wyszło. :( A co do umieszczenia tych jedynek, to po poprawnym wyświetleniu tablicy mam zamiar odwołać się do poszczególnych miejsc i tam umieścić jedynkę. Dobrze kombinuję?

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

using namespace std;

int main()

{
int tab [10][10];

    for (int x=0; x<10; x++)
       for (int y=0; y<10; y++)
        {
         tab[x][y]=0;
         cout<<tab[x][y]<<" ";
         }
    cout<<endl;
         
    system("PAUSE");
    return EXIT_SUCCESS;
}
_________________
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 12-01-2012, 17:18   

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

using namespace std;

int main()

{
int tab [10][10];

    for (int x=0; x<10; x++)
    {
       for (int y=0; y<10; y++)
        {
         if (x==y)
             tab[x][y]=1
         else
             tab[x][y]=0;
         cout<<tab[x][y]<<" ";
         }

      cout<<endl;
    }
         
    system("PAUSE");
    return EXIT_SUCCESS;
}


Powinno pomóc.

A na obu przekątnych? hmmmm można na około (3 pętle), a można by też zamieszać np.:

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

using namespace std;

int main()

{
int tab [10][10];

    for (int x=0; x<10; x++)
    {
       for (int y=0; y<10; y++)
        {
         if (x==y)
             tab[x][y]=1;
         else if (y==9-x)
             tab[x][y]=1;
         else
             tab[x][y]=0;
         cout<<tab[x][y]<<" ";
         }

      cout<<endl;
    }
         
    system("PAUSE");
    return (0);
}


Powinno działać chodź nie testowałem. Możesz też zrobić na piechotę:

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

using namespace std;

int main()

{
int tab [10][10];

    for (int x=0; x<10; x++)
    {
       for (int y=0; y<10; y++)
        {
         tab[x][y]=0;
        }
    }
         
    for (int x=0; x<10; x++)
    {
         tab[x][x]=1;
         tab[x][9-x]=1;
    }
    for (int x=0; x<10; x++)
    {
       for (int y=0; y<10; y++)
        {
         cout<<tab[x][y]<<" ";
         }

      cout<<endl;
    }
    system("PAUSE");
    return (0);
}
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 12-01-2012, 18:31   

Identyczną wersje, jak Twoja pierwsza, przed momentem napisałem we współpracy z kolegą. :) Opcja numer trzy działa, tylko mógłbyś wyjaśnić tą część, bo nie bardzo rozumiem o co w niej chodzi?

Kod:
for (int x=0; x<10; x++)
    {
         tab[x][x]=1;
         tab[x][9-x]=1;
    }



EDIT.

OK, rozumiem, dzięki! :)
_________________
Ostatnio zmieniony przez KowaliK 12-01-2012, 19:01, w całości zmieniany 1 raz  
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 12-01-2012, 18:36   

No wpisujesz w tablicy jedynki.... więc wpisujesz po jednej przekątnej czyli dla elementów [0,0] [1,1] [2,2]......[9,9] a potem na drugiej przekątnej czyli [0,9] [1,8] [2,7].....[9,0].
 
 
KowaliK 
Mitsumaniak
01339/KMM

Auto: JDM's
Kraj/Country: Polska
Pomógł: 6 razy
Dołączył: 06 Sty 2008
Posty: 990
Skąd: Wrocław
Wysłany: 25-04-2012, 20:03   

Wracam z powrotem po przerwie. Mam problem z funkcją kopiującą znaki od tyłu, czyli np. użytkownik wpisuje "Ala ma kota" a program zamienia na "atok am ala". :wink: Nie mam pojęcia jak to ugryźć, pomożecie?
 
 
krzychu 
Mitsumaniak


Auto: Lancer 2.0 Int, Mazda CX-3
Zaproszone osoby: 1
Kraj/Country: Polska
Pomógł: 141 razy
Dołączył: 21 Kwi 2008
Posty: 12607
Skąd: Bielsko-Biała
Wysłany: 25-04-2012, 20:17   

String tekst = "Ala ma kota";
String nowy = "";
for (int i=tekst.Lenght(); i>0 ; i--)
nowy+=tekst[i];


Czy jakoś tak...
 
 
elektryk 
Forumowicz

Auto: auto
Kraj/Country: Polska
Pomógł: 33 razy
Dołączył: 10 Sie 2008
Posty: 2082
Skąd: z ...
Wysłany: 25-04-2012, 20:38   

KowaliK napisał/a:
Wracam z powrotem po przerwie. Mam problem z funkcją kopiującą znaki od tyłu, czyli np. użytkownik wpisuje "Ala ma kota" a program zamienia na "atok am ala". :wink: Nie mam pojęcia jak to ugryźć, pomożecie?
Podstawowe dwa pytanka:
1. czym jest sam napis? Czy to jest *char, std::string, QString, System.String czy jeszcze jakieś inne cudo?
2. czy zamiana ma polegać na stworzeniu nowego obiektu (alokacji nowej pamięci) czy ma być w rama tego co istnieje (in-place).
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie 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
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group

Ta strona używa ciasteczek (ang. cookies) w celu logowania oraz do badania oglądalności strony.
Aby dowiedzieć się czym są ciasteczka odwiedź stronę wszystkoociasteczkach.pl
Jeśli nie wyrażasz zgody na wykorzystywanie ciasteczek na tej stronie, zablokuj je w opcjach Twojej przeglądarki internetowej.