tablice

zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

tablice

Post autor: zxc18 »

mam problem z zadaniem:

Napisz program, który wczyta dane z klawiatury do 10-cio elementowej
tablicy liczb double, a następnie sprawdzi:
- czy te liczby są uporządkowane rosnąco lub malejąco,
- czy elementy tablicy mają symetryczną zawartość
(tzn. pierwszy element równy ostatniemu, drugi równy przedostatniemu, itd. )
- czy w tablicy występuje chociaż jedno powtórzenie wartości,

prosze o pomoc, dziekuje
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

Przedstaw najpierw swoje próby rozwiązania tego zadania a wtedy będziemy pomagać.
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

tablice

Post autor: zxc18 »

pierwsza funkcja:

#include
#include
using namespace std;

int i;
double wczytaj(double tab[],double n)
{
for(i=1;i
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

Kod: Zaznacz cały

#include <iostream>
using namespace std;
main()
{
double t[11];
int i,j,sym=1,pow=-1,mal=1,ros=1;
cout<<"Podaj 10 elemetow ciagu :"<<endl;
for(i=1;i<=10;i++)
{
 cout<<"Podaj "<<i<<" element"<<endl;
 cin>>t[i];
}
for(i=1;i<=5;i++)
{
 if(t[i]!=t[11-i])
 {
  sym=0;
  break;
 }
}
for(i=1;i<=9;i++)//pamiętaj o zakresie tablicy
{
 if(t[i]>=t[i+1]) ros=0;
 if(t[i]<=t[i+1]) mal=0;
}
for(i=1;i<=10;i++)
{
pow=-1;
 for(j=1;j<=10;j++)
 {
  if(t[j]==t[i]) pow++;
 }
if(pow) break;
}

if(ros) cout<<"Ciag jest rosnacy"<<endl;
else if(mal) cout<<"Ciag jest malejacy"<<endl;
else cout<<"Ciag nie jest silnie monotoniczny"<<endl;
if(sym) cout<<"Ciag jest symetryczny"<<endl;
else cout<<"Ciag nie jest symetryczny"<<endl;
if(pow) cout<<"Jakis element sie powtarza w ciagu"<<endl;
else cout<<"Wszystkie elemetny w ciagu sa rozne"<<endl;

return 0;
}
zxc18
Użytkownik
Użytkownik
Posty: 92
Rejestracja: 12 gru 2007, o 14:29
Płeć: Mężczyzna
Lokalizacja: Szczecin
Podziękował: 65 razy
Pomógł: 1 raz

tablice

Post autor: zxc18 »

wszystko fajnie ale masz blad bo nie pokazuje czy rosnacy czy malejacy ...

dalem taka funkcje :

double spr(double tab[],double n)
{
int rosnace=0;
int malejace=0;
for(i=1; i=tab)
{ rosnace++; }
else if(tab>=tab[i+1])
{ malejace++; }

}

if(rosnace) cout
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

Po pierwsze, może najpierw dziękuję za wklejenie gotowca.
Po drugie zanim wytkniesz komuś błąd POMYŚL dwa razy zanim coś napiszesz.
Po trzecie jeśli nadal jesteś przekonany do błędu kogoś innego patrz punkt drugi.
A tak wyjaśniając: ciąg 6,3,2,2,1 nie jest ani malejący ani tym bardziej rosnącym. Jest nierosnący.
Podany przez ciebie kod :

Kod: Zaznacz cały

 if(tab[i+1]>=tab[i])
{ rosnace++; }
else if(tab[i]>=tab[i+1])
{ malejace++; } 
jest oczywiście BŁĘDNY. Mniejsza o to, że nie wiesz co to ciąg rosnący i malejący. Gorzej, że nie zauważasz bzdury w znakach warunków i w samych blokach warunkowych. Słówko if oznacza "jeżeli" a else"w przeciwnym wypadku". Tak więc nie możesz powtarzać warunku równości komórek t i t[i+1]. Zauważ, że jeśli pojawi się ciąg nierosnący to twój blok warunków zwiększy zmienną rosnace i potem wypiszesz, że ciąg jest i rosnący i malejący.
Przykład:

Kod: Zaznacz cały

int a=5,b=5;
if(a>=b) cout<<"TAK";
else if(b>=a) cout<<"NIE";
Sprawdź co się stanie i wyciągnij wnioski. Tyle na temat bo nie chce mi się już więcej pisać. Mimo wszystko życzę ci dalszej radości czerpanej z programowania. Pozdrawiam.
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

tablice

Post autor: Rafal88K »

kadiii nie sprawdzałem logiki programu ale masz masę błędów: w C++ tablice indeksuje się od 0 a nie od 1. C++ to nie Pascal. Po drugie jeśli chcesz, żeby wszystko było zgodne ze specyfikacją C++ i się poprawie kompilowało (np. w VS2005) to funkcja main powinna zwracać int. Po trzecie zamiast korzystać ze stałego rozmiaru tablicy lepiej zrobić dynamiczną alokację

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    int *tablica, rozmiar, i;

    cout << "Podaj rozmiar tablicy: ";
    cin >> rozmiar;
    tablica = new int[rozmiar];
    cout << endl;

    for(i = 0; i < rozmiar; ++i)
    {
        cout << "Podaj " << i + 1 << " element tablicy: ";
        cin >> tablica[i];
    }
    cout << endl;

    cout << "Wczytalem:";
    for(i = 0; i < rozmiar; ++i)
    {
        cout << " " << tablica[i];
    }

    cout << endl;
    system("pause");
    return 0;
}
a jeszcze lepiej skorzystać z kontenera vector

Kod: Zaznacz cały

#include <iostream>
#include <vector>
using namespace std;

int main(int argc, char** argv)
{
    vector<int> vnTablica;
    int nRozmiar, tmp, i;

    cout << "Podaj ilosc elementow: ";
    cin >> nRozmiar;

    cout << "Wpisz elementy: ";
    for(i = 0; i < nRozmiar; ++i) {
        cin >> tmp;
        vnTablica.push_back(tmp);
    }

    cout << "Wczytalem:";
    for(vector<int>::iterator it = vnTablica.begin(); it != vnTablica.end(); ++it) {
        cout << " " << *it;
    }


    cout << endl;
    system("pause");
    return 0;
}
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

Witaj, jeżeli chcesz wtrącić swoje trzy grosze to przeczytaj najpierw cały temat. Moje pretensje były odnośnie odpowiedzi jaką otrzymałem po wklejeniu gotowego programu. Wiesz ja uważam, że jeśli czegoś nie potrafię zrobić to kiedy otrzymuje pomoc nie krytykuje jej bez odpowiedniego zastanowienia. Jeśli nadal uważam, że coś jest nie tak to raczej pytam a nie odpowiadam
wszystko fajnie ale masz blad
Nie wiem, może to była nadinterpretacja, ale tak zrozumiałem i dlatego skrytykowałem nieodpowiednią według mnie postawę.
Co do Rafała88K, wiesz nie chcę się licytować co kto potrafi bo niepotrzebne a ja nie mam potrzeby się sprawdzać.
Parę wyjaśnień: tablicę zapisuję od jakiego chcę indeksu, ja piszę z nawyku od 1 bo w pierwszym(czyli zerowym) elemencie często się coś przechowuje odnośnie całej tablicy. Stąd od 1, a nie od 0-błędem to nie jest.
Po drugie zadeklarowałem stałą tablicę bo tak było w treści zadania z pierwszego postu.
Napisz program, który wczyta dane z klawiatury do 10-cio elementowej
tablicy liczb double
Po trzecie main jest u mnie int-ową funkcją, zwracam w końcu wartość 0 - o jakiej niby specyfikacji mówisz. Jak nie napiszesz int przed main to kompilator go przyjmie domyślnie. Wiesz ja kompiluje programy samym kompilatorem, nie używam środowisk programistycznych do tak małych programów, więc jak się skompilowało na linuksie to ze standardem jest raczej za pan brat.
Co do tego vectorów to raczej nie ma potrzeby go używać do tak krótkiego programu(zresztą już pisałem, że miała być stała tablica, więc po problemie).
Tak więc w moim programie nie ma żadnego błedu, działa dobrze i daje dobre wyniki.
Podsumowując - temat się wyczerpał, problem rozwiązał w 4 poście. Nastąpiło po nim drobne nieporozumienie, niejasności zostały wyjaśnione. Róbmy coś pożyteczniejszego. Pozdrawiam
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

tablice

Post autor: Rafal88K »

kadiii pisze:Wiesz ja uważam, że jeśli czegoś nie potrafię zrobić to kiedy otrzymuje pomoc nie krytykuje jej bez odpowiedniego zastanowienia.
Zgodzę się z Tobą, ale ja napisałem parę uwag na temat programu.
kadiii pisze:pierwszym(czyli zerowym) elemencie często się coś przechowuje odnośnie całej tablicy
Coś czyli co? Może chodziło Ci o to, że nazwa tablicy jest adresem jej zerowego elementu, ale to nie ma nic wspólnego z tym że w zerowym elemencie nie możesz nic przetrzymywać, właśnie od tego elementu powinieneś zacząć przypisywać. Załóżmy, że masz taki program:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

void funkcja(int* t, int rozmiar)
{
    for(int i = 0; i < rozmiar; ++i)
        cout << t[i] << " ";
}

int main(int argc, char** argv)
{
    int t[4];
    t[1] = 1;
    t[2] = 2;
    t[3] = 3;
    funkcja(t, 3);
    cout << endl;
    system("pause");
    return 0;
}
np. funkcja jest napisana przez inną osobę i nie możesz zmieniać jej definicji (np. jest w pliku dll) i zobacz co Ci się wyświetli ;) Możesz to zrobić inaczej np. zamiast

Kod: Zaznacz cały

funkcja(t, 3);
wpisać

Kod: Zaznacz cały

funkcja(&t[1], 3);
ale jest to mniej czytelne. Do tego jak tworzysz tablicę na 11 elementów, a wykorzystujesz tylko 10 z nich, może nie jest to zbyt duża strata pamięci przy liczbach całkowitych, tylko co będzie przy przesyłaniu Twoich obiektów, których rozmiar będzie 20 razy większy.
kadiii pisze:Co do tego vectorów to raczej nie ma potrzeby go używać do tak krótkiego programu
Napisałem to do tego dynamicznego tworzenia tablicy, że lepiej skorzystać z vector'a. Poza tym jak ktoś zna i umie korzystać z STL-a to może (powinien) to robić, a vector jest wymienny z tablicą :D
kadiii pisze:Jak nie napiszesz int przed main to kompilator go przyjmie domyślnie.
No niestety muszę Cię zdziwić bo nie wszystkie tak robią.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

A ty widzę dalej swoje :wink: Niech ci będzie.
Coś czyli co? Może chodziło Ci o to, że nazwa tablicy jest adresem jej zerowego elementu, ale to nie ma nic wspólnego z tym że w zerowym elemencie nie możesz nic przetrzymywać, właśnie od tego elementu powinieneś zacząć przypisywać.
Nie nie oto chodziło. W zerowym elemencie można przechowywać sobie np. rozmiar tejże tablicy. Wierz mi, zwiększa to czytelność w pewnych sytuacjach. Oczywiście tego zabiegu urzywa się jeśli informacja przechowywana jest tego samego typu co pozostałe komórki tablicy.
tylko co będzie przy przesyłaniu Twoich obiektów, których rozmiar będzie 20 razy większy.
Nic by nie było, jeśli chciałbym zapisać tam obiekt, który i tak musiałbym zadeklarować w programie(chociaż to akurat dziwna sytuacja i w obiektówce nie uzywa się raczej takich zabiegów).
Napisałem to do tego dynamicznego tworzenia tablicy, że lepiej skorzystać z vector'a. Poza tym jak ktoś zna i umie korzystać z STL-a to może (powinien) to robić, a vector jest wymienny z tablicą :D
Czyli poprawiłeś sam siebie w rzeczy, która nie była oczekiwana? Przecież pisałem, że tablica miała być stała.
No niestety muszę Cię zdziwić bo nie wszystkie tak robią.
a wcześniej
Po drugie jeśli chcesz, żeby wszystko było zgodne ze specyfikacją C++ i się poprawie kompilowało (np. w VS2005) to funkcja main powinna zwracać int
Tylko, że ty wytknąłeś mi, że coś jest niezgodne ze specyfikacją języka. To, że się nie kompiluje w microsoftowym VS to nie znaczy, że jest niezgodne ze specyfikacją. Co więcej są rzeczy, które kompilują się tylko w VS bo są niestandardowe i nie należą do specyfikacji języka.
Jeszcze jakieś uwagi? Trochę szkoda czasu na prostowanie faktów.
:wink:
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

tablice

Post autor: Rafal88K »

kadiii pisze:Czyli poprawiłeś sam siebie w rzeczy, która nie była oczekiwana? Przecież pisałem, że tablica miała być stała.
Nie poprawiłam sam siebie tylko napisałem 2 możliwości rozwiązania lepszą i gorszą.
kadiii pisze:W zerowym elemencie można przechowywać sobie np. rozmiar tejże tablicy. Wierz mi, zwiększa to czytelność w pewnych sytuacjach. Oczywiście tego zabiegu urzywa się jeśli informacja przechowywana jest tego samego typu co pozostałe komórki tablicy.
Nie stosuje się czegoś takiego jak rozmiar tablicy w zerowym elemencie Po co Ci ten rozmiar jest masz pojemnik vector?
kadiii pisze:Nic by nie było, jeśli chciałbym zapisać tam obiekt, który i tak musiałbym zadeklarować w programie(chociaż to akurat dziwna sytuacja i w obiektówce nie uzywa się raczej takich zabiegów).
Jak to nic by nie było? Dodatkowy obiekt = dodatkowa pamięć. Widać, że albo nie rozumiesz co piszę albo mało wiesz o programowaniu obiektowym, chodziło mi o to, że niepotrzebnie tworzysz tablicę większą niż jest Ci potrzebna, zresztą spójrz na poniższy przykład.

Kod: Zaznacz cały

#include <iostream>
#include <string>
using namespace std;

class MojaKlasa
{
    public:
        MojaKlasa();
        MojaKlasa(const string& inName);

        void setName(const string& inName);
        string getName() const;
    private:
        string strName;
        int nAry[2500];
};

MojaKlasa::MojaKlasa() : strName("Brak nazwy")
{
    for(int i = 0; i < 200; ++i)
        nAry[i] = i * 2;
}

MojaKlasa::MojaKlasa(const string& inName) : strName(inName)
{
    for(int i = 0; i < 200; ++i)
        nAry[i] = i * 3;
}

inline string MojaKlasa::getName() const
{
    return strName;
}

inline void MojaKlasa::setName(const string& inName)
{
    strName = inName;
}

int main(int argc, char** argv)
{
    // Ja zrobiłbym tak
    MojaKlasa obiekty[3] = {MojaKlasa("Obiekt 11"), MojaKlasa("Obiekt 12"), MojaKlasa("Obiekt 13")};
    cout << "Rozmiar tablicy: " << sizeof(obiekty) << endl;
    cout << "Rozmiar jednego obiektu: " << sizeof(obiekty[0]) << endl;
    cout << endl;
    cout << "Nazwa pierwszego obiektu: " << obiekty[0].getName() << endl;
    cout << "Nazwa drugiego obiektu: " << obiekty[1].getName() << endl;
    cout << "Nazwa trzeciego obiektu: " << obiekty[2].getName() << endl;

    cout << endl;
    cout << "Teraz prawdopodobna Twoja wersja:" << endl;
    cout << endl;

    // Natomiast patrząc na Twój program mogę się spodziewać czegoś takiego
    MojaKlasa obiekty1[4];
    obiekty1[1].setName("Obiekt 21");
    obiekty1[2].setName("Obiekt 22");
    obiekty1[3].setName("Obiekt 23");
    cout << "Rozmiar tablicy: " << sizeof(obiekty1) << endl;
    cout << "Rozmiar jednego obiektu: " << sizeof(obiekty1[1]) << endl;
    cout << endl;
    // Z tego i tak nie korzystasz a zajmuje tylko miejsce
    cout << "Nazwa "zerowego" obiektu: " << obiekty1[0].getName() << endl;
    cout << "Nazwa pierwszego obiektu: " << obiekty1[1].getName() << endl;
    cout << "Nazwa drugiego obiektu: " << obiekty1[2].getName() << endl;
    cout << "Nazwa trzeciego obiektu: " << obiekty1[3].getName() << endl;
    cout << endl;

    cout << "Skoro to dla Ciebie bez roznicy " << sizeof(obiekty1) << " czy " << sizeof(obiekty) << " bajtow";
    cin.get();
    return 0;
}
Nie pisz, że byś tak nie zrobił bo skoro stworzyłeś tablicę 11 elementową, a korzystałeś tylko z 10

kadiii pisze:Tylko, że ty wytknąłeś mi, że coś jest niezgodne ze specyfikacją języka.
Jeśli chcesz rozmawiać o specyfikacji to włącz tryb pełnej zgodności w swoim kompilatorze.
kadiii pisze:Co więcej są rzeczy, które kompilują się tylko w VS bo są niestandardowe i nie należą do specyfikacji języka.
Są też taki, które nie działają w większości kompilatorów mimo iż są w standardzie już dość długo, jak choćby słówko kluczowe: export, które obsługuje VS.

Z drugiej strony np. w Dev-ie który korzysta z gcc (podejrzewam, że nim właśnie kompilujesz), można zrobić coś takiego:

Kod: Zaznacz cały

#include <iostream>
using namespace std;

int main(int argc, char** argv)
{
    int n, m;
    cin >> n >> m;
    int t[n][m];
    for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                cin >> t[i][j];
    for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                cout << "Wpisales: " << t[i][j] << endl;
    cout << endl;
    system("pause");
    return 0;
}
jak również można napisać

Kod: Zaznacz cały

main()
zamiast

Kod: Zaznacz cały

int main()
Co też nie powinno działać i jest niezgodne z obowiązującą specyfikacją. Ale jak włączyłem tryb pełnej zgodności to już wywaliło błędy



Proponuje włączyć tryb pełnej zgodności i wtedy wypowiadać się o standardach.
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

Dobra odpiszę jeszcze, niech już będzie. Z zerowego elementu tablicy zwykło mi(i nie tylko mi, ale piszę za siebie) się wpisywać zmienną, która jest w programie niezbędna, a która jest powiązana znaczeniowo z tablicą.
Przykład żeby już wszystko było jasne.
int size_tab=10;
lub można przyjąć(to tylko umowa), że w t[0] przechowuje size_tab
taki sam rozmiar kodu wynikowego, chyba to widać. To samo gdybym miał tablicę obiektów. Gdyby znalazł się zestaw informacji, który byłby zgodny typami i ilością z pozostałymi obiektami tej tablicy to ten obiekt mozna sobie zapisać w t[0]. Powiem obrazowo żeby już całkowicie rozjaśnić. Mamy obiekt-fiszka księgarniana, w którym mamy dwa składniki cena książki i ilość i-tej książki. W informacyjnej komórce t[0] możemy więć zapisać sobie np. cena maksymalna i ilosc wszystkich książek. Chyba jasne.
Co do kompilatora - zerknij na sygnaturkę na dole posta, deva nie używam. Mogę się jednak zgodzić, że słowa standard użyłem dość obszernie i nieprecyzyjnie. Tu ci przyznaję rację. Pozdrawiam
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

tablice

Post autor: Rafal88K »

kadiii pisze:Mamy obiekt-fiszka księgarniana, w którym mamy dwa składniki cena książki i ilość i-tej książki. W informacyjnej komórce t[0] możemy więć zapisać sobie np. cena maksymalna i ilosc wszystkich książek. Chyba jasne.
Dziwnie projektujesz swoje klasy
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

tablice

Post autor: kadiii »

tylko co będzie przy przesyłaniu Twoich obiektów, których rozmiar będzie 20 razy większy.
Nic by nie było, jeśli chciałbym zapisać tam obiekt, który i tak musiałbym zadeklarować w programie(chociaż to akurat dziwna sytuacja i w obiektówce nie uzywa się raczej takich zabiegów).
Przecież to był szczegół, który jest dla niektórych uproszczeniem, ułatwieniem w pracy ze standardowymi typami danych a rozdmuchałeś to do rangi techniki programowania. Pokazałem przykład na klasie żeby przedstawić istotę a nie promować użycie tego zabiegu za każdym razem. Mam nadzieję, że się wszystko wyjaśniło. Pozdrawiam
Rafal88K
Użytkownik
Użytkownik
Posty: 311
Rejestracja: 15 mar 2007, o 16:52
Płeć: Mężczyzna
Lokalizacja: Lublin
Podziękował: 28 razy
Pomógł: 54 razy

tablice

Post autor: Rafal88K »

Jeśli miałbyś klasę książka to w zmiennej static przechowujesz ilość wszystkich książek Więc nie wiem po co Ci ten zerowy element.
ODPOWIEDZ