3 votes

Programme récursif de remplissage de formes en C

Je dois faire un programme qui prend le périmètre d'une forme, dessinés dans des astérisques ( ) par l'utilisateur, puis de remplir la forme avec des astérisques ( ).
Il compile bien mais mon problème est que lorsque je réimprime le périmètre de la forme, il imprime des symboles funky comme :

1ÿu x { @

Un autre problème est qu'une fois que fill est exécuté, les astérisques sont tous imprimés sur une seule ligne ?

Voici mon code (il est assez long, désolé)

#include <stdio.h>
#include "simpio.h"
#include "genlib.h"

void getArray(char array[][20]);
int getRow(void);
int getColumn(void);
void fill(char array[][20], int row, int column);
void dispArray(char array[][20]);
void dispMsg(void);

main()
{
      char array[20][20];
      int row, column;

      dispMsg();
      getArray(array);
      printf("Please enter an interior point from which the program starts filling.\n");
      row=getRow();
      column=getColumn();
      fill(array, row, column);
      dispArray(array);

      getchar();
}

void dispMsg(void)
{
      printf("This program will ask you to input the outline of a shape, and it will fill the shape up.\n");
      printf("To input the perimeter of your shape please use asterisks(*), and the <enter>     key to start a new line.\n");
}

void fill(char array[][20], int row, int column)
{
     if(array[row][column]!=' '||row>20||row<20||column>20||column<20)
     {
     }
     else
     {
         array[row][column]=='*';
         fill(array, row, column+1);
         fill(array, row+1, column);
         fill(array, row, column-1);
         fill(array, row-1, column);
     }
}

void dispArray(char array[][20])
{
     int i, j;

     for(i=0;i<20;i++)
     {
              for(j=0;j<20;j++)
              {
                               printf("%c", array[i][j]);
              }
     }
}

int getRow(void)
{
      int row;

      printf("Enter the row of the point: ");
      row=GetInteger();
      return(row);   
}

int getColumn(void)
{
      int column;

      printf("Enter the column of the point: ");
      column=GetInteger();
      return(column);   
}

void getArray(char array[][20])
{
      int i, j;
      char input;

      for(i=0;i<20;i++)
      { 
                       for(j=0;j<20;j++)
                       {
                                        array[i][j] = ' ';
                       }
      }
      while(true)
      {
                 input=getchar();
                 if(input=='\n')
                 {
                    i++;
                    j=0;
                 }
                 else if(input=='!')
                 {
                     break;
                 }
                 else
                 {
                    array[i][j]=input;
                    j++;
                 }
      }
      printf("Your input shape is: \n");
      for(j=0;j<20;j++)
      {
                       for(i=0;i<20;i++);
                       {
                               printf("%c", array[i][j]);
                       }
      }
}

Merci beaucoup :)

1voto

nouney Points 2643

Un autre problème est qu'une fois que fill est exécuté, les astérisques sont tous imprimés sur une seule ligne ?

Vous n'imprimez jamais un NL caractère :

void dispArray(char array[][20])
{
     int i, j;

     for(i=0;i<20;i++)
     {
              for(j=0;j<20;j++)
              {
                               printf("%c", array[i][j]);
              }
              printf("\n");
     }
}

Effectivement fill() semble bizarre :

 // what if row and column are equals to 5 by example?
    void fill(char array[][20], int row, int column) 
    {
         // If row = 5, then this condition is true, same for column = 5.
         // The array will never be filled so ! 
         if(array[row][column]!=' '||row>20||row<20||column>20||column<20)
         {
         }
         else
         {
             array[row][column] = '*'; // By the way, you should use the assigment operator instead of comparison one.
             fill(array, row, column+1);
             fill(array, row+1, column);
             fill(array, row, column-1);
             fill(array, row-1, column);
         }
    }

Vous devriez changer la condition. Vous devriez peut-être utiliser la méthode itérative, qui est plus simple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X