[C] Un petit problème à résoudre

Statut
N'est pas ouverte pour d'autres réponses.
M

Machiavel666

ex membre
Voilà une mini énigme juste pour le fun.
Normalement c'est pas trop dur:

Réaliser une fonction en C qui doit saisir un certain nombre d'entier par exemple puis qui les affiche en sens inverse.
Bon évidemment là c'est trop facile...
Pour corser les choses, vous n'avez pas le droit de stocker ces entiers dans un tableau, ni dans une liste chainée.

En gros chaque entier doit être dans une variable unique.

Le but n'est pas de garder en mémoire tous les nombres, mais simplement de les afficher.

Enfin, le nombre d'entiers à sasir doit être passé en paramètre.

Voici en gros la déclaration de la fonction:
void fonction(int nbrDEntierASaisir);

Et un exemple d'utilisation (avec fonction(4) ):
L'utilisateur entre 5 9 4 7 et le prog affiche 7 4 9 5

Si j'ai pas assez détaillé, il suffit de demander.
 
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
 

Araubas

Mr Usant
OUi ... ca me semble aussi simple que ca....
Tu peux faire joli en définissant un séparateur dans ta chaine de char (autre chose que chr(0)).

Pour le reste... pas de difficulté particulière.

Si tu veux la jouer TRES élégante, voici ma petite solution:
Tu définis deux entiers en global, et tu ajoutes les nombres entiers alternativement à l'un, puis à l'autres.
ex:
soit les deux variables a et b, et l'utilisateur encode 5 9 4 7
donc a et b seront égales successivement à

a b
5 0
5 9
9 9
9 16

pour depiller les nombres, tu fait comme ceci:
comme le nombre d'entrée est pair (4), tu obtiens le premier nombre en partant de b-a (a contrario a-b si impair), et tu cycle les opérations suivantes:


affichage = b - a
b = b - (b-a)
next


et si impair:

affichage = a - b
a = a - (a-b)
next

les deux derniers résultat sont b et a ( ou a et b)
et voiliiiii

tout ca sur deux entiers en tout et pour tout :)

facile non ?
 

gogoprog

Oprahiste vaudou
ouai mais il veut que chaque entier soit dans une variable unique
 

zoheir

cvm.mangaleet()
TITM4v3rick a dit:
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
euh je crois que tu n'a pas tout compris :s

Le problème de cet exercice c'est qur justement tu ne peux stocker dans une chaine de caract. mais uniquement dans des variables.
 
CvMz0r- a dit:
TITM4v3rick a dit:
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
euh je crois que tu n'a pas tout compris :s

Le problème de cet exercice c'est qur justement tu ne peux stocker dans une chaine de caract. mais uniquement dans des variables.



vous n'avez pas le droit de stocker ces entiers dans un tableau, ni dans une liste chainée.

En gros chaque entier doit être dans une variable unique.

Voici en gros la déclaration de la fonction:
void fonction(int nbrDEntierASaisir);

Et un exemple d'utilisation (avec fonction(4) ):
L'utilisateur entre 5 9 4 7 et le prog affiche 7 4 9 5
Je ne stocke pas d'entiers dans un tableau ni dans une liste
 
1er
OP
M

Machiavel666

ex membre
TITM4v3rick :
Désolé mais par définition une chaîne de caractère, c'est juste un tableau dans lequel du stock des char au lieu de int, short ou long et qui se termine par le caractère '\0'.
De toute façon, la norme du C définit le type char comme un ENTIER de petite taille (en général c'est un octet de toute façon).

La solution de _Turlutte_ semble en effet plus élégante (je n'avais absolument pas pensé à ça mais j'aime beaucoup).

Bon je vous livre une autre façon de le faire. Elle utilise le principe de récursivité.
Voici la fonction en pseudo langage:

<vide> FONCTION ( <entier> nombre)
{
< lire x >

si (nombre > 1)
<appel de FONCTION (nombre - 1) >

< écrire x >
}


En C :

void fonction (int nbr)
{
int x;
scanf (" %d",&x);

if (nbr > 1)
fonction(nbr-1);

printf (" %d",x);
}
 

zoheir

cvm.mangaleet()
TITM4v3rick a dit:
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
ici tu dis le contraire, stockage dans une chaine de caract.
 
ben tu dis pas stocker dans un tableau d'entier.
alors hop dans une chaîne de caractères puis strrev et voili voulu...
 

zoheir

cvm.mangaleet()
TITM4v3rick a dit:
ben tu dis pas stocker dans un tableau d'entier.
alors hop dans une chaîne de caractères puis strrev et voili voulu...
Il a dit variable entière uniquement ;), donc toute chaîne à proscrire :roll:
 
CvMz0r- a dit:
TITM4v3rick a dit:
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
ici tu dis le contraire, stockage dans une chaine de caract.

euh , t'es gentil mais on est obligé de stocker qlq part...
Fonction récursive => sur la pile avec "à chaque nouvelle instance de tour d'algo" construction et destruction d'un objet int local => en mémoire ...


Si vous voulez la jouer un peu "magic" => getchar()
 
1er
OP
M

Machiavel666

ex membre
Si j'avais su, j'aurai pas posté.

Le but était pas de se bouffer la gueule sur la définition d'une chaîne de caractère par rapport à un simple tableau d'entier.

C'est juste pour le plaisir de trouver des solutions pas habituelles à un problème.
 
bah, si t'appelles ça se bouffer la gueule, ben que dirais-tu des "courses algorithmiques" entre profs/élèves ? :D
 

zoheir

cvm.mangaleet()
TITM4v3rick a dit:
CvMz0r- a dit:
TITM4v3rick a dit:
oui bon => chaîne de caractère...
On stocke tout dans un char *, on l'inverse et on l'affiche.
ici tu dis le contraire, stockage dans une chaine de caract.

euh , t'es gentil mais on est obligé de stocker qlq part...
Fonction récursive => sur la pile avec "à chaque nouvelle instance de tour d'algo" construction et destruction d'un objet int local => en mémoire ...


Si vous voulez la jouer un peu "magic" => getchar()
Je n'ai pas dit le contraire :roll:
 

Araubas

Mr Usant
J'viens de vérifier ma solution ... et ca marche pas ... y'a un chtite n'erreur pas juste ... donc OUBLIE :)

:roll:
 

Xaab

Elite
Voilà ce que je me suis amusé à faire :)
Mais est-ce autorisé ?
// énigme
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a,b,c,d;
int* pointeini = 0;
int* pointe=0;
pointeini = &d;
pointe=pointeini;
a=0;
while (d != 999)
{
cout << endl;
cout << "entrez votre chiffre ";
cin >> d;
cout << endl << "La liste à l'envers ==>";

a+=4;
pointe = pointeini+a;

*pointe = d;

for (b=a; b>=4; b-=4)
{
pointe=pointeini+b;
cout << " " << dec << *pointe;
}
cout << endl;
}
return 0;
}
Exécutable (tapez 999 pour quitez): Soluce ?
Je sais: le prog a un ptit bug. Et 500 ko pour faire trois fois rien. Ben mazette !!! Le basic fait beaucoup mieux.
 
horrible ce code. Rempli de bug...
On ne joue pas avec des pointeurs comme ça.




Je me rend compte que je suis un peu saligaud en ne te disant pas où... en fait tu joues avec des pointeurs et des références, mais tu mélanges un peu la notion...

Le pointeur pointe vers un objet d'un type primitif ou un type classe/struct définit par le pgmeur.

Il ne faut pas non plus oublier d'allouer dynamiquement les objets, sinon tout ce que tu fais ce sont des partages de mémoire => bombes à retardement.

(note : si tu alloues, faut pas oublier de désallouer...)

Attention de ne pas faire un int * nombres = new int[X]; car là tu jouerais avec un tableau, et donc tu ne répondrais pas à la question...
 

Xaab

Elite
C'est clair que je le trouve pas terrible non plus. hihi. Voir j'me demande comment ça arrive à pas planter XP. Vu que c'est un peut comme la fonction Poke du Basic. J'ai d'autres idées. Mais il faut que je trouve certaines fonctions qui me sont encore inconnues. :)
 

Araubas

Mr Usant
Xaab a dit:
Voilà ce que je me suis amusé à faire :)
Mais est-ce autorisé ?
// énigme
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int a,b,c,d;
int* pointeini = 0;
int* pointe=0;
pointeini = &d;
pointe=pointeini;
a=0;
while (d != 999)
{
cout << endl;
cout << "entrez votre chiffre ";
cin >> d;
cout << endl << "La liste à l'envers ==>";

a+=4;
pointe = pointeini+a;

*pointe = d;

for (b=a; b>=4; b-=4)
{
pointe=pointeini+b;
cout << " " << dec << *pointe;
}
cout << endl;
}
return 0;
}
Exécutable (tapez 999 pour quitez): Soluce ?
Je sais: le prog a un ptit bug. Et 500 ko pour faire trois fois rien. Ben mazette !!! Le basic fait beaucoup mieux.
Euuhh tu aurais pas travaillé chez Microsoft toa ?
 
A

aerox

ex membre
omG what a roxor ^^
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut