Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Dzięki. Dużo pozycji tam nie ma, ale może to i dobrze. Będzie mniejszy wybór i mniej kasy do wydania. Zwłaszcza, że Język C#. Szkoła programowania - Klaus Michelsen, wyd. Helion [książka] (PL), (stron 1128) to w najlepszym wypadku koszt 77 zł bez przesyłki (znalazłem na Allegro osobę, u której będę mógł w weekend odebrać książkę osobiście), a w najgorszym to nawet 95 zł + przesyłka.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam. Mamy zrobić program, który będzie wczytywał zmienną, a następnie wpisywał ją w ODPOWIEDNIM miejscu do tablicy.
Na infie pan kazał nam zrobić taki program. Niestety nikt nie wie jak. Oparty na rekurencji. Jest dana tablica (np 12 komórkowa, jedna komórka wolna). Wpisujemy liczbę, która ma zostać wpisana w tablicę. Najpierw program metodą dziel i zwyciężaj ma znaleźć miejsce, gdzie ta liczba ma być wpisana (tablica jest posortowana), jeżeli liczba wpasuje się np w komórkę numer 5 i 6, to cała tablica ma być przesunięta o jedną komórkę w prawo (wtedy wszystkie komórki będą zajęte, a liczba która podaliśmy, będzie wpisana w miejsce 6).
Program mam chyba już w głównej mierze zarysdowany, ale dev c++ wyrzuca błąd w linii 17 expected unqualified-id before "return" . Nie mam pojęcia czemu, wszystko jest ok moim zdaniem. No i trzeba jeszcze wpisać pętle, by przesuwał już po wpisaniu komórki tablicy o jeden w prawo od miejsca, gdzie została wpisana zmienna.
Proszę o pomoc.


http://wklej.org/id/495372/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Odnośnie błędu masz jedną klamerkę za dużo konkretnie w linii 13.

Aha i funkcja raczej powinna zwracać nr komórki w którą chcesz wpisać nową wartość a nie zawartość tejże komórki.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

O ile masz problemy z tym przesuwaniem to te 2 liniki się tym zajmą
for (i=10;i>=poz;i--) tab[i+1]=tab;
tab[poz]= licz;

za poz wstaw zmienną z numerem komórki w którym ma ta dodatkowa liczba wylądować. i zaczyna się od 10, bo potem w trakcie obliczeń dodajemy jeden a że komórki tablicy numerowane są od zera, od jej rozmiaru trzeba odjąć 2.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

W liniii 13 musi być klamerka otwierająca ifa.
Zresztą po jej wykasowaniu błędy wyskakują w innych liniach.
Co do up - ta pętelkę trzeba włożyć za fragment
if(p<=k)
{
sr=(p+k)/2;
if(tab[sr]==s) return tab[sr]=s; CZYLI TU?
}

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.03.2011 o 08:34, Jackal-pl napisał:

W liniii 13 musi być klamerka otwierająca ifa.

Ja wywalił bym raczej tą z 16, w każdym razie masz jedną otwierającą i dwie zamykające co jest niedopuszczalne (bo stosuje się je parami, do oznaczania bloku kodu czyli funkcji, instrukcji do wykonania w przypadku if/for/inne podobne itp).

ps poszukaj w swoim IDE (dev c++ z tego co pisałeś) funkcji dopasowania nawiasów, dzięki temu po ustawieniu kursora koło nawiasu podświetli się jego para. bardzo ułatwia eliminację takich błędów.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Też właśnie zauważyłem tą w 16, ale po jej wykasowaniu nic się nie zmieniło.
Zamieszczę kod, który jest jak na razie najnowszym
http://wklej.org/id/495543/

Mam wątpliwość co do tej w/w pętli for - ją będzie chyba w innym miejscu zamieścić. No i przy niej też błąd wyskakuje. Spróbujcie u siebie ją skompilować.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

to tak aby się skompilował:
1. skasuj klamerkę w linii 14
2. wstaw klamerkę za linią 16
3. wstaw klamerkę za linią 29
4. w linii 12 zmień tab[i+1]=tab na tab[i+1]=tab[ i ]

Widzę że gubisz się w klamerkach. Najlepszy sposób aby tego uniknąć to jak tworzysz funkcję, pętlę, ifa itp wstawić od razu obie niezbędne klamerki a potem wypełniać to co ma się między nimi znaleźć. Niestety jak zapomnisz klamerki to kompilator informuje nie o jej braku a najczęściej o jakimś błędzie spowodowanym jej brakiem. Problem jest tylko taki, że błąd może być wiele linijek dalej niż brakująca klamerka i przy rozbudowanym kodzie jest bardzo ciężko to wytropić.
Moim zdaniem program i tak nie będzie robił tego co chcesz.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Oczywiście że wyskakuje, ma być for (int i=10;i>=sr;i--) tab[i+1]=tab[ i ]; samo tab jako takie na nic nie pokazuje (zwyczajnie zapomniałeś o/nie skopiowałeś [ i ] na końcu (tuż przed średnikiem).
W każdym razie ta pętla u mnie nie tylko się kompiluje ale i prawidłowo wstawia liczbę w szereg.

ps na przyszłość proponował bym podawać treść komunikatu o błędzie

pps pousuwaj spacje w nawiasach kwadratowych, forum uznało argumenty tablicy za rozpoczęcie kursywy

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ok, program kompiluje się i wstawia liczbę, ale nie tam gdzie ma być. Przykładowo 50. Tablica na końcu jest taka:
10,20,30,40,50,60,50,70,80,50,90,50...
No i na początku jest -1, to zapewne wynik linii 17 (else return -1), zatem liczba w ogóle nie kwalifikuje się do pętli po jakimś kroku.
Trzeba pogłówkować jeszcze, pooglądam to, a jak coś znajdę to napiszę.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.03.2011 o 12:02, Jackal-pl napisał:

Ok, program kompiluje się i wstawia liczbę, ale nie tam gdzie ma być. Przykładowo 50.
Tablica na końcu jest taka:
10,20,30,40,50,60,50,70,80,50,90,50...
No i na początku jest -1, to zapewne wynik linii 17 (else return -1), zatem liczba w
ogóle nie kwalifikuje się do pętli po jakimś kroku.
Trzeba pogłówkować jeszcze, pooglądam to, a jak coś znajdę to napiszę.


podpowiem tak jak ja to widzę:
1. tworzysz funkcję rekurencyjną, która zwraca pozycję pierwszej liczby większej od szukanej
2. rozsuwasz tablicę metodą podaną przez s1ga
3. w miejsce znalezionego indeksu wstawiasz zadaną liczbę

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.03.2011 o 12:48, Jackal-pl napisał:

No, prawie działa, tylko jeszcze od pierwszej komórki wpisuje podaną liczbę :)
Jeszcze drobniutka jakaś modyfikacja i będzie git!
http://wklej.org/id/495632/

ale tylko z liczbami 10-100... ;) w sensie 10, 20 , 30 itd


jak już nie będziesz miał pomysłu to masz gotowe rozwiązanie (działa z dowolną liczbą która mieści sie w incie)

http://wklej.org/id/495648/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam. Mam taki całkiem poważny ( jak dla mnie ) problem w C++.

Otóż jak zrobić, by zapisywać różne nazwy do tablicy stringów, gdy chcemy, by każdy numer tablicy odpowiadał kolejnemu łańcuchowi znaków, który został wpisany?
Ogólnie to oprócz tego w ogóle nie wiem jak zrobić punkt, w którym wszystkie klasy, miały możliwość zapisywania i odczytywania stanu obiektów na dysku.
I jeszcze o co chodzi w ogóle z kopiowaniem obiektów?


Ech... o wiele za późno się wziąłem za ten projekt. Ogólnie to mam odwzorować ( tak ogólnie na razie ) obiektowo bibliotekę, 3 klasy ( główna, statyczna, dynamiczna ).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jeżeli chodzi o kopiowanie obiektów to może oznaczać ono przypisanie jednej zmiennej obiektowej do drugiej. Mamy np. klasę:
class CNaszaKlasa
{
public:
int wartosc;
};
tworzymy sobie dwa obiekty tej klasy:
CNaszaKlasa nk1;
CNaszaKlasa nk2;
każdemu przypisujemy inną wartość:
nk1.wartosc = 1;
nk2.wartosc = 2;
W pamięci mamy teraz dwa obiekty nk1 i nk2 "różniące" się wartościami. Po przypisaniu:
nk1 = nk2;
Zostaje zniszczony obiekt nk1 i na jego miejsce powstaje nowy obiekt nk1 bedący dokładną kopią obiektu nk2 (nk1.wartosc==2.) Przy czym obiekty pozostają niezależne od siebie. Gdybyśmy zrobili to ze wskaźnikami:
CNaszaKlasa1* nk1;
CNaszaKlasa2* nk2;
nk1 = nk2;
to wskaźnik nk1 wskazywałby na obiekt CNaszaKlasa2 tak samo jak wskaźnik nk2. Na CNaszaKlasa1 nic by nie wskazywało. :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Hym... Dzięki sprawdzę, tylko nie wiem czy właśnie o to chodzi. Mam napisane, że mam "rozważyć realizacje konstruktora kopiującego, lub użycie standardowego konstruktora kopiującego".
A co jeszcze, na przykład z zapisywaniem danych z obiektu do pliku?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam.

W poleceniu do projektu mam napisane, żeby we wszystkich konstruktorach i destruktorach wstawić kod drukujący na ekran informacje o wywołaniu ( pod zmienną kompilacji TESTP ).

Co to jest ta zmienna kompilacji? Jak to zrobić?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 27.03.2011 o 15:28, Piotrbov napisał:

Co to jest ta zmienna kompilacji? Jak to zrobić?


Myślę, że tak:

CBiblioteka :: CBiblioteka() // konstruktor klasy
{
#ifdef TESTP
cout << "wywolanie konstruktora klasy CBiblioteka";
#endif

// kod konstruktora
}

z tym, że wcześniej musisz zdefiniować makro TESTP:

#define TESTP

jeżeli tego nie zrobisz instrukcja ''cout'' nie zostanie dołączona do kodu programu podczas kompilacji. :)

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ć