Voila, je suis un débutant en C (je viens de finir le premier chapitre de "Méthodologie de la programmation en C" de Jean Pierre Baquelaire pour ceux qui connaissent et je viens de créer un programme en C qui résout les équations du second degré avec les valeurs exactes et approchées, dans le complexes et les réels. Mon programme fonctionne parfaitement mais il y a quelques lourdeurs. Donc ceux qui peuvent répondre à mes questions ci apres, ce serait sympa :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
 
static int racine_delta(int delta);
static void usage(char *);
 
 
 
int
main(int argc, char *argv[])
{
	if (argc != 4)
		usage(argv[0]);
	int a = floor(atof(argv[1]));
	if (a == 0);
		usage(argv[0]);
	int b = floor(atof(argv[2]));
	int c = floor(atoi(argv[3]));
 
	int delta = (b * b) - (4 * a * c);
 
	if (delta != 0)
	{
		printf("Deux solutions %s :\n\n", (delta < 0) ? "complexes et conjuguees" : "reelles");
		int d = printf("%d + %s(%d * rac(%d))\n", -b, (delta < 0) ? "i" : "", racine_delta(delta), abs(delta / (racine_delta(delta) * racine_delta(delta))));
		int e;
		for (e = 1; e <= d; e++)
		{
			printf("-");
		}
		if (delta > 0)
		{
			printf(" = %f\n", (-b + sqrt(delta)) / (2 * a));
		}
		else if (delta < 0)
		{
			printf(" = %f + i * %f\n", ((float)-b/(2*a)), (sqrt(abs(delta)))/(2 * a));
		}
		printf("%d\n\n", 2 * a);
 
		d = printf("%d - %s(%d * rac(%d))\n", -b, (delta < 0) ? "i" : "", racine_delta(delta), abs(delta / (racine_delta(delta) * racine_delta(delta))));
		for (e = 1; e <= d; e++)
		{
			printf("-");
		}
		if (delta > 0)
		{
			printf(" = %f\n", (-b + sqrt(delta)) / (2 * a));
		}
		else if (delta < 0)
		{
			printf(" = %f - i * %f\n", ((float)-b/(2*a)), (sqrt(abs(delta)))/(2 * a));
		}
		printf("%d\n", 2 * a);
	}
	if (delta == 0)
	{
		printf("Une solution reelle double :\n\n");
		int d = printf("%d\n",-b);
		int e;
		for (e = 1; e <= d; e++)
		{
			printf("-");
		}
		printf(" = %f\n", (float)-b/(2*a));
		printf("%d\n", 2 * a);
	}
	return EXIT_SUCCESS;
}
 
static int
racine_delta(int delta)			// Fonction retournant la racine du plus grand carré entier dont delta est un multiple
{
	if (delta < 0)
	{
		delta = abs(delta);
	}
 
 
		int val_maxi = floor(sqrt(delta));
		int i;
		int t = 1;
		for (i = val_maxi; i > 0; i--)
		{
			if ( delta - (floor(delta/(i*i))*(i*i)) == 0)
			{
				t = i;
				i = -1;
			}
		}
	return t;
}
 
static void
usage(char *s)
{
	fprintf(stderr, "Usage: %s \"a\" \"b\" \"c\" avec a different de zero", s);
	exit(EXIT_FAILURE);
}
Voila, quelques petites questions :
Pourquoi suis-je obligé de mettre (float)-b/(2 * a) pour obtenir un float avec une divisions de deux entiers ??? (Sinon, il me considere le resultat comme un entier et ne fait qu'un arrondi entier au lieu d'un décimal

Autre soucis, pour le int a = floor(atof(argv[1])); j'ai testé la fonction atoi a tout hasard lol, il y a un bug. Qqn saurait il comment passer un argument du programme en int sans ce lourd procédé.

Enfin, dites moi ce que vous pensez de ce prog. Et ne dites pas seulement qu'il est nul plz, dite aussi pourquoi. Si vous trouvez que qqch peut etre amélioré, dites le, ca m'aidera toujours.

Pour le moment, le prog ne fonctionne bien qu'avec des entiers, pour les décimaux, le floor le transforme en entiers.

Voila, merci à vous de votre attention en tout cas.