Corrigé de l’exercice de l’horloge

import java.util.Scanner;
public class Horloge {

	/* Lire une heure sous fome de 3 entiers (heures, minutes et secondes)
	 * Afficher l'heure sous forme de texte en français : 13:15:32 = "Il est 13 heures, 15 minutes et 32 secondes."
	 * 
	 * On affiche les heures sous le format 24h.
	 * On n'affiche les minutes que s'il y en a (minutes>0), de même pour les secondes.
	 * Oh et 12h se disent "minuit" et "midi"
	 * Lorsqu'il y a 0 secondes, les minutes 15, 30 et 45 se disent "et quart", "et demie", et "moins le quart" pour toutes les heures de 0 à 12 inclus.
	 * Lorsqu'il y a des secondes, ou pour les heures de l'après-midi, les minutes 15, 30 et 45 se disent de la même manière que n'importe quelles autres minutes ("15 minutes")
	 * 
	 * Ce qui suit est une proposition de solution. Il y a de nombreuses autres façons d'écrire ce programme.
	 */

	public static void main(String[] args) {
		/* déclaration des variables*/
		int heure, min, sec;		// des variables entières pour stocker les heures, les minutes et les secondes lues

		Scanner s=new Scanner(System.in);

		/* on demande un nombre d'heures à l'utilisateur et on le stocke dans la variable "heure" */
		System.out.println("Combien d'heures ?");	
		heure=s.nextInt();

		/* petit test pour vérifier que l'heure saisie est bien comprise entre 0 et 23 inclus.
		Si ce n'est pas le cas, on recommence la lecture de l'heure avec un message de rappel à l'utilisateur */
		if (heure>=24 || heure<0){ 			System.out.println("Veuillez saisir une valeur entre 0 et 23 :"); 			heure=s.nextInt(); 		} 		/* on demande un nombre de minutes ˆ l'utilisateur et on le stocke dans la variable "min" */ 		System.out.println("de minutes ?"); 		min=s.nextInt(); 		/* petit test pour vérifier que les minutes saisies sont bien comprises entre 0 et 59 inclus. 		Si ce n'est pas le cas, on recommence la lecture des minutes avec un message de rappel à l'utilisateur */ 		if (min>59 || min<0){ 			System.out.println("Veuillez saisir une valeur entre 0 et 59 :"); 			min=s.nextInt(); 		} 		/* on demande un nombre de secondes ˆ l'utilisateur et on le stocke dans la variable "sec" */ 		System.out.println("de secondes ?"); 		sec=s.nextInt(); 		/* petit test pour vérifier que les secondes saisies sont bien comprises entre 0 et 59 inclus. 		Si ce n'est pas le cas, on recommence la lecture des secondes avec un message de rappel à l'utilisateur */ 		if (sec>59 || sec<0){ 			System.out.println("Veuillez saisir une valeur entre 0 et 59 :"); 			sec=s.nextInt(); 		} 		/* Bloc de tests pour afficher l'heure sous forme de texte en fonction des cas particuliers */ 		/* on commence par gérer les cas où il y a 0 seconde, car c'est seulement pour ces cas que l'on dira éventuellement "et quart", "et demie" et "moins le quart"... */ 		if (sec==0){		 			if (min==0){								// cas de 0 minutes (donc on donne l'heure seule) 				if (heure==0){										//cas particulier de Oh 					System.out.println("Il est minuit."); 				}else if (heure==12){								//cas particulier de 12h 					System.out.println("Il est midi."); 				}else{												//toutes les autres heures (donc sauf minuit et midi) 					System.out.println("Il est " + heure + " heures."); 				} 			}else if (min==15){							// cas de 15 minutes (se dit "et quart" de 0h ˆ 12h inclus, et "15 minutes" de 13h à 23h inclus) 				if (heure==0){										//cas particulier de Oh 					System.out.println("Il est minuit et quart."); 				}else if (heure==12){								//cas particulier de 12h 					System.out.println("Il est midi et quart."); 				}else if (heure>0 && heure<12){						//toutes les heures du matin 					System.out.println("Il est " + heure + " heures et quart."); 				}else{												//toutes les autres heures (donc sauf minuit,midi et le matin) 					System.out.println("Il est " + heure + " heures et 15 minutes."); 				} 			}else if (min==30){							// cas de 30 minutes (se dit "et demi" de 0h ˆ 12h inclus, et "30 minutes" de 13h à 23h inclus) 				if (heure==0){										//cas particulier de Oh 					System.out.println("Il est minuit et demie."); 				}else if (heure==12){								//cas particulier de 12h 					System.out.println("Il est midi et demie."); 				}else if (heure>0 && heure<12){						//toutes les heures du matin 					System.out.println("Il est " + heure + " heures et demie."); 				}else {												//toutes les autres heures (donc sauf minuit,midi et le matin) 					System.out.println("Il est " + heure + " heures et 30 minutes."); 				} 			}else if (min==45){							// cas de 45 minutes (se dit "moins le quart", en prenant l'heure suivante : donc h+1 moins le quart lorsque h=0 à 11 et 23) 														//(se dit "45 minutes" en gardant l'heure h quand h=12 à 22) 				if (heure==23){										//cas particulier de minuit (23h45) 					System.out.println("Il est minuit moins le quart."); 				}else if (heure==11){								//cas particulier de midi moins le quart (11h45) 					System.out.println("Il est midi moins le quart."); 				}else if (heure==12){								//cas particulier de midi (12h45) 					System.out.println("Il est midi et 45 minutes."); 				}else if (heure>=0 && heure<11){					//toutes les heures du matin (il faut prendre l'heure suivante pour dire "moins le quart")
					System.out.println("Il est " + (heure+1) + " heures moins le quart.");
				}else {												//toutes les autres heures (donc sauf minuit,midi et le matin)
					System.out.println("Il est " + heure + " heures et 45 minutes.");
				}

			}else{										// tous les autres cas (minutes différentes de 0, 15, 30 et 45)
				if (heure==0){										//cas particulier de Oh
					System.out.println("Il est minuit et " + min + " minutes.");
				}else if (heure==12){								//cas particulier de 12h
					System.out.println("Il est midi et " + min + " minutes.");
				}else {												//toutes les autres heures (donc sauf minuit et midi)
					System.out.println("Il est " + heure + " heures et " + min + " minutes.");
				}
			}
		}  /* Fin des cas de 0 secondes. On gère maintenant les cas où il y a des secondes mais pas de minutes... */
		else if (min==0){			/*(équivalent à 	else if (sec!=0 && min==0)	,mais sec!=0 est inutile puisque les cas sans seconde ont
									tous été traités dans le premier gros bloc if, et donc il ne reste forcément que les cas où il y a des secondes.) */
			if (heure==0) {										//cas particulier de 0h
				System.out.println("Il est minuit et " + sec + " secondes.");
			}else if (heure==12) {								//cas particulier de 12h
				System.out.println("Il est midi et " + sec + " secondes.");
			}else{												//toutes les autres heures (donc sauf minuit et midi)
				System.out.println("Il est " + heure + " heures et " + sec + " secondes.");
			}
		}  /* Fin des cas où il y a des secondes mais pas de minutes. On gère maintenant tous les cas restant, c'est-à-dire où il y a des secondes ET des minutes */
		else{
			if (heure==0) {										//cas particulier de Oh
				System.out.println("Il est minuit, " + min + " minutes et " + sec + " secondes.");
			}else if (heure==12) {								//cas particulier de 12h
				System.out.println("Il est midi, " + min + " minutes et " + sec + " secondes.");
			}else{												//toutes les autres heures (donc sauf minuit et midi)
				System.out.println("Il est " + heure + " heures, " + min + " minutes et " + sec + " secondes.");
			}
		}
	}
}