Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1173 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Page Suivante
Auteur Sujet :

[C] ah la la .... comment chercher la complication ... !

n°868526
gilou
Modérateur
Modzilla
Posté le 08-10-2004 à 21:05:06  profilanswer
 

Reprise du message précédent :

ze nerdz a écrit :

c est vrai que ce n est pas la version finale ! :D
 
Mais ca me parait un peu bourrin de faire des if pour des valeurs type non ?
 
par contre je ne connait pas ce qu est la valeur maximale d un int ?


Il y a rien de bourrin la dedans. Si tu ecris un programme, tu dois faire de la verification de la validite des données et des resultats.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 08-10-2004 à 21:05:06  profilanswer
 

n°868536
gilou
Modérateur
Modzilla
Posté le 08-10-2004 à 21:09:45  profilanswer
 

Au fait, Ze Nerdeux, toujours vis a vis du programme, quel est l'interet de passer par des int, vu que tout doit etre positif?
A+,


Message édité par gilou le 08-10-2004 à 21:11:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°868567
ze nerdz
gné ?
Posté le 08-10-2004 à 21:44:49  profilanswer
 

gilou a écrit :

Au fait, Ze Nerdeux, toujours vis a vis du programme, quel est l'interet de passer par des int, vu que tout doit etre positif?
A+,


 
et bien, il me semblait que, comme on avait affaire à des entiers positifs, le int me parait approprié ?
 
en fait on a vu que 3 types : int, float, char
 
Je débute seulement. On vient d attaquer les tableaux, apres avoir fait l affectation, les itérative, et alternative ...
 
Tu aurais une maniere d ameliorer en passant par autre chose que des int ?.

n°868574
Taz
bisounours-codeur
Posté le 08-10-2004 à 21:48:05  profilanswer
 

pour les entiers, ils sont signés par défaut, donc un joli qualificateur unsigned et hop
 
unsigned int i;

n°868578
Sve@r
Posté le 08-10-2004 à 21:50:46  profilanswer
 

gilou a écrit :

Il y a rien de bourrin la dedans. Si tu ecris un programme, tu dois faire de la verification de la validite des données et des resultats.
A+,


 
Eh allez... On est reparti comme dans le topic à propos des 3 nombres où il faut s'amuser à vérifier s'ils sont croissants, décroissants, impairs, etc... (http://forum.hardware.fr/hardwarefr/Programmation/sujet-58189-1.htm)
 
C'était un truc tout gentil au départ et ça finit en charclage "il faut faire -ci, il faut utiliser des "const", il faut faire-ça, on utilise "size_t", pas de "#define", etc
 
1) on essaye d'abord de faire un truc qui fonctionne, qui donne envie d'aller plus loin en C, on se fait plaisir à voir son algo réussir à donner la bonne valeur
2) si on a envie, si on est sur un projet sensible, si cela doit-être à l'épreuve du singe, si on imagine qu'il y aura sur la planète un type dont le seul but est de faire planter le programme alors on le blinde anti-tout.
 
Essayez de relativiser un peu les objectifs...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°868582
Taz
bisounours-codeur
Posté le 08-10-2004 à 21:53:14  profilanswer
 

faut te mettre un truc dans la tête : la bibliothèque standard utilise plus de size_t que d'int, sizeof retourne un int ... alors l'approche la plus simple, quand quelque chose te file un size_t, c'est de le récupérer dans un size_t.
 
C'est ton approche tout int qui est hasardeuse.

n°868602
masklinn
í dag viðrar vel til loftárása
Posté le 08-10-2004 à 22:13:08  profilanswer
 

Taz a écrit :

faut te mettre un truc dans la tête : la bibliothèque standard utilise plus de size_t que d'int, sizeof retourne un int ... alors l'approche la plus simple, quand quelque chose te file un size_t, c'est de le récupérer dans un size_t.
 
C'est ton approche tout int qui est hasardeuse.


Coquille/inattention je pense (l'int est pas logique ici, ca va pas avec le reste de la phrase), sizeof retourne un size_t, en tout cas d'après la msdn

Citation :

The result of the sizeof operator is of type size_t, an integral type defined in the include file STDDEF.H. This operator allows you to avoid specifying machine-dependent data sizes in your programs.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°868608
Taz
bisounours-codeur
Posté le 08-10-2004 à 22:17:42  profilanswer
 

oups :D
 
au moins t'es attentif. et comme tu le cites, la première raison d'être de size_t, c'est sizeof :)

n°868617
masklinn
í dag viðrar vel til loftárása
Posté le 08-10-2004 à 22:23:45  profilanswer
 

Taz a écrit :

oups :D
 
au moins t'es attentif.


pas spécialement, c'est juste que ca m'a choqué sur le coup, la phrase n'ayant aucun sens avec cet int [:cupra]  

Citation :

et comme tu le cites, la première raison d'être de size_t, c'est sizeof :)


chose que je viens par ailleurs d'apprendre grâce à toi :jap:  
(non je rigole pas)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°868634
ze nerdz
gné ?
Posté le 08-10-2004 à 22:40:28  profilanswer
 

oula la je suis completement perdu dans ce que vous me dites .... :(
 
on nous a rien expliqué de tout ca ... sizeof, size_t,#define,const...oulala j en ai encore a apprendre, ... :)
 
:hello:

mood
Publicité
Posté le 08-10-2004 à 22:40:28  profilanswer
 

n°868635
ze nerdz
gné ?
Posté le 08-10-2004 à 22:40:58  profilanswer
 

a mon avis tout le long du topic vous avez surestimé mes capacités ....

n°868651
gilou
Modérateur
Modzilla
Posté le 08-10-2004 à 22:55:49  profilanswer
 

Sve@r a écrit :

Eh allez... On est reparti comme dans le topic à propos des 3 nombres où il faut s'amuser à vérifier s'ils sont croissants, décroissants, impairs, etc... (http://forum.hardware.fr/hardwarefr/Programmation/sujet-58189-1.htm)
 
C'était un truc tout gentil au départ et ça finit en charclage "il faut faire -ci, il faut utiliser des "const", il faut faire-ça, on utilise "size_t", pas de "#define", etc
 
1) on essaye d'abord de faire un truc qui fonctionne, qui donne envie d'aller plus loin en C, on se fait plaisir à voir son algo réussir à donner la bonne valeur
2) si on a envie, si on est sur un projet sensible, si cela doit-être à l'épreuve du singe, si on imagine qu'il y aura sur la planète un type dont le seul but est de faire planter le programme alors on le blinde anti-tout.
 
Essayez de relativiser un peu les objectifs...


Par exemple avoir comme objectif de ne pas coder un truc merdeux qui plante a la moindre faute de frappe de l'utilisateur...
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°868696
ze nerdz
gné ?
Posté le 08-10-2004 à 23:18:31  profilanswer
 

Sve@r a écrit :

Tu tentes de réécrire le "r * x" de ton premier algo par une suite d'additions. Mais au-lieu de calculer "r + r" x fois, tu fais "r + x" x fois.
Essaye plutôt ceci...

Code :
  1. int x,y,r,sum;
  2. demander("x",x);
  3. demander("y",y);
  4. r=1;
  5. for(b=1;b<=y;b++)
  6. {
  7.     sum=r;
  8.     for(a=2;a<=x;a++) // commencer à "2" car l'initialisation compte pour 1
  9.     {
  10.         r=r+sum;
  11.     } 
  12. }




 
J ai un peu de mal a interpreter ton "sum", qu est ce que tu a voulu faire comprendre en utilisant ce nom de variable ?
serait ce juste une variable auxilliaire ?, qui permet de garder l ancienne valeur ?


Message édité par ze nerdz le 08-10-2004 à 23:20:01
n°868705
masklinn
í dag viðrar vel til loftárása
Posté le 08-10-2004 à 23:26:34  profilanswer
 

ze nerdz a écrit :

a mon avis tout le long du topic vous avez surestimé mes capacités ....


Non, on peut peut-être parler de notions que tu ne connais pas encore, mais il n'y a pas de raison pour que tu ne les maîtrises pas dans le futur (de plus entendre parler de ces notions peut te donner des pistes de recherche pour t'améliorer) [:spamafote]  

Citation :

J ai un peu de mal a interpreter ton "sum", qu est ce que tu a voulu faire comprendre en utilisant ce nom de variable ?
serait ce juste une variable auxilliaire ?, qui permet de garder l ancienne valeur ?


non, elle permet d'avoir la nouvelle valeur "courante" de r
 
quand tu as r*n ca se décompose en r+r+r+r+...+r
mais si tu fais r+=r, tu modifies la valeur de r donc tu perds la dite valeur
 
La technique, c'est de sauvegarder la valeur de r au début de l'étape (dans sum, ou temp, ou schtroumpf, on s'en fout, l'avantage de sum c'est que c'est explicite), puis d'incrémenter r dans la boucle simulant la multiplication


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°868749
ze nerdz
gné ?
Posté le 08-10-2004 à 23:57:18  profilanswer
 

ok j ai compris l utilisation de cette variable, je me posais juste la question sur son nom, mais si cela a été choisit au hasard ^^.
 
Par contre, je trouve que mon programme marche mieux dans les valeurs pour x=0 ou y =0 enfin c peut etre une idée :
 

Code :
  1. #include <stdio.h>
  2. int main(void){
  3. int x,y;
  4. int resultatFin;
  5. int resultatAux;
  6. int i,j;                             //Variables utilisées pour les boucles "for"
  7. do{
  8.     printf("\nValeur de x : " );
  9.     scanf("%d",&x);
  10. }while(x<0);
  11. do{
  12.     printf("Valeur de y : " );
  13.     scanf("%d",&y);
  14. }while(x<0);
  15. resultatFin = x;
  16. if(y == 0){                            //cas de la puissance 0 toujours égale à 1
  17.     resultatFin = 1;
  18. }
  19. else{
  20.     for(i = 1 ; i < y ; i++){                //décomposition de la multiplication    
  21.         resultatAux = 0;
  22.         for(j = 0 ; j < resultatFin ; j++){         //décomposition de l'addition
  23.             resultatAux = resultatAux + x;
  24.         }
  25.     resultatFin = resultatAux;
  26.     }
  27. }
  28. printf("resultat = %d",resultatFin);                     // affichage du resultat  
  29. }


 
 
par contre, la facon de procéder est differente, donc je vais analyser ton point de vue !
 
merci !


Message édité par ze nerdz le 09-10-2004 à 00:00:01
n°868840
Sve@r
Posté le 09-10-2004 à 08:49:42  profilanswer
 

ze nerdz a écrit :

ok j ai compris l utilisation de cette variable, je me posais juste la question sur son nom, mais si cela a été choisit au hasard ^^.
 
Par contre, je trouve que mon programme marche mieux dans les valeurs pour x=0 ou y =0 enfin c peut etre une idée :
 

Code :
  1. #include <stdio.h>
  2. int main(void){
  3. int x,y;
  4. int resultatFin;
  5. int resultatAux;
  6. int i,j;                             //Variables utilisées pour les boucles "for"
  7. do{
  8.     printf("\nValeur de x : " );
  9.     scanf("%d",&x);
  10. }while(x<0);
  11. do{
  12.     printf("Valeur de y : " );
  13.     scanf("%d",&y);
  14. }while(x<0);
  15. resultatFin = x;
  16. if(y == 0){                            //cas de la puissance 0 toujours égale à 1
  17.     resultatFin = 1;
  18. }
  19. else{
  20.     for(i = 1 ; i < y ; i++){                //décomposition de la multiplication    
  21.         resultatAux = 0;
  22.         for(j = 0 ; j < resultatFin ; j++){         //décomposition de l'addition
  23.             resultatAux = resultatAux + x;
  24.         }
  25.     resultatFin = resultatAux;
  26.     }
  27. }
  28. printf("resultat = %d",resultatFin);                     // affichage du resultat  
  29. }


 
 
par contre, la facon de procéder est differente, donc je vais analyser ton point de vue !
 
merci !


 
T'inquiète pas pour "sum". J'avais effectivement pris ce nom au hasard. Et quand j'ai tapé mon prog, j'avais utilisé la variable "res" pour récupérer le résultat.
 
Encore quelques détails à voir
1) dans ta saisie de "y" tu boucles tant que "x" < 0 !!!
2) pour 0^0 ton programme renvoie "1" alors que la vraie valeur est indéfinie
3) L'instruction "ResultatFin=x" est inutile puisque 3 lignes plus bas  
tu as "ResultatFin=1" ou bien "ResultatFin=ResultatAux"
4) tes commentaires sur les décompositions sont inexacts. Ta première boucle décompose la puissance et non la multiplication, et ta seconde boucle décompose la multiplication et non l'addition
5) j'ai pas vérifié (j'ai pas de compilo chez-moi) mais il me semble que ta première boucle devrait être "for (i=1; i <= y; i++)"
 
Mais te fais pas de soucis. Le vrai sujet de cet exercice était de te faire réfléchir sur l'algorithme et l'imbrication de boucles. De ce point de vue, ton exo est parfait et ces quelques détails ne sont vraiment que pour le puriste qui veut couper le cheveu en quatre dans sa longueur.
 
A+


Message édité par Sve@r le 09-10-2004 à 09:03:31

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°868843
masklinn
í dag viðrar vel til loftárása
Posté le 09-10-2004 à 09:14:02  profilanswer
 

Sve@r a écrit :


5) j'ai pas vérifié (j'ai pas de compilo chez-moi) mais il me semble que ta première boucle devrait être "for (i=1; i <= y; i++)"


Suffit de taper le code en python dans l'interpréteur [:spamafote] (traduire des boucles comme ca du C au Python c'est quand même pas bien compliqué)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°868851
Sve@r
Posté le 09-10-2004 à 09:54:49  profilanswer
 

Masklinn a écrit :

Suffit de taper le code en python dans l'interpréteur [:spamafote] (traduire des boucles comme ca du C au Python c'est quand même pas bien compliqué)


 
Je n'ai pas non-plus d'interpréteur Python (de plus je ne connais pas ce langage) ni Perl ni Ada ni Delphi ni...
Chez-moi j'utilise pas mon ordi pour programmer [:spamafote] et je n'ai pas non-plus envie de prendre un papier et un crayon pour dérouler l'algo à la mano un samedi matin...


Message édité par Sve@r le 09-10-2004 à 09:56:21

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°868856
masklinn
í dag viðrar vel til loftárása
Posté le 09-10-2004 à 10:13:54  profilanswer
 

Sve@r a écrit :

Chez-moi j'utilise pas mon ordi pour programmer [:spamafote] et je n'ai pas non-plus envie de prendre un papier et un crayon pour dérouler l'algo à la mano un samedi matin...


Saÿ malin ca :o

Citation :

Je n'ai pas non-plus d'interpréteur Python (de plus je ne connais pas ce langage) ni Perl ni Ada ni Delphi ni...


en même temps, Ada/delphi n'ont pas d'interpréteurs interactifs si?
 
et python est pas super compliqué pour des travaux aussi simple, le programme de nerdz donne en gros (avec une gestion d'erreur au niveau des saisies totalement indexistante)

Code :
  1. def addpower():
  2.     print "x^y"
  3.     x = int(raw_input("x:" ))
  4.     y = int(raw_input("y:" ))
  5.     resultatFin = x
  6.     if y==0:
  7.         if x==0:
  8.             raise ArithmeticError
  9.         else:
  10.             return 1
  11.     for i in range(1, y):
  12.         resultatAux = 0
  13.         for j in range(resultatFin):
  14.             resultatAux = resultatAux+x
  15.         resultatFin = resultatAux
  16.     return resultatFin


yé pas super efficace par contre (Python aime pas trop ce genre de boucles :o)
 
Edit: merci Taz, je trouvais pas quelle erreur mettre (donc j'ai mis runtime qui est le défaut quand on sait pas quoi foutre d'autre et qu'on veut pas créer sa sienne, a moins que je me plante)


Message édité par masklinn le 09-10-2004 à 10:49:08

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°868873
Taz
bisounours-codeur
Posté le 09-10-2004 à 10:45:48  profilanswer
 

RuntimeError -> ArithmeticError

n°869596
dividee
Posté le 10-10-2004 à 19:22:18  profilanswer
 

Toujours en python:

Code :
  1. import operator
  2. def addpower(x,y):
  3.     reduce(lambda x,y: reduce(operator.add, [x]*y, 0), [x]*y, 1)


 
plus simple, non ?  :pt1cable:  

n°869607
Taz
bisounours-codeur
Posté le 10-10-2004 à 19:34:00  profilanswer
 

là où t'as loosé, c'est qu'il reste un def dans ton code :o
(t'as oublié son return d'ailleurs)
 
lambda x,y: reduce(operator.add, [x]*y, 0)
cela dit, c'est effectivement une belle obfuscation ...  
 
 
du reste, tout le monde aura compris que  
x**y est quand même plus efficace et bien plus simple.

n°869636
masklinn
í dag viðrar vel til loftárása
Posté le 10-10-2004 à 20:04:56  profilanswer
 

dividee a écrit :

Toujours en python:

Code :
  1. import operator
  2. def addpower(x,y):
  3.     reduce(lambda x,y: reduce(operator.add, [x]*y, 0), [x]*y, 1)


 
plus simple, non ?  :pt1cable:


Ah oui, c'est supaïr facile à faire correspondre à du code C/C++ ca :whistle:


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°869637
dividee
Posté le 10-10-2004 à 20:06:06  profilanswer
 

Taz a écrit :

là où t'as loosé, c'est qu'il reste un def dans ton code :o
(t'as oublié son return d'ailleurs)
 
lambda x,y: reduce(operator.add, [x]*y, 0)
cela dit, c'est effectivement une belle obfuscation ...  
 
 
du reste, tout le monde aura compris que  
x**y est quand même plus efficace et bien plus simple.


 
oops c'est vrai j'ai oublié le return...
Obfuscation, c'est une question de point de vue. Pour un pythoniste, c'est sans doute de l'obfuscation, mais pour qqn habitué au langages fonctionnels (scheme, lisp,...), c'est sans doute plus facile écrire et à comprendre que la version impérative.
D'ailleurs j'ai volontairement laissé le def car le but c'était pas de faire de l'obfuscation, justement, mais de montrer une autre approche de la solution.
 
Bien sûr dans le monde réel c'est idiot de vouloir réimplémenter des opérateurs built-ins ou des fonctions d'un libraire standard, mais en tant qu'exercice académique, pourquoi pas ? On peut apprendre tout autant de choses avec ce genre d'exercice et ils ont l'avantage d'avoir des formulations simples et d'être facilement vérifiables...

n°869642
Taz
bisounours-codeur
Posté le 10-10-2004 à 20:16:20  profilanswer
 

lambda x,y: reduce(operator.add, [x]*y, 0)  
 
ça te parait pas de l'obfuscation pour écrire une multiplication ça ?

n°869681
dividee
Posté le 10-10-2004 à 21:38:21  profilanswer
 

Taz a écrit :

lambda x,y: reduce(operator.add, [x]*y, 0)  
 
ça te parait pas de l'obfuscation pour écrire une multiplication ça ?


Dans l'absolu, si. Mais le but étant d'implémenter une multiplication à partir d'additions uniquement, ce morceau de code le fait assez clairement je trouve (quand on connait reduce).
La seule opération arithmétique utilisée est l'addition (le [x]*y n'étant pas une opération arithmétique, si on considère que c'est tricher, on peut le remplacer par [x for i in range(y)]).  
Il a aussi l'avantage de faire clairement ressortir l'élément neutre de chaque opération (0 pour l'addition, 1 pour la multiplication) comme 3ème argument de chaque reduce, et de bien séparer les opérations d'additions et de multiplications; j'avais d'abord écris
reduce(operator.mul, [x]*y, 1), puis j'ai remplacé operator.mul pour le réimplémenter à base d'additions. En fait j'ai plus de difficulté à comprendre et à me convaincre de la justesse de l'implémentation impérative que de celle-ci.
Sinon, n'importe quelle solution peut être vue comme une obfuscation de x*y.


Message édité par dividee le 10-10-2004 à 21:40:28
n°869683
Taz
bisounours-codeur
Posté le 10-10-2004 à 21:40:40  profilanswer
 

t'es une fille ?

n°869685
WhatDe
Posté le 10-10-2004 à 21:42:53  profilanswer
 

Elle (il ?) habite Bruxelles.
Si c'est le cas  [:je@nb]

n°869700
dividee
Posté le 10-10-2004 à 21:58:07  profilanswer
 

:lol:  
non désolé, je suis pas une fille (mais j'habite bien Bruxelles). Tu peux y aller, je crains pas les coups, si c'était le but de la question :p

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
Cmnt aller chercher une valeur dans des champs générés aleatoirement ?[algo/proba] je chercher une fonction de probabilite
chercher code nouvelles par phpChercher une chaine dans un tableau PHP
[expression réguliére] Comment chercher toutes les chaines sans espace[PHP] Chercher un caractère dans une chaine... Quel fonction ?
chercher une chaine de caractere dans un fichier texteVB.NET (smart device application) [arrêtez de chercher]
chercher valeur...chercher la position d'un noeuds?
Plus de sujets relatifs à : [C] ah la la .... comment chercher la complication ... !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR