Crible d'eratostene et génération de pages web.

Soyez le premier à donner votre avis sur cette source.

Vue 5 517 fois - Téléchargée 148 fois

Description

Ceci est un prgramme (mon premier ici) qui calcul une table des nombres premiers grâce au crible d'Eratostene et génère des pages webs en résultat.
Le logiciel est assez complet, c'est la version 1.3.

Désolé si le HTML n'est pas très clair, tout les sauts de lignes sont remplacés par des \n, donc ca rend un peu illisible le truc.
J'ai fait ça grâce à word (remplacer les saut de ligne par \n) et le code générique qui m'a servi de base a été fait sous Dreamweaver et modifié à la main pour la clarté et l'efficacité.

Voilà, j'espère que des gens pourront me donner des conseils pour simplifier encore.

P.S: Ah oui, ce code est valable pour une plateforme Win32 uniquement, et est compilé avec succès sous VC++ 6.0

Source / Exemple :


#define COL 6
#define LIG 200

#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <sys\timeb.h>
#include <conio.h>

void crible(int n, bool erat[]);			// Criblage d'Eratostène.
int genere(int n, int compte, int table[]); // Génere un dico HTML.
double diff(timeb *start, timeb *end);		// Renvoie end-start en secondes et microsecondes.

void main()
{
	system("title nbp v1.3 by Bloomwhite (2002-2003)");
	int m, n, i, j;
	bool *erat;
	int *table;
// initialisation des temps
	timeb *debutc, *finc, *debutg, *fing;
	finc = new timeb;
	debutc = new timeb;
	fing = new timeb;
	debutg = new timeb;

	cout << "Nous allons faire une table de nombre premiers grace a la\n";
	cout << "methode du crible d'eratostene\n-----------------------------------\n";
	cout << "\nChoisissez une taille (en Mo): ";
	cin >> m;

	n = m*1048576;
	erat= new bool[n];

	ftime(debutc); // démarrage du compteur1
	cout << "\n\ncriblage..." << endl;
		crible(n, erat);
	cout << "comptage du nombre de premiers..." << endl;
		int compte =0;
		for (i=0; i<n; i++)
		{
			if (erat[i])
				compte++;
		}
	cout << "creation de la table de premiers..." << endl;
		table= new int[compte];
		for (i=0, j=0; i<n; i++)
		{
			if (erat[i])
			{
				table[j]= i+1;
				j++;
			}
		}
	cout << "liberation partielle de la memoire..." << endl;
		delete[] erat;
		erat = NULL;
	ftime(finc); // fin du compteur1
	ftime(debutg); // debut du compteur2
	cout << "ecriture des fichiers HTML..." << endl;
		genere(n, compte, table);
	cout << "liberation totale de la memoire...\n" << endl;
		delete[] table;
	ftime(fing); // fin du compteur2

	cout << "-----------------------------------\nTemps de creation liste:\t" << diff(debutc, finc) << endl;
	cout << "Temps de generation des pages:\t" << diff(debutg, fing) << endl;
	cout << "-----------------------------------\n" << endl;

	cout << "Tapez enter pour ouvrir la page web, sinon espace" << endl;
	while(true)
	{
		int key= getch();
		if (key == 13)
		{	system("index.html");
			break;
		}
		if (key == 32)
			break;
	}
}

/*###################### Fonctions ##########################*/

	void crible (int n, bool erat[]) // la toute conne fonction...
	{
		int i,j;
		for (i=0; i<n; i++)
			erat[i]= true;
		erat[0]=false;
		for (i=1; i<n; i++)
		{
			if (erat[i])
			{
				for (j=2*(i+1); j<n+1; j+=(i+1))
					erat[j-1]= false;
			}
		}
	}

// GENERATION HTML // La c'est plus chaud...

int genere (int n, int compte, int table[])
{
	system("mkdir tables");			// Et oui, une commande MS-DOS
	int page, i, j, m= n/1048576;
	int ici = 0;

// INDEX.HTML
	
	ofstream index;
	index.open("index.html");

	index << "<html>\n<head>\n<title>Nombres premiers</title>\n<meta http-equiv='Content-Type'";
	index << "content='text/html; charset=iso-8859-1'>\n</head>\n<frameset rows='*,458' frameb";
	index << "order='NO' border='0' framespacing='0' cols='*'> \n  <frame name='mainFrame' scr";
	index << "olling='NO' src='tables/haut.html'>\n  <frame name='bottomFrame' scrolling='YES' noresiz";
	index << "e src='tables/page000001.html'>\n</frameset>\n<noframes> \n<body bgcolor='#FFFFFF' text='#";
	index << "000000'>\n</body>\n</noframes> \n</html>\n";

	index.close();

// /INDEX.HTML

// HAUT.HTML

	ofstream haut;
	haut.open("tables/haut.html");

	haut << "<html>\n<head><title>nombres premiers</title></head>\n<body>\n\n<p align='center'";
	haut << ">\n  <b><font color='#990000' face='Geneva, Arial, Helvetica, san-serif' size='5'";
	haut << "> \n  TABLE DES NOMBRES PREMIERS<br>CALCULEE SUR UN TABLEAU DE ";
	haut << m << " Mo.\n ";
	haut << " </font></b>\n</p>\n\n<p align='right'>\n  <i><font face='Georgia, Times New Roma";
	haut << "n, Times, serif' size='1'> \n  générée par nbp v1.3<br>Copyr";
	haut << "ight Bloomwhite 2002-2003\n  </font></i>\n</p>\n\n<hr>\n\n<div align='center'> </";
	haut << "div>\n\n</body>\n</html>\n";

	haut.close();

// /HAUT.HTML

// BAS !!!
	
	int nppp= LIG*COL;			// nombre d'entiers par page
	int pages= (compte/nppp);	// nombre de pages
		if (compte%nppp)
			pages++;
	char nom_page[27] = "tables/page000000.html";		// nom_page générique
	
	// reg page_last
	char LST[7];
	if (pages/1000000) // erreur
		return 1;
	int page_100000 = (pages/100000);
	int page_10000 = (pages/10000 - 10*(pages/100000));
	int page_1000 = (pages/1000 - 10*(pages/10000));
	int page_100 = (pages/100 - 10*(pages/1000));
	int page_10 = (pages/10 - 10*(pages/100));
	int page_1 = (pages - 10*(pages/10));
		LST[0] = '0' + page_100000;
		LST[1] = '0' + page_10000;
		LST[2] = '0' + page_1000;
		LST[3] = '0' + page_100;
		LST[4] = '0' + page_10;
		LST[5] = '0' + page_1;
		LST[6] = '\0';
	
	// 1 boucle par page
	for (page=0; page < pages; page++)
	{
		page++;
		char PCD[7];
		char SVT[7];
		char ACT[7];

		// on decompose un entier de 6 chiffres en 6 de 1 chiffre
		int page_100000 = (page/100000);
		int page_10000 = (page/10000 - 10*(page/100000));
		int page_1000 = (page/1000 - 10*(page/10000));
		int page_100 = (page/100 - 10*(page/1000));
		int page_10 = (page/10 - 10*(page/100));
		int page_1 = (page - 10*(page/10));

		// reg page_precedente
		for (i= 0; i<6; i++)
			PCD[i] = nom_page[11+i];
		PCD[6] = '\0';

		// reg page_actuel
		nom_page[11] = '0' + page_100000;
		nom_page[12] = '0' + page_10000;
		nom_page[13] = '0' + page_1000;
		nom_page[14] = '0' + page_100;
		nom_page[15] = '0' + page_10;
		nom_page[16] = '0' + page_1;
		for (i= 0; i<6; i++)
			ACT[i] = nom_page[11+i];
		ACT[6] = '\0';

		// reg page_suivante
			page++;
			// on decompose un entier de 6 chiffres en 6 de 1 chiffre
			page_100000 = (page/100000);
			page_10000 = (page/10000 - 10*(page/100000));
			page_1000 = (page/1000 - 10*(page/10000));
			page_100 = (page/100 - 10*(page/1000));
			page_10 = (page/10 - 10*(page/100));
			page_1 = (page - 10*(page/10));
			page--;
		/////////////////////////////////////////
		SVT[0] = '0' + page_100000;
		SVT[1] = '0' + page_10000;
		SVT[2] = '0' + page_1000;
		SVT[3] = '0' + page_100;
		SVT[4] = '0' + page_10;
		SVT[5] = '0' + page_1;
		SVT[6] = '\0';

		page--;
		
		ofstream bas;
		bas.open(nom_page);

		// creation variables de localisation
		int de= page*nppp+1;
		int a= (page+1)*nppp;
		
		// écriture localisation
		bas << "<div align='center'>\n  <p>\n    ";
		if (page)
			bas << "<a href='page000001.html'>";
		bas << "<<";
		if (page)
			bas << "</a>\n";
		bas << "&nbsp;&nbsp;&nbsp;&nbsp;\n    ";
		if (page)
			bas << "<a href='page" << PCD << ".html'>";
		bas << "<";
		if (page)
			bas << "</a>\n";
		bas << "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \n    <font color='#009900' size='4'>nombres pr";
		bas << "emiers de rang</font>\n    <font color='#FF0000' size='4'><b> " << de << "</b>";
		bas << "</font>\n    <font size='4' color='#009900'>à</font>\n    <font color='";
		bas << "#FF0000' size='4'><b> ";
		if (page != (pages-1))
			bas << a;
		else
			bas << compte;
		bas << "</b></font>\n    <font size='4' color='#00990";
		bas << "0'>sur</font>\n    <font color='#FF0000' size='4'><b> " << compte<< " </b></fo";
		bas << "nt>\n    &nbsp;&nbsp;&nbsp;&nbsp;\n    ";
		if (page != (pages-1))
			bas << "<a href='page" << SVT << ".html'>";
		bas << ">";
		if (page != (pages-1))
			bas << "</a>\n";
		bas << "    &nbsp;&nbsp;&nbsp;&nbsp;";
		if (page != (pages-1))
			bas << "<a href='page" << LST << ".html'>";
		bas << ">>";
		if (page != (pages-1))
			bas << "</a>\n";
		bas << "</p>\n</div>\n<table width='70%' border='5' align='center'>\n  <tr>\n\n";

		// écriture table
		for (i=0, j=0; i<nppp && ici < compte; i++, ici++)
		{
			if(j==COL)
			{
				bas << "  </tr>\n  <tr>\n";
				j=0;
			}
			bas << "    <td width='9%'>" << table[ici] << "</td>\n";
			j++;
		}

		// écriture finale
		bas << "  </tr>\n</table>\n\n<p align='center'>\n  <i><font face='Georgia, Times New R";
		bas << "oman, Times, serif' size='1'> \n  générée par nbp v1.3<br";
		bas << ">Copyright Bloomwhite 2002-2003\n  </font></i>\n</p>\n\n</body>\n</html>\n";
		bas.close();
	}

// /BAS !!!

	return 0;
}

double diff(timeb *start, timeb *end)
{
	double temps = ((*end).time - (*start).time)/1.;
	double milli = ((*end).millitm - (*start).millitm) / 1000.;
	return (temps + milli);
}

Conclusion :


Pour voir un exemple (en HTML), aller sur http://bloomwhite.free.fr/primes/

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

ok je m'y mettrais.
En plus les bases de données, ca peut m'intérresser.
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

j'veux pas faire de pub, et en aucun cas je ne suis partenaire de ce site, mais je te conseil phpdebutant.om c'est excellent, comme tu programmes déjà dans 2 semaines tu jongles avec les bases de données, c super ^^
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

ouai, t'as raison, je changerais le html des que j'en aurais le temps (et le courage...)
Pas con pour la POO, surtout que c'est pas le premier prog qui me sort de l'HTML. En fait mes résultats sortent souvent en HTML, je sais pas c'est comme ça, j'aime.
Mais il faudrait des trucs plus "générique" que du simple copier/coller.
Bref faire un éditeur HTML pour les calculs divers ??? (lol)
Mais les classes, je débute, même si je sais m'en servir (un peu), j'ai pas le réflexe; pas comme toi...
Le PHP ?? Why not, faut voir...
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

dis, pr la taille je m'en suis rendu compte, j'avais pr 50Mo de fichiers alors que j'avais choisi 25 Mo ds le programme.

Pr le html c ultra simple, renseigne toi c tjs utile. puis après tu pourras te mettre eu PHP, c follement amusant (lol), c simple comme pas possible.

vi moi j'aime la POO, je fias que ça, autant que possible je POO, ts les jours, à toute heure, pr tt projet, même ton programme là, j'en aurais fait un OO :-P avec une classe d'écriture de fichier html, et une autre pr la détermination des nb premiers. faut vivre avec son temps (euh, ok je fais pas de .NET, mais c pas pr la meme raison)
Messages postés
215
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
25 septembre 2010

Merci pour ta note Kirua, je pensais pas avoir autant.
En fait à l'origine, on pouvait demander un nombre et voir s'il était premier. Ca calculais avec la table d'Erat. mais le problème c'ets pour les nombres en dehors... Dans une prochaine version (si un jour j'ai le courage de retoucher ce code), il y'aura une liste/menu dans les pages html pour arriver à des séquences de nombres premiers (car sur mille page obtenir la 600eme à partir de l'index est très difficile sous cette forme...). Bref, bateau, mais faut connaître le code html et avoir le courage...

Une petite erreur de ta part: la taille marquée n'est pas la taille des fichiers, mais de la table d'Eratostene (en fait une table avec un 1 ou 0 par nombre (premier ou pas)). Ca reviens parfois à peu près au même.

Sinon, pour le benchmark c'est une bonne idée, le calcul de la table pourrait servir d'indice pour le processeur + la mémoire + le bus, etc... quand à l'écriture, la fragmentation des fichiers la vitesse disque, le tampon disque, etc...
Dommage que ce soit pas plus détaillé.

P.S: j'ai vu ta chenille en openGL, bravo c'est une réussite, surtout l'utilisation des classes.
Afficher les 7 commentaires

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.