Comme je l'ai mentionné dans une autre question, je m'ensey moi-même C hors de la programmation C Kn King: une approche moderne (2ndedn).
Je l'apprécie, mais j'espère poster la question étrange ici pour conseils, le cas échéant, car malheureusement, je n'ai pas de tuteur et que certains bits soulèvent plus de questions, ils répondent! P>
Je suis à une question qui me demande d'écrire un programme qui trouve le plus grand et le plus petit de Quatre entiers entrés par l'utilisateur ... Je suis arrivé avec une façon de trouver le plus grand, mais pour la vie de moi ne peut pas comprendre comment obtenir le plus petit. La question indique que quatre déclarations si elles devraient suffire. Math n'est pas mon fort, j'apprécierais tout conseil! P>
#include <stdio.h> int main(int argc, const char *argv[]) { int one, two, three, four; printf("Enter four integers: "); scanf("%d %d %d %d", &one, &two, &three, &four); if (four > three && four > two && four > one) printf("Largest: %d", four); else if (three > four && three > two && three > one) printf("Largest: %d", three); else if (two > three && two > four && two > one) printf("Largest: %d", two); else printf("Largest: %d", one); return 0; }
8 Réponses :
Une autre façon serait en tant que telle: pas une seule instruction si nécessaire;) p> p>
Vous vous rendez compte qu'il n'écrire pas le code pour être rapide ou concis, mais d'apprendre les fonctionnalités de la langue.
Je fais. Et pendant que je reconnais que ma réponse est un peu plus complexe, je pensais que je lui soutiens de la soumettre à la question de savoir qu'il y a plus d'une solution à tout problème donné. En outre, c'est un exemple relativement facile à comprendre, sinon trivial, d'exemple de chaîne de fonction.
Je n'ai jamais dit que c'était difficile à comprendre mais que vous ne pensez pas qu'il est probable que s'il apprenne si des déclarations qu'il ne saurait pas sur les fonctions ou enchaînement?
if (first > second) swap(&first, &second); if (third > fourth) swap(&third, &fourth); if (first > third) swap(&first, &third); if (second > fourth) swap(&second, &fourth); printf("Smallest: %d\n", first); printf("Largest: %d\n", fourth); The implementation of the swap() function is left as exercise.
Il suffit de lire sur la fonction d'échange maintenant et de votre chemin à travers cela, comment avez-vous trouvé cela c'est incroyable!
Je viens d'utiliser la stratégie de division et de conquérir.
@Super chat, pourquoi pensez-vous que cette solution ne fonctionne pas?
@mgronber Pardonnez-moi, il y avait une erreur idiote de mon côté. Désolé pour le dérangement. Si vous éditez un peu la réponse, mon vote se déverrouillera et je peux la restaurer.
@Super chat, pas de problème.
printf("Largest: %d\n",(one>two ? one:two)>(three>four ? three:four) ? (one>two ? one:two):(three>four ? three:four)); printf("Smallest: %d",(one<two ? one:two)<(three<four ? three:four) ? (one<two ? one:two):(three<four ? three:four));
J'ai le même livre, et je vais l'admettre, ce programme m'a donné un mal à la tête. C'est un peu délicat pour un programmeur débutant.
Premièrement, vous comparez la première paire d'entiers (A et B dans le code) et conservez-le des mines locales et max quelque part. Faites la même chose avec la deuxième paire. Comparez ensuite les minimums locaux pour obtenir le minimum mondial et faire la même chose avec des maximums. Pas plus de quatre ifs. P> Il existe de meilleurs moyens de résoudre ce problème, certains d'entre eux sont montrés ici, mais le livre les couvre dans les derniers chapitres. P> p>
Je passe à travers k.n. La programmation du roi "C: une approche moderne, une deuxième édition" aussi. Vous trouverez ci-dessous ma solution pour la question originale de cette thread.
Notez que j'utilise uniquement les concepts C introduits jusqu'au chapitre 5 du livre. Le problème de programmation original provient du chapitre 5, problème de programmation 7. p>
#include <stdio.h> /* SOLUTION 1 int main(void) { int a1,a2,a3,a4,max,min,max1,min1,max2,min2; printf("Enter four integers : "); scanf("%d %d %d %d",&a1,&a2,&a3,&a4); if (a1 > a2) { max1 = a1; min1 = a2; } else { max1 = a2; min1 = a1; } if (a3 > a4) { max2 = a3; min2 = a4; } else { max2 = a4; min2 = a3; } if (max1 > max2) max = max1; else max = max2; if (min1 < min2) min = min1; else min = min2; printf("Largest : %d\n",max); printf("Smallest : %d\n",min); } */ /* SOLUTION 2 */ int main(void) { int a1,a2,a3,a4; printf("Enter four integers : "); scanf("%d %d %d %d",&a1,&a2,&a3,&a4); if (a1 > a2) { int temp1 = a1; a1 = a2; a2 = temp1; // Swap the numbers (a1 to contain smallest number) } if (a3 > a4) { int temp2 = a3; a3 = a4; a4 = temp2; // Swap the numbers (a1 to contain smallest number) } if (a1 > a3) { int temp3 = a1; a1 = a3; a3 = temp3; // Swap the numbers (a1 to contain smallest number) } if (a2 > a4) { int temp4 = a2; a2 = a4; a4 = temp4; // Swap the numbers (a1 to contain smallest number) } printf("Largest : %d\n",a4); printf("Smallest : %d\n",a1); }
J'ai réussi à résoudre ce problème dans encore moins de 4 déclarations, voici ma solution:
#include<stdio.h> int main(void){ int no1, no2, no3, no4; int max1, max2, max3, min1, min2, min3; printf("Enter four integers:"); scanf_s("%d %d %d %d", &no1, &no2, &no3, &no4); if(no1 > no2 || no1 < no2 && no3 > no4 || no3 < no4){ no1 > no2 ? (max1=no1) : (max1=no2); no1 > no2 ? (min1=no2) : (min1=no1); no3 > no4 ? (max2=no3) : (max2=no4); no3 > no4 ? (min2=no4) : (min2=no3); } if(max1 > max2 || max1 < max2 && min1 > min2 || min1 < min2){ max1 > max2 ? (max3=max1) : (max3=max2); min1 > min2 ? (min3=min2) : (min3=min1); } printf("The largest number is %d \n", max3); printf("The smallest number is %d \n", min3); }
Vous devriez considérer le ternaire dans votre somme des ifs
Dans le contexte du chapitre:
if (a > b) { max = a; min = b; } else { max = b; min = a; } if (c > d) { max2 = c; min2 = d; } else { max2 = d; min2 = c; } if (max < max2) { max = max2; } if (min > min2) { min = min2; }
Maintenant, pour être complet, vous pouvez marquer ceci (ou l'un des autres) comme répondu en cliquant sur la coche
Considérez ce qui se passe si l'utilisateur entre dans 2,2,1,1.
Je suppose que cela ne fait jamais le deuxième 2, ni les deux prochains 1? Après l'évaluation de la première instruction si la déclaration vraie, imprime simplement le plus grand nombre d'entiers est deux et ses sorties?
OPS, je voulais dire "1 1 2 2". Mettez cela dans votre programme et voyez ce qui se passe.
Ah, d'accord. Beau ramassage. Donc, les deux premières si les déclarations échouent parce que 2 n'est pas plus grande que deux, et il n'a pas d'autre choix que d'appeler le plus grand Int. Je l'ai changé à> = au lieu de> et cela semble avoir corrigé le problème, cela semble-t-il la bonne façon de vous résoudre?
@AUSSIE_AJ Bien fait :) Cela devrait le réparer :)
@freespace génial merci j'apprends des tas, cet endroit bascule!