2009-05-29 2 views
1

Мне просто интересно, почему эта определенная проблема возникает со мной. Если вы можете мне помочь, я буду признателен.Что вызывает проблемы с этим фрагментом кода?

Хорошо, это прекрасно работает, и результат равен 120. И это правда.

Теперь вот в чем проблема. Если я попрошу пользователя ввести значение числа, это не сработает.

Program factorial; 
uses crt; 
var 
    i,r: Integer; 
begin 
    write('Enter the number'); 
    read(r); 

    for i:=1 to r do 
    r:= r * i; 

    write(r); 
    readkey; 
end. 

Если я написал 5, выход будет 600.

+0

Вы не отступаете от своего кода? Если нет, программирование будет очень сложным. Если вы это сделаете, пожалуйста, отложите это на SO также. – Zifre

+0

Кстати, почему вы используете Pascal? – Zifre

+0

Какой сломанный способ редактировать заголовок этого вопроса ... –

ответ

10

Вы используете значение r в качестве условия остановки цикла и изменяете значение в цикле.

Program factorial; 
uses crt; 
var 
    i,r, f: Integer; 
begin 
    write('Enter the number'); 
    read(r); 
    f := 1; 
    for i:=1 to r do 
    f:= f * i; 
    write(f); 
    readkey; 
end. 
+0

Просто избили меня :) – CiscoIPPhone

+0

Дох, избили меня тоже. – dss539

1

попробовать:

Program factorial; 
uses crt; 
var 
i,r,x: Integer; 
begin 
write('Enter the number'); 
read(x); 
r:=1 
for i:=1 to x do 
r:= r * i; 
write(r); 
readkey; 
end. 
+0

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

+0

+1 для сохранения оригинального отступа. Полезно, хотя и все еще суетится при оригинальной глупости. – Randolpho

+0

@Peter Stuifzand, хороший улов. Я ненавижу программы, использующие однобуквенные переменные! делает это запутанным –

4

Вы повторно переменную r. Если вы вводите 5 для r, ваша программа будет действовать один раз. Вы должны начать с 1 в качестве первого f.

Program factorial; 
uses crt; 
var 
    i,r, f: Integer; 
begin 
    write('Enter the number'); 
    read(r); 
    f:=1 
    for i:=1 to r do 
     f:= f * i; 
    write(r); 
    readkey; 
end. 
+0

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

+0

Ваше первое предложение верно. Я считаю, что ваше второе и третье предложения неверны. – dss539

+0

Его решение и ваше решение цикла одинаковое количество раз. Как у него есть одна ошибка в его петле? – dss539