3
votes

Question sur le retour d'une fonction comme «indéfinie» avec un nombre négatif?

J'essaie d'écrire du code qui renverra undefined si on lui donne un nombre négatif

On m'a demandé de calculer les aires d'un rectangle, d'un triangle et d'un cercle en utilisant une fonction en Javascript. J'ai bien compris cette partie, mais le problème dit aussi " Si l'un des paramètres est négatif, la fonction doit renvoyer undefined. "

if (calculateRectangleArea <0) 
   return "undefined";

Je peux calculer les zones bien mais je ne peux pas comprendre quoi écrire s'il y a un nombre négatif pour obtenir undefined . Est-ce quelque chose comme:

function calculateRectangleArea (length, width) {
  return length * width;
}
function calculateTriangleArea (base, height) {
  return (base * height)/2;
}
function calculateCircleArea (radius) {
  return radius * radius * Math.PI;
}


0 commentaires

5 Réponses :


4
votes

Vous devez tester chaque paramètre pour vous assurer qu'il n'est pas négatif, dans une instruction if , et s'il y en a qui sont négatifs, renvoyez undefined - sinon, retournez le calcul ordinaire comme vous le faites déjà:

function calculateRectangleArea(length, width) {
  if (length >= 0 && width >= 0) {
    return length * width;
  }
}

Alternativement, puisque lorsqu'aucune valeur n'est renvoyée, undefined est renvoyé par défaut, vous pouvez également renvoyer le calcul uniquement si tous les paramètres ne sont pas négatifs, par exemple:

function calculateRectangleArea(length, width) {
  if (length < 0 || width < 0) {
    return undefined;
  } else {
    return length * width;
  }
}
function calculateTriangleArea(base, height) {
  if (base < 0 || height < 0) {
    return undefined;
  } else {
    return (base * height) / 2;
  }
}
function calculateCircleArea(radius) {
  if (radius < 0) {
    return undefined;
  } else {
    return radius * radius * Math.PI;
  }
}


3 commentaires

vous pouvez omettre d'autre, car s'il est renvoyé, il n'y a plus de flux dans la fonction.


Vous n'avez pas besoin de l'instruction else , car return quitte la fonction - si elle n'est pas quittée, vous pouvez exécuter le reste de la fonction car les conditions de retour n'étaient pas rencontré.


@ guest271314 Ensuite, la valeur de retour est 0. L'exigence d'OP dit de retourner undefined sur les paramètres négatifs , mais n'a rien dit à propos du moment où les paramètres sont 0, donc vraisemblablement une sortie de 0 est souhaité



3
votes

Parce que vous voulez que cela se produise si l'un des paramètres n'est pas défini, utilisez certains sur [... arguments] :

function calculateRectangleArea (length, width) {
  if ([...arguments].some(e => e < 0)) return undefined;
  return length * width;
}

Faites ceci pour toutes vos fonctions.


0 commentaires

0
votes

Vous utilisez Math.abs () pour vérifier si un entier ou un décimal est négatif. Le code définit les fonctions comme propriétés d'un objet et une fonction qui utilise .find () pour créer une variable qui est définie comme undefined si l'un des paramètres passés à la fonction est négatif

const calculations = {
  calculateRectangleArea (length, width) {
    const n = this[Object.getOwnPropertySymbols(this)[0]](length, width) 
    return !n ? n : length * width
  },
  calculateTriangleArea (base, height) {
    const n = this[Object.getOwnPropertySymbols(this)[0]](base, height) 
    return !n ? n : (base * height)/2
  },
  calculateCircleArea (radius) { 
    const n = this[Object.getOwnPropertySymbols(this)[0]](radius) 
    return !n ? n : radius * radius * Math.PI
  },
  [Symbol('filter')](...props) {
    const n = props.find(n => Math.abs(n) !== n)
    // if `n` is not `undefined` `return` `void 0` else return `true`
    console.log(!n)
    return n !== undefined ? void 0 : !n
  }
}

console.log(
  calculations.calculateRectangleArea(0, 0) // `0`
, calculations.calculateTriangleArea(1, 2) // `1` 
, calculations.calculateCircleArea(-2, 1) // `undefined`
)


6 commentaires

Pas vraiment. Si la longueur et la largeur sont toutes deux négatives, alors n === Math.abs (n) renverra true. OP doit vérifier "si l'un des paramètres est négatif".


@KhauriMcClain OP peut utiliser la même évaluation Math.abs () pour tout, tous les paramètres passés à la fonction.


Je suis désolé mais cette réponse n'a tout simplement pas de sens et je pense que vous avez mal compris la question initiale ou que vous essayez de faire quelque chose de trop intelligent. Si, par exemple, OP devait utiliser ceci pour calculer rayon * rayon * Math.PI alors si le rayon était passé en tant que -1, OP voudrait que la fonction renvoie non défini . Cependant, puisque -1 * -1 * Math.PI == 1 * Math.PI et 1 * Math.PI == Math.abs (1 * Math.PI) , cette fonction ne retournera pas indéfini.


@KhauriMcClain Vous n'avez pas lu le commentaire précédent? Il existe des réponses qui itèrent tous les paramètres passés; par exemple, en utilisant arguments et Array.prototype.some () . La réponse montre une option pour vérifier si un entier ou un nombre décimal est négatif.


Je comprends que votre commentaire suggère à OP d'utiliser n === Math.abs (n) sur chaque paramètre individuel de la fonction, mais cela ne se reflète pas dans votre réponse réelle. Votre réponse réelle semble impliquer que OP devrait l'utiliser comme un moyen de renvoyer undefined de la fonction, mais cela ne le fera que si le calcul final est négatif, ce qui n'est pas ce que l'OP a demandé. Et de plus, je ne comprends pas pourquoi vous préféreriez faire cela plutôt qu'un n <0 plus compréhensible


@KhauriMcClain Ok. Vous avez écrit vos préoccupations pertinentes à la réponse et avez lu ces préoccupations.



1
votes

La solution la plus simple et la plus lisible consiste à vérifier que tous les arguments sont positifs avant de calculer la zone, sinon vous retournerez undefined .

Par exemple (cela utilise le opérateur conditionnel ):

// Takes a function as argument and returns a function 
// that will execute the function given only if all the arguments
// provided are positive, `undefined` otherwise:
const guard = fn => (...args) => args.some(arg => arg < 0) ? undefined : fn(...args);

const calculateRectangleArea = guard((length, width) => length * width);
const calculateTriangleArea = guard((base, height) => base * height /2);
const calculateCircleArea = guard(radius => radius ** 2 * Math.PI);


1 commentaires

J'ai considéré "Si l'un des paramètres est négatif" de l'OP comme s'il était inférieur à 0 dans le code que j'ai suggéré. Cependant, vous avez raison, ce n'est pas cohérent avec le premier exemple que j'ai écrit, je vais inverser la condition pour que les deux exemples soient équivalents.



0
votes

Je voulais juste vous remercier pour toute cette aide! J'ai réussi à le résoudre, mais il est vraiment utile que cette communauté soit prête à intervenir et à aider! J'espère qu'un jour je serai assez bon pour rendre la pareille.

Merci!


0 commentaires