хотите использовать переменную в одном (для) цикле в следующем в C

Я новичок и пытаюсь сделать cs50 mario для левой половины пирамиды что-то вроде этого (изображения - это просто пустое место)

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-line), а затем распечатать хэши (хеши входных переменных), чтобы во 2-й строке пирамиды из 4 строк я получил (4-1-1 = 2 пробела), затем хеши (входные пробелы) (4-2 = 2) ss ## 3-я строка (4-1-2 = 1) (4-3 = 1) s ### и так далее.


person Manin intheworld    schedule 10.11.2018    source источник
comment
первый цикл for for (int h = 0; h < n - s; h++) не имеет скобок вокруг блока кода, а второй даже не компилируется, потому что в нем отсутствует открывающая скобка for (int h = 0; h < n - s; h++)   -  person phuclv    schedule 11.11.2018
comment
У вас довольно случайный отступ и интервал, а некоторые фигурные скобки { и } размещены особым образом (AFAICS). Я думаю, что эти неуместные фигурные скобки являются причиной некоторых странностей. Если вы используете стандартный макет кода, это значительно облегчит жизнь всем. В конце цикла s значение s будет n - 1 - i; вы можете использовать выражение в предельном выражении следующего цикла: for (int h = 0; h < n - (n - 1 - i); h++), но затем вы можете упростить его до for (int h = 0; h < i + 1; h++), так что вам действительно не нужно иметь доступ к s после завершения цикла.   -  person Jonathan Leffler    schedule 11.11.2018
comment
@phuclv: код в вопросе компилируется, но его структура цикла не такая, как задумано, и отступ вводит в заблуждение.   -  person Jonathan Leffler    schedule 11.11.2018


Ответы (3)


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

person Scott Hunter    schedule 10.11.2018

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

// 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++) { 
   ...
person Stephan Lechner    schedule 10.11.2018
comment
спасибо, я попытался добавить int s; но появится ошибка ((объявление затеняет локальную переменную [-Werror, -Wshadow)) .. оказалось, что мне нужно добавить {} - person Manin intheworld; 11.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
      #
     ##
    ###
   ####
  #####
 ######
#######

Похоже, это то, что нужно.

person Jonathan Leffler    schedule 11.11.2018
comment
спасибо за ваш ответ .. вот окончательный код, который у меня сработал и привел к полной пирамиде. #include ‹cs50.h› #include ‹stdio.h› int main (void) {int n; сделать {п = get_int (Высота :); } while (n ‹0 || n› 50); for (int i = 0; i ‹n; i ++) {// s обозначает пробелы int s; для (s = 0; s ‹n - 1 - i; s ++) {printf (); } // h обозначает хеши для (int h = 0; h ‹n - s; h ++) printf (#); printf (); для (int h = 0; h ‹n -s; h ++) {printf (#);} printf (\ n); } printf (\ n); } - person Manin intheworld; 11.11.2018