Night Sky8 Ответов: 4

Как мне решить эту проблему языка Си


Я все еще очень новичок в мире кодирования, и мне трудно решить этот вопрос. Итак, мне нужно создать программу, которая попросит пользователя ввести 3 целых числа. Введенные числа будут являться начальной точкой, расстоянием между ними и точкой остановки последовательно. Пример:
Введите три целых числа: 10 2 20
Решение: 10 12 14 16 18 20

Что я уже пробовал:

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

Patrice T

Покажи свой код.

Richard MacCutchan

Вы даете три числа A, B и C. A-это начальная точка, C-предел, А B-шаг. Поэтому написать простой цикл for должно быть легко, даже для новичка.

4 Ответов

Рейтинг:
31

Rick York

Ваше утверждение неверно : у вас есть точный номер точки остановки, потому что он был введен пользователем. Это требует реализации в виде цикла for, потому что это три параметра, которые он использует. Цикл for выглядит следующим образом :

for( Initialize; Condition; Increment )
{
   // code executed on every loop iteration
}
Ниже приведен небольшой пример кода, который реализует цикл for, и каждый из трех параметров является вызовом функции. В большинстве циклов они являются простыми операторами, и первая строка каждой из трех функций-это то, как обычно выглядит оператор. Во всяком случае, это задумано как мини-учебник. Я рекомендую вам прочитать дальше для петель, потому что они непосредственно применимы к вашей проблеме.
// for loop example

int Initialize( int init )
{
   printf( "Initialize() : returning value of %d\n", init );
   return init;
}

bool Condition( int & value, int limit )
{
   bool result = ( value < limit );
   const char * rstr = result ? "true" : "false";
   printf( "Condition() : value is %d - returning %s\n", value, rstr );
   return result;
}

void Increment( int & value, int incr )
{
   value += incr;
   printf( "Increment() : value is now %d\n", value );
}

void main()
{
   const int init = -1;    // initial value
   const int limit = 3;    // limit of loop
   const int incr = 1;     // increment step

   printf( "beginning for loop : init is %d, limit is %d, incr is %d\n",
           init, limit, incr );

   int value;
   for( value = Initialize( init ); Condition( value, limit ); Increment( value, incr ) )
   {
       printf( "for loop body : value is %d\n", value );
   }

   // the equivalent for loop is :
   // for( value = init; value < limit; value += incr )

   printf( "exited for loop - value is %d\n", value );
}
Я рекомендую вам скомпилировать и запустить эту программу, чтобы посмотреть, что произойдет. Я сделал операторы функциями, чтобы вы могли видеть точный порядок выполнения каждого оператора. Вы также можете использовать отладчик и пошагово просмотреть программу, чтобы увидеть ее в деталях.

Еще одна очень полезная вещь, которую нужно знать, - это то, как цикл while отличается от цикла for. Самое важное различие заключается в том, что while не имеет инкрементирующего оператора, что означает, что оператор continue будет действовать по-другому. В цикле for continue вызовет переход выполнения к инкрементеру. В цикле while его нет, поэтому он возвращается к условному оператору. Чтобы увидеть это в действии, измените цикл for На this и понаблюдайте за его поведением :
for( value = Initialize( init ); Condition( value, limit ); Increment( value, incr ) )
{
    if( value == 1 )
        continue;
    printf( "for loop body : value is %d\n", value );
}
Имея это в виду, цикл for можно рассматривать как цикл while. Вот эквивалентный цикл while :
// for loop equivalent while loop

   printf( "beginning while loop : init is %d, limit is %d, incr is %d\n",
           init, limit, incr );

   int value = Initialize( init );
   while( Condition( value, limit ) )
   {
       printf( "while loop body : value is %d\n", value );

       Increment( value, incr );
   }

   printf( "exited while loop - value is %d\n", value );
Вот цикл while с оператором continue реализуемым как goto поэтому он ведет себя как цикл for :
// for loop equivalent while loop with pseude-continue

   printf( "beginning while loop : init is %d, limit is %d, incr is %d\n",
           init, limit, incr );

   int value = Initialize( init );
   while( Condition( value, limit ) )
   {
       if( value == 1 )
           goto ContinueTarget;

       printf( "while loop body : value is %d\n", value );

ContinueTarget :

       Increment( value, incr );
   }

   printf( "exited while loop - value is %d\n", value );
Предупреждение : если вы измените оператор goto на continue, то окажетесь в бесконечном цикле, потому что инкремент будет постоянно пропускаться, а условие всегда будет возвращать true.

И вот еще что напоследок. Поскольку вы видели, как оператор for эквивалентен оператору while, вот как оператор for эквивалентен оператору if с goto. Вот начальный цикл for написанный с помощью только if и goto :
    init = Initialize( init );
LoopCondition:
    if( ! Condition( value, limit ) )
        goto LoopEnd;

    printf( "for loop body : value is %d\n", value );

    Increment( value, incr );
    goto LoopCondition;
LoopEnd:
Надеюсь, вы понимаете, почему люди предпочитают использовать циклы for и while.

В качестве теста для себя добавьте код к последнему фрагменту цикла for, чтобы он вел себя так же, как предыдущий с оператором continue.


BillWoodruff

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

Richard MacCutchan

Продвижение заявлений goto???

Rick York

Это то, что "я надеюсь, вы можете понять, почему люди предпочитают использовать для и в то время как петли." говорит вам?

Тогда все в порядке.

Richard MacCutchan

Я согласен, что это отличное объяснение, но ... ..
.. люди, которые смотрят на эти ответы, как правило, больше заинтересованы в копировании кодов "как есть", а не в чтении инструкций и инструкций. предостережениес.

Rick York

Да, вы правы, и это был действительно хороший вопрос. Я вспомнил, что когда писал свой компилятор, то понял, как строится цикл в терминах примитивных инструкций для целей генерации кода, и подумал, что это может быть полезно для кого-то, кто только учится. Оглядываясь назад, это, вероятно, не полезно, если они не думают в этих терминах, а большинство новичков-нет. Я был таким, потому что пришел с аппаратной стороны и позже изучил программное обеспечение. Хотя на самом деле - кто изучает ассемблерные языки раньше Си? Сегодня этого никто не делает.

Stefan_Lang

"кто изучает язык ассемблера до С?"

Я сделал. Порядок изучения языков в университете в течение первых 1,5 лет был таким: Паскаль, ассемблер, Лисп. Я выучил Фортран и Си позже, когда он действительно понадобился мне для проектов.

Моим первым компьютером был C=Plus4, который я получил после изучения Паскаля. Поэтому, в отличие от многих моих коллег, я действительно изучал структурированное программирование до того, как был избалован Бейсиком. Это многое объясняет в моем глубоком отвращении к Гото. ;-)

Собственно говоря, я так и не выучил с - Первый настоящий проект " С " на самом деле был C++, хотя в то время у нас не было компиляторов C++: вместо этого мы использовали прекомпилятор, который превращал код C++ в какой - то искореженный C. Ну, скорее альфа-версию прекомпилятора: она менялась каждые две недели!

Рейтинг:
2

Sandeep Mewara

- Эй! Я не слишком уверен в том, что именно вы пробовали, поскольку вы не поделились своей попыткой кода для этого.


Перефразируя формулировку задачи для вас, если это поможет: вам нужно начать цикл с a это продолжается до тех пор, пока c с шагом b. a, b, c будучи тремя входными параметрами, которыми вы поделились.

Вот что вам нужно изучить и попробовать: ищите способы выполнения цикла в C/C++. Вы узнаете, как начать цикл в шагах и как они заканчиваются.

Несколько ключевых слов на случай, если вы совершенно не знаете: while, do-while &усилитель; for


КСТАТИ, запрашивать весь код без обмена вашими усилиями или конкретными запросами здесь не рекомендуется!


0x01AA

Я не вижу причины для раскомментированного 2 для этого. Мой 5-й

Sandeep Mewara

Спасибо!

BillWoodruff

мой голос №1: бесполезный, расплывчатый ответ оператору, который не прилагал никаких усилий.

Sandeep Mewara

Спасибо! :)

BillWoodruff

"Рахи Гульзар в пхул хиленге" Кабир

Sandeep Mewara

:большой палец вверх:

"там, где есть сад, придут цветы"...

0x01AA

Вы пишете совершенно неправильно, когда вы пьяны!

Stefan_Lang

Как вы и сказали: ОП не прилагал никаких усилий. Трудно быть чем-то иным, кроме расплывчатости, когда сам вопрос уже неясен!

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

Хотя решение 2 довольно конкретно и полезно, совершенно неясно, действительно ли оно полезно для ОП, поскольку оно в основном отвечает на вопросы, которые еще не были заданы!

P.S.: Возможно, это должно было быть опубликовано в качестве комментария, а не решения.

Рейтинг:
2

Stefan_Lang

Похоже, вы боретесь с основными синтаксическими концепциями языка C/C++. Проверьте этот сайт: Инструкции и управление потоком - учебники по C++ [^] , в частности раздел о петлях for.

В более общем плане, если вы только начали учиться, этот учебник может быть очень полезен: вы должны проработать его с самого начала.


Рейтинг:
0

Patrice T

Вот обучающий сайт для изучения основ программирования: stanford.edu: учитесь программировать[^]

Совет: найдите учебник о циклах в C.