begin process at 2008 08 28 21:44:30
1 233 393 membres
485 nouveaux aujourd'hui
14 291 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

REMPLIR UN TABLEAU EN SPIRALE


Information sur la source

Catégorie :Trucs & Astuces Classé sous : remplir, tableau, spirale, agorithme Niveau : Débutant Date de création : 24/11/2007 Date de mise à jour : 24/11/2007 21:53:35 Vu : 4 233

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


Description

Suite à un post (http://www.javascriptfr.com/infomsg_TABLEAU-SPIRALE_1039112.aspx ), je me suis penché sur la question du remplissage d'un tableau en spirale :
Imaginons donc un carré de 5*5, cela devrait donner ceci en résultat finale
0  1  2  3  4
15 16 17 18 5
14 23 24 19 6
13 22 21 20 7
12 11 10 9  8

Source

  • <script language="javascript">
  • <!--
  • tableauspirale(5);
  • function tableauspirale(vartaille){
  • if (vartaille>1){
  • var taille=parseInt(vartaille);
  • var nbr=0;
  • var damier=new Array(taille);
  • var nbrcarre = parseInt(taille / 2);
  • //initialisation du damier
  • for (var j=0;j<damier.length;j++){damier[j]= new Array(damier.length);}
  • for (var j=0;j<damier.length;j++)
  • {
  • for (var x=0;x<damier[j].length;x++){damier[j][x]=0;}
  • }
  • //initialisation des limites
  • var premiereligne=0;
  • var dernierecolonne=taille -1 ;
  • var derniereligne=taille - 1;
  • var premierecolonne=0;
  • for(var startcarre=1;startcarre<nbrcarre+1;startcarre++){
  • //construction de la première ligne
  • for(var j=premiereligne;j<dernierecolonne;j++)
  • {
  • damier[premiereligne][j]=nbr;
  • nbr++;
  • }
  • //affichage
  • affichagetableau(damier);
  • //construction de la dernière colonne
  • for(var j=premiereligne;j<derniereligne;j++)
  • {
  • damier[j][dernierecolonne]=nbr;
  • nbr++;
  • }
  • //affichage
  • affichagetableau(damier);
  • //construction de la dernière ligne
  • for(var j=dernierecolonne;j>premierecolonne;j--)
  • {
  • damier[derniereligne][j]=nbr;
  • nbr++;
  • }
  • //affichage
  • affichagetableau(damier);
  • //construction de la première colonne
  • for(var j=derniereligne;j>premiereligne;j--)
  • {
  • damier[j][premierecolonne]=nbr;
  • nbr++;
  • }
  • //affichage
  • affichagetableau(damier);
  • //incrementation pour donner les limites du carre suivant
  • premiereligne += 1;
  • dernierecolonne -= 1;
  • derniereligne -= 1;
  • premierecolonne += 1;
  • }
  • //si la taille du carré est un nombre impaire alors on remplit le centre du tableau avec la dernière valeur de nbr
  • if (taille%2){
  • damier[premiereligne][premiereligne]=nbr;
  • //affichage
  • affichagetableau(damier);
  • }
  • }
  • }
  • function affichagetableau(damier){
  • //affichage
  • document.write("<table>");
  • for (var j=0;j<damier.length;j++){
  • document.write("<tr>");
  • for (var x=0;x<damier[j].length;x++){
  • document.write("<td>");
  • document.write(damier[j][x]);
  • document.write("</td>");
  • }
  • document.write("</tr>");
  • }
  • document.write("</table>");
  • document.write("<br>");
  • }
  • //-->
  • </script>
<script language="javascript"> 
<!--
tableauspirale(5);
function tableauspirale(vartaille){
	if (vartaille>1){
		var taille=parseInt(vartaille);       
		var nbr=0;
		var damier=new Array(taille);
		var nbrcarre = parseInt(taille / 2);
		//initialisation du damier
		for (var j=0;j<damier.length;j++){damier[j]= new Array(damier.length);}
		for (var j=0;j<damier.length;j++)
			{
			for (var x=0;x<damier[j].length;x++){damier[j][x]=0;}
			}
		//initialisation des limites
		var premiereligne=0;
		var dernierecolonne=taille -1 ;
		var derniereligne=taille - 1;
		var premierecolonne=0;
		for(var startcarre=1;startcarre<nbrcarre+1;startcarre++){
			//construction de la première ligne
			for(var j=premiereligne;j<dernierecolonne;j++)
				{
				damier[premiereligne][j]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la dernière colonne
			for(var j=premiereligne;j<derniereligne;j++)
				{
				damier[j][dernierecolonne]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la dernière ligne
			for(var j=dernierecolonne;j>premierecolonne;j--)
				{
				damier[derniereligne][j]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//construction de la première colonne
			for(var j=derniereligne;j>premiereligne;j--)
				{
				damier[j][premierecolonne]=nbr;
				nbr++;
				}
			//affichage
			affichagetableau(damier);
			//incrementation pour donner les limites du carre suivant
			premiereligne += 1;
			dernierecolonne -= 1;
			derniereligne -= 1;
			premierecolonne += 1;
		}
		//si la taille du carré est un nombre impaire alors on remplit le centre du tableau avec la dernière valeur de nbr
		if (taille%2){
			damier[premiereligne][premiereligne]=nbr;
			//affichage
			affichagetableau(damier);
		}
		
	}
}
function affichagetableau(damier){
	//affichage
	document.write("<table>");
	for (var j=0;j<damier.length;j++){
		document.write("<tr>");
		for (var x=0;x<damier[j].length;x++){
			document.write("<td>");
			document.write(damier[j][x]);
			document.write("</td>");
			}
		document.write("</tr>");
		}
	document.write("</table>");
	document.write("<br>");
}
//-->
</script>

Conclusion

Code à placer dans le body.
J'ai placé la fonction d'affichage du tableau tout au long du procédé pour que vous puissiez voir les différentes étapes de construction !
Attention évitez les grandes tailles de carré si vous laissez l'affichage actif.
  • signaler à un administrateur
    Commentaire de c_raf le 25/11/2007 11:29:15 9/10

    Je viens de regarder tout ton code javascript et j'aimerai que tu m'explique les premières lignes

    if (vartaille>1){
    var taille=parseInt(vartaille);      
    var nbr=0;
    var damier=new Array(taille);
    var nbrcarre = parseInt(taille / 2);


    et aussi cette partie de code:

    if (taille%2){
    damier[premiereligne][premiereligne]=nbr;
    //affichage
    affichagetableau(damier);
    }


    Je te remercie beaucoup nickadele

  • signaler à un administrateur
    Commentaire de nickadele le 25/11/2007 11:51:35 administrateur CS

    Bonjour,

    si la taille du carré est supérieure à 1
    if (vartaille>1){
    je m'assure d'avoir une valeur entière, pour bien faire il faudrait également tester qu'il ne s'agit pas d'une chaine de caractère ou d'une valeur undifined
    var taille=parseInt(vartaille);      
    var nbr=0;
    var damier=new Array(taille);
    Calcul le nombre de carré qu'il y a dans mon carré initiale en fonction de la taille
    ex : si j'ai un carré de taille 4 il contient 2 carrés (4/2)
    var nbrcarre = parseInt(taille / 2);
    ...........
    il s'agit du calcul du modulo (reste d'une division) si taille vaut 5, la division de 5 par 2 donne comme reste 1 (5%2)=1. J'ai fait ce test car si tu regardes le remplissage du carré avec une taille impaire tu t'apercevras qu'il reste un carré de 1 sur 1 (le centre) en fin de remplissage. Il faut donc le remplir avec la dernière valeur.
    if (taille%2){
    damier[premiereligne][premiereligne]=nbr;
    //affichage
    affichagetableau(damier);
    }

  • signaler à un administrateur
    Commentaire de c_raf le 25/11/2007 15:11:19

    Merci nickadele pour le post que tu as mis sur le site, je l'ai regardé et j'ai mieux compris et sa ma permis d'optimiser mon code et j'en arrive a un code similaire au tiens. En fait je me prenait trop la tête avec les lignes et colonnes mais la j'ai mieux compris et j'ai bien commenté mon code afin de le refaire correctement à tout moment.

    Et tu avais raison pour les compteurs, maintenant j'en utilise plus que un seul.


    Franchement merci à toi d'avoir pris sur ton temps pour m'aider à faire ce tableau spirale et franchement c'est vraiment gentil de ta part de m'avoir accordé cette aide précieuse nickadele.


    MERCI MERCI MERCI

Ajouter un commentaire

Pub



Appels d'offres

Recherche developpeur ...
Budget : 700€
SITE MARCHAND LOCATION...
Budget : 3 000€
SITE MARCHAND POUR HOTEL
Budget : 4 000€

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS