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.
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
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.
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. Ciemny jestem niesamowicie nawiasem mówiąc. 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. 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". 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". 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). |
|
|
|
 |
|