Обработка символов и итерация символов - PullRequest
2 голосов
/ 05 марта 2011

Источник:

#include <stdio.h>

void main()

{

int i, j, tree_Size, spaces, total_Spaces, x;
char tree_Characters;

printf("Enter characters to use --> ");
 scanf("%c", &tree_Characters);
printf("Enter size of tree --> ");
 scanf("%d", &tree_Size);

   //For handling top part of tree
   for (i = 0; i <= tree_Size; i++) {
      printf("\n");
      total_Spaces = tree_Size - i;

        //Determine spaces before each number for pyramid
      for (spaces = 1; spaces <= total_Spaces; spaces++) 
         printf(" ");

      //Make first line always one number
      for (j = -1; j < i; j++)
         if (j <= -1)
            printf("%c", tree_Characters);
         else if (j > -1)
            printf("%c%c", tree_Characters, tree_Characters);
   } 

   //For handling stem and base of tree
   for (i = 0; i <= tree_Size; i++) {

      //if handling stem
      if (i < tree_Size) {
         printf("\n");  
         for (spaces = 1; spaces <= tree_Size; spaces++)
            printf(" ");
         printf("%c", tree_Characters);
      }

      //else if handling base

      else if (i == tree_Size) {
         printf("\n");

         for (x = 0; x <= tree_Size * 2; x++) {
            printf("%c", tree_Characters);
         }
      }
   }

printf("\n");

}

Вот результат, который он производит до сих пор
Вот тема, которую я сделал на Reddit для лучшего понимания (комментарии)

Цель задания - чтобы он выглядел следующим образом:

*** Print a Tree ***

Enter characters to use ---   *|=+
Enter size of tree      ---   4

    *
   ***
  *****
 *******
*********
    |
    |
    |
    |
====+====

Чего я не понимаю, так это как обрабатывать символы. Учитель упоминал о том, что нужно поместить символы в какой-то буфер, а затем очистить его и т. Д. Я понятия не имею. Кто-нибудь может помочь? Я должен использовать scanf, не могу преобразовать что-либо в строки или использовать что-либо более сложное.

Ответы [ 2 ]

0 голосов
/ 05 марта 2011

Вам нужно сделать tree_Characters массивом (char tree_Characters[5] для пятиэлементного массива, который будет содержать ваши четыре символа дерева и нулевой терминатор) и изменить первый параметр scanf.

scanf("%4s%*[^\n]",tree_Characters);
//      vv\_____/  ^-- array will decay to char*
//      ||   \-- discard the rest of the line
//      ||         ("*" indicates discard, "[^\n]" matches everything but '\n')
//      |\-- string (non-whitespace characters only)
//      \-- at most four characters scanned

См. http://linux.die.net/man/3/scanf для получения дополнительной информации.

Редактировать: Вам, конечно, придется изменить оставшуюся часть программы, чтобы выбрать соответствующие символы для каждого элемента дерева.(См. @ eznme's answer .)

Редактировать: Версия без массива:

char tree_leaf,tree_stem,tree_ground,tree_root;
scanf("%c%c%c%c%*[^\n]",&tree_leaf,&tree_stem,&tree_ground,&tree_root);

Это будет плохо реагировать на слишком короткие входные строки.

0 голосов
/ 05 марта 2011
    Enter characters to use --> *|=+
    Enter size of tree --> 4

        *
       ***
      *****
     *******
    *********
        |
        |
        |
        |
    ====+====

Вот модифицированный источник, строки, которые я изменил, помечены // **:

    #include <stdio.h>

    void main()

    {

    int i, j, tree_Size, spaces, total_Spaces, x;
    char tree_Characters[4]; //**

    printf("Enter characters to use --> ");
     scanf("%s", tree_Characters);          // **
    printf("Enter size of tree --> ");
     scanf("%d", &tree_Size);

       //For handling top part of tree
       for (i = 0; i <= tree_Size; i++) {
          printf("\n");
          total_Spaces = tree_Size - i;

            //Determine spaces before each number for pyramid
          for (spaces = 1; spaces <= total_Spaces; spaces++) 
             printf(" ");

          //Make first line always one number
          for (j = -1; j < i; j++)
             if (j <= -1)
                printf("%c", tree_Characters[0]); // **
             else if (j > -1)
                printf("%c%c", tree_Characters[0], tree_Characters[0]); // **
       } 

       //For handling stem and base of tree
       for (i = 0; i <= tree_Size; i++) {

          //if handling stem
          if (i < tree_Size) {
             printf("\n");  
             for (spaces = 1; spaces <= tree_Size; spaces++)
                printf(" ");
             printf("%c", tree_Characters[1]); // **
          }

          //else if handling base

          else if (i == tree_Size) {
             printf("\n");

             for (x = 0; x < tree_Size; x++) { // **
                printf("%c", tree_Characters[2]); // **
             }
             printf("%c", tree_Characters[3]); // **
              for (x = 0; x < tree_Size; x++) { // **
                printf("%c", tree_Characters[2]); // **
             }
          }
       }

    printf("\n");

    getch();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...