neverneve Temat założony przez niniejszego użytkownika |
Problemy z paroma ćwiczeniami z Symfonii C++ » 2011-02-04 01:00:22 Po każdym z działów w tej książce są Ćwiczenia, do których niestety nie ma odpowiedzi - dlatego co do paru mam wątpliwości. Wskaźniki: - ćwiczenie XIV - "Mamy tablicę znaków zawierającą litery alfabetu ABCDEFGHIJKLMNOPQRSTUWVZ ( nie są to po kolei znaki ASCII, brakuje X i Y oraz W jest przed V - przyp. neverneve). Zdefiniuj wskaźnik i ustaw go na drugim elemencie tablicy. Począwszy od tego miejsca - za pomocą pętli i przesuwania tego wskaźnika - wypisuj na ekranie co czwartą pokazywaną literę, dopóki wskazywany znak nie będzie miał kodu ASCII większego lub równego kodowi litery Z." Mi udało się to zrobić tylko z użyciem dwóch wskaźników w ten sposób: #include <iostream> using namespace std;
int main() { char tablica[] = { "ABCDEFGHIJKLMNOPQRSTUWVZ" }; char * wskaznik = & tablica[ 1 ]; char * poczatek = wskaznik; do { if(( wskaznik - poczatek ) % 4 == 0 ) cout <<* wskaznik << endl; wskaznik++; } while( * wskaznik < 'Z' ); cin.get(); return 0; }
W zadaniu pisze, aby wykorzystać jeden wskaźnik (wprawdzie nie dosłownie), więc jeśli ktoś potrafi to proszę o wyjaśnienie jak to zrobić :) - ćwiczenie XXXIII oraz XXXIV - najpierw ćwiczenie XXXIII: "Napisz program, w którym w funkcji main zostaną stworzone (operatorem new) trzy tablice typu double o rozmiarach co najmniej 20 elementów. Elementy pierwszych dwóch tablic załaduj jakimiś wartościami. W programie powinna być funkcja, która przyjmie wysłane do niej trzy tablice. Funkcja ta ma na elementach tych tablic wykonać operację mnożenia - taką, że i-ty element tablicy pierwszej zostanie pomnożony przez i-ty element tablicy drugiej. Rezultat ma zostać wpisany do i-tego elementu tablicy trzeciej. W funkcji main wypisz na ekranie zawartość poszczególnych elementów tablicy pierwszej, drugiej i trzeciej, a następnie skasuj te tablice." To udało mi się zrobić (jednakże zignorowałem informację "o rozmiarach co najmniej 20 elementów", żeby za każdym razem nie trzeba było wpisywać tyle liczb). Oto kod: #include <iostream> using namespace std;
int rozmiar;
void przypisywanie( double * tablica_nr1, double * tablica_nr2, double * tablica_nr3 ) { for( int i = 0; i < rozmiar; i++ ) { tablica_nr3[ i ] =( tablica_nr1[ i ] ) *( tablica_nr2[ i ] ); } }
void wypisywanie( double * tablica ) { for( int i = 0; i < rozmiar; i++ ) cout << tablica[ i ] << " "; cout << "\n\n"; }
void inicjalizacja( double * wskaznik ) { for( int i = 1; i <= rozmiar; i++ ) { cout << "Podaj " << i << " liczbe: "; cin >>*( wskaznik++ ); } endl( cout ); }
int main() { cout << "Podaj rozmiar tablic: "; cin >> rozmiar; endl( cout ); double * tablica1 = new double[ rozmiar ]; double * tablica2 = new double[ rozmiar ]; double * tablica3 = new double[ rozmiar ]; cout << "Uzupelnij 1 tablice: \n\n"; inicjalizacja( tablica1 ); cout << "Uzupelnij 2 tablice: \n\n"; inicjalizacja( tablica2 ); cout << "Elementy tablicy 1: "; wypisywanie( tablica1 ); cout << "Elementy tablicy 2: "; wypisywanie( tablica2 ); przypisywanie( tablica1, tablica2, tablica3 ); cout << "Elementy tablicy 3: "; wypisywanie( tablica3 ); delete[] tablica1, tablica2, tablica3; system( "pause" ); return 0; }
A teraz zadanie XXXIV, którego nie umiem zrobić: "Zmodyfikuj powyższy program tak, by teraz tworzeniem każdej tablicy zajęła się funkcja o nazwie kreator_tablicy. Jedno wywołanie tej funkcji ma tworzyć jedną tablicę, a argumentem aktualnym (wywołania) tej funkcji powinien być żądany rozmiar danej tablicy." Problem leży w tym, że mamy stworzyć trzy tablice - jednak jeśli jako jedyny argument podamy rozmiar tablicy, to czy za każdym uruchomieniem tej funkcji nie będzie ona próbowała stworzyć tablicy o takiej samej nazwie (tylko innym rozmiarze)? Proszę o pomoc w rozwiązaniu tego ćwiczenia. |
|
DejaVu |
» 2011-02-04 03:36:29 Co do rozwiązań zadań: ważne jest by rozwiązać zadanie poprawnie, a niekoniecznie optymalnie. Rozwiązań optymalnych nauczysz się z czasem.
double * tablica1 = kreator_tablicy( 123 );
Tak ma wyglądać wywołanie więc myślę, że jak się zastanowisz to dojdziesz do pozostałej części rozwiązania. |
|
jsc |
» 2011-02-04 14:42:01 Co do ćwiczenia XIV: Wykorzystaj, że *(cos + pozycja) to jest to samo co cos [pozycja]. |
|
neverneve Temat założony przez niniejszego użytkownika |
» 2011-02-06 14:13:38 OK, udało mi się zrobić obydwa te zadanie do końca i dokładnie :) Oto pierwsze (XIV), udało mi się zrobić w dosyć prosty sposób z jednym wskaźnikiem (nie wiem czy o to chodziło jsc, ale i tak dzięki za poradę): #include <iostream> using namespace std;
int main() { char tablica[] = { "ABCDEFGHIJKLMNOPQRSTUWVZ" }; char * wskaznik = & tablica[ 1 ]; for( int i = 0;; i++ ) { if( i % 4 == 0 ) cout << *( wskaznik + i ); if( *( wskaznik + i ) >= 'Z' ) break; } cin.get(); return 0; }
No i XXXIV, raczej na pewno nie jest optymalnie, ale działa, to najważniejsze. Program ma tez takie usprawnienie, że przypisuje wartości tablicy3 do momentu aż jedna z tablic (najmniejsza) się nie skończy, bo potem wypisywałby chyba bezsensowne wyniki, więc potem każdy element tablicy3 jest równy 0: #include <iostream> using namespace std;
double * kreator_tablicy( int rozmiar ) { double * tablica = new double[ rozmiar ]; return tablica; }
void przypisywanie( double * tablica_nr1, double * tablica_nr2, double * tablica_nr3, int rozmiar1, int rozmiar2, int rozmiar3 ) { int min; if(( rozmiar1 < rozmiar2 ) &&( rozmiar1 < rozmiar3 ) ) min = rozmiar1; else if(( rozmiar2 < rozmiar1 ) &&( rozmiar2 < rozmiar3 ) ) min = rozmiar2; else min = rozmiar3; for( int i = 0; i < min; i++ ) { tablica_nr3[ i ] =( tablica_nr1[ i ] ) *( tablica_nr2[ i ] ); cout << "***" << endl; } }
void wypisywanie( double * tablica, int rozmiar ) { for( int i = 0; i < rozmiar; i++ ) cout << tablica[ i ] << " "; cout << "\n\n"; }
void inicjalizacja( double * wskaznik, int rozmiar ) { for( int i = 1; i <= rozmiar; i++ ) { cout << "Podaj " << i << " liczbe: "; cin >>*( wskaznik++ ); } endl( cout ); }
int main() { int rozmiar1; cout << "Podaj rozmiar 1 tablicy: "; cin >> rozmiar1; while( rozmiar1 < 20 ) { cout << "Rozmiar nie moze byc mniejszy niz 20, sprobuj jeszcze raz: "; cin >> rozmiar1; } double * tablica1 = kreator_tablicy( rozmiar1 ); int rozmiar2; cout << "Podaj rozmiar 2 tablicy: "; cin >> rozmiar2; while( rozmiar2 < 20 ) { cout << "Rozmiar nie moze byc mniejszy niz 20, sprobuj jeszcze raz: "; cin >> rozmiar2; } double * tablica2 = kreator_tablicy( rozmiar2 ); int rozmiar3; cout << "Podaj rozmiar 3 tablicy: "; cin >> rozmiar3; while( rozmiar3 < 20 ) { cout << "Rozmiar nie moze byc mniejszy niz 20, sprobuj jeszcze raz: "; cin >> rozmiar3; } double * tablica3 = kreator_tablicy( rozmiar3 ); for( int i = 0; i < rozmiar3; i++ ) tablica3[ i ] = 0; cout << "Uzupelnij 1 tablice: \n\n"; inicjalizacja( tablica1, rozmiar1 ); cout << "Uzupelnij 2 tablice: \n\n"; inicjalizacja( tablica2, rozmiar2 ); cout << "Elementy tablicy 1: "; wypisywanie( tablica1, rozmiar1 ); cout << "Elementy tablicy 2: "; wypisywanie( tablica2, rozmiar2 ); przypisywanie( tablica1, tablica2, tablica3, rozmiar1, rozmiar2, rozmiar3 ); cout << "Elementy tablicy 3: "; wypisywanie( tablica3, rozmiar3 ); delete[] tablica1; delete[] tablica2; delete[] tablica3; cin.get(); return 0; }
I pytanie: jak można usunąć naraz parę dynamicznie ulokowanych obiektów? Coś takiego: delete[] { tablica1; tablica2; tablica3; }; nie działało. Czy można jakąś komendą usunąć wszystkie takie obiekty? |
|
kizia |
» 2011-02-06 14:15:26 delete[] tab1
delete[] tab2
delete[] tab3
I po co kombinować? |
|
neverneve Temat założony przez niniejszego użytkownika |
» 2011-02-06 14:16:31 No tak, ale jeśli takich obiektów mamy 100? 100 takich komend? |
|
kizia |
» 2011-02-06 14:18:46 int *wsk
wsk = new int [100] ;
delete[] wsk ;
Albo jak chcesz mieć 100 wskaźników to :
int *wsk[100] ;
for( int i = 0 ; i < 100 ; i++)
{
wsk[i] = new int ;
}
for( int i = 0 ; i < 100 ; i++)
{
delete wsk[i]
}
|
|
pekfos |
» 2011-02-06 14:23:00 @kizia: przeczytaj ich wypowiedzi jeszcze tyle razy aż zrozumiesz o co chodzi: da sie np tak: int ** tptr = new int *[ 100 ]; for( int a = 0; a < 100; a++ ) tptr[ a ] = new int[ 2 * a + 3 ];
for( int a = 0; a < 100; a++ ) delete[] tptr[ a ];
delete[] tptr;
|
|
« 1 » 2 |