хотите использовать переменную в одном (для) цикла в следующем в C - PullRequest
0 голосов
/ 11 ноября 2018

Я новичок, и я пытаюсь сделать CS50 Марио левой половине пирамиды как-то так (образ s - это просто пустое пространство)

ssss#
sss##
ss###
s####

после долгих раздумий я понял, что эта формула должна работать

 #include<cs50.h>
#include<stdio.h>

int main(void)

{
 int n = get_int("Height: ");
 for (int i = 0; i < n; i++)
 {

  // s stands for spaces
    for (int s = 0; s < n - 1 - i; s++)


       printf(" ");

  // h stands for hashes
    for (int h = 0; h < n - s; h++)
       printf("#");
       printf("\n");

 }

printf("\n");
}

как вы видите, я хочу использовать значение переменной s, которое меняется, и использовать его в следующей переменной h я знаю, что его значение только в () когда я пытался добавить {} вот так

#include<cs50.h>
#include<stdio.h>

int main(void)

{
 int n = get_int("Height: ");
 for (int i = 0; i < n; i++)
 {

  // s stands for spaces
    for (int s = 0; s < n - 1 - i; s++)

{
       printf(" ");


  // h stands for hashes
    for (int h = 0; h < n - s; h++)
       printf("#");
       printf("\n");
       }

 }

printf("\n");
}

он избегает строки printf ("") и сначала печатает #, что приводит к чему-то вроде этого

 
####
###
##
####
###
####

так, как я могу получить его в первые пробелы по количеству (строка INput-1), затем печатаю хэши (хэши переменных ввода) так что во 2-й строке пирамиды из 4 строк я получаю (4-1-1 = 2 пробела), затем хэши (входные пробелы) (4-2 = 2) сс ## 3-я строка (4-1-2 = 1) (4-3 = 1) s ### и т. д.

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

Переменная, объявленная в for -loop, недоступна за пределами этого цикла. Если вы хотите получить доступ к переменной вне цикла, определите / объявите ее вне цикла; например:

// s stands for spaces
int s;
for (s=0; s < n - 1 - i; s++) {
   printf(" ");
}

// h stands for hashes
for (int h = 0; h < n - s; h++) { 
   ...
0 голосов
/ 11 ноября 2018

Если я скопирую и отформатирую код из вопроса, это будет выглядеть так:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n = get_int("Height: ");
    for (int i = 0; i < n; i++)
    {
        // s stands for spaces
        for (int s = 0; s < n - 1 - i; s++)
        {
            printf(" ");
            // h stands for hashes
            for (int h = 0; h < n - s; h++)
                printf("#");
            printf("\n");
        }
    }

    printf("\n");
}

Структура цикла не соответствует задуманной; цикл h может обращаться к s, но не должен этого делать. Цикл i считает от нуля до (но не включая) введенного числа. Вы хотите напечатать i + 1 хэшей, так что на самом деле нет необходимости обращаться к s после цикла.

Как я отметил в комментарии, в конце цикла s значение s будет n - 1 - i; Вы можете использовать это в предельном выражении следующего цикла: for (int h = 0; h < n - (n - 1 - i); h++), но затем вы можете упростить его до for (int h = 0; h < i + 1; h++), так что вам действительно не нужно иметь доступ к s после завершения его цикла.

Вывод этого перемешанного кода цикла для высоты 7 выглядит следующим образом:

Height: 7
 #######
 ######
 #####
 ####
 ###
 ##
 #######
 ######
 #####
 ####
 ###
 #######
 ######
 #####
 ####
 #######
 ######
 #####
 #######
 ######
 #######

Если вы исправите код таким образом, чтобы цикл h не находился внутри цикла s, и зафиксировали ограничение на цикл h, как обсуждалось, вы получите код, подобный:

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int n = get_int("Height: ");
    for (int i = 0; i < n; i++)
    {
        // s stands for spaces
        for (int s = 0; s < n - 1 - i; s++)
            printf(" ");
        // h stands for hashes
        for (int h = 0; h < i + 1; h++)
            printf("#");
        printf("\n");
    }

    printf("\n");
}

Соответствующий вывод для высоты 7:

Height: 7
      #
     ##
    ###
   ####
  #####
 ######
#######

Это похоже на то, что нужно.

0 голосов
/ 11 ноября 2018

Вы можете объявить индексную переменную (s) вне цикла, чтобы она сохраняла свое значение после завершения цикла, чтобы вы могли делать с чем угодно.

...