[c] dessiner une ligne un carré, un triangle,

Fermé
bosz28 - 16 oct. 2005 à 18:47
 deazure - 26 avril 2008 à 15:21



Salut tout le monde!
Je dois faire un programme en C et j'utilise turbo C++ 1.0

Voici l'énoncé de mon exercice :

Ecrire un programme qui affiche 3 formes géométriques à partir de caractères, une ligne, un carré, un triangle, (une ligne séparera chaque forme) en demandant à l'utilisateur la taille qu'il souhaite.

Il faut définir et utiliser une fonction qui affiche une ligne de N caractères (N entre 1 et 8).
La saisie de la taille devra être valide (redemander un entier tant que la taille donnée n'est pas entre 1 et 8) : définir et utilisé une fonction de saisie valide.

Voici pour le moment le code que j'ai tapé mais qui me pose déja des soucis que je n'arive à résoudre :
#include <stdlib.h>
#include <stdio.h>

void car(int i);
void lig(int i);

void main()
{
  int i;
  char reslig,rescar,n;

  clrscr();
  printf("entrer la valeur de i");
  scanf("%d",&i);
  reslig="lig(i)";
  printf("%s",reslig);
  rescar="car(i)";
  printf("%s",rescar);
  getch();
}

void lig(i)
{
  for(i=1; i<=8; i++)
  {
    printf("g");
  }
printf("\n");
getch();
}

void car(i)
{
  for(i=1; i<=8; i++)
  {
printf(lig(i));
  }
printf("\n");
getch();
}


Mais cela ne fonctionne pas! en effet, cela ne prend pas en compte le nombre que je donne et la fonction carré n'est pas exécuter! en plus quand je rentre une valeur, le charactère que j'ai pré-enregistrer pour les dessins sont raplacer par d'autres carachtères.

4 réponses

kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
16 oct. 2005 à 19:11
reslig="lig(i)";
rescar="car(i)";


Ici tu n'exécutes pas lig() et car()
Ce que tu fait c'est faire pointer reslig vers la chaine de caractère "lig(i)" et rescar vers la chaine "car(i)"

Tu les entoures de guillemets ce ne sont que des chaînes.
Pour executer une fonction, il ne faut pas l'entourer de guillemets.

Donc ce serait:
reslig=lig(i);
rescar=car(i);


C'est déjà plus correct: lig(i) s'execute et affiche à l'écran ta ligne.
Ta fonction s'en charge donc ton printf() plus loin ne sert à rien.

En fait je vois ton résonnement, tu pensais qu'en faisant:
reslig="lig(i)";
..reslig contiendrait ce qu'affiche lig(i), et bien non ça ne fonctionne pas comme ça :-)
printf(), ça affiche toujours à l'écran et ça ne charge pas l'affichage ailleurs.

Par contre lig et car sont des fonctions de type void, donc inutile de mettre:
reslig=lig(i);
puisque lig(i) ne retourne aucune valeur (mais effectue des actions, il faut distinguer les deux notions).

Donc pour ton main, ceci corrigera déjà certains truc:
int main()  //Par convention, main doit retourner un int
{
  int i;

  clrscr();
  printf("entrer la valeur de i");
  scanf("%d",&i);
  lig(i);
  car(i);
  getch();
  return 0;
}
1
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 1 527
16 oct. 2005 à 19:17
Ah j'oubliais:
void car(i)
{
  for(i=1; i<=8; i++)
  {
        printf(lig(i)); //Pas bon!!!
  }
printf("\n");
getch();
}


Pourquoi pas bon?
Parce que comme je l'ai dis au dessus, lig(i) ne retourne aucune valeur (il est typé void). Donc ton printf n'affichera rien (peut être même que ça te déclenchera une erreur).
lig() fait déjà un affichage à l'écran, tu n'as donc pas à t'en soucier:
void car(i)
{
  for(i=1; i<=8; i++)
  {
        lig(i); // La foule en délire.....
  }
printf("\n");
getch();
}
0
Voici l'algo du programme que je dois réaliser.
Procédure : ligne(données N entier)
variable i : entier (pour compter le nombre de répétition)
 début
   pour i variant de 1 a N par pas de 1 faire
       écrire("*")
   fin pour
       passer à la ligne
  fin


Procédure : carré(données N entier)
variable i : entier (pour compter le nombre de répétition)
 début
   pour i variant de 1 a N par pas de 1 faire
     ligne(N)
     fin pour   
  fin

Procédure : triangle(données N entier)
variable i : entier (pour compter le nombre de répétition)
 début
   pour i variant de 1 a N par pas de 1 faire
     ligne(i)
     fin pour   
  fin



Voici le code après quelques modifications
#include <stdlib.h>
#include <stdio.h>

void car(int i);
void lig(int i);

void main()
{
  int i;
  clrscr();
  printf("entrer la valeur de i");
  fflush(stdin);
  scanf("%d",&i);
  printf("vous avez choisi i=%d\n",i);
  lig(i);
  car(i);
  getchar();
}

void lig(int k)
{
  for(i=1; i<=8; i++)
  {
    printf("*");
  }
printf("\n");
getch();
}

void car(int q)
{
  for(q=1; q<=8; q++)
  {
    lig(q);
  }
getch();
}

La fonction lig() ne doit pas être bonne car quelqesoit la veleur de i que je donne, j'obtient toujours 8 charactères d'affiché à l'écran.
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
17 oct. 2005 à 09:52
La fonction lig() ne doit pas être bonne car quelqesoit la veleur de i que je donne, j'obtient toujours 8 charactères d'affiché à l'écran.

void lig(int k)
{
for(i=1; i<=8; i++) // Ok ca tourne que de 1 a 8 normal ...
{
printf("*");
}
printf("\n");
getch();
}

remplace:
for(i=1; i<=8; i++)

PAR

for(i=1; i<=k; i++)

Zep3k!GnO
-->hi i hi o on va pas au boulot :P
0
voici ce que je veux faire
|----------------------------------------------------------------------------------------------------------------|
| |
| ecriture du programme |
| |
|----------------------------------------------------------------------------------------------------------------- |
0