Zaloguj się, aby obserwować  
Bartuc

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

1979 postów w tym temacie

Mam taki problemik i nie wiem co z nim zrobić.
Piszę w C.

Jak mam jakąś tablicę charrów, to jak zrobić, by tylko pewną część, np. pierwsze 16 znaków przekopiować do innej tablicy, jest jakiś inny sposób, niż pętlą for?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 19.01.2013 o 00:23, Piotrbov napisał:

Mam taki problemik i nie wiem co z nim zrobić.
Piszę w C.

Jak mam jakąś tablicę charrów, to jak zrobić, by tylko pewną część, np. pierwsze 16 znaków
przekopiować do innej tablicy, jest jakiś inny sposób, niż pętlą for?


tu masz opisane funkcje: http://www.gnu.org/software/libc/manual/html_node/Copying-and-Concatenation.html#Copying-and-Concatenation albo po polsku są tu: http://pl.wikibooks.org/wiki/C/Biblioteka_standardowa/Indeks_tematyczny#string.h interesuje Cię funkcja strncpy() lub ewentualnie memcpy(). Jeśli chcesz kopiować np od 4 znaku musisz podać jako tablice z której chcesz kopiować wskaźnik na 4 element (czyli np tablica+3)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Mam problem z zadaniem ćwiczeniowym w Visual Studio. Podobne zadanie będzie na moim kolokwium zaliczeniowym, jednak od 2 tygodni jestem na zwolnieniu lekarskim i nie mam pojęcia co mam zrobić. Czy ktoś może mi wyjaśnić, jak zrealizować poniższe zadanie?

Utworzyć nowe rozwiązanie o nazwie NazwiskoStudentaSOLUTION oraz nowy projekt MFC oparty na oknie dialogowym o nazwie SamochodPROJECT. Zadaniem aplikacji jest umożliwienie wyświetlenia danych o samochodzie oraz ich aktualizację przy wykorzystaniu dwóch okien dialogowych opisanych poniżej. Uwaga: Dla każdej kontrolki zakłada się odpowiednią zmianę nazwy jej identyfikatora ID.

Okno dialogowe pierwsze (ID = IDD_FIRST_DIALOG)
 Nazwy zmiennych związanych z odpowiednimi polami edycyjnymi: m_nazwisko, m_marka, m_kolor, m_km, m_rok
 Przycisk Zmień powoduje wyświetlenie okna dialogowego, w którym możliwa jest aktualizacja danych o samochodzie.

Okno dialogowe aktualizacji (ID = IDD_AKTUALIZACJA_DIALOG)
 Nazwy zmiennych związanych z odpowiednimi kontrolkami:
- pole edycyjne zawierające nazwisko: m_nazwisko
- kontrolka List Box pozwalająca wybrać markę: m_marka, m_marka_ctrl
- przyciski Radio Button pozwalające wybrać jeden z kolorów:
m_kolor_czerwony, m_kolor_niebieski, m_kolor_czarny, m_kolor_srebrny
- kontrolka Combo Box pozwalająca wybrać liczbę koni mechanicznych m_km, m_km_ctrl
pole edycyjne zawierające rok: m_rok
 Przycisk OK powoduje zamkniecie okna dialogowego aktualizacji i wyświetlenie wybranych przez użytkownika aktualnych danych o samochodzie w oknie pierwszym

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Może być z tym problem bo wygląda na to że zadanie jest oparte o jakieś przykładowe rozwiązanie czy klasy/struktury z wykładów i musisz sięgnąć do nich żeby dowiedzieć się o jakieś konkrety. Ewentualnie podpytaj kolegów/koleżanki z roku moze wykładowca coś wspominał albo oni wiedzą o co chodzi dokładniej.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Ktoś chętny na napisanie programu w C? Odpłatnie.

Treść:
Napisać program w języku C, który realizuje następujące funkcje:
1. Program jest bazą danych rozgrywek World Series of Boxing (WSB).
2. Wszystkie zasady obliczania punktów i tworzenia rankingu są zgodne z zasadami WSB (www.worldseriesboxing.com).
3. Baza danych przechowuje następujące informacje:
a) listę reprezentacji
b) wyniki poszczególnych meczy rozegranych pomiędzy reprezentacjami
4. Użytkownik może wprowadzać, modyfikować i usuwać dane z bazy danych.
5. Dane w bazie danych są zapamiętywane na dysku w postaci plików.
6. Program umożliwia na każdym etapie wprowadzania danych wyświetlić aktualną tabelę z rankingiem reprezentacji.

EDIT: Najlepiej z pełnym opisem co jest co. Muszę to mieć na 28 stycznia.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Witam , potrzebuje kogoś , kto napiszę mi jutro od około 8:15 program w C++. Nic super zaawansowanego , definicja klasy (konstruktory kopiujące i przypisania ,**tab), 25-30 min roboty. Oczywiście zapłacę jeśli program będzie poprawnie napisany. Osoby zainteresowane proszę o kontakt : diego26pl@gmail.com

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Napisz i uruchom program, który wczyta 1 kilka liczb rzeczywistych do tablicy
TAB[Max] (Max=1000), następnie wyprowadzi te liczby w wyrównanej
kolumnie. W programie kontroluj, aby zadany rozmiar tablicy nie przekroczył
maksymalnego.

Czy moglby mi ktos pomoc i napisac kod jak ten program wyglada bo za uja nie moge zrozumiec o co tu chodzi ;/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 26.02.2013 o 11:32, suchy9999 napisał:

Napisz i uruchom program, który wczyta 1 kilka liczb rzeczywistych do tablicy
TAB[Max] (Max=1000), następnie wyprowadzi te liczby w wyrównanej
kolumnie. W programie kontroluj, aby zadany rozmiar tablicy nie przekroczył
maksymalnego.

Czy moglby mi ktos pomoc i napisac kod jak ten program wyglada bo za uja nie moge zrozumiec
o co tu chodzi ;/


Pomóc - czemu nie. Napisać za ciebie kod - co to, to nie. Nawet języka zresztą nie podałeś... Wstępnie uznam że C++, jak miał być inny to cóż, nie mój problem ^^

Żeby napisać ten program musisz mieć dwie rzeczy:
- długość największej z liczb żeby pod nią dostosować szerokość kolumny
- funkcję która potrafi zmieniać szerokość kolumny (np. setw() w c++ albo po prostu napisać samemu coś co dodaje spacje na początku)

Jedziemy dalej - maksymalnym rozmiarem tablicy ma być tysiąc.

Czyli robisz to tak:
int TAB[1000];
cout << "Podaj rozmiar tablicy: ";
cin >> rozmiar;
if (rozmiar>1000){cout << "Zbyt wiele elementow!";}
else
{
reszta programu
}
return 0;
}

Idźmy dalej - poznanie długości liczby można zrobić na dwa sposoby - albo najpierw stworzyć sobie stringa i wczytywać każdą liczbę jako ciąg znaków - wtedy należy zastosować funkcję .length() i stworzyć drugą tablicę pomocniczą do której wrzucisz te same wartości ale już jako liczbę a nie jako znaki. Efektem będzie takie coś:

http://imgur.com/w9Zjzyd

Będziesz do tego potrzebować też takiej funkcji:

double string_to_double( const std::string& s )
{
std::istringstream i(s);
double x;
if (!(i >> x))
return 0;
return x;
}


Ewentualnie idziemy drogą na skróty - liczby rzeczywiste to zapewne będzie typ double. Mają one do 15 miejsc po przecinku. Po prostu na stałe upchnąć pod każde cout << setw(32) << liczba; I wtedy masz pewność że kolumny będą tej samej szerokości. Fakt że to zdecydowanie nie będzie estetyczne.
Przykład:
http://i.imgur.com/hfgtJtP.jpg (setw(10);)

Pewnie jest też szybsza metoda żeby sobie łatwo znaleźć po prostu długość double''a zamiast bawić się ze stringami ale nie chce mi się więcej wymyślać.

http://pastebin.com/5aj6Uq51 - a jeśli już naprawdę nie chce ci się myśleć. Oczywiście program nie sprawdza wszystkich twoich założeń i nieszczególnie interesuje go czy planujesz wsadzić mu i 10000 liczb. Po prostu się wtedy zawiesi. Dodatkowo ma jeszcze jakąś pustą pętlę, pozostałość po moim 2 minutowym programowaniu i niedokładnym usuwaniu śmieci.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Czesc mam taki problem poniewaz wpisalem funkcje

int wyswietl_liczby( double *t_tab_[] )
{
for (int i =0; i < MAX_TAB_SIZE; i++){
cout << t_tab;
}
return 0;
}

i teraz ja wywoluje ale nie wiem czy dobrze to robie

wyswietl_liczby(double t_tab_[]);jakby kto mogl mi podpowiedziec jak to sie robi albo ja wywolac funkcje ta gorna

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Funkcja powinna być zadeklarowana:
int wyswietl_liczby( double *t_tab)

i wywołujesz ja:

wyswietl_liczby (tablica)
gdzie tablica to nazwa twojej tablicy z której chcesz wyświetlić liczby

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

/.../

Ja to się zastanawiam co ta twoja dziwna funkcja ma robić. Bo to przecież nie ma prawa działać.

Po pierwsze - double *t_tab_[] to wskaźnik... na wskaźnik do double. Równie dobrze możesz wpisywać double** tab, efekt jest ten sam. Jesteś pewny że tego właśnie potrzebujesz?

Dlaczego? Otóż tworząc np. takie coś:
int tab[3]; musisz zrozumieć że nazwa tablicy jest jednocześnie wskaźnikiem na jej pierwszy element. I w funkcji wystarczy zrobić takie coś:
int wyswietl_liczby(int tab[]){}, znaczek gwiazdki nie jest potrzebny.


Co jednocześnie oznacza że z takimi rzeczami powinieneś być bardzo ostrożny:
int zmienna(double xyz_tab[])
{
xyz_tab[1]=18.66;
return 0;
}
int main()
{
double tablica[2]={11.2, 13.3};
zmienna(tablica);
cout << tablica[1];
}

Co pojawi się jako wynik ostatniego cout? 18.66. I to mimo tego że teoretycznie początkowo było 13.3. Czemu tak jest? Bo przekazując tablicę do funkcji możliwa jest modyfikacja oryginału. Dlatego najbezpieczniej jest dodawać zwrot const przy używaniu tablicy jako argumentu, inaczej może dojść do niezbyt przyjemnych efektów ubocznych.

Idziemy dalej:
cout << t_tab;

Co to jest t_tab? Nie zdefiniowałeś czegoś takiego.
Ja widzę tylko t_tab_ a to nie to samo. No i co to w ogóle ma robić?
Jest sobie pętla. Która ma się uruchomić i razy gdzie i jest mniejsze od MAX_TAB_SIZE (no właśnie, czemu tutaj nie ma definicji MAX_TAB_SIZE, ustawiłeś to jako zmienną globalną... ?). I teraz krok po kroku, co się w tej pętli ma dziać?

Dajesz cout << t_tab; Ale...

Pomyśl co właśnie zrobiłeś. Nie utworzyłeś pojedynczej zmiennej typu double o nazwie t_tab a tablicę dla nich. Tablicę z indeksem. Wiesz co wyświetli ci ten cout? ADRES pod którym znajduje się pierwszy element tablicy. Nawet nie sam element. A jego adres. Poprawną formą cout jest cout << t_tab[n] gdzie n nie może wykraczać poza zasięg/rozmiar tablicy. W twoim przypadku należałoby to uzależnić od samej pętli ze zmienną i która w końcu z każdym wykonaniem będzie rosnąć.

Czyli cout << t_tab[i1]; - bez tej jedynki, samo i, po prostu to forum nie lubi stosowania tego znaku.

I wtedy rzeczywiście, z każdym kolejnym wykonaniem pętli zostanie wyświetlony kolejny element tablicy t_tab.

Rozwijając nieco temat - pewnym wyjątkiem w tej dziedzinie jest string:

string s="czarna krowa w kropki bordo";
cout << s; - to wyświetli ci całe "czarna krowa w kropki bordo".
cout << s[0]; - a to wyświetli ci tylko "c".
for (int a=0; a<=s.length(); a++)
{
cout << s[a];
} - z kolei taka pętla działa równoznacznie z pierwszą wersją instrukcji, cout << s;
String w C++ jest takim rozbudowanym interfejsem dla tablicy i rzeczywiście, dziwny kod który napisałeś wcześniej na niej by się skompilował i działał wyświetlając zawartość tablicy a nie jej adres.

I potencjalnie jest możliwym by twoja instrukcja cout << t_tab; działała poprawnie i się kompilowała ale wymagałoby to programowania na zdecydowanie wyższym poziomie niż twój obecny, musiałbyś najlepiej wykorzystać do tego wektory i przeciążyć operator <<. Nie wiesz nawet co to znaczy? To na razie sobie daruj ;)

A i jeszcze jedno - jak już programujesz w C++ to daruj sobie zwykłe tablice i zacznij korzystać z wektorów (mogę się rozpisać na ich temat jeśli się tym zainteresujesz). Oszczędzisz sobie pracy i zgrzytania zębami - wektory mogą do woli zmieniać swoje rozmiary z pomocą prostych funkcji, poza tym "znają" też swoje rozmiary i nie musisz tego osobno przekazywać w zmiennej.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jak w języku c zrobić by wypisywało mi znak - w pętli nieskończonej koło siebie (coś takiego ---------------)? By sprawiało wrażenie ruchu. Da się?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 03.03.2013 o 13:32, ziptofaf napisał:

A i jeszcze jedno - jak już programujesz w C++ to daruj sobie zwykłe tablice i zacznij
korzystać z wektorów (mogę się rozpisać na ich temat jeśli się tym zainteresujesz). Oszczędzisz
sobie pracy i zgrzytania zębami - wektory mogą do woli zmieniać swoje rozmiary z pomocą
prostych funkcji, poza tym "znają" też swoje rozmiary i nie musisz tego osobno przekazywać
w zmiennej.


O, jeżeli nie stanowiłoby to problemu to mógłbyś napisać o tym coś nie coś.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 06.03.2013 o 20:21, Islanzi napisał:

O, jeżeli nie stanowiłoby to problemu to mógłbyś napisać o tym coś nie coś.



Oki ^^ Mam nadzieję że zdołasz zrozumieć co piszę bo co innego umieć coś stosować a co innego to wytłumaczyć xD

Wektor czyli wysokopoziomowa tablica. Wymaganiem wstępnym by go użyć jest #include <vector>

Jego utworzenie jest dosyć proste. Odpowiednikiem instrukcji:
int tab[10];
jest
vector<int> tab(10);
Praca na nim jest identyczna jak na typowej tablicy. Czyli tab[0] wywoła pierwszy element, tak samo działają też wszystkie inne polecenia.

A teraz zalety:

Po pierwsze, wektor zna swój rozmiar. Co upraszcza choćby taką operację:
vector<int> misio(10);

for (unsigned int a=0; a<misio.size(); a++)
{
cin >> misio[a];
}

Tak samo przy przekazywaniu wektora do funkcji nie musisz osobno podawać jego rozmiaru.

Kolejną zaletą jest prostsza manipulacja rozmiarem wektora.

Dajmy na to że w C++ chcesz utworzyć tablicę dynamiczną. Której rozmiaru nie znasz.

To co robisz?
int *tablica = new int[n];
A potem trzeba jeszcze pamiętać o delete.

Tutaj jeszcze problemu nie ma. Ale dajmy na to że nie będzie zapytania o ilość elementów w tablicy w trakcie działania programu, ma je wczytywać do czasu aż elementem nie będzie np. -1. I co więcej, nie chcesz marnować pamięci. Czyli tablica ma mieć dokładnie tyle samo elementów ile mieć powinna, bez pustych miejsc.

W przypadku wektora jest to zaskakująco proste:

vector<int> tablica(0);
for (int a=0; ; a++)
{
int element;
cin >> element;
if (element!=-1){tablica.push_back(element);} else {break;}
}

Istotną funkcją w tym jest push_back(element) - dodaje na końcu wektora element podany w nawiasie. Która potem jest zastępowana przez to co właśnie wpisujesz. Odczytanie zawartości takiego wektora potem polega po prostu na takiej pętli:

for (int a=0; a<tablica.size(); a++)
{
cout << tablica[a];
}

I proszę, mamy gwarantowany rozmiar. W ledwie kilku linijkach. A jak to zrobić ze zwykłymi tablicami...? Oj, będziesz mieć zabawy z tymi new. Ja bym to już robił wtedy na czymś pokroju drzewa binarnego i łączył je ze sobą. Długie, nieefektywne i absolutnie bez sensu.

W sumie możesz zamiast vector<int> tablica(0) wpisać samo vector<int> tablica, nie musisz podawać początkowego rozmiaru wektora jeśli planujesz dodawać elementy z samym push_back().

Oczywiście, takie spamowanie push_back() nie jest optymalne pod kątem wydajności bo jednak robi się przez to sporo biegania po pamięci. Ale na szczęście mamy więcej przydatnych poleceń z których mogą skorzystać wektory. Jednym z nich jest resize() którego można użyć do pomniejszenia wektora.

vector<double> tablica(100);
tablica.resize(50);

Czyli jak najbardziej możemy sobie przygotować zazwyczaj za duży wektor i po wczytaniu danych po prostu go sobie zmniejszyć. A jeśli jednak zaczniemy wykraczać poza przewidziany zakres to z pomocą push_back() można poradzić sobie z tym problemem.

Albo nawet możemy pousuwać z tablicy niepotrzebne elementy - pop_back() usuwa ostatni element tablicy, z kolei erase() pozwala usuwać konkretne obiekty:

tablica.erase(tablica.begin()+1); - usunie drugi element z tablicy. begin(), jak łatwo zgadnąć, zwraca adres pierwszego elementu. Można też zrobić tak:
tablica.erase(tablica.begin()+1, tablica.begin()+3) - a to z kolei usunie elementy od 2 do 4.

Normalnie żeby coś takiego zrobić na zwykłych tablicach, np. przefiltrować je i usunąć niektóre elementy... oj, nie obędzie się bez drzewka binarnego i potem jeszcze odpowiednio ze sobą łączyć gałęzie żeby po takim karczowaniu zachować działającą strukturę. Albo tworzyć drugą tablicę pomocniczą i przepisywać elementy... co kosztuje nas dużo czasu i pamięci.

A tutaj? Wszystko ładne i estetyczne. Nie musimy się martwić o delete[], pisać funkcji długich na kilometr, martwić wyciekami pamięci itd.

Co więcej, vector jest chyba jedynym sposobem na stworzenie tablic szarpanych w C++. Czyli takich które wyglądają np tak:

1 2 3
1 2
1 3 5 6
1 6 9 4 7

Mamy 4 kolumny mające od 2 do 5 elementów. Na zwykłej tablicy... się nie da. No dobra, w sumie to się da. O tak.

int* tab[4];

tab[0] = new int[3];
tab[1] = new int[2];
tab[2] = new int[4];
tab[3] = new int[5];

A i potem jeszcze:
delete [] tab[0];
delete [] tab[1];
delete [] tab[2];
delete [] tab[3];

Fajne, nie? Zwłaszcza te delete mi się podobają ;) A teraz powiedzmy że nie wiesz ile tych elementów ma być do czasu aż nie zostaną wprowadzone. Kod się robi naprawdę fajny a przecież na pewno to tylko mała część problemu, to tylko wprowadzanie danych które dopiero potem poddamy obróbce!

W sumie nawet z wektorami takie rzeczy są dość trudne do zrobienia. Pierwszą metodą jest stworzenie wektora wektorów czyli wysokopoziomowego odpowiednika tablic. Na nasze nieszczęście w dopiero C++0x takie coś jest łatwe.
Na razie trzeba tak:

template<typename T>
struct vecvec {
typedef std::vector< std::vector<T> > type;
}; - wstawiamy to nad mainem.


I w samym mainie:
vecvec<int>::type intSequences;

Ewentualnie tak, jeśli nie lubisz szablonów, wtedy w samym mainie:
vector< vector<int> > vec(4, vector<int>(4)); - te spacje są nieprzypadkowe. Nie ruszy bez nich. Dlatego wolę vecvec.


Proszę, dwuwymiarowy wektor. Działają na nim wszystkie push_back i reszta poleceń. Mimo tego że dziwnie to wygląda to pracuje się na nich dość normalnie:
vec[2][3] = 10;
Albo lepszy przykład:

vector< vector<int> > vec; // główny wektor

for (int i = 0; i < 10; i++) {
vector<int> row; // Tworzysz pusty wiersz
for (int j = 0; j < 20; j++) {
row.push_back(i * j); // Dodajesz kolumnę do wiersza
}
vec.push_back(row); // Dodajesz wiersz do głównego wektora
}

Nie powiem że jest to wyjątkowo wygodne. Ale na pewno lepsze niż pisanie kilkudziesięciu linii jeśli próbować tego na tablicach.

Ogólnie jeśli już programujesz w C++ to staraj się korzystać z jego rozwiązań a nie pierwowzorów z C. Z innych bardzo przydatnych rzeczy które warto poznać są #include <map>
http://www.cplusplus.com/reference/map/map/

Dzięki temu można np. w kilkanaście linii kodu napisać program który zliczy wszystkie litery które pojawiły się w danym tekście.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 06.03.2013 o 00:14, Dregorio napisał:

Jak w języku c zrobić by wypisywało mi znak - w pętli nieskończonej koło siebie (coś
takiego ---------------)? By sprawiało wrażenie ruchu. Da się?


Może chodzi ci o coś innego niż mi ale to przecież jest nieziemsko proste. Kod w C++ ale podejrzewam że zamienić cout na printf dasz radę:
for (;;){
sleep(50); - żeby to nie zasyfiło całego ekranu w sekundę. // zależnie od kompilatora i używanego systemu czasem będzie to _sleep, czasem Sleep, czasem sleep. Niezbędna biblioteka to albo dos.h albo windows.h albo time.h. A przynajmniej sądzę że to chyba któraś z nich :D
cout << "-";
}
I proszę. Robi to co chcesz xD

No chyba że chcesz zrobić takiego ruchomego wężyka.

To wtedy możesz użyć np. system("cls"), co wymaga biblioteki cstdlib. I po prostu robisz tak:
for (int a=0; ; a++)
{
sleep(50);
for (int b=0; b<=a; b++)
{
cout << " ";
}
cout << "-------";
system("cls);
}

Najpierw dodaje spacje których za każdym razem będzie coraz więcej a potem znaki "-". A potem ekran jest czyszczony i zabawa zaczyna się od nowa. Z tym że spacji jest więcej co daje wrażenie ruchu.

I co to w ogóle za pytanie czy się "da". Wszystko się da. Kwestia chęci i wysiłku.

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ć