Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dnia 20.10.2013 o 13:57, Matti299 napisał:

nie wiem czemu ale dla kodu który podałeś też otrzymuje jedną i tą samą wartośc niezależnie
od a


w scanfie musisz użyć zamiast %d to %e.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zaczynam się na uczeli uczyć javy i stąd moje pytanie- jedno z pierwszych zadań polega na wczytaniu danych do tablicy z pliku, wykonaniu dzialania na zmiennych i wpisaniu spowrotem (nawet jeśli dołożono danych).
Zał. Liczba danych max. okreslona, ale co jeśli byłaby nie określona? Jak stworzyć tablicę którą można powiększać w javie bez końca? Pytanie początkującego, dlatego proszę się nieśmiać i mozliwie wiele kodu dawać dla przykładów. :)
Zawsze otrzymywałem tutaj lepszą odpowiedź niż w google (które często zakładają, że coś się już rozumie i szuka zamiennika albo są odpowiedziami niepełnymi/dotyczącymi tematu pokrewnego).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

#include<iostream>
using namespace std;
main()
{
int x,y=0,i=0,a=1;
cout<<"Podaj liczbe elementow ciagu: ";
cin>>x;
for(i=1; i<x; i++)
{
cout<<a<<", ";
a++;
for(y=0; y<i; y++)
cout <<a<<", ";
}
return 0;
}

Program ma za zadanie wypisać x elementów ciągu w postaci 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5 itd. Gdy jednak deklaruję pięcioelementowy ciąg, zamiast wypisać "1, 2, 2, 3, 3" wypisuje właśnie powyższą kombinację. Co robię źle?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

>ciach

Za bardzo nie rozumiem o co ci chodzi? Chodzi o to masz ciąg jakiś ciąg 1,2,2,3,3,3,4,4,4,4 itd. i chcec napisać program, który drukuje pierwsze x elementów z tego ciągu?

Jeśli tak to widać od razu dlaczego masz źle. Przykład dla x=5.

Ta pierwsza pętla wywołuje się 5 razy, wartość i ma kolejno wartości 1,2,3,4,5. W niej mamy drugą pętlę, która wykonuje się tyle razy ile ma wartość i więc na początku raz, później dwa razy, później trzy razy itd.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

O rany, patrzeć w ten kod bez formatowania i z nazwami typu "i" "x" "f" to aż mózg boli. Aż rączki świerzbią do soczystego Ctrl+Shift+F :)

Program robi dokładnie to co mu napisałeś - można go nawet uprościć i zamiast tego fragmentu:
cout<<a<<", ";
a++;

W tej drugiej pętli for warunek stopu mógłbyś zamienić na <=, czyli:
for(y=0; y<=i; y++)
cout <<a<<", ";
}

Ale to tylko drobiazgi. Ogólnie to program dostaje polecenie, żeby wypisać reprezentację x liczb (gdzie x wpisuje się z klawiatury), przy czym reprezentacja liczby a to wypisanie jej a razy. Twoim problemem jest to, że wczytaną wartość traktujesz właśnie jako warunek stopu dużej pętli for. Żeby rozwiązać postawiony przez Ciebie problem, wczytana liczba powinna być takim ogólnym warunkiem stopu, niebędącym ani w warunku dużej pętli for ani małej.

Czyli to co powinieneś zrobić to warunki w obu pętlach for powinieneś zamienić na jakieś bardzo duże wartości (albo w ogóle nic tam nie wstawiać), stworzyć dodatkową zmienną licznik = 0, przy każdym wypisaniu czegokolwiek na ekran zwiększać ją o 1 i sprawdzać, czy stała się już równa x. Jeśli tak, zakończyć obie pętle - dużą i małą. Możesz to zrobić albo przez całkowite zakończenie programu albo przez jakieś atrakcje z break - możesz pomyśleć o etykietach :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 23.10.2013 o 21:31, Gumisiek2 napisał:

Program ma za zadanie wypisać x elementów ciągu w postaci 1, 2, 2, 3, 3, 3, 4, 4, 4,
4, 5, 5, 5, 5, 5 itd. Gdy jednak deklaruję pięcioelementowy ciąg, zamiast wypisać "1,
2, 2, 3, 3" wypisuje właśnie powyższą kombinację. Co robię źle?

X u ciebi enie oznacza liczby elementów do wypisania a jakie liczby ma wypisać (jak podasz 1 wypisze 1, jak podasz 2 wypisze 1,2,2, itd)
Jak chcesz aby wypisywał konkretną liczbę elementów to musisz dać jakiś licznik po każdym cout i przerwać pętlę jak osiągniesz zadaną wartość. Albo zmodyfikować drugi for do postaci for (y=0; y<a; y++), wywalić cout i a++ sprzed drugiego fora i dodać a++ po drugiej pętli for (ale jeszcze wewnątrz pierwszej). Z pierwszego for wywaalić i++ (z warunku) i umieścić to i++ po każdym coucie (wewnątrz drugiego fora).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

a jakaś wskazówka jak zrobic cos takiego suma sąsiednich elementów w tablicy dwuwymiarowej przez sąsiednie rozumiane jest nad, pod, po lewej,po prawej

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

w związku z moim powyższym postem mam kod
for(i=0; i<4; i++)
{
for(k=0; k<5; k++)
{
suma = 0;

if(i>0)
suma+= tab[i-1][k];
if(i<3)
suma+=tab[i+1][k];
if(k>0)
suma+=tab[k-1];
if(k<4)
suma+=tab[k+1];

printf("%3d\n", suma);
}
}

tylko jak zrobić z tego fragmentu kodu macierz

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 06.11.2013 o 22:20, Matti299 napisał:

/.../
tylko jak zrobić z tego fragmentu kodu macierz


Chodzi Ci o zapis tego w stylu 1 2 3
4 5 6
7 8 9
czy raczej o sumowanie? Jeśli chcesz tak wypisać to najpierw jedną pętlą przechodzisz po poziomie i wypisujesz koeljne częsci od tego poziomu np. tab[1][1] tab [2][1] tab [3][1] itp. gdzie cyframi są zmienne sterujące pętlami.

Edit. Formatowanie macierzy trochę się zgubiło.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 06.11.2013 o 22:28, Matti299 napisał:

1 2 3
4 5 6
7 8 9
taki zapis
i jakbyś mi to móg w odzie zapisać byłbym bardo wdzięczny


zróbmy testową macierz, gdzie wartość w odp. miejscach to liczby w zasadzie bezsensu, ale możesz to zmienić na dowolne

int main(){


int i,j;
/* ze względu na sposób w jaki C numeruje, tak naprawdę tablica ma rozmiar 3 w każdą stronę,ale 0 jako start */
int tab[3][3];


/* napierw przejdzie i, za każdym razem dla tego konkretnego i wywolując pętle j po 4 razy, a potem przejście do nowej lini po każdym zwiększeniu i; w ten sposób j to kolejne poziome wartości */

for(i=0;i<3;i++){
for(j=0;j<3;j++){
tab[j]=i+j;
printf(" %d",tab[j]);
}
printf("\n");
}

}


Czuje, że jest tutaj jakiś oczywisty błąd, ale o tej godzinie nie widzę już go :)
Macierz 3 na 3 jest :P

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Da się to może napisać "ładniej"?

map<unsigned int, vector<string> > *wskaznik;

Normalnie taka konstrukcja by mi nie przeszkadzała ale żeby np. dobrać się do zawartego w środku generowanej dynamicznie mapy wektora to muszę robić takie dziwactwa:
(*wskaznik)[a].push_back("hello");
A to ponieważ priorytet nawiasów kwadratowych jest wyższy niż gwiazdki.

Pierwsze co przyszło mi do głowy to oczywiście typedef:
typedef map<unsigned int, vector<string> > box;
Ale skraca to tylko deklarację obiektu do
box *wskaznik;
Wszystkie pozostałe problemy z gwiazdkami i nawiasami pozostają.

I tak się zastanawiam - da się w jakiś sposób sprawić żeby wyłuskiwanie wektora z mapy nie wymagało tak dziwacznych operacji z nawiasami? Bo to się robi aż za proste by popełnić błąd.

I nie, nie chce mi się pisać całej klasy z metodami do obsługi takiej konstrukcji, szukam czegoś nieco prostszego.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

#include <stdio.h>
#include <stdlib.h>

char tab[1000]={0};
int x;
int i;
void tekst(char tab[])
{
int i=0;
printf("Wpisz dowolny tekst: \n");

do
{
x=getchar();
tab=x;
i++;


} while(x!=10 && i<1000);
}


int znak(char tab[])
{
unsigned int a=0;
int i;
for(i=0;i<1000;i++)
{
if(tab==97) a++;
if(tab==10) return a;
}}


int main()
{


system("PAUSE");
return 0;
}



mógby to mi ktoś pomóc napisać wywołanie tych funkcji i powiedzieć czy ta funkcja znak policzy wystpienie małego a

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ć