Creation d'un tableau en C par rotation A l'aide !!

Signaler
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005
-
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005
-
Voila: je voudrai creer un tableau du genre:
abcdefgh...xyz
bcdefghi...xyza
cdefghij...xyzab
... et ainsi de suite
Le tout sans avoir a ecrire chaque ligne a la main.
Comment faire pour enlever a chaque fois un charactere au debut, puis le rajouter a la fin de la chaine ?
Merci d'avance !

Cyril (babounlehobbit@hotmail.com)

13 réponses

Messages postés
62
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
14 octobre 2005

'lut

hey, c'est de l'algo , sa.....

bon , on va pas tout te faire, c'est juste qu'ils faut apprendre a trouver ce genre de solution tout seul

indice(s) : les caractères ont un code ascii ...( majuscule de 45 a 90, minuscule 97 a 122 )

donc sa ressemble a une boucle qui va de a à z avec une condition a un endroit ou a un autre... ;)

voila, avec sa tu devrai trouver rapidement

++

neoh_p [=- coding spirit -=]
------- since 1999 ------
Messages postés
15
Date d'inscription
mercredi 10 mars 2004
Statut
Membre
Dernière intervention
15 décembre 2005

En théorie, c'est juste une boucle qui recopie ta chaine sur les éléments du tableau, et une autre qui copie chaque élément de la chaine à la place de celui juste avant, et qui ramène le premier à la fin

#include <malloc.h>
#include <string.h>
int main()
{
char alphabet[27] = "abcdefghijklmnopqrstuvwxyz"; // La chaîne de base
char* pcAlpha; // Servira à parcourir la chaîne
int i , j;
char c;

const int iLaTailleDeMonTableau = 26;
char* pszMonTableau[iLaTailleDeMonTableau];

for (i = 0 ; i < iLaTailleDeMonTableau ; ++i)
{
// On alloue la taille de la chaîne dans un élément du tableau
pszMonTableau[i] = (char*) malloc(27 * sizeof(char));
// On copie la chaîne de la case précédente du tableau dans la case en cours 
// (ou la chaîne de base si l'on est dans la première case)
strcpy(pszMonTableau[i] , (i == 0 ? alphabet : pszMonTableau[i - 1])); 
if (i == 0) //Si c'est la première case
continue; // On ne modifie pas la chaîne de base

pcAlpha = pszMonTableau[i]; // On pointe sur la chaîne en cours
c = *pcAlpha; // On sauvegarde le premier caractère
for (j = 0 ; j < 25 ; ++j)
{
*pcAlpha = *(pcAlpha + 1); // On recopie à l'emplacement de chaque lettre, la lettre située juste après
pcAlpha++; // Et on avance
}
*pcAlpha = c; // La première lettre passe à la fin
}

// Et voilà

//...

//une fois le tableau rendu obsolète (fin du programme ou fin de nécessité d'utilisation) , on restaure la mémoire allouée
for (i = 0 ; i < iLaTailleDeMonTableau ; ++i)
free(pszMonTableau[i]);

return 0;
}
Messages postés
198
Date d'inscription
lundi 2 juin 2003
Statut
Membre
Dernière intervention
15 février 2005

pour réaliser un décalage sur une chaine:

sprintf(chaine,"%s%c",&chaine[1],chaine[0]);

c tout simple ;-)

Cmill
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
pour décaler une zone mémoire (un tableau par ex) : memmove

ex :
int tab[26];
int tmp = tab[0];
memmove(&tab[0], &tab[1], 26*sizeof(int));
tab[25]=tmp;

NB : memmove vérifie si la source et la destination se chevauche pour effectuer l'opération alors que memcpy non.
Messages postés
62
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
14 octobre 2005

bon....

exemple pour un tableau de 5 lignes :

char tableau[5][26] = {0} , lettre = 'A' ;

for( int i = 0 ; i < 5 ; i++ )
{
for( int j = 0 ; j < 26 ; j++ )
{
tableau[i][j] = lettre ;

if( ++lettre >= ( 'Z' + 1 ) )
lettre = 'A' ;
}
lettre++ ;
}

voila , spa plus compliqué que sa ...

neoh_p [=- coding spirit -=]
------- since 1999 ------
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
en c (ansi) on declare les variables au debut d'un bloc, un bloc c'est une fonction ou un fichier
donc vaut mieux eviter for(int i=... pour une meilleur compatibilité
Messages postés
62
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
14 octobre 2005

oué je sais djl excuse moi, c'est l'habitude du c++ .....

dsl

donc oui pour les debutant, declarez les variables au debut d'un bloc, comme ma l'a rappeler m'sieur djl (en C , surtout )

neoh_p [=- coding spirit -=]
------- since 1999 ------
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
oui, mais ce que tu a ecris n'est as faut, j'ai juste nuancé car seul c99 supporte les declaration a la c++
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005

Neohp,
c tres interessant ce que tu viens decrire...
Mais, ... ou est-ce que tu initialise la base de ton tableau, la ligne 0.
Je ne vois marque l'alphabet nullepart, pourtant ton tableau l'affiche ... ??
(dsl, mais je suis un gros newie ...)
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005

parceque,en fait, je voulai mettre plus que l'alpabet. je m'explique :
en fait le but recherché, c d'avoir un max de caracteres dans mon tableau: alphabet en minuscule, en majuscule (et oui, C ne fait pas la difference tout seul, aloras il faut l'aider) puis les chiffres, le _ le ' et eventuellement le . et la , ...
ca donnerai un truc dans le genre:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-,.'1234567890
Messages postés
62
Date d'inscription
jeudi 5 juin 2003
Statut
Membre
Dernière intervention
14 octobre 2005

'lut

eh bien le tableau, pas besoin de l'initiliser ( bien que je met tout a zero a la creation, sa n'est pas utile ici )
...

pis mince, insulte pas C, lui justement il sais faire la difference.. lol ;)

bon, moi j'utilise la valeur ascii pour remplire mon tableau.
comme tu doit le savoir, les valeur ascii des lettre de l'alphabet se suivent

comme en C un char c'est un entier --> 'A' ( 65 decimal ) + 1 = 'B' ( 66 decimal )

voila tu comprend maintenant ?

bon maintenant si tu veux mettre plus de caractrère le principe est tjs le meme....y'aura plus de conditions ou alors utilise un tableau ou tu mets ta liste entiere pis tu joue sur l'index du caractère en cours

y'a plein de solutions différentes pour cet algo...

l'avantage du code que je t'ai donner est qu'il est simple a ameliorer et qu'il utilise pas de la memoire inutilement

voila j'espere que tu vas pouvoir te derbouiller ave sa

++

neoh_p [=- coding spirit -=]
------- since 1999 ------
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005

merci . c clair maintenant...
Messages postés
12
Date d'inscription
samedi 14 février 2004
Statut
Membre
Dernière intervention
23 octobre 2005

Donc, si jai bien compris, pour faire un tableau contenant toute la table ascii, on donne a 'lettre' la valeur 0(zéro), ce qui corresponds au premier caractère de la table, puis on va jusqu'à la fin de la table, soit lettre=0.
Ce qui donnerai, sur la base de ce que tu m'a donné avant :

char tableau[255][255] = {0} , lettre = 0 ;

for( int i = 0 ; i < 255 ; i++ )
{
for( int j = 0 ; j < 255 ; j++ )
{
tableau[i][j] = lettre ;

if( ++lettre >= ( 255 + 1 ) )
lettre =0 ;
printf("%c",tableau[i][j]);
}
lettre++ ;
printf("\n");
}

Je t'avouerai que j'ai testé ceci, ... ca affiche effectivement le code ascii, mais ca décale pas !!! :-)
Et je ne vois pas du tout ce qui cloche... (peut être cela te saute il au yeux ...?)