tablice
-
- 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
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
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
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
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;
}
-
- 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
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
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
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
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 :
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:
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.
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++; }
Przykład:
Kod: Zaznacz cały
int a=5,b=5;
if(a>=b) cout<<"TAK";
else if(b>=a) cout<<"NIE";
-
- 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
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ę
a jeszcze lepiej skorzystać z kontenera vector
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;
}
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;
}
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
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
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.
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
Nie wiem, może to była nadinterpretacja, ale tak zrozumiałem i dlatego skrytykowałem nieodpowiednią według mnie postawę.wszystko fajnie ale masz blad
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.
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.Napisz program, który wczyta dane z klawiatury do 10-cio elementowej
tablicy liczb double
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
-
- 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
Zgodzę się z Tobą, ale ja napisałem parę uwag na temat programu.kadiii pisze:Wiesz ja uważam, że jeśli czegoś nie potrafię zrobić to kiedy otrzymuje pomoc nie krytykuje jej bez odpowiedniego zastanowienia.
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:kadiii pisze:pierwszym(czyli zerowym) elemencie często się coś przechowuje odnośnie całej tablicy
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;
}
Kod: Zaznacz cały
funkcja(t, 3);
Kod: Zaznacz cały
funkcja(&t[1], 3);
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ąkadiii pisze:Co do tego vectorów to raczej nie ma potrzeby go używać do tak krótkiego programu
No niestety muszę Cię zdziwić bo nie wszystkie tak robią.kadiii pisze:Jak nie napiszesz int przed main to kompilator go przyjmie domyślnie.
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
A ty widzę dalej swoje Niech ci będzie.
Jeszcze jakieś uwagi? Trochę szkoda czasu na prostowanie faktów.
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.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ć.
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).tylko co będzie przy przesyłaniu Twoich obiektów, których rozmiar będzie 20 razy większy.
Czyli poprawiłeś sam siebie w rzeczy, która nie była oczekiwana? Przecież pisałem, że tablica miała być stała.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ą
a wcześniejNo niestety muszę Cię zdziwić bo nie wszystkie tak robią.
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.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
Jeszcze jakieś uwagi? Trochę szkoda czasu na prostowanie faktów.
-
- 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
Nie poprawiłam sam siebie tylko napisałem 2 możliwości rozwiązania lepszą i gorszą.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 stosuje się czegoś takiego jak rozmiar tablicy w zerowym elemencie Po co Ci ten rozmiar jest masz pojemnik vector?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.
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.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).
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;
}
Jeśli chcesz rozmawiać o specyfikacji to włącz tryb pełnej zgodności w swoim kompilatorze.kadiii pisze:Tylko, że ty wytknąłeś mi, że coś jest niezgodne ze specyfikacją 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.kadiii pisze:Co więcej są rzeczy, które kompilują się tylko w VS bo są niestandardowe i nie należą do specyfikacji języka.
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;
}
Kod: Zaznacz cały
main()
Kod: Zaznacz cały
int main()
Proponuje włączyć tryb pełnej zgodności i wtedy wypowiadać się o standardach.
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
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
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
-
- 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
Dziwnie projektujesz swoje klasykadiii 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.
- kadiii
- Użytkownik
- Posty: 642
- Rejestracja: 20 gru 2005, o 21:04
- Płeć: Mężczyzna
- Lokalizacja: Wrocław
- Pomógł: 130 razy
tablice
tylko co będzie przy przesyłaniu Twoich obiektów, których rozmiar będzie 20 razy większy.
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. PozdrawiamNic 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).