Impression étoile ('*') diamant en C avec des boucles imbriquées?
Je veux être en mesure d'imprimer un diamant comme cela lorsque l'utilisateur entre 5 pour le diamant. Mais aussi de travail pour toute valeur qui est impair et supérieur à 0.
J'ai un code qui fonctionne pour faire un diamant pour l'utilisateur d'entrée de 5, mais ne fonctionnera pas pour tout nombre impair entrées..
half = (size/2)+1;
for (a=1; a <= half ; a++) /*top to mid row of diamond*/
{
for (b=a; b<half;b++)
{
printf(" ");
}
for (c= size -2* a; c <= half; c++)
{
printf("*");
}
printf("\n");
}
for (a = 1; a < half;a++)
{
for (b = a; b>0;b--)
{
printf(" ");
}
for (c = size-2*a; c >0 ;c--)
{
printf("*");
}
printf("\n");
}
return 0;
}
Toute aide serait grandement appréciée.Merci.
Mike
- Et votre code jusqu'à présent?
- Est-ce devoirs?
- vous n'avez pas besoin de boucles imbriquées, comment environ deux boucles, l'une qui s'incrémente et un qui diminue, essayer et d'en faire rapport avec votre tentative.
- Google est plein de résultats et des exemples de ce ("C impression de diamant"), ce que vous avez essayé jusqu'à présent?
- Essayez de demander à l'-vous les questions suivantes: Combien d'espaces et puis astérisques vous avez besoin d'imprimer pour la première ligne? Combien d'espaces et les astérisques aurez-vous besoin de chaque ligne, en comparant avec la ligne précédente? À un certain point, vous aurez besoin d'imprimer plus d'espace et moins d'astérisques: quand?
- Ré-étiqueté comme devoirs. Ne pas essayer d'être offensive, mais c'est très simple si vous vous asseyez et pensez à ce sujet pendant 5 minutes.
- c'est plutôt dangereux hypothèse. Je suis sûr que la plupart pathologie infirmières envisager le prélèvement de sang pour être "simple", mais ce n'est pas quelque chose que je voudrais essayer. Les gens d'ici ont des niveaux très différents de compétences dans divers domaines.
- Il y a une tournure intéressante sur cette question dans un Deitel C++ livre (mais la même chose peut être fait en C). Une fois que vous êtes en mesure d'imprimer de manière arbitraire de la taille des diamants, essayez de faire la même chose, mais avec une seule boucle. Cet exercice m'a fait me sentir vraiment bien une fois que j'ai travaillé sur la façon de le faire et ajusté le tout correctement.
- à un certain point, cela devient contre-productif. Alors qu'il est souvent intelligent pour être en mesure d'analyser des trucs comme ça (et je dois admettre que j'ai senti qu'avant), c'est une limitation arbitraire qui vous avez peu de chances de rencontrer dans le monde réel. Semblable à la permutation des variables sans une variable temporaire (xor truc), de l'incapacité d'utilisation temporaire est peu probable, comme c'est l'incapacité d'avoir un programme où une seule boucle est autorisé 🙂
- le livre juste compris que comme un bonus, et mon professeur a fait trop quand nous sommes arrivés au. C'était mon plus bien méritée bonus de marque, je n'ai jamais travaillé pour. Il vous fait vraiment penser à une façon complètement différente, ce qui est probablement le principal point d'elle. J'ai passé combien de temps assis là, sûr à 100% que j'avais besoin de deux boucles, jusqu'à ce que finalement il est venu à moi.
- J'ai fait cette question, à l'âge de 8 ans à partir d'un Steve Prata livre; C++ Primer et en Plus, si je me souviens bien, et c'était gérable alors. Fourni les boucles et les printf sont couverts dans les 3 premiers chapitres du texte de cette personne (ce qui est le cas dans 90% des "traditionnels" C/C++ livres), cette personne a tout le nécessaire à portée de la main pour résoudre cette question. Je maintiens ma déclaration d'origine et d'avoir re-marqués ce. J'ai posé cette question à 12 ans d'apprentissage de base en programmation Flash, et ils ont compris, en tant que groupe en 10 minutes.
Vous devez vous connecter pour publier un commentaire.
Presque certainement devoirs alors voici un indice.
De compter le nombre d'espaces avant une ligne et le nombre d'étoiles dans cette ligne. Ce que vous cherchez est un relationsip entre le numéro de la ligne et de ces deux valeurs.
Ensuite, vous pouvez utiliser deux fois de suite
for
boucles, une augmentation du nombre d'étoiles et l'autre en la diminuant.Dans chacune de ces boucles de deux plus consécutives boucles d'imprimer le nombre requis de places de suivi par le nombre d'étoiles suivie par un caractère de saut de ligne.
Si vous rencontrez toujours des difficultés après avoir lu ci-dessus, considérez ceci. Pour l'entrée (bizarre, comme vous le dites vous respecter dans vos commentaires)
n
, l'espace commence à(n - 1) /2
et le nombre d'étoiles à1
. Pour chaque ligne, l'espace réduit par1
et le nombre d'étoiles augmente par2
.Qui fonctionne jusqu'au moment où l'espace atteint
0
, puis vous tournez autour, et aller dans l'autre sens, de s'assurer que vous n'avez pas l'impression que le milieu de la ligne deux fois.Une fois que le nombre d'étoiles atteint
0
, vous avez terminé.Maintenant, vous avez juste à tourner cette spécification dans le code 🙂
Maintenant, puisque vous avez indiqué dans les commentaires qui vous êtes intéressé à faire votre propre solution plutôt que d'être simplement remis le code, je me sens à l'aise en vous donnant quelque chose que vous pouvez vérifier votre propre solution contre. Voici le pseudo-code que j'ai utiliser:
Et, à la fin de l'exercice, vous pouvez restructurer:
dans une autre fonction, car il est commun entre les deux boucles.
Et maintenant, puisque vous avez votre propre code de travail, voici le code Python que j'ai utilisé pour la preuve de concept, inclus pour l'intégralité:
Vous pourriez probablement l'écrire de façon plus succincte en Python si vous avez utilisé le plus de fonctionnalités modernes, mais qui serait plutôt l'encontre de l'objectif de compréhension rapide et facile de la traduction. Il suffit de changer
n
à ce que le numéro que vous souhaitez (impair et supérieur à deux, en fournissant la résultante de diamant ira parfaitement dans votre terminal) et de profiter de la sortie 🙂if
déclaration. Si vous souhaitez imprimer des dix places et neuf étoiles, ce serait deux mandats consécutifs defor
boucles. Consécutives comme dans "l'un après l'autre", dans le cas où je n'ai pas que cela soit clair, auquel cas je m'excuse."the star count increases by 2"
- vous n'êtes plus 1. Mon conseil est d'utiliser des variables séparées pournumSpaces
etnumStars
de sorte que vous êtes de ne pas se soucier à la volée des calculs en utilisant une formule juste-1/+2
s'élargit et+1/-2
se diluant dans l'autre boucle par la suite.Il y a deux choses qui se produisent ici:
Tiret changements (de -1 à "mi", +"1 " après")
Nombre d'étoiles changements (+2 "mid" -2 "après")
Maintenant, cela pourrait être fait avec deux boucles (une pour le haut vers le "milieu" et un "après"), mais les valeurs peuvent également être déterminé avec un peu de mathématiques. Nous allons explorer que 🙂
Voici les numéros:
Commencez par noter que
s
est symétrique sur le "milieu":Et alors que
x
est liée às
(par 2 comme indiqué dans les deltas ci-dessus):Espérance qui donne un aperçu!
Vous êtes probablement à la prise d'introduction de classe C à l'instant, et comme tout le monde, je voudrais vous décourager de la copie, mais voici une réponse:
Pour rendre la réponse simple, tout ce que vous devez savoir, c'est combien d'espaces et les étoiles à imprimer.
La séquence est la suivante: [imprimer des espaces] [imprimer étoiles] [imprimer des espaces] [print '\n'].
Observer que, dans la rangée du milieu, nous aurions besoin de: (0) espaces, (numStars) étoiles, (0) espaces.
Dans la ligne ci-dessus et ci-dessous, nous aurions besoin de: (1) de l'espace, (numStars - 2) étoiles, (1) l'espace.
Une sorte de suite...
Cela devrait vous donner le sentiment de compter le nombre d'espaces, vous devez compter la distance à partir de la rangée du milieu. Notez également que chaque rangée loin de la moyenne, le nombre d'étoiles diminue par 2.
Puisque nous sommes le calcul de la distance entre la ligne actuelle et celle du milieu, nous avons besoin de connaître la valeur absolue. abs fonction de série C de la fonction pour le faire.
J'ai eu du mal avec cela un peu. Aussi désolé, mon dernier code est en C++, pas strict C, comme je n'ai pas utilisé le C en 10 ans. Voici un plus verbeux explication pour ceux qui essaient de comprendre comment faire ce travail pour vous-même. Avant de commencer, une chose que vous pouvez faire pour vous est de commencer avec une déclaration comme:
int numStars = 1, numSpaces = 10;
numSpaces n'a pas vraiment d'importance tant qu'il est assez petit pour tenir sur votre écran... vous pouvez brancher n'importe quel nombre et de le tester plus tard. Ensuite, travailler sur votre algorithme, et plus tard, vous pouvez travailler sur la manipulation de l'entrée.
Aussi, le nombre de places en suivant les étoiles n'est pas pertinent pour ce problème.
Ensuite, résoudre le problème de la façon de sortie de la partie supérieure du diamant. J'ai utilisé un compteur de boucle d'imprimer des espaces jusqu'à ce que j'avais imprimé le nombre de places pour la première ligne, puis une deuxième boucle (pas imbriquée) pour imprimer le nombre d'étoiles nécessaires pour cette ligne. Nous savons que dans la ligne 1, nous avons besoin d'imprimer un espace de 10 fois et une étoile une fois.
Une fois la ligne a, le nombre d'espaces et les étoiles nécessaires, vous allez sur le retour à la ligne ("\n" ou endl). Mais la ligne suivante, vous avez besoin d'imprimer plus de 2 étoiles et 1 moins d'espaces. Donc, vous devez incrémenter/décrémenter de façon appropriée.
Quand vous arrivez à la ligne avant de la rangée du milieu, vous allez vous arrêter. En d'autres termes, la boucle du haut doit continuer alors que numSpaces est plus grand que 0. À la fin de thefinal passer dans la boucle, numSpaces est décrémenté à 0, mais il ne peut pas imprimer la ligne avec 0 espaces et n étoiles (2 étoiles de chaque espace que vous avez commencé avec). Qui se passe dans votre prochaine boucle...
Ensuite, vous pouvez exécuter la deuxième boucle qui renverse votre incrémenter/décrémenter à la fin, mais sinon presque la même. Seulement, cette fois, il devrait afficher 0 espaces et 10n étoiles. Puis le retour à la ligne, et enfin de diminuer le numStars par 2 et d'augmenter numSpaces par 1.
Si vous n'êtes pas à l'aide de fonctions encore ou n'est pas autorisé à la mise en œuvre, c'est juste à ce sujet. Vous pouvez facilement appeler une fonction, si, en passant, il numSpaces/numStars, pour chacune des boucles pour éliminer le double code.
Voici mon code en C++:
Je ne veux pas vous donner le code, vous devez apprendre.
Le nombre d'entrée sera la largeur du diamant, alors assurez-vous de faire une relation entre les espaces et les astérisques et ne pas dépasser ce nombre.
L'idée principale serait de commencer à 1 astérisque, et d'incrément par deux à chaque fois jusqu'à ce que le nombre d'entrée est atteint.
Aussi, faire quelque chose pour éviter une erreur si l'utilisateur entre un nombre pair.
ici avec le code matlab
Salut, je suis à la meilleure solution pour ce problème en moins de lignes
La sortie d'un diamant en C par un astérisque signe