Newsgroup: it.comp.lang.c++
Titolo: bingo-sort

Salve,
qualcuno mi sa dire cosa c'č che non va in questo bingo-sort? Le ho provate
tutte, eppure il testo originale spiegava passo per passo di fare proprio
cosě...
Grazie, saluti :-)
#include <windows.h>
#include <iostream.h>
#include <time.h>
#include <math.h>
#define	n	30
unsigned int a[n];
void fillarray()
{
	srand((unsigned)time(NULL));
	for (unsigned int j=0; j<n; j++)
		a[j]=rand();
};
unsigned int getminindex()
{
	unsigned int c=0;
	for (unsigned int s=1; s<n; s++)
		if (a[s]<a[c]) c=s;
	return(s);
};
unsigned int getmaxindex()
{
	unsigned int c=0;
	for (unsigned int s=1; s<n; s++)
		if (a[s]>a[c]) c=s;
	return(s);
};
void swapvalues(unsigned int i1, unsigned int i2)
{
	unsigned int temp=a[i1];
	a[i1]=a[i2];
	a[i2]=temp;
};
void Bingo_Sort()
{
	unsigned int	Min_Val=a[getminindex()],
					Max_Val=a[getmaxindex()],
					Pos=0,
					Next_Pos=1,
					Bingo=Min_Val,
					Next_Bingo=Max_Val;
	while (Bingo<Max_Val)
	{
		Pos=Next_Pos;
		for(unsigned int i=Pos; i<=n; i++)
		{
			if (a[i]==Bingo)
			{
				swapvalues(i,Next_Pos);
				Next_Pos++;
			};
			if (a[i]<Next_Bingo) Next_Bingo=a[i];
			Bingo=Next_Bingo;
			Next_Bingo=Max_Val;
		};
	};
};
int main()
{
	fillarray();
	cout << "Stampa dell'array disordinato..." << "\n";
	for (unsigned int k=0; k<n; k++)
		cout << a[k] << "\n";
	Bingo_Sort();
	cout << "\nStampa dell'array ordinato..." << "\n";
	for (k=0; k<n; k++)
		cout << a[k] << "\n";
	return(0);	// nessun errore
};
Marco Zanon (
m.z...@usa.net
)
http://www.geocities.com/SiliconValley/Peaks/6455
(BUY CDS AT THE LOWEST PRICES through my site!!!
Zamorano fan page, free MIDI mailing list, Music db...)

};
ERRORE: return(c);

Sono avvilito! ,-)
Peggio di cosě credo di non aver mai fatto (vabbč che l'ho scritto di sera
tardi, ma comunque...).
Grazie, ciao :-)
Marco Zanon (
m.z...@usa.net
)
http://www.geocities.com/SiliconValley/Peaks/6455
(BUY CDS AT THE LOWEST PRICES through my site!!!
Zamorano fan page, free MIDI mailing list, Music db...)
Antonio Donatiello <anto...@REMOVETHISsanpaolo.com> wrote in message
7aen0s$b4c$1...@fe1.cs.interbusiness.it...

         return(0);      // nessun errore
E' sufficiente
return 0;
Comunque il programma non funziona ugualmente. Forse c'è un errore
nell'algoritmo di ordinamento.
EMG

 nell'algoritmo di ordinamento.
Anch'io ho la stessa impressione.
Non conosco l'algoritmo, quindi non so dove sono gli errori, pero'
ho notato alcune stranezze:
- a[0] non viene mai toccato, l'algoritmo lavora solo
  su a[1] ... a[n-1]
- quando parte il ciclo for, Pos = Next_Pos, e il ciclo parte
  con i = Pos = Next_Pos. L'unico swap e' fra a[i] e a[Next_Pos],
  quindi alla prima iterazione l'eventuale swap scambierebbe
  un elemento con se stesso, e se questo succede, Next_Pos viene
  incrementato (come i), e quindi anche all'iterazione successiva
  lo scambio sarebbe inutile.
- a ogni iterazione del for, nel seconfo if, Next_Bingo diventa
  uguale ad a[i], sempre: Next_Bigno == Max_Val (c'e' l'assegnamento
  alla fine dell'iterazione precedente), quindi Next_Bingo >= a[i]
  se e' maggiore scatta l'if, se e' = sono gia' uguali.
  Subito dopo Bingo diventa uguale a Next_Bingo e quindi ad a[i].
  Nell'iterazione successiva Bingo vale a[i-1] (i e' incrementato),
  e il primo if viene eseguito solo se a[i] == a[i-1].
  Se nella sequenza non ci sono due elementi uguali consecutivi,
  il primo if non viene mai eseguito, e quindi non c'e' mai uno
  scambio.
Un consiglio: durante il debugging del programma non conviene usare
srand(time), ma usare srand con valori predefiniti (magari presi da
argv), in modo da poter ripetere l'esecuzione con gli stessi valori.
Con valori casuali puo' capitare di scoprire che qualcosa non va,
pero' quando si va a vedere cosa non va, tutto funziona perfettamente
perche' l'errore si manifestava solo con particolari valori in ingresso.
	Mauro
poter ripetere

Grazie a tutti, effettivamente ho scoperto gli errori:
1) le due funzioni getminindex e getmaxindex devono tornare c e non s (sono
avvilito...)
2) effettivamente a[0] non viene toccato, quindi i valori vanno inseriti da
a[1]...
Una cosa solo: nel main, nel secondo for perché bisogna ridichiarare k? A me
se lo faccio dà errore...


   enum { n = 30 };
Piů che giusto!
EMG

 avrebbe avuto un errore di compilazione e se ne sarebbe accorto.
s non e' visibile al di fuori del ciclo. 
Anticamente (2-3 anni fa) lo scope di una variabile era il blocco
in cui era dichiarata, e quindi in questo caso il blocco che contiene
il for (cioe' la funzione).
Poi lo standard (che non era ancora standard) e' stato cambiato e
adesso le variabili dichiarate nel for (e anche nel while) sono
visibili solo all'interno del ciclo.
Probabilmente il compilatore e' vecchio e segue ancora le vecchie
regole.
	Mauro

 se lo faccio dà errore...
Secondo lo standard va ridichiarato (vedi anche altro messaggio).
Probabilemte il tuo compilatore e' vecchio e segue ancora le
regole vecchie, secondo cui il primo k era ancora visibile.
Nel caso del gcc il passaggio e' stato fatto fra il 2.5.8 e il 
2.6.0 (che comunque ha tante altre sfighe).
La cosa migliore e' aggiornare il compilatore. Se decici di tienere
il codice attuale, preparati a riceveri vari errori da un compilatore
standard.
Per compilare sia con un compilatore standard che su uno vecchio,
puoi:
- cambiare nome a una delle due variabili;
- mettere il ciclo all'interno di una funzione (es. print), che
  contiene un solo ciclo e quindi non ha problemi, e poi chiamare
  due volte la funzione;
- (abbastana brutto) mettere un ciclo all'interno di una coppia { }
	Mauro

 avrebbe avuto un errore di compilazione e se ne sarebbe accorto.
Allora probabilmente il suo compilatore non è ISO-compliant.
EMG

 se lo faccio dà errore...
Allora vuol dire che il tuo compilatore è molto vecchio e non aderente
allo standard ISO.
EMG

 wrote in message 7agmf0$rf1$
1...@nslave1.tin.it
..

 vero?
Temo di si, almeno per le funzioni piů evolute dell'ambiente visuale.
EMG