Bonjour, je fais de l'initiation à la programmation, et j'ai un exercice à faire
Voici l'énoncé :
Ecrire un programme qui permet de saisir l'âge de 5 personnes puis qui affiche true si au moins 4 personnes sont adultes (âge>=18) et false sinon (ne pas utiliser de conditionnellle)
Voici ce que j'ai écris :
public class ProgAge
{public static void main(String args[])
{ int a,b,c,d,e;
boolean K;
System.out.println("Donnez l'âge des 5 personnes");
a=Lire.i();
b=Lire.i();
c=Lire.i();
d=Lire.i();
e=Lire.i();
K=a>=18 && b>=18 && c>=18 && d>=18 && e>=18 ||
a<=18 && b>=18 && c>=18 && d>=18 && e>=18 ||
a>=18 && b<=18 && c>=18 && d>=18 && e>=18 ||
a>=18 && b>=18 && c<=18 && d>=18 && e>=18 ||
a>=18 && b>=18 && c>=18 && d<=18 && e>=18 ||
a>=18 && b>=18 && c>=18 && d>=18 && e<=18 ||;
System.out.println(K);
}
}
Sachant qu'ils nous ont dit d'utiliser Lire.i() pour déclarer un entier
J'ai bon ou mon raisonnement ne tient pas ? Avoir un K aussi grand me parait bizarre
Merci d'avoir lu
J'ai bon ou mon raisonnement ne tient pas ?
Ca ne peut pas tenir parce qu'on ne fait en pratique jamais de condition aussi grandes pour des raisons de maintenabilité. Pourquoi?
"Maintenant je veux l'âge de 15 personnes et true si 9 sont agées de plus de 21ans. " Tu ne peux pas le faire facilement.
En l'occurence la bonne solution, c'est de passer par des boucles et de mettre tes variables en amont du code, genre:
lim_age = 18
nb_person = 5
nb_lim_age = 4
ages = liste
pour i de 0 à nb_person:
age = lire i
ages.ajoute(age)
count_lim_age = 0
pour i de 0 à nb_person:
si ages[i] > lim_age:
count_lim_age += 1
si count_lim_age > nb_lim_age:
vrai
faux
Le truc à retenir et qui est FONDAMENTAL , c'est de se demander : "et si on me pose le même problème en changeant les valeurs numériques, est-ce que je peux le résoudre en 5secondes ou en 5heures". Avec mon code on peut le faire en 5secondes, avec le tien non.
Il faut faire la différence entre un bon code, et un code qui est correct. Ton code est correct (probablement j'ai pas tout vérifié), mais ça ne peut absolument pas être un bon code, et ce qui est très important c'est de faire du bon code (peut-être même davantage que de faire du code correct). Je préfère arriver sur un projet en me disant "ça marche pas, mais tout est documenté, tu vas mettre 1semaine à le reprendre et à corriger" que de me dire "ça marche, par contre c'est un bordel incroyable, tu vas mettre 3semaines à comprendre et de toute façon derrière si tu veux modifier quelque chose tu vas encore mettre 3semaines"
Le 20 septembre 2018 à 11:13:49 blackapplex a écrit :
J'ai bon ou mon raisonnement ne tient pas ?
Ca ne peut pas tenir parce qu'on ne fait en pratique jamais de condition aussi grandes pour des raisons de maintenabilité. Pourquoi?
"Maintenant je veux l'âge de 15 personnes et true si 9 sont agées de plus de 21ans. " Tu ne peux pas le faire facilement.
En l'occurence la bonne solution, c'est de passer par des boucles et de mettre tes variables en amont du code, genre:lim_age = 18 nb_person = 5 nb_lim_age = 4 ages = liste pour i de 0 à nb_person: age = lire i ages.ajoute(age) count_lim_age = 0 pour i de 0 à nb_person: si ages[i] > lim_age: count_lim_age += 1 si count_lim_age > nb_lim_age: vrai faux
Le truc à retenir et qui est FONDAMENTAL , c'est de se demander : "et si on me pose le même problème en changeant les valeurs numériques, est-ce que je peux le résoudre en 5secondes ou en 5heures". Avec mon code on peut le faire en 5secondes, avec le tien non.
Il faut faire la différence entre un bon code, et un code qui est correct. Ton code est correct (probablement j'ai pas tout vérifié), mais ça ne peut absolument pas être un bon code, et ce qui est très important c'est de faire du bon code (peut-être même davantage que de faire du code correct). Je préfère arriver sur un projet en me disant "ça marche pas, mais tout est documenté, tu vas mettre 1semaine à le reprendre et à corriger" que de me dire "ça marche, par contre c'est un bordel incroyable, tu vas mettre 3semaines à comprendre et de toute façon derrière si tu veux modifier quelque chose tu vas encore mettre 3semaines"
ça c'est bien vrai !
Moi je te conseillerait plutôt de faire un truc du genre après avoir récupéré les ages dans un array.
int nombre_adultes_min = 4;
int nombre_adultes= Stream.of(ages).filter(age -> age >= 18).count();
bool nbr_adultes_suffisant = nombre_adultes >= nombre_adultes_min;
System.out.println(nbr_adultes_suffisant);
blackapplex ton code est bien mais c'est un peu chiant d'avoir 10 lignes de boucles et de conditionnelle pour un si petit truc mieux vaut utiliser un filter, et en plus il a pas d=le droit d'utiliser les conditionnelles dans son exo.
La le code est court et auto-descriptif grâce au noms de variables.
Après j'ai pas testé le code je suis sur mon portable et je fais pas de java j'ai peut-etre laissé passer une bourde dans le code.
Merci beaucoup pour vos réponses, je ferai en sorte d'avoir un code facilement modifiable maintenant
@batora c'est plus lisible mais quand on démarre la programmation on s'entraîne sur les boucles et les conditions
Le 21 septembre 2018 à 18:02:29 dark_drow a écrit :
@batora c'est plus lisible mais quand on démarre la programmation on s'entraîne sur les boucles et les conditions
Il n'a pas le droit aux conditions dans son exo.
Le 21 septembre 2018 à 18:24:01 Batora a écrit :
Le 21 septembre 2018 à 18:02:29 dark_drow a écrit :
@batora c'est plus lisible mais quand on démarre la programmation on s'entraîne sur les boucles et les conditionsIl n'a pas le droit aux conditions dans son exo.
ah c'était ça le "ne pas utiliser de conditionnel" ?
Je suis pas sûr de voir l'utilité
Dans ce cas pour mon code tu fais: count_lim_age += int(ages[i] > lim_age)
et puis return count_lim_age > nb_lim_age
J'ai tendance à être un peu littéraire dans mon code parfois, c'est rare qu'on demande des one liners, la lisibilité prime
Le 20 septembre 2018 à 15:05:22 Batora a écrit :
Moi je te conseillerait plutôt de faire un truc du genre après avoir récupéré les ages dans un array.int nombre_adultes_min = 4; int nombre_adultes= Stream.of(ages).filter(age -> age >= 18).count(); bool nbr_adultes_suffisant = nombre_adultes >= nombre_adultes_min; System.out.println(nbr_adultes_suffisant);
blackapplex ton code est bien mais c'est un peu chiant d'avoir 10 lignes de boucles et de conditionnelle pour un si petit truc mieux vaut utiliser un filter, et en plus il a pas d=le droit d'utiliser les conditionnelles dans son exo.
La le code est court et auto-descriptif grâce au noms de variables.
Après j'ai pas testé le code je suis sur mon portable et je fais pas de java j'ai peut-etre laissé passer une bourde dans le code.
C'est la bonne solution.
import java.util.Scanner;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
long nbrAdultes = IntStream.range(0,5)
.map(i -> input.nextInt())
.filter(age -> age >= 18)
.count();
System.out.println(nbrAdultes > 3);
}
}