Simplificateur de racines carrées

Description

Ce programme sert à simplifier les racines carrées. Bon, le reste des choses à dire est dans la source.

Source / Exemple :


////////////////////////////////////////////////////////
// Simplification de racines carrées...
// Par Alexandre SECHAUD,
// alex.andre63@laposte.net .
// Mon premier petit programme avec des fenêtres;
// mon deuxième en C++
// J'ai essayé de faire des commentaires compréhensibles,
// dans ces derniers, j'ai mis les variables entre 'apostrophes'
// Je me suis amusé avec les fonctions et les chaînes;
// le programme n'est peut-être pas très beau,
// mais je suis ouvert à toutes les remarques
// Le 30/05/2002.
// ----------------
// J'ai utilisé lcc comme compilateur,
// Mais ça doit marcher pour tous les
// autres compilateurs.
///////////////////////////////////////////////////////

#include <windows.h>
#include <windowsx.h>
#include <math.h>
#include <string.h>
#include "ressource.h"
#define WIN32_LEAN_AND_MEAN
HINSTANCE g_hInst;

// déclare variables
char buffer[12],solution[100];

//déclare Fonctions
void racine(unsigned long racine, unsigned long &c, unsigned long &d);
BOOL CALLBACK FenPrinc( HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam);
void reponse(unsigned long un,unsigned long deux,unsigned long trois);
int overfloor(unsigned long nombre);

//////////////////////////
// WinMain
/////////////////////////

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )
{
	g_hInst = hInstance;
	DialogBox(hInstance,MAKEINTRESOURCE(IDQUESTION),NULL,FenPrinc); //Lance la fenêtre de dialogue, contrôle par FenPrinc
	BOOL SetWindowText(HWND hwnd, LPCTSTR lpString);
	return 0;
}

///////////////////////
// Calcul
///////////////////////
// 					Principe :
// on a 'racine', on veux 'c' et 'd' entiers tels que:
// Racine('racine')=Racine('c'*'c'*'d')='c'*Racine('d')
// On enlève Racine:
// Ca donne 'rac' = 'c'*'c'*'d'
// ou alors 'd'='rac'/('c'*'c')
// Et d doit être entier.
// On voit vite que 'c' =< Racine('rac')
// Si c'est égal, on a un carré, et 'd'=1,
// sinon, 'd'>1 et alors 'c'*'c'<'racine'
// En commençant par 'c'=E(Racine('racine'));
// E étant la partie entière; et en
// diminuant progressivement de 1, dès
// que l'on trouve un entier pour 'd', c'est
// que c'est le plus grand.
// Au pire, on va arriver à 1,
// et on dira Racine('racine')=1*Racine('racine')
// Il faut que 'racine' !=0, car sinon,
// 'c'=E(Racine('racine')=0 et
// on divise par 0 :-(
/////////////////////////
void racine(unsigned long racine, unsigned long &c, unsigned long &d)
{
	double approch;
	approch = floor(sqrt(racine))+1; // J'ai fait +1
		do
				{
					approch -= 1;  // car ici, on fait tout de suite -1
				}					// on commence donc par floor(sqrt(racine))
				while (racine/(approch*approch) != floor(racine/(approch*approch)));
				// On a un entier...
		c = approch;
		d=racine/(c*c);
}

/////////////////////////////////
// Mise en place de la réponse
/////////////////////////////////
void reponse(unsigned long un, unsigned long deux, unsigned long trois)
{
strcpy(solution,"Racine de ");	//Je veux écrire dans la boîte de dialogue racine de
char tmp[30]; 					 //'un' se simplifie en 'deux' racine de 'trois'
ultoa(un,tmp,10);				   //J'écris la variable 'un' sous forme de chaîne
strncat(solution,tmp,strlen(tmp)); // Je colle tous les bouts de réponse les un aux autres.
strcpy(tmp," devient ");			// J'écris du texte sous forme de chaîne
strncat(solution,tmp,strlen(tmp));	// Et je recolle....
ultoa(deux,tmp,10);					// etc...
strncat(solution,tmp,strlen(tmp));
strcpy(tmp," racine de ");
strncat(solution,tmp,strlen(tmp));
ultoa(trois,tmp,10);
strncat(solution,tmp,strlen(tmp));
strcpy(tmp,".");
strncat(solution,tmp,strlen(tmp));
}

//////////////////////////////
// Messages, gestion fenetre
/////////////////////////////

BOOL CALLBACK FenPrinc( HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam)
{

	switch(uMsg)
	{

		case WM_INITDIALOG:
			{
			// je place un texte dans l'edit box au début
			SetWindowText(GetDlgItem(hwndDlg, IDNOMBRE), "125");
			return TRUE;
			break;
			}

		case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
				case IDQUIT: // On veux fermer...
				{
					EndDialog(hwndDlg, 0);
					return TRUE;
					break;
				}

				case IDCALCUL: // On veux calculer
				{
				unsigned long rac,a,b;
				GetDlgItemText(hwndDlg,IDNOMBRE,buffer,12); //Je prend la chaîne qui a été entrée
				rac=atol(buffer); // Je la transforme en un chiffre
				if (rac==0) //J'évite la division par 0
					{SendMessage(GetDlgItem(hwndDlg, IDRESULT), WM_SETTEXT, 0,(LPARAM) "Vous devez entrer un entier non nul");
					return TRUE;
					break;
					};
				if (overfloor(rac)==0) // Je vérifie que l'on ai pas dépassé 2^32, sinon,
					{				  // on n'obtient pas ce que l'on a demandé :-(
					SendMessage(GetDlgItem(hwndDlg, IDRESULT), WM_SETTEXT, 0,(LPARAM) "Patience pendant le calcul.");
					racine(rac,a,b); // Oui, comme on teste toutes les solutions, ça peut être long, dépend de la machine.
					reponse(rac,a,b);
					SendMessage(GetDlgItem(hwndDlg, IDRESULT), WM_SETTEXT,0,(LPARAM) solution);
					}
				else // Si on a dépassé
					SendMessage(GetDlgItem(hwndDlg, IDRESULT),WM_SETTEXT,0,(LPARAM) "Erreur - Overfloor !!! \nVous ne devez pas entrer de nombre supérieur à 2 puissance 32,\nsoit 4 294 967 296");
				return TRUE;
				break;
				}
			}
		}
		default:
			break;
	}

	return FALSE;
}

//////////////////////////////////
/// Regarde si le nombre entré est > 2^32
/// Car 2^32=0 ;-)
//////////////////////////////////
int overfloor(unsigned long nombre)
{
char cmp[12];
ultoa(nombre,cmp,10);
int over=!(!strcmp(cmp,buffer)); // on compare la chaine initiele à la chaîne qui vient de rac(=nombre). S'il n'y a pas de
return over; //dépassement, tout est bon. !(!'a') renvoie 1 si 'a' différent de 0; sinon 0.
}

Conclusion :


Bon, n'hésitez pas à laisser des messages...

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (cs_alexandre)