Projet n°1

Voici le projet que nous devons faire en Algorithmique. Un simple programme de gestion de clients.
-- Code Ada du logiciel bilan --

with Gnat.Io; use Gnat.Io;

procedure bilan_beta is
-- Specifications
-- {preconditions : - }
-- {postconditions : - }

type fiche_clients is record
	numero_client : integer;
	nom_client : integer;
	nombre_produit : integer;
	montant_total : integer;
end record;

type clients is array(1..10) of fiche_clients ;
tab_clients : clients;
n,i,choix : Integer;

	procedure affichage_donnees_clients(tab_clients : in clients; n : in integer ) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Les donnees (nom, numéro, nombre de produits achetés, 
	--- montant total) de chaque clients sont affichées }

	begin
	put ("Liste des clients :");
	new_line;
	new_line;
	for i in 1..n loop
		put("nom : ");
		put (tab_clients(i).nom_client);
		new_line;
		put("numero : ");
		put (tab_clients(i).numero_client);
		new_line;
		put ("Nombre de produits achetes : ");
		put (tab_clients(i).nombre_produit);
		new_line;
		put ("Montant total : ");
		put (tab_clients(i).montant_total);
		new_line;
		new_line;
	end loop;
	end;

	----

	procedure affichage_donnees_numero(tab_clients : in clients; n : in integer) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Le nombre de produit achetés et le montant total payé par le client ayant le numéro
	-- (donné par l'utilsateur) est affiché }
	numero,vide  : integer;
	begin
	put ("Entrez le numéro du client : ");
	get (numero);
	new_line;
	vide := 1;
	for i in 1..n loop
		if tab_clients(i).numero_client = numero then
			vide := 0;
			put ("Le nombre de produit achetés par ce client est : ");
			put (tab_clients(i).nombre_produit);
			new_line;
			put ("Le montant total payé par ce client est : ");
			put (tab_clients(i).montant_total);
			new_line;
			new_line;
		end if;
	end loop;
	if vide = 1 then
		put ("Ce numéro n'est pas attribué.");
		new_line;
		new_line;
	end if;
	end;
	
	---

	procedure produits(tab_clients : in clients; n : in integer ) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : le nom du client ayant acheté le plus / moins de produits est affiché}
	meilleur_i : integer;
	meilleur_nombre : integer;
	pire_i : integer;
	pire_nombre : integer;

	begin
	meilleur_nombre := tab_clients(1).nombre_produit;
	meilleur_i := 1;
	for i in 2..n loop
		if tab_clients(i).nombre_produit > meilleur_nombre then
			meilleur_nombre := tab_clients(i).nombre_produit;
			meilleur_i := i; 
		end if;
	end loop;
	put ("Le client ayant achete le plus de produits est : ");
	put (tab_clients(meilleur_i).nom_client);

	new_line;

	pire_nombre := tab_clients(1).nombre_produit;
	pire_i := 1;
	for i in 2..n loop
		if tab_clients(i).nombre_produit < pire_nombre then
			pire_nombre := tab_clients(i).nombre_produit;
			pire_i := i; 
		end if;
	end loop;
	put ("Le client ayant achete le moins de produits est : ");
	put (tab_clients(pire_i).nom_client);
	new_line;
	new_line;
	end;

	----

	procedure intervalle(tab_clients : in clients; n : in integer) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : La liste des clients ayant versé un montant compris entre a et
	--- b (donnés par l'utilisateur) à l'entreprise est affichée }
	a,b,vide : integer;
	begin
	vide := 1;
	put ("Afficher la liste des clients ayant paye entre (entrez le premier nombre) ");
	get(a);
	put(" et (entrez le second nombre) ");
	get(b);
	new_line;
	put("Les clients correspondants a vos criteres sont : ");
	new_line;
	new_line;
	for i in 1..n loop
		if tab_clients(i).montant_total >= a then
			if tab_clients(i).montant_total <= b then
				put (tab_clients(i).nom_client);
				vide := 0;
				new_line;
			end if;
		end if;
	end loop;
	if vide = 1 then
		put("Il n'existe aucun client répondant à vos criteres.");
		new_line;
	end if;
	new_line;
	end;

	----

	procedure moyenne_montant(tab_clients : in clients; n : integer) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : La somme moyenne versée à l'entreprise par un client est affichée }
	somme, moyenne : integer;

	begin
	somme := 0;
	for i in 1..n loop
		somme := somme + tab_clients(i).montant_total;
	end loop;
	moyenne := somme / n;
	put("La somme moyenne versee a l'entreprise par un client est : ");
	put(moyenne);
	new_line;
	new_line;
	end;

	----

	procedure paye(tab_clients : in clients; n : in integer ) is
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Le nom du client ayant versé la plus grosse / faible somme à l'entreprise et affiché }
	meilleur_i : integer;
	meilleur_montant : integer;
	pire_i : integer;
	pire_montant : integer;

	begin
	meilleur_montant := tab_clients(1).montant_total;
	meilleur_i := 1;
	for i in 2..n loop
		if tab_clients(i).montant_total > meilleur_montant then
			meilleur_montant := tab_clients(i).montant_total;
			meilleur_i := i; 
		end if;
	end loop;
	put ("Le client ayant verse la plus grosse somme a l'entreprise est : ");
	put (tab_clients(meilleur_i).nom_client);

	new_line;

	pire_montant := tab_clients(1).montant_total;
	pire_i := 1;
	for i in 2..n loop
		if tab_clients(i).montant_total < pire_montant then
			pire_montant := tab_clients(i).montant_total;
			pire_i := i; 
		end if;
	end loop;
	put ("Le client ayant verse la plus faible somme a l'entreprise est : ");
	put (tab_clients(pire_i).nom_client);
	new_line;
	new_line;
	end;

--- Debut de la procedure principale

Begin

i:= 1;

Put ("Bienvenue dans le programme de Bilan.");
new_line;
new_line;

--- Debut de l'enregistrement des clients

put ("Combien de client avez-vous ? ");
get (n);
new_line;

for i in 1..n loop  
	put ("Entrez le nom du client : ");
	get (tab_clients(i).nom_client);
	put ("Entrez le numero du client : ");
	get (tab_clients(i).numero_client);
	put ("Entrez le nombre total de produits achetes par le client : ");
	get (tab_clients(i).nombre_produit);
	put ("Entrez la somme totale que le client a paye : ");
	get (tab_clients(i).montant_total);
	put ("Client enregistre.");
	new_line;
	new_line;
end loop;

put ("Tous vos clients ont bien ete enregistres.");
new_line;
new_line;

--- Affichage des choix utilisateurs

while choix /= 0 loop

	put ("| 1 Afficher la liste des clients");
	new_line;
	put ("| 2 Afficher le client ayant achete le plus / moins de produits");
	new_line;
	put ("| 3 Afficher les clients dont le nombre de produits achetes est compris entre a et b");
	new_line;
	put ("| 4 Afficher le client qui a paye la plus forte / faible sommme a l'entreprise");
	new_line;
	put ("| 5 Afficher la somme moyenne versee par un client a l'entreprise");
	new_line;
	put ("| 6 Afficher le nombre de produits achetés et le montant total payé pour un client donné");
	new_line;
	put ("| 0 Quitter le programme");
	new_line;
	new_line;
	put ("Choisissez l'operation a realiser : ");
	get(choix);
	new_line;
	new_line;

--- Traitement des choix utilisateurs

	if choix = 1 then
		affichage_donnees_clients(tab_clients, n);
	end if;
	if choix = 2 then
		produits(tab_clients, n);
	end if;
	if choix = 3 then
		intervalle(tab_clients, n);
	end if;
	if choix = 4 then
		paye(tab_clients, n);
	end if;
	if choix = 5 then
		moyenne_montant(tab_clients, n);
	end if;
	if choix = 6 then
		affichage_donnees_numero(tab_clients, n);
	end if;

end loop;

put("Merci d'avoir utilise notre soft de Bilan.");
new_line;
new_line;

end;

L'algorithme correspondant à ce petit programme est le suivant :

-- Algorithme du logiciel de bilan --

procedure bilan_beta
-- Specifications
-- {preconditions : - }
-- {postconditions : - }

type fiche_clients  enregistrement
	numero_client : entier;
	nom_client : entier;
	nombre_produit : entier;
	montant_total : entier;
fin;

type clients  tableau[1..10] de fiche_clients ;
tab_clients : clients;
n,i,choix : entier;

	procedure affichage_donnees_clients(tab_clients : clients; n : entier )
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Les donnees (nom, numéro, nombre de produits achetés, 
	--- montant total) de chaque clients sont affichées }

	debut
	ecrire ("Liste des clients :");
	pour i de 1..n faire
		ecrire("nom : ");
		ecrire (tab_clients(i).nom_client);
		ecrire("numero : ");
		ecrire (tab_clients(i).numero_client);
		ecrire ("Nombre de produits achetes : ");
		ecrire (tab_clients(i).nombre_produit);
		ecrire ("Montant total : ");
		ecrire (tab_clients(i).montant_total);
	fin pour;
	fin;

	----

	procedure affichage_donnees_numero(tab_clients : clients; n : entier)
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Le nombre de produit achetés et le montant total payé par le client ayant le numéro
	-- (donné par l'utilsateur) est affiché }
	numero,vide  : entier;

	debut
	ecrire ("Entrez le numéro du client : ");
	lire (numero);
	vide := 1;
	pour i de 1..n faire
		si tab_clients(i).numero_client = numero alors
			vide := 0;
			ecrire ("Le nombre de produit achetés par ce client est : ");
			ecrire (tab_clients(i).nombre_produit);
			ecrire ("Le montant total payé par ce client est : ");
			ecrire (tab_clients(i).montant_total);
		fin si;
	fin pour;
	si vide = 1 alors
		ecrire ("Ce numéro n'est pas attribué.");
	fin si;
	fin;
	
	---

	procedure produits(tab_clients : de clients; n : de entier ) 
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : le nom du client ayant acheté le plus / modes de produits est affiché}
	meilleur_i : entier;
	meilleur_nombre : entier;
	pire_i : entier;
	pire_nombre : entier;

	debut
	meilleur_nombre := tab_clients(1).nombre_produit;
	meilleur_i := 1;
	pour i de 2..n faire
		si tab_clients(i).nombre_produit > meilleur_nombre alors
			meilleur_nombre := tab_clients(i).nombre_produit;
			meilleur_i := i; 
		fin si;
	fin pour;
	ecrire ("Le client ayant achete le plus de produits est : ");
	ecrire (tab_clients(meilleur_i).nom_client);
	pire_nombre := tab_clients(1).nombre_produit;
	pire_i := 1;
	pour i de 2..n faire
		si tab_clients(i).nombre_produit < pire_nombre alors
			pire_nombre := tab_clients(i).nombre_produit;
			pire_i := i; 
		fin si;
	fin pour;
	ecrire ("Le client ayant achete le modes de produits est : ");
	ecrire (tab_clients(pire_i).nom_client);
	fin;

	----

	procedure intervalle(tab_clients : de clients; n : de entier) 
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : La lte des clients ayant versé un montant compr entre a et
	--- b (donnés par l'utilateur) à l'entreprise est affichée }
	a,b,vide : entier;

	debut
	vide := 1;
	ecrire ("Afficher la lte des clients ayant paye entre (entrez le premier nombre) ");
	lire(a);
	ecrire(" et (entrez le second nombre) ");
	lire(b);
	ecrire("Les clients correspondants a vos criteres sont : ");
	pour i de 1..n faire
		si tab_clients(i).montant_total >= a alors
			si tab_clients(i).montant_total <= b alors
				ecrire (tab_clients(i).nom_client);
				vide := 0;
			fin si;
		fin si;
	fin pour;
	si vide = 1 alors
		ecrire("Il n'exte aucun client répondant à vos criteres.");
	fin si;
	fin;

	----

	procedure moyenne_montant(tab_clients : de clients; n : entier) 
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : La somme moyenne versée à l'entreprise par un client est affichée }
	somme, moyenne : entier;

	debut
	somme := 0;
	pour i de 1..n faire
		somme := somme + tab_clients(i).montant_total;
	fin pour;
	moyenne := somme / n;
	ecrire("La somme moyenne versee a l'entreprise par un client est : ");
	ecrire(moyenne);
	fin;

	----

	procedure paye(tab_clients : de clients; n : de entier ) 
	-- Specifications
	-- {preconditions : tab_clients, un tableau comportant les donnees des clients, n le nombre de clients }
	-- {postconditions : Le nom du client ayant versé la plus grosse / faible somme à l'entreprise et affiché }
	meilleur_i : entier;
	meilleur_montant : entier;
	pire_i : entier;
	pire_montant : entier;

	debut
	meilleur_montant := tab_clients(1).montant_total;
	meilleur_i := 1;
	pour i de 2..n faire
		si tab_clients(i).montant_total > meilleur_montant alors
			meilleur_montant := tab_clients(i).montant_total;
			meilleur_i := i; 
		fin si;
	fin pour;
	ecrire ("Le client ayant verse la plus grosse somme a l'entreprise est : ");
	ecrire (tab_clients(meilleur_i).nom_client);

	pire_montant := tab_clients(1).montant_total;
	pire_i := 1;
	pour i de 2..n faire
		si tab_clients(i).montant_total < pire_montant alors
			pire_montant := tab_clients(i).montant_total;
			pire_i := i; 
		fin si;
	fin pour;
	ecrire ("Le client ayant verse la plus faible somme a l'entreprise est : ");
	ecrire (tab_clients(pire_i).nom_client);
	fin;

--- Debut de la procedure principale

debut

i:= 1;

ecrire ("Bienvenue dans le programme de Bilan.");

--- Debut de l'enregistrement des clients

ecrire ("Combien de client avez-vous ? ");
lire (n);

pour i de 1..n faire  
	ecrire ("Entrez le nom du client : ");
	lire (tab_clients(i).nom_client);
	ecrire ("Entrez le numero du client : ");
	lire (tab_clients(i).numero_client);
	ecrire ("Entrez le nombre total de produits achetes par le client : ");
	lire (tab_clients(i).nombre_produit);
	ecrire ("Entrez la somme totale que le client a paye : ");
	lire (tab_clients(i).montant_total);
	ecrire ("Client enregistre.");
fin pour;

ecrire ("Tous vos clients ont bien ete enregistres.");

--- Affichage des choix utilateurs

tantque choix /= 0 faire

	ecrire ("| 1 Afficher la liste des clients");
	ecrire ("| 2 Afficher le client ayant achete le plus / moins de produits");
	ecrire ("| 3 Afficher les clients dont le nombre de produits achetes est compris entre a et b");
	ecrire ("| 4 Afficher le client qui a paye la plus pourte / faible sommme a l'entreprise");
	ecrire ("| 5 Afficher la somme moyenne versee par un client a l'entreprise");
	ecrire ("| 6 Afficher le nombre de produits achetés et le montant total payé pour un client donné");
	ecrire ("| 0 Quitter le programme");
	ecrire ("Chosez l'operation a realiser : ");
	lire(choix);

--- Traitement des choix utilateurs

	si choix = 1 alors
		affichage_donnees_clients(tab_clients, n);
	fin si;
	si choix = 2 alors
		produits(tab_clients, n);
	fin si;
	si choix = 3 alors
		intervalle(tab_clients, n);
	fin si;
	si choix = 4 alors
		paye(tab_clients, n);
	fin si;
	si choix = 5 alors
		moyenne_montant(tab_clients, n);
	fin si;
	si choix = 6 alors
		affichage_donnees_numero(tab_clients, n);
	fin si;

fin pour;

ecrire("Merci d'avoir utile notre soft de Bilan.");

fin;