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

cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005 - 12 mai 2004 à 15:44
cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005 - 14 mai 2004 à 11:41
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

neohp Messages postés 62 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 14 octobre 2005
12 mai 2004 à 16:31
'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 ------
0
ensiame Messages postés 15 Date d'inscription mercredi 10 mars 2004 Statut Membre Dernière intervention 15 décembre 2005
12 mai 2004 à 17:02
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;
}
0
c2millet Messages postés 198 Date d'inscription lundi 2 juin 2003 Statut Membre Dernière intervention 15 février 2005
12 mai 2004 à 17:19
pour réaliser un décalage sur une chaine:

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

c tout simple ;-)

Cmill
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
12 mai 2004 à 18:40
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
neohp Messages postés 62 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 14 octobre 2005
12 mai 2004 à 20:05
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 ------
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
12 mai 2004 à 20:34
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é
0
neohp Messages postés 62 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 14 octobre 2005
12 mai 2004 à 21:03
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 ------
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
12 mai 2004 à 21:07
oui, mais ce que tu a ecris n'est as faut, j'ai juste nuancé car seul c99 supporte les declaration a la c++
0
cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005
13 mai 2004 à 09:31
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 ...)
0
cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005
13 mai 2004 à 09:35
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
0
neohp Messages postés 62 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 14 octobre 2005
13 mai 2004 à 11:33
'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 ------
0
cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005
13 mai 2004 à 19:30
merci . c clair maintenant...
0
cs_babounlehobbit Messages postés 12 Date d'inscription samedi 14 février 2004 Statut Membre Dernière intervention 23 octobre 2005
14 mai 2004 à 11:41
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 ...?)
0
Rejoignez-nous