2013-08-05 3 views
-1

Около двух недель назад я опубликовал аналогичный вопрос, и я решил свою проблему. Однако после некоторых изменений моя программа не работает. Инструкции состоят в том, чтобы взять по периметру фигуры, нарисованную звездочками () пользователем, а затем заполнить форму звездочками ().Программа, которая рекурсивно заполняет фигуры

Есть две проблемы:

1) The program fails to print the full input shape (at end of getArray function) 
2) The program does not fill an input shape problem for row > 9 or column > 9. 

Я хотел бы знать, почему эти проблемы возникают, и как их исправить.

Вот программный код (извините за длинноты):

#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("\nPlease 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"); 
} 

void fill(char array[][20], int row, int column) 
{ 
    if(array[row][column] != ' '|| row>20 || row<0 || column>20 || column<0) 
    { 
    } 
    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++) 
    { 
       printf("\n"); 
       for(j = 0; j < 20; j++) 
       { 
          printf("%c", array[i][j]); 
       } 
    } 
} 

int getRow(void) 
{ 
     int row; 

     printf("\nEnter the row of the point: \n"); 
     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, row = 0, column = 0, num; 
    char input; 

    printf("To input the perimeter of your shape please use asterisks(*), and the <enter> key to start a new line.\nEnd the input with the '!' signal\n\n"); 
    for(i=0;i<20;i++) 
    { 
       for(j=0;j<20;j++) 
       { 
        array[i][j] = ' '; 
       } 
    } 
    i=0; 
    j=0; 
    while(true) 
    { 
       input=getchar(); 
       if(input=='\n') 
       { 
        i++; 
        j=0; 
        row++; 
        column = num; 
        num = 0; 
       } 
       else if(input=='!') 
       { 
        if(array[i-1][j] == '*')  row--;  
        break; 
       } 
       else 
       { 
        array[i][j] = input; 
        j++; 
        num++; 
       } 
     } 
     printf("Your input shape is: \n"); 

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

Например:

If the user enters: 

************** 
*   ***** 
*    * 
*    * 
*    * 
****************** 

The output will be: 

************** 
****************** 
****************** 
****************** 
****************** 
****************** 

Однако для моей программы:

When the input is re-printed, this comes out: 

**************** * 
*    *****   * 
*     *   * 
*     *   * 
*     *** 

And when the fill is printed: 

****************** 
*    **************** 
*    **************** 
*    **************** 
****************** 
****************** 

Помощь будет много оценил, спасибо :)

+0

Что вы пробовали в отладке? Можете ли вы привести примеры того, что он должен был делать и что он делает? См. Также http://whathaveyoutried.com/ –

+0

@MihaiMaruseac См. Редактирование в сообщении –

+0

И что показывает программа? –

ответ

2

Проблема заключается в ваших расчетах количества столбцов.

Есть две вещи, которые вы должны помнить:

Первое, что целочисленное деление обрезает результат. Например, при вводе в ваш вопрос у вас есть column как 44 и row как 6, в результате чего 44/6 составляет 7.3333333.... Однако, поскольку это целая операция, вы получите вместо этого 7.

Во-вторых, вы просто не можете получить количество столбцов, разделив количество звездочек на количество строк. Вместо этого вам нужен отдельный счетчик, чтобы подсчитать количество столбцов для текущей строки. Если он больше текущего значения column, вы устанавливаете новое количество столбцов.

+0

спасибо, я исправлю это, а затем вернусь к вам –

+0

Еще раз спасибо. После его исправления программа работает :) –

Смежные вопросы