Komputery, RTV, AGD, Komorki - C++; ktoś się orientuje?
KowaliK - 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 - 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 - 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 - 19-12-2011, 16:32
Pokaż kod programu.
KowaliK - 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 - 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 - 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 - 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 - 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 - 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 - 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!
krzychu - 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 - 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 - 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 - 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).
|
|
|