Misiek Napisano 13 Maja 2009 Udostępnij Napisano 13 Maja 2009 chodzi o to zeby najpierw sobie napisac rekurencyjnie metode silni, a potem rekurencyjna wersje metody obliczajacej podane wyrazenie - w ten sposob mamy rekurencje w rekurencji (pomijam fakt efektywnosci takiego dzialania ) nie znam skladni c++, ale w javie wygladaloby to mniej wiecej tak: public class cos { private static int silnia(int n) { if (n == 0) return 1; else return n*silnia(n-1); } private static double count(int n, double x) { if (n == 0) return x; else return x/silnia(n); } public static void main(String [] args) { int n = 5; double x = 2.5; System.out.println("Policzmy wartosc dla "+n+" , "+x); System.out.println(count(n, x)); } } a tam nie powinno w tym count być jakoś x*n/silnia(n), bo wzór jest xn/n! Cytuj Odnośnik do komentarza
Fenomen Napisano 14 Maja 2009 Udostępnij Napisano 14 Maja 2009 ja myslalem ze xn oznacza x z indeksem n a nie iloczyn x i n ale to juz przeciez szczegol implementacyjny - najwazniejsze zeby ogolne podejscie bylo wlasciwe Cytuj Odnośnik do komentarza
Fenomen Napisano 20 Maja 2009 Udostępnij Napisano 20 Maja 2009 orientuje sie ktos jak w matlabie naniesc na wykres 3d punkty pomiarowe? Cytuj Odnośnik do komentarza
Vitaliss Napisano 23 Maja 2009 Udostępnij Napisano 23 Maja 2009 Mam napisac taki program: Napisz program wypełniający tablicę a[3,4] wartościami wczytanymi z zewnątrz i znajdujący wartość największą oraz położenie. Naskrobałem takie cos: #include <iostream> using namespace std; int main() { int a[4][3], i, j; for (i=0; i<4; i++) { for (j=0; j<3; j++) { cout << "Podaj a[wiersz nr " << i+1 << ", kolumna nr " << j+1 << "]: "; cin >> a[i][j]; } } cout << "Pierwszy wiersz: "; for (i=0; i<3; i++) { cout << a[0][i] << " "; } cout << endl; } Wyniki otrzymuje takie: KLIK Czyli nie do konca jest to dobrze.Tablica nie jest uzupelniona do konca. Co poprawic? Praktycznie jest to mój pierwszy "poważny" program w c++. W ogóle to pierwszy raz mam stycznośc z programowaniem. Cytuj Odnośnik do komentarza
Vitaliss Napisano 23 Maja 2009 Udostępnij Napisano 23 Maja 2009 ..... Problem rozwiązany. Cały mankament był w tym jak ja wprowadzałem dane.... Nie moge zaedytowac poprzedniego posta Cytuj Odnośnik do komentarza
Vitaliss Napisano 24 Maja 2009 Udostępnij Napisano 24 Maja 2009 Jeszcze jeden problem: teraz wogóle program nie działa "Napisz program wypełniający tablicę a[3,4] wartościami wczytanymi z zewnątrz i znajdujący wartość największą oraz położenie" Tak to wygląda: #include <iostream> using namespace std; int main(){ int a[3][4]; int i,j; int max, posx,posy; for(i=0;i<3;i++){ for(j=0;j<4;j++){ cout << "\nPodaj element a[" << i << "][" << j << "]"; cin >> a[i][j]; } } max = a[0][0]; posx=0; posy=0; for(i=0;i<3;i++){ for(j=0;j<4;j++){ if(a[i][j]>max){ max = a[i][j]; posx=i; posy=j; } } } cout << "Max: a["<<posx<<"]["<<posy<<"] = " << max << endl; return 0; } Wywala błąd w 27 linii. Unterminated string or character constans possible real start of unterminated constans. O co biega? Cytuj Odnośnik do komentarza
lindros Napisano 24 Maja 2009 Udostępnij Napisano 24 Maja 2009 Może małe oszustwo popełnij: #include <iostream> using namespace std; int main(){ int a[3][4]; int max = 0 , posx = 0, posy = 0; for(int i=0;i<3;i++){ for(int j=0;j<4;j++){ cout << "\nPodaj element a[" << i << "][" << j << "]: "; cin >> a[i][j]; if(a[i][j]>max){ max = a[i][j]; posx=i; posy=j; } } } cout << "Max: a["<<posx<<"]["<<posy<<"] = " << max << endl; system("PAUSE"); return 0; } Cytuj Odnośnik do komentarza
Vitaliss Napisano 24 Maja 2009 Udostępnij Napisano 24 Maja 2009 ha dalej to samo. Hmm teraz zauważyłem dziwną rzecz a mianowicie: Program mam napisac pod UNIX'em. Tak tez napisałem i po skompilowaniu takie błedy wywala. Wkleiłem kod do Dev C++ i o dziwno po skompilowaniu działa..... Wiec w czym rzecz jest? Czemu pod UNIX'em nie chce a w zwykłym kompilatorze śmiga? Cytuj Odnośnik do komentarza
jasonx Napisano 25 Maja 2009 Udostępnij Napisano 25 Maja 2009 Moze nie masz dodanej jakies biblioteki? Kody, ktore chodza pod DEV nie zawsze chodza pod VS na przyklad.. Juz nie pamietam, chyba stdio albo stdafx trzeba bylo dodac.. Cytuj Odnośnik do komentarza
og02r Napisano 25 Maja 2009 Udostępnij Napisano 25 Maja 2009 @ Vitaliss, mi ten program co dałeś śmiga w 100% pod unixem :> g++ -o prog prog.cpp do kompilacji polecenie. novi@gentoo ~ $ g++ -o prog prog.cpp novi@gentoo ~ $ ./prog Podaj element a[0][0]3 Podaj element a[0][1]3 Podaj element a[0][2]3 Podaj element a[0][3]3 Podaj element a[1][0]3 Podaj element a[1][1]33 Podaj element a[1][2]3 Podaj element a[1][3]33 Podaj element a[2][0] 3 Podaj element a[2][1]33 Podaj element a[2][2]3 Podaj element a[2][3]3 Max: a[1][1] = 33 Cytuj Odnośnik do komentarza
Vitaliss Napisano 25 Maja 2009 Udostępnij Napisano 25 Maja 2009 system("PAUSE"); to był "błąd". Cytuj Odnośnik do komentarza
jasonx Napisano 29 Maja 2009 Udostępnij Napisano 29 Maja 2009 Co zrobić, żeby funkcja regex przepuszczala mi tylko liczby calkowite (dodatnie i ujemne)? Regex("^[0-9]*$"); <-- puszcza mi tylko dodatnie Regex("^-[0-9]*$"); <-- nie puszcza mi nic Regex("^[(-9)-9]*$"); <-- puszcza mi wszystko (i niestety tez ulamki) Regex("^[(-9)-9][^,.a-z]*$"); <-- niby to w miare dobrze łapie, ale to troche amatorszczyzna i nie wyłapuje jeszcze kilku znaków z klawiatury np. przyjmie mi 5- Jest mi to potrzebne do editboxa, w ktorym wpisuje skalar w kalkulatorze macierzowym Cytuj Odnośnik do komentarza
Elfiszon Napisano 30 Maja 2009 Udostępnij Napisano 30 Maja 2009 Spróbuj poniższe, powinno pójść, ale nie wiem jaką masz wersję wyrażeń regularnych: Regex("^-?[0-9]+$"); Cytuj Odnośnik do komentarza
jasonx Napisano 30 Maja 2009 Udostępnij Napisano 30 Maja 2009 Weszlo w ten sposób Regex("^[-|0-9][0-9]*$"); tx og02r Cytuj Odnośnik do komentarza
Fenomen Napisano 31 Maja 2009 Udostępnij Napisano 31 Maja 2009 pytanie do fachowcow: czy java udostepnia jakies biblioteki klas zawierajacych zbiory wszystkich znakow (char)? pytam, bo potrzebuje sobie napisac jakis generator hasel do systemu wirtualnego dziekanatu na wydziale Cytuj Odnośnik do komentarza
Glapa Napisano 2 Czerwca 2009 Udostępnij Napisano 2 Czerwca 2009 witam pojawił się kolejny problem. Muszę napisać program który wyznaczy trasę z punktu początkowego do końcowego w grafie. Jak narazie zaimplementowałem algorytm Dijkstry ale to wyznacza tylko wagi a ja potrzebuję pola przez które przechodzi i później dla tej trasy wyznaczyć trasę zapasową i tak 3 razy z jednym grafem. Problem jest taki że niezbyt wiem jak sie do tego zabrać. Może ktoś z was ma jakiś pomysł? Cytuj Odnośnik do komentarza
Fenomen Napisano 2 Czerwca 2009 Udostępnij Napisano 2 Czerwca 2009 pamietam, ze implementujac algorytm Djikstry w javie uzywalem kolejkowych struktur danych do zapamietywania wierzcholkow edyta mowi, ze znalazlem kod do tego (zwracam honor - to nie tu uzywalem struktur kolejkowych ) public class DijkstrasAlgorithm { private Graph graph; private int start; // wierzcholek poczatkowy private int[] predecessors; // tablica wynikowa z poprzednikami na najkrotszej drodze double[] distance; // tablica wynikowa z mierzonymi odleglosciami HashSet vminus; public DijkstrasAlgorithm(int numV, boolean directed, int start, int[] predecessors, double[] distance) { graph = new ListGraph(numV, directed); this.start = start; this.predecessors = predecessors; this.distance = distance; vminus = new HashSet(graph.getNumV()); } public void algorithm() { fillStructures(); findClosestDist(); } private void fillStructures() { for (int i=0; i<vminus.size(); i++) if (i != start) vminus.add(i); Iterator iterator = vminus.iterator(); for (iterator.first(); !iterator.isDone(); iterator.next()) { predecessors[(Integer)(iterator.current())] = start; distance[(Integer)(iterator.current())] = graph.getEdge(start, (Integer)(iterator.current())).getWeight(); } } private void findClosestDist() { Iterator iterator = vminus.iterator(); while (vminus.size() != 0) { double mindist = Double.POSITIVE_INFINITY; int u = -1; for (iterator.first(); !iterator.isDone(); iterator.next()) { if (distance[(Integer)(iterator.current())] < mindist) { mindist = distance[(Integer)(iterator.current())]; u = (Integer)(iterator.current()); } } vminus.delete(u); correctDistance(u); } } private void correctDistance(int u) { Iterator iterator = vminus.iterator(); for (iterator.first(); !iterator.isDone(); iterator.next()) { if (graph.isEdge(u, (Integer)(iterator.current()))) { double weight = graph.getEdge(u, (Integer)(iterator.current())).getWeight(); if (distance[u] + weight < distance[(Integer)(iterator.current())]) { distance[(Integer)(iterator.current())] = distance[u]+weight; predecessors[(Integer)(iterator.current())] = u; } } } } } Cytuj Odnośnik do komentarza
Glapa Napisano 4 Czerwca 2009 Udostępnij Napisano 4 Czerwca 2009 ok coś mi sie udało ogarnąć z dużą pomocą wójka googla. Na chwilę obecną mam coś takiego: #include "stdafx.h" #include <stdio.h> #define GRAPHSIZE 2048 #define INFINITY GRAPHSIZE*GRAPHSIZE #define MAX(a, b) ((a > b) ? (a) : (b)) int e; /* The number of nonzero edges in the graph */ int n; /* The number of nodes in the graph */ long dist[GRAPHSIZE][GRAPHSIZE]; /* dist[i][j] is the distance between node i and j; or 0 if there is no direct connection */ long d[GRAPHSIZE]; /* d[i] is the length of the shortest path between the source (s) and node i */ int prev[GRAPHSIZE]; /* prev[i] is the node that comes right before i in the shortest path from the source to i*/ void printD() { int i; printf("Distances:\n"); for (i = 1; i <= n; ++i) printf("%10d", i); printf("\n"); for (i = 1; i <= n; ++i) { printf("%10ld", d[i]); } printf("\n"); } /* * Prints the shortest path from the source to dest. * * dijkstra(int) MUST be run at least once BEFORE * this is called */ void printPath(int dest) { if (prev[dest] != -1) printPath(prev[dest]); //wyznacza trase printf("%d ", dest); } void dijkstra(int s) { int i, k, mini; int visited[GRAPHSIZE]; for (i = 1; i <= n; ++i) { d[i] = INFINITY; prev[i] = -1; /* no path has yet been found to i */ visited[i] = 0; /* the i-th element has not yet been visited */ } d[s] = 0; for (k = 1; k <= n; ++k) { mini = -1; for (i = 1; i <= n; ++i) if (!visited[i] && ((mini == -1) || (d[i] < d[mini]))) mini = i; visited[mini] = 1; for (i = 1; i <= n; ++i) if (dist[mini][i]) if (d[mini] + dist[mini][i] < d[i]) { d[i] = d[mini] + dist[mini][i]; prev[i] = mini; } } } int main(int argc, char *argv[]) { int i, j; int u, v, w; FILE *fin = fopen("dist.txt", "r"); fscanf(fin, "%d", &e); for (i = 0; i < e; ++i) for (j = 0; j < e; ++j) dist[i][j] = 0; n = -1; for (i = 0; i < e; ++i) { fscanf(fin, "%d%d%d", &u, &v, &w); dist[u][v] = w; n = MAX(u, MAX(v, n)); } fclose(fin); dijkstra(1); printD(); printf("\n"); for (i = 1; i <= n; ++i) { printf("Path to %d: ", i); printPath(i); printf("\n"); } getchar(); return 0; } póki co nie jest to wersja optymalna bo nie bawiłem się w usuwanie zmiennych globalnych i ustalanie tablic dynamicznych bo dopiero co znalazłem jakiś sensowny algorytm który w dużej częsci mi sie przydał. Dodałem też funkcje, która wyznacza trasę. Teraz mam pytanie czy da sie w jakiś prosty sposób na wykluczenie tej wyznaczonej trasy z kolejnego sprawdzania? Cytuj Odnośnik do komentarza
Misiek Napisano 5 Czerwca 2009 Udostępnij Napisano 5 Czerwca 2009 Czas na tablice znakowe ZADANIE 1 Napisać funkcję zawiera(), która pobiera jako argumenty dwa wskaźniki typu char. Jeśli drugi łańcuch zawiera się w pierwszym funkcja zwraca adres pod którym rozpoczyna się ten łańcuch, jeśli drugi łańcuch nie zawiera się w pierwszym wtedy funkcja zwraca wskaźnik zerowy. Czym to porównać w zadaniu 1? Strcmp? Dwa szybkie pytania, jak zwrócić wskaźnik zerowy? Jak zwrócić adres, pod którym rozpoczyna się ten łańcuch? #include <iostream> #define N 60 using namespace std; void zawiera (char *wsk, char *ptr); int main() { char lan1[N], lan2[N]; zawiera(lan1, lan2); system ("Pause"); } void zawiera (char *wsk, char *ptr) { cout<<"Wprowadz 1 lancuch znakow"<<endl; cin.getline(wsk,N); cout<<"Wprowadz 2 lancuch znakow"<<endl; cin.get(); cin.getline(ptr,N); char *wynik = strstr(wsk,ptr); if (wynik == NULL ) cout << wynik; else cout <<*(wynik-1)<<endl; } Tak zrobiłem, powiedz ktoś czy dobrze zwróciłem wartości. Jednak lepiej było zastosować instrukcję strstr, niż strcmp, z którą coś mi nie wychodziło Cytuj Odnośnik do komentarza
citko Napisano 7 Czerwca 2009 Udostępnij Napisano 7 Czerwca 2009 Czy ktoś z Was posiadałby w swoich zasobach proste programy wyjaśniające działania: interfejsu, polimorfizmu i zdarzeń? Najlepiej w C#, choć gdyby nawet w C++ to mam nadzieję, że połapię o co w nich biega. Najlepiej też oparte na jakichś prostych działaniach arytmetycznych. Śledzenie kodu w bardziej skomplikowanych programach nie bardzo mi wychodzi, a tym bardziej, gdy jedno jest pomieszane z drugim. Z góry dzięki. Mile widziane na PW, gdyby miałoby to zaśmiecić forum:) Cytuj Odnośnik do komentarza
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.