Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problemy z paroma ćwiczeniami z Symfonii C++

Ostatnio zmodyfikowano 2011-02-10 19:41
Autor Wiadomość
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:

C/C++
#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:

C/C++
#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.
P-27780
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.
C/C++
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.
P-27782
jsc
» 2011-02-04 14:42:01
Co do ćwiczenia XIV:
Wykorzystaj, że *(cos + pozycja) to jest to samo co cos [pozycja].
P-27793
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ę):

C/C++
#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:

C/C++
#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; //inicjalizowanie tablicy3 zerami
   
    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?
P-27877
kizia
» 2011-02-06 14:15:26
delete[] tab1
delete[] tab2
delete[] tab3
I po co kombinować?
P-27878
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?
P-27879
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]
}
P-27880
pekfos
» 2011-02-06 14:23:00
@kizia:
przeczytaj ich wypowiedzi jeszcze tyle razy aż zrozumiesz o co chodzi:
da sie np tak:
C/C++
int ** tptr = new int *[ /*iles.. np:*/ 100 ];
for( int a = 0; a < 100; a++ ) tptr[ a ] = new int[ /*iles.. np:*/ 2 * a + 3 ];
//dealokacja:
for( int a = 0; a < 100; a++ ) delete[] tptr[ a ];

delete[] tptr;
P-27881
« 1 » 2
  Strona 1 z 2 Następna strona