Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

13 janvier 2009 à 21:56:45

Citation : May_Hop

Quand tu fais un copier/coller dans un code, car c'est l'origine de cette répétition (sauf si erreur ;) ), il faut se poser des questions et voir si on ne peut pas éviter ces répétitions.


C'était tout réfléchi, ne t'inquiète surtout pas. ;)
  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2009 à 10:26:48

Je m'inquiète plutôt pour les débutants qui vont lire ton code et le prendre comme exemple. Car je trouve que tu donnes une mauvaise habitude. Mieux vaut découper son code en de multiples fonctions ... La relecture, ou une possible amélioration du code est d'autant plus facile.
  • Partager sur Facebook
  • Partager sur Twitter
14 janvier 2009 à 19:13:18

Titre : zGame
mois : Janvier
Sujet : Révisions du cours de M@teo21

L'exercice !



L'exercice de ce mois-ci sera : un jeu : zGame !
Ce jeu sera d'un niveau simple afin qu'un maximum de débutants en C puissent le coder. Il est dans le même style que le jeu du pendu proposé par M@teo21 ici (lien). Il va vous permettre de pratiquer, mais pas contre, il n'y a pas de thème bien particulier, vous allez devoir réutiliser quasiment tout ce que vous savez (variables, conditions, boucles, nombres pseudo-aléatoires, calculs, etc.).

En plus, vous ne perdez rien, en vous entraînant, vous réalisez un jeu amusant et utile ! :) Let's go.

Le but du jeu



zGame est un grand classique parmi les jeux que l'on réalise pour s'entraîner.

Le programme vous tire une série de dix calculs mathématiques sur les tables de multiplication (oui, ceux qu'on bosse en primaire ^^ ). Le but du jeu est de trouver la bonne réponse à ces calculs le plus rapidement possible et en faisant le moins d'erreurs possibles.

À quoi doit ressembler votre programme ?



Le programme .. c'est à vous de le faire. :p
Vous allez donc commencer par afficher le nom du jeu (j'ai pris zGame, mais vous le nommez comme vous voulez) ainsi qu'une rapide présentation des règles. Ensuite, vous soumettez le joueur (l'utilisateur de votre programme) à une série de dix calculs comportant obligatoirement que 2 facteurs (un facteur, c'est l'un des termes d'une multiplication). Ces facteurs doivent obligatoirement être des nombres entiers compris entre 0 et 10, les deux inclus, et tirés pseudo-aléatoirement !

À la fin de cette série de calculs, vous affichez le temps total qu'a mis le joueur pour trouver les réponses (c'est parfois amusant ^^ ) ainsi que le nombre d'erreurs qu'il a pu faire.

On peut par exemple imaginer ceci :
-zGame- : Entraînez votre cerveau au calcul mental !

 Le programme va vous soumettre dix calculs sur les tables de multiplication,
 calculs que vous allez devoir résoudre le plus rapidement possible et ... de tête !

Près ? Appuyez sur entrer pour commencer...

 5*9 = 45
 3*4 =
 [...]

Vous avez mis 15.234 seconde(s) et vous avez 1 erreur(s) !
Appuyez sur entrer pour quitter...


Pour le calcul du temps qu'a mis le joueur à résoudre la série des dix calculs, jetez un oeil à la correction de zTri (lien). Pour le tirage des valeurs pseudo-aléatoires, j'utilise rand()%11 ce qui tire une valeur entre 0 et 10, les deux inclues. Je vous conseille aussi de lire le tutoriel de Natim sur les nombres aléatoires (lien).

Je crois que vous avez suffisamment d'informations, maintenant, c'est à vous de coder ! Au boulot ! :p

Je posterai la correction dans trois semaines. Je donnerai plus de détails sur cette date dés que possible.

Have a lot of fun !

crys
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2009 à 0:14:20

Citation : crys'


Ce jeu sera d'un niveau simple afin qu'un maximum de débutants en C puissent le coder.


Je le trouve trop complexe.

Citation : crys'



En plus, vous ne perdez rien, en vous entraînant, vous réalisez un jeu amusant et utile ! :)
(...)
zGame est un grand classique parmi les jeux que l'on réalise pour s'entraîner.



Pour une complexité identique, j'aurais trouvé plus excitant de coder mots/minute.
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2009 à 1:45:08

Je viens de terminer l'exercice, mais...

Petite question : les fonctions fgets et scanf sont blocantes, ainsi l'utilisation de clock() n'est pas possible par non représentative du temps qu'il est réellement écoulé (vu que clock() regarde uniquement le temps à partir de l'utilisation cpu). J'ai utilisé les fonctions time() et difftime() pour calculer le temps de l'exercice, néanmoins la précision n'est que de la seconde.

Alors, certes, dans un tel exercice, les millièmes n'ont pas vraiment d'importance et ma solution marche parfaitement. Mais existerait-il une alternative pour obtenir une telle précision ?
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2009 à 1:49:42

Citation : Eusebus


Mais existerait-il une alternative pour obtenir une telle précision ?



De façon portable, je ne pense pas.
  • Partager sur Facebook
  • Partager sur Twitter
15 janvier 2009 à 18:49:29

Citation : candide

Je le trouve trop complexe.


Il n'est en aucun cas plus complexe que le pendu.

Citation : candide

Pour une complexité identique, j'aurais trouvé plus excitant de coder mots/minute.


Je ne suis pas du tout d'accord.
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 19:08:42

Yeah, je m'y met tout de suite :) , dommage que ça ne parle pas de pointeurs...
(Ou alors je suis vraiment nul et je les ai pas vu passé... :lol: )
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 21:42:22

Non, il n'y a pas encore eu d'exercice ayant uniquement pour but de vous entraîner aux pointeurs. Ca ne va pas tarder. ^^
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 22:17:36

tiens belle initiative de proposer un tel jeu, mais j'aurai fait un niveau 2 qui consistait à utiliser les + - * /
niveau 2 : faire des équations du 1er degré(assez simple pour du cacul mental) et
niveau 3 : des identités remarquables(tel que (x+5)² ou 31²) à développer(ça c'est plus dur).
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 22:22:04

Citation : Jaloyan1

tiens belle initiative de proposer un tel jeu, mais j'aurai fait un niveau 2 qui consistait à utiliser les + - * /
niveau 2 : faire des équations du 1er degré(assez simple pour du cacul mental) et
niveau 3 : des identités remarquables(tel que (x+5)² ou 31²) à développer(ça c'est plus dur).



je crois pas que c'est nécessaire de compliquer à outrance, c'est fait pour les débutants, pour qu'un maximum de participants puisse réaliser "quelque chose" car pour l'instant a priori on est que 6 ou 7 a avoir fait tous les exo jusqu'a present !
@+
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 22:36:09

Avec le rand j'ai vachement de mal a obtenir des bon nombres aleatoires
Souvent le meme nombre se repete sur la ligne suivant si on est rapide vu que sa se base sur le temps :/
Et j'arrive pas a utliser la fontion hasard donnée
Enfin je vais revoir sa
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 22:55:45

Petite astuce pour srand(). Au lieu de faire

srand(time(NULL));


on peut aussi faire un

srand(getpid() * time(NULL));


getpid() est définie dans unistd.h
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 23:06:17

Citation : birdroun

Avec le rand j'ai vachement de mal a obtenir des bon nombres aleatoires
Souvent le meme nombre se repete sur la ligne suivant si on est rapide vu que sa se base sur le temps :/


Si le même nombre se répète dans la même seconde, c'est que tu appelles srand(time(NULL)) à chaque fois que tu veux générer un nombre aléatoire, alors que srand() ne sert qu'à initialiser le générateur. Appel srand() une fois au début de main() et seulement rand() quand tu as besoin d'un nouveau nombre aléatoire ;)
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 23:07:45

Citation

Petite astuce pour srand(). Au lieu de faire

srand(time(NULL));


on peut aussi faire un

srand(getpid() * time(NULL));


getpid() est définie dans unistd.h



Oui, ou alors utiliser le dow jones la temperature a vladivostock, et rajouter l'age du capitaine...

Ce qui ne changera pas grand chose au resultat

Citation

Avec le rand j'ai vachement de mal a obtenir des bon nombres aleatoires
Souvent le meme nombre se repete sur la ligne suivant si on est rapide vu que sa se base sur le temps :/
Et j'arrive pas a utliser la fontion hasard donnée
Enfin je vais revoir sa



Il faut que tu n'utilise srand qu'une seule fois dans tout ton programme. Met le au debut du main, avant toutes les boucles. Ca devrait resoudre ton problème

/grilled
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 23:49:40

Citation : Flooder

Oui, ou alors utiliser le dow jones la temperature a vladivostock, et rajouter l'age du capitaine...



Super constructif, merci.

D'autant plus que personnellement j'ai observé un changement entre les deux. Mais bon, c'est surement du à l'âge du capitaine...
  • Partager sur Facebook
  • Partager sur Twitter
16 janvier 2009 à 23:54:29

Un changement dans de l'aléatoire, mouais.
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 0:23:47

Maintenant j'aimerais bien savoir comment faire pour aligner les multiplications je m'explique
9 * 8 =
2 * 3 =   //tout va bien
10 * 4 =  //sa se decale
10 * 10 = //et encore

ce resultat serait mieu
9  * 8  =
2  * 3  =  
10 * 4  = 
10 * 10 =

car j'aimerais ajouter juste apres la bonne reponse colorée en vert si juste et en rouge si faux


9 * 8 = 72
2 * 3 = 6
10 * 4 = 30 ==> 40
10 * 10 = 100


  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 0:29:20

Citation : python-guy

Un changement dans de l'aléatoire, mouais.



C'est du pseudo-aléatoire, pas de l'aléatoire pur... Bref, le topic n'est pas là pour débattre de cela.
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 18:32:06

Citation : birdroun

Maintenant j'aimerais bien savoir comment faire pour aligner les multiplications



man printf(3)
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 19:13:39

Citation : mota

Citation : birdroun

Maintenant j'aimerais bien savoir comment faire pour aligner les multiplications



man printf(3)


man 3 printf
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 19:26:02

Citation : python-guy

Citation : mota

Citation : birdroun

Maintenant j'aimerais bien savoir comment faire pour aligner les multiplications



man printf(3)


man 3 printf



bon bah si tu veux jouer au plus cretin: printf(3)

Voila, c'est correct pour de bon.
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 19:51:23

Citation : mota


man printf(3)



Dans le genre aide-pour-enfoncer c'est réussi.

Un petit exemple vaut mieux qu'une long page man :

#include <stdio.h>

int main(void)
{
    int x=9;
    printf("calcul : %2d x %2d = %3d\n", x,x,x*x);
    printf("calcul : 10 x 10 = 100\n");

    return 0;
}


calcul :  9 x  9 =  81
calcul : 10 x 10 = 100

Process returned 0 (0x0)   execution time : 0.015 s
Press any key to continue.


EDIT : Sans compter qu'il existe d'autres façons de résoudre le problème.


  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 20:19:38

Citation : candide


Un petit exemple vaut mieux qu'une long page man :



Non.

Donner une solution n'est jamais un bon conseil.

D'ailleurs, tu donnes ton exemple sans expliquer le pourquoi de la syntaxe, ce a quoi elle correspond, quel est son nom, j'en passe et des meilleurs. Dans le genre aide-pour-encourager-l'ignorance, c'est reussi.

man est un bon conseil, on y trouve toujours ce que l'on cherche, sauf si on est faineant.
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 21:20:02

bonjour:
pour motta et phyton guy = -1
Je vous rapelle qu'il y a des novices, c'est pas la peine de les décourager, surtout que la demande de birdroun est "propre". Si vous n'avez pas envie de lui repondre, abstenez vous !

Candide lui donne une solution correcte, qu'il peut tester, la moindre des choses c'est de respecter son choix !

Faites un "feed back " du temps ou vous avez débuté. Vous avez oublié ?
@+
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 21:24:12

Petite solution pour zBinary (compréhensible pour des gens ayant mon niveau...)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	long nombreDecimal;
	long reste[1000] = {0};
	int a = 0;

	printf("Veuillez entrer un nombre entier positif s'il vous plait: ");
	scanf("%ld", &nombreDecimal);

	while(nombreDecimal != 0)
	{
		reste[a] = nombreDecimal % 2;
		nombreDecimal = nombreDecimal / 2;
		a++;
	}
	printf("\nLe meme nombre en binaire est: ");

	while(a != 0)
	{
		a--;
		printf("%ld", reste[a]);
	}
	printf("\n");

	return EXIT_SUCCESS;
}


  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 21:42:23

L'algorithme que tu utilises est le même que celui utilisé dans la première solution donnée ici (lien). :)
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 21:43:31

Citation : Camp0us

Petite solution pour zBinary (compréhensible pour des gens ayant mon niveau...)

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	long nombreDecimal;
	long reste[1000] = {0};
	int a = 0;

	printf("Veuillez entrer un nombre entier positif s'il vous plait: ");
	scanf("%ld", &nombreDecimal);

	while(nombreDecimal != 0)
	{
		reste[a] = nombreDecimal % 2;
		nombreDecimal = nombreDecimal / 2;
		a++;
	}
	printf("\nLe meme nombre en binaire est: ");

	while(a != 0)
	{
		a--;
		printf("%ld", reste[a]);
	}
	printf("\n");

	return EXIT_SUCCESS;
}




effectivement c'est une solution (par division successive, dans la correction il en existe d'autre. Si tu l'as fait tout seul c'est bien, c'est un bon début.

--> avec cette méthode si tu fait des divisions succesives par un nombre a, et non par deux, tu obtients ta conversion en base a
@+
  • Partager sur Facebook
  • Partager sur Twitter
17 janvier 2009 à 23:35:01

Citation : mota


man est un bon conseil, on y trouve toujours ce que l'on cherche, sauf si on est faineant.



Ben on n'a plus qu'à fermer le forum C du sdz qui est parcouru par un ramassis de fainéants et donner un lien vers les pages man ou, plutôt, vu qu'il est préférable de s'adresser à Dieu qu'à ses saints, un lien vers la Norme du langage C.

Et quand je parcours les messages que tu as postés sur le forum C du sdz, je vois que t'es bon pour donner des conseils mais jamais pour produire du code, du vrai code C. T'en fais pas je ne suis pas dupe. "In code we trust".
  • Partager sur Facebook
  • Partager sur Twitter
18 janvier 2009 à 1:53:25

J'ai pondu un code pour une correction d'un exercice ici parce que j'estimais que le sujet n'employait pas un vocabulaire exact. A toi de le retrouver, et si tu ne trouves pas beau, tant pis pour toi.

Avant d'etre dans une ecole j'ai toujours ete voir les man et maintenant que j'y suis, mes habitudes ne changent pas, a l'exception pres qu'avec un peu plus de niveau je vais aussi voir le code des outils dont je dispose, par simple curiosite.

Cette meme curiosite est un reel atout, en particulier en informatique, et boire les paroles d'un tiers ne mene jamais rellement a quelque chose de productif, que le demandeur de solution soit novice, ou non.

Donc oui, "man" est un excellent conseil.
Quant a la fermeture du forum C, je ne vois pas l'interet de sortir une telle extrapolation autre que pour aggraver tes propos et discrediter les miens : )
  • Partager sur Facebook
  • Partager sur Twitter