Skocz do zawartości

Programowanie


xemi

Rekomendowane odpowiedzi

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 :D )

 

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!

Odnośnik do komentarza

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.

Odnośnik do komentarza

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?

Odnośnik do komentarza

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;
}

Odnośnik do komentarza

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?

Odnośnik do komentarza

@ 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

Odnośnik do komentarza

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

Odnośnik do komentarza

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ł?

Odnośnik do komentarza

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 :D )

 

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;
			}
		}
	}
}

}

Odnośnik do komentarza

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?

Odnośnik do komentarza
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 :)

Odnośnik do komentarza

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:)

Odnośnik do komentarza

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ą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.

Ładowanie
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...