Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Myślę, że najłatwiej będzie przedstawić Ci konkretny przypadek:


int pyt=0, odp, i;
String []w = new String [pyt];

for (i=1; i<odp; i++)
{
w[pyt]=JOptionPane.showInputDialog("Wprowadź pytanie ("+i+"/"+odp+").");
pyt++;
String w[pyt]; // W tym miejscu ma być właśnie wers deklarujący nowy element wektora. O ten wers mi chodzi.
}

JOptionPane.showInputDialog(w[4]);


W tym programie z każdą rundką pętli for koncepcyjnie ma zostać "zadeklarowany" nowy element zadeklarowanego wcześniej wektora.
Czyt. został na początku zadeklarowany wektor posiadający 0 elementów. A w pętli for z każdą rundką chcę po prostu zwiększyć ilość jego elementów o jeden. To jest mój zamiar.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ten wiersz jest całkowicie błędny:
String []w = new String [pyt];
ponieważ pyt ma w tym miejscu wartość zero, co oznacza, że stworzysz tablicę która może przechowywać zero elementów. A tablica czegokolwiek jest obiektem nierozszerzalnym. Jedyna możliwość aby zmienna reprezentowała większą tablicę jest porzucenie tablicy dotychczasowej (śmieciarz się nią zajmie) i przypisanie
w = new String[ROZMIAR_WEKTORA]. Rozmiar wektora musi być stałą dla każdego pojedyncznego uruchomienia aplikacji bo jeżeli nie, to program będzie się zajmował wektorami różnych długości i szybko skończy się to katastrofą.
Wtedy możliwe do użycia indeksy to zakres: [0..ROZMIAR_WEKTORA - 1].
Pętla musi wtedy zawierać warunek: i < ROZMIAR_WEKTORA, a użytkownik absolutnie nie może decydować o tym ile sobie wymiarów wektora wprowadzi (to jest decyzja projektowa). Musi wprowadzić dokładnie tyle ile wymiarów ma wektor - ani mniej, ani więcej. To jest jedna operacja wprowadzania wektora.

Każdy uzyskany od użytkownika String (z dowolnej metody wejściowej) powinien być jak najszybciej skonwertowany na liczbę, sprawdzony pod względem poprawności (np. czy jest to w ogóle liczba) i wtedy wpakowany do struktury Twojego wektora pod konkretnym indeksem.

Ewentualnie Twój wektor może być tablicą rozszerzalną, czyli np. typu ArrayList<Integer>. Ale wtedy i tak górny rozmiar wektora musi być stałą dla każdego uruchomienia aplikacji.

Jeszcze lepszym sposobem jest stworzenie osobnej klasy wektor, który wewnętrznie może sobie używać tablicy, listy lub osobnych zmiennych np. typu int aby reprezentować kolejne wymiary.
Dzięki takiemu podejściu wszystkie możliwe operacje na wektorze będą mogły być spójne i skupione w jednej klasie. W tym wszelkie operacje utworzenie wektora z dowolnego źródła.
Generalnie używanie InputDialoga do wprowadzania danych złożonych jest tylko prowizorką. Do tego celu projektuje się własny komponent GUI, który pozwoli na wprowadzenie danych z klawiatury w wygodniejszy i bardziej odporny na błędy sposób, gdzie użytkownik od razu będzie widział rozmiar wektora i miał do wypełnienia wszystkie jego wymiary na raz. Oczywiście o ile wektor jest wprowadzany z klawiatury bo normalnie służy to tylko odpluskwianiu kodu.
Dane wektorów są zwykle pozyskiwane z takich urządzeń wejściowych jak tablety (digitizery), systemy przechwytywania ruchu, mysz (dla wektorów 2d) itp.

Co do nazwy, to nazwa Vector została niestety zajęta przez przestarzałą synchronizowaną tablicę dynamiczną. Dlatego aby jej użyć musiałbyś stworzyć ją we własnym pakiecie (np. com.TwójNick.math) i jeszcze uważać aby się nie pomylić w instrukcji import. Dlatego używanie nazw identycznych jak już istniejące nazwy biblioteczne nie jest zalecane dla początkujących i wciąż ryzykowne dla starych wyg. :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam szybkie pytanko (musze dzis poslac zadanie).

Pytanie dotyczy Java.

Zrobilam program, ktory wypisuje w onkie polecen (cmd) pewna ilosc cyfr, jedna pod druga. Cyfry maja 2 liczyby po przecinku. Potrzebuje czegos co sprawi, ze te cyfry beda wypisane w oknie polecen w taki sposob:

22.1
3.45
115.20

Czyli potrzebuje aby przecinki byly ulozone w linie.
Uzywam System.out.printf(bla bla), cyfry musza byc tez ograniczone do 2 po przecinku(to osiagnelam przez %.2f .

Z gory dzieki za pomoc. Przepraszam, ze jakos tak dziwnie pisze. Ucze sie programowania w innym jezyku i cos mi marnie idzie z tlumaczeniem.xd

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dotyczy C++

Mam drobny problem. Mam napisać program w kórym:
- jest tablica 2 wymiarowa, która jest wypełniana losowo cyframi z zakresu <0;9>
- jest wyszukiwana wartość minimalna każdej kolumny i jest wyświetlana razem z całą tablicą.
Napisałem to tylko że zamiast wyświetlać mi wartości minimalne kolumn wyświetla wartości minimalne wierszy. Zmieniam miejsce komendy wyświetlania wart. min. ale żadna z nich nie jest poprawna. Podaje kod:

#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main(int argc, char *argv[])
{
int tab[5][7], i, j, min;

srand(time(0));

for (int i=0; i<5; i++)
{
cout<<endl;

for(int j=0; j<7; j++)
{
tab[j]=rand()%(10);

cout<<tab[j];
}
}
cout<<endl;


for(i=0; i<5; i++)
{
min = tab[0];
for(j=1; j<7; j++)
{
if(tab[j]< min)
{
min=tab[j];

}
}
cout<<min<<endl;
}

system("PAUSE");
return EXIT_SUCCESS;
}
Mógłby ktoś zerknąć w wolnej chwili i powiedzieć jak to zrobić by działało tak jak trzeba?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 04.10.2011 o 16:58, Thalanthas napisał:

for(i=0; i<5; i++)
{
min = tab[0];
for(j=1; j<7; j++)
{
if(tab[j]< min)
{
min=tab[j];

}
}
cout<<min<<endl;
}



Ta pętla przegląda najpierw poszczególne wiersze, a później wartości w nich, dlatego są wyświetlane minimalne wartości w wierszach. Żeby sprawdzało ci wartości w kolumnach musisz albo przeglądać najpierw po kolumnach, a dopiero później po wierszach (pierwsza pętla przegląda po j a druga po i), albo wartości minimalne zapisywać w tablicy - dla każdej kolumny oddzielna wartość, np min[j], i wyświetlać tablicę na końcu.
BTW: znacznik [ i] to tag bb, dlatego nie wyświetla się na forum.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 04.10.2011 o 17:20, rob006 napisał:

Ta pętla przegląda najpierw poszczególne wiersze, a później wartości w nich, dlatego
są wyświetlane minimalne wartości w wierszach. Żeby sprawdzało ci wartości w kolumnach
musisz albo przeglądać najpierw po kolumnach, a dopiero później po wierszach (pierwsza
pętla przegląda po j a druga po i), albo wartości minimalne zapisywać w tablicy - dla
każdej kolumny oddzielna wartość, np min[j], i wyświetlać tablicę na końcu.
BTW: znacznik [ i] to tag bb, dlatego nie wyświetla się na forum.


Dzięki wielkie. Już wszystko działa. Co do [ i] to nie wiedziałem o tym. Myślałem że coś mi się w kompilatorze popsuło, ale już poprawiłem tak jak trzeba. Dzięki jeszcze raz.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 04.10.2011 o 14:59, Eilene napisał:

Zrobilam program, ktory wypisuje w onkie polecen (cmd) pewna ilosc cyfr, jedna pod druga.
Cyfry maja 2 liczyby po przecinku. Potrzebuje czegos co sprawi, ze te cyfry beda wypisane
w oknie polecen w taki sposob:

Nie bardzo mogę zrozumieć czego potrzebujesz. Zakładam, że potrzebujesz wypisać liczby z tabulatorem przecinkowym, czyli tak aby we wszystkich liczbach przecinki były dokładnie pod sobą.
Zarówno w C, C++ jak i w Javie osiąga się to dokładnie tak samo:
ciąg formatujący polecenia prinft musi mieć format %8.2f, gdzie 8 określa maksymalną liczbę cyfr jaka musi się zmieścić. Krótko mówiąc liczba przed kropką określa największą liczbę cyfr jaką zawiera jedna z wyświetlanych liczb. Jeżeli byłoby to %4.2f, to jeżeli liczba przed przecinkiem ma 1 cyfrę, to zostaną wcześniej dodane 3 spacje, a jeżeli 3 cyfry, to zostanie dodana tylko jedna spacja. W przypadku liczby z czterema cyframi nic nie zostanie dodane. Co się stanie jeżeli liczba będzie zawierać więcej cyfr niż maksymalna, to zależy od języka i jego implementacji.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 04.10.2011 o 19:18, Olamagato napisał:

/ciach/
Jeżeli byłoby to %4.2f, to jeżeli
liczba przed przecinkiem ma 1 cyfrę, to zostaną wcześniej dodane 3 spacje, a jeżeli 3
cyfry, to zostanie dodana tylko jedna spacja.


Juz sobie poradzilam (program juz dziala jak potrzeba). Wystarczylo wpisac wlasnie %8.2f i wszystkie przecineczki sa ladnie uporzadkowane. Dzieki za pomoc i odpowiedz:).
p.s. Chodzilo o tabulator przecinkowy tak jak napisales.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam

Problem pewnie prosty, ale jakoś nie mogę znaleźć rozwiązania.

double sred;
sred=(a+b+c)/3;
cout << "Srednia arytmetyczna wynosi: " << sred << endl;

np.: wklepuje jako a=2, b=3, c=3 i średnia powinna wyjść 2.(6), a wychodzi 2. Jak zrobić by wyświetlał wynik poprawny?

Za pomoc dziękuje.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 06.10.2011 o 20:55, Tomaszek92 napisał:

Witam

Problem pewnie prosty, ale jakoś nie mogę znaleźć rozwiązania.

double sred;
sred=(a+b+c)/3;
cout << "Srednia arytmetyczna wynosi: " << sred << endl;


np.: wklepuje jako a=2, b=3, c=3 i średnia powinna wyjść 2.(6), a wychodzi 2. Jak zrobić
by wyświetlał wynik poprawny?

Za pomoc dziękuje.

sred=(a+b+c)/3.0;

Pewnie a, b i c to inty. 3 to też int. Kompilator zatem robi dzielenie całkowite. Jak dasz tam 3.0 (double), to przerzutuje sumę a+b+c do double''a i dostaniesz oczekiwany wynik.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Potrzebuję napisać program wyświetlający n wierszy trójkąta Pascala. Problem mam z tym niemały (ponad rok właściwie od jakiegokolwiek programowania w szkole), a wykładowca mimo świadomości że część osób w ogóle nie programowała daje takie coś po pobieżnym opisaniu tych instrukcji...:) Bez tablic, raczej tylko z użyciem instrukcji if, for. Powinien mieć jeszcze dobrze zrobione odstepy, ale to kosmetyka, może być jak trójkąt prostokątny. Mam problem z policzeniem dwumianu newtona, wiem, że lepiej jest korzystać ze wzoru rekurencyjnego, ale mimo to, nie mogę tego wymyślić. Byłbym wdzięczny za jakąkolwiek pomoc.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../
http://pl.wikipedia.org/wiki/Trójkąt_Pascala
I niżej masz przykłady implementacji w Pascalu, C++ i Pythonie.

Ewentualnie po prostu skopiuj sobie to (ma jedną wadę - nie wyśrodkowuje tekstu i to nie wygląda jak trójkąt):
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int y = 0; y < n; y++)
{
int c = 1;
for (int x = 0; x <= y; x++)
{
cout << c << " ";
c = c * (y - x) / (x + 1);
}
cout<<endl;
}
cout<<endl;
system("PAUSE");
return 0;
}

n = liczba wierszy

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Na moim semestrze w przedmiocie Algorytmy i Struktury Danych będziemy sie posługiwać C#.

Może mi ktoś powiedzieć o tym języku i opisać czym się różni od C++?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 07.10.2011 o 21:02, Piotrbov napisał:

Na moim semestrze w przedmiocie Algorytmy i Struktury Danych będziemy sie posługiwać
C#.

O, to macie lepiej niż u mnie bo ja mam zwykłe C ;P

Dnia 07.10.2011 o 21:02, Piotrbov napisał:

Może mi ktoś powiedzieć o tym języku i opisać czym się różni od C++?

http://msdn.microsoft.com/en-us/magazine/cc301520.aspx
http://msdn.microsoft.com/en-us/library/yyaad03b(v=vs.71).aspx

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 07.10.2011 o 21:12, ziptofaf napisał:

O, to macie lepiej niż u mnie bo ja mam zwykłe C ;P


Na podobnym przedmiocie? Ja tam już jestem na trzecim semestrze.

Dnia 07.10.2011 o 21:12, ziptofaf napisał:


A tak coś od siebie? Linki to mogę sobie sam wyszukać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 07.10.2011 o 21:18, Piotrbov napisał:

Na podobnym przedmiocie? Ja tam już jestem na trzecim semestrze.

U mnie toto się programowanie nazywa bodajże. Widać też że na każdej wyższej uczelni mają nieco inną listę języków których uczą.

Dnia 07.10.2011 o 21:18, Piotrbov napisał:

A tak coś od siebie? Linki to mogę sobie sam wyszukać.

Uczciwie przyznam że uczyłem się samodzielnie tylko podstaw C#, więc zapewne moje spostrzeżenia będą niepełne:
a) kod z C# działa tylko na Windowsie.
b) C# jest bardziej nastawiony na obiektowość niż C++ i ogólnie oferuje nieco większe bazowe wsparcie dla aplikacji okienkowych.
c) Składnia zasadniczo jest podobna i przestawić się nie trudno.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować