Newsgroup: it.comp.lang.c
Titolo: problema con la funzione rand()

Cosa c'è che non va in questo codice?
--------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE	 	10
void original(int a[], int size1);
void bubble(int b[], int size2);
void modify(int c[], int size3);
int main()
{
	int array[SIZE];
	int i, t;
	srand(time(NULL));
	for (i = 0; i < SIZE; i++) {
		array[i] = 97 + rand() % 122;
	}
	original(array, SIZE);
	bubble(array, SIZE);
	modify(array, SIZE);
	return 0;
}
void original(int a[], int size1)
{
	int i;
	for (i = 0; i < size1; i++)
		printf(" %c", a[i]);
	return;
}
void bubble(int b[], int size2)
{
	int i, t, j;
	for (j = 1; j < size2; j++) {
		for (i = 0; i < SIZE - 1; i++)
			if (b[i] > b[i+1]) {
				t = b[i];
				b[i] = b[i+1];
				b[i+1] = t;
			}
	}
	return;
}
void modify(int c[], int size3)
{
	int i;
	for (i = 0; i < size3; i++)
		printf(" %c", c[i]);
	return;
}
------------------------------
Il mio intento è quello di generare 10 lettere in modo casuale e
riordinarle in ordine alfabetico con il bubble sort. 
Il problema è la funzione rand(). Ho provato con scanf() immettendo i 
valori manualmente e genera e ordina i valori e quindi le rispettive 
lettere. Se uso rand() invece mi dà caratteri indefiniti e alcune 
volte non me li dà proprio.
Altra domanda: ho l'impressione che l'uso che ne faccio delle funzioni
faccia schifo... :) Avete qualche consiglio derivante dalla vostra
esperienza (e non solo) da darmi al riguardo, per scrivere codice più
efficiente, leggibile, ecc? Grazie!

 riordinarle in ordine alfabetico con il bubble sort. 
Scusa, ma cosa stai usando, l'alfabeto venusiano ?
con la formula 97 + rand() % 122;
generi numeri casuali compresi tra 97 e 218 che non mi sembra
proprio che siano i codici ascii delle lettere...
prova con   array[i] = 'A' + rand()%26;
che almeno ti genera lettere a caso tra 'A' e 'Z'.
non ho guardato il resto del programma.
g.

 generi numeri casuali compresi tra 97 e 218 
Ecco dove stava l'errore! 
Mi hai spinto ad andarmelo a rinfrescare sul Deitel&Deitel, e dice:
"n = a + rand() % b;
dove a sarà il valore di traslazione (che sarà uguale al primo numero
dell'intervallo di interi consecutivi), mentre b sarà il fattore di scala
(che sarà uguale alla ampiezza dell'intervallo di interi consecutivi
desiderato)."
Io invece continuavo a confondermi pensando che b fosse il valore massimo
che la funzione rand() dovesse scegliere. Quindi quella schifezza che ho
scritto io sarebbe tra 97 e 122, invece dovevo fare 97 + rand() % 24. 
Grazie 10000000000000!!

 scritto io sarebbe tra 97 e 122, invece dovevo fare 97 + rand() % 24. 
Scusa la curiosita', ma perche' fai % 24 e non %26 ?
Ti fanno schifo le ultime due lettere dell'alfabeto ?
facendo %24 non otterrai mai la y e la z.
Comunque ti suggerisco di scrivere 'a'+rand()%26 cosi' non sei costretto
ad imparare a memoria i codici ASCII.
ciao,
g.

 invece dovevo fare 97 + rand() % 24.
per non sbagliare (come hai fatto anche ora), ti suggerisco la seguente
cosa:
'a' + rand()%('z'-'a'+1)
almeno all'inizio, visto che hai le idee un pochino confuse....
questo poi verra' convertito in (su codifica ascii):
97 + rand()%(122-97+1)
quindi
97 + rand()%26
quindi 26, NON 24.
Per fare una prova ti basta sapere che n%26 (con n>0) puo' assumere valori
da 0 a 25.
97 + 0 = 97 -> 'a'
97 + 25 = 122 -> 'z'
In pratica e' questo l'intervallo giusto che ti serve.
Tommy

Ora ho capito. Grazie 1000 a tutti e due!