Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

3. Цикл с параметром (for)

Предыдущий раздел:

Следующий раздел:

Задание 3: Цикл for, приемы накопления суммы и произведения

1. Цикл for

1.1. Напечатайте таблицу умножения на 5. предпочтительно печатать 1 x 5 = 5, 2 x 5 = 10, а не просто 5, 10 и т.д.

1.2. Напечатайте в столбик нечетные числа от 3 до 25.

1.3. Напечатайте свое имя так, чтобы оно располагалось в углах окна вывода.

1.4. Выведите на экран таблицу значений синуса от 0 до 2*Pi. В каждой строке должны стоять один аргумент и одно значение. Количество значений аргумента пусть задает пользователь.

2. Прием накопления суммы

2.1. Напишите программу, которая вычисляет сумму квадратов чисел т 1 до N. Число N программа должна запрашивать у пользователя.

2.2. Напишите программу, перемножающую целые числа без использования операции «*». Например, при умножении целых чисел n*m число m надо сложить само с собой n раз (m+m+…+m).

2.3. Используя прием накопления суммы, найдите сумму нечетных чисел от 1 до N. Число N программа должна запрашивать у пользователя.

2.4. Выведите на экран последовательность сумм чисел от 1 до n. n меняется от 1 до 10. То есть первые члены последовательности: 1, 3 (1+2), 6 (1+2+3), 10 (1+2+3+4) и т.д.

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

2.6. Найдите сумму 100 синусов от аргументов в диапазоне от 0 до 2*Pi (из задачи 1.4).

3. Прием накопления произведения

3.1. Факториалом целого числа n (обозначается n!) называется произведение всех целых чисел от 1 до n. Напишите программу вычисления факториала введенного пользователем числа.

3.2. Напишите программу возведения числа в целую степень. Число и степень запрашивайте у пользователя.

4. Комбинация обоих приемов

4.1. Используя комбинацию обоих приемов, напишите программу, вычисляющую функцию

1+x+x^2+x^3+\ldots+x^{10}.

4.2. Вычислите сумму ряда:

~~s_n=1+x+\frac{\displaystyle x^2}{\displaystyle 2!}+\ldots+\frac{\displaystyle x^n}{\displaystyle n!}

Из мат. анализа известно, что \lim\limits_{n\to\infty} s_n=\exp(x). Выясните, на сколько 5-й и 10-й член последовательности таких сумм отличается от \exp(x).

Следующий раздел:

Предыдущий раздел:

47 комментариев

  1. S9

    Ахренеть…

  2. mikhail

    pomogite s nomerom 4.2. ne vihodit.

  3. Taras

    4.2 отличается от 4.1 только наличием факториала в знаменателе. Добавь вычисление факториалов (см. задачу 3.1) и дели на них каждое из слагаемых. Так будет проще всего.

    Но это не самое лучше решение. Лучше получать сразу отношения вида \frac{\displaystyle x^n}{\displaystyle n!}. Обычный прием накопления произведения позволяет это сделать.

  4. Вася Рыжий

    Что за задачи у Вас?!
    Задачи сложные, для новичков просто нереaльны

  5. Сеня Лютый

    По-моему, задачи чёткие!
    Составлял на совесть, ошибок не заметил.
    А если у студентов руки кривые — ничего поделать не могу

  6. Taras

    //Задачи сложные, для новичков просто нереaльны

    Большинство моих студентов решали. К тому же по каждой теме они идут от совсем простых к более сложным. Хоть какие-то должны получиться.

  7. mikhail

    da nebrashayte vnimae na eto,taras viktorovich,eto nashi dyryu mailis.a tak zadashki klasnie.4.2 vishel,v perviy raz delal kak vi i pisali,no da,eto ne variant.proshe sravnit kak geometricheskuy progressiy i polushiv eyo snamenatel progressii podstavit v uravnenie,tak proshe.

  8. Аноним

    Вопрос, есть определённый оператор, который позволяет возводить x в n-ю степень ? Или можно как то более простым способом ?

  9. Аноним

    всё понял) вопросов 0)

  10. Игорёк

    А если 4.2 не как прогрессию сделать, а вот таким способом. Будет ли он правильным ?

    <Здесь был правильный ответ. Поэтому стерто ))
    Taras>

  11. Игорёк

    <Здесь был правильный ответ. Поэтому стерто ))
    Taras>

  12. Taras

    div даст только целую часть от деления, поэтому надо заменить его на «/». В остальном правильно.

    Пара замечаний:
    1) Аргумент экспоненты по-смыслу — вещественное число, так что не надо делать его integer’ом.
    2) Вычисление степени и факториала в знаменателе можно совместить:

    f := f * a/i;

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

    PS. Через несколько дней сотру ответ, чтобы не спойлерить.

  13. Игорёк

    Спасибо, учту, всё-таки такой способ намного короче.

  14. Аноним

    Намекните 1.3, а то я совсем завис что-то.

  15. Taras

    Про экран со времен Borland Pascal осталось. В Pascal ABC надо помещать имя в углы окна вывода (исправил). Как-то так:

    А как этого добиться — ну, сообрази )

  16. Аноним

    Ну совсем никаких идей, сдаюсь.

  17. Taras

    Ну, пропускай и иди дальше. Конкретно эта задача не так уж и важна. Она больше на сообразительность, чем на усвоение какой-то серьезной программистской идеи. Хотя, соображать, как имеющимися ограниченными средствами добиться желаемого результата, конечно, полезно.

  18. Аноним

    А ответ не дадите? А то я времени столько убил, интересно теперь.

  19. Аноним

    А 2.1 можно же и без приема накопления суммы, да?

  20. Аноним

    вот как-то так:
    program summa;
    var
    N: integer;
    begin
    writeln(‘Vvedite N’);
    readln(N);
    writeln((N*(N+1)*(2*n+1))/6);
    end.

  21. Taras

    Можно ))

    Приятно встретить в вашем лице математически подкованного человека.

  22. Аноним

    Спасибо, польщен. Надеюсь, я Вас не сильно загружаю.
    2.3. Это нормально, что выдает все промежуточные рез-ты или я косячу?

  23. Taras

    Промежуточных результатов не должно быть, только окончательный ответ.

  24. Максим

    Тоже сломал голову над задачей 1.3 Но очень хочется понять как же ее решить. Помогите плиз.

  25. Taras

    Да ну, ничего особенного в ней нет. Есть write и writeln, которые печатают, что хочешь. Надо только сообразить, что именно напечатать, чтобы получилось имя по углам. Циклы здесь просто для сокращения текста программы, чтобы кучу раз одно и то же не писать.

  26. Володя

    В 1.3 размер окна вывода фиксированный?

  27. Володя

    1.3 Если задача с турбо паскаля, то там размер строки насколько со школы помню фиксированный. Значит в строку можно поместить опред. кол-во символов. Лично я проверил подгоняя циклом for i:=1 to n кол-во символов выводя еденицу, пока она не перенесётся по вертикали, так же пока не заскролица по горизонтали, вычел кол — во символов в моём имени и поправил цикл + сам вывод. Чувствую код ужасен и чувство что топором деланый.
    var
    i,n : integer;
    name: string;
    ch: char;
    begin
    name:=’Володя’;
    ch:=’ ‘;
    //for i:=1 to 104 do //
    //write(1);
    write(name);//печатаем имя (6 символов)
    for i:=1 to 92 do //Отсчёт от напечатанных + оставить место для следующих 6 104 — 6 — 6 =92
    write(ch); //печатаем 91 пробела
    write(name);//печатаем имя
    for i:=1 to 11 do
    writeln(ch);
    write(name);
    for i:=1 to 92 do
    write(ch);
    write(name);
    end.

  28. Taras

    Такое решение изначально и предполагалось. Код нормальный. Единственно, считается нехорошо использовать числовые константы (92, 11). Лучше бы осмысленные параметры, такие как ширина экрана и длина имени, записать в отдельные переменные и в циклах использовать выражения, составленные из этих переменных. Программа стала бы понятней и легче переделывалась бы под другие имена и размеры.

  29. Дмитрий

    Тарас Викторович, в задании 2.6 требуется найти 100 синусов, значит должно быть 100 значений счетчик-переменная, но в диапазоне от 0 до 2*Pi не может быть 100 значений целого типа.

  30. Taras

    >> в задании 2.6 требуется найти 100 синусов, значит должно быть 100 значений счетчик-переменная, но в диапазоне от 0 до 2*Pi не может быть 100 значений целого типа.

    Отсюда следует, что сама переменная счетчик не может служить аргументом синуса. Его нужно вычислять отдельно и тип он будет иметь вещественный. А как — надо придумать. В качестве намека — идущие через равный интервал 100 значений можно пронумеровать (от 1 до 100 или от 0 до 99, это уж, как захочешь). Каждому номеру будет соответствовать одно значение аргумента, значит, можно придумать функцию (формулу, выражение), которая по номеру будет вычислять аргумент.

    Хотя, это не единственный возможный подход к решению. Можно думать и в других направлениях.

  31. Ирина

    Помогите с 1.2

  32. Taras

    Посчитай, сколько требуется нечетных чисел. Сделай столько шагов цикла. В цикле можно или вычислять число по номеру шага или вычислять следующее нечетное число по предыдущему.

  33. Алексанлдр

    4.2

    program ds;
    var
    i,b,x,n: integer;
    s,r,d: real;
    begin
    readln(x,n);
    b:=x;
    r:=1;
    d:=0;
    for i:= 1 to n do
    begin
    r:=r*i;
    x:=x*b;
    d:=d+ (x/b)/r;
    end;
    writeln(1+d);
    end.

  34. АленА

    Ирина, вот простое решение 1.2:
    program zadacha_1_2;
    var
    i, b : integer;
    begin
    for i:=3 to 25 do
    if odd(i) then
    writeln (i)
    end.

  35. Роман

    Так ли решается задача 1.3
    var
    Ivanov:string;
    begin
    writeln(‘Ivanov Ivanov’);
    writeln(»);
    writeln(»);
    writeln(»);
    writeln(»);
    writeln(»);
    writeln(»);
    writeln(»);
    writeln(‘Ivanov Ivanov’);
    end.

  36. Роман

    Между фамилиями пробел где-то в 60 символов. Почему это не отобразилось.

  37. Роман

    данную задачу (1.3) решил тупо подбором количества пробелов в строке, может не надо ее так усложнять как предлагает Владимир?

  38. Аноним

    Если правильно отразиться, то решила 4.2 после изучения следующей темы о Рекурентных соотношениях (до этого билась-билась — ничего не выходило)

    program zadacha_4_2;
    var
    x, a, i: integer;
    m, b, k: real;
    function f(n:integer): integer;
    begin
    if n<=1 then f:=1
    else f:=n*f(n-1); {вычисление n!}
    end;
    function s(n:integer): real;
    begin
    s:=exp(ln(x)*n); {вычисление x в n степени}
    end;
    begin
    writeln ('введите количество чисел (элементов) последовательности, которые нужно просуммировать');
    readln(a);
    writeln ('введите число x');
    readln(x);
    m:=0;
    b:=0;
    for i:= 1 to a-1 do
    begin
    m:=s(i)/f(i);
    b:=b+m;
    end;
    k:=1+b;
    writeln(k);
    end.

  39. Taras

    Предполагалось, что 4.1 — 4.2 решается комбинацией приемов накопления произведения (для степени и факториала) и накопления суммы.

  40. АленА

    так?
    program zadacha_4_2;
    var
    i,x,n:integer;
    p,m,r:real;
    begin
    writeln(‘укажите число x’);
    readln(x);
    writeln(‘укажите число n’);
    readln(n);
    m:=0;
    p:=0;
    r:=1;
    for i:= 1 to n do
    begin
    p:=exp(ln(x)*i);
    r:=r*i;
    m:=m+p/r;
    end;
    writeln(1+m);
    end.

  41. АленА

    Исправьте имя с Аноним на АленА, недосмотрела )

  42. Taras

    Степень тоже лучше накапливать.

  43. Сергей

    var
    i,n,a: integer;
    y: real;
    begin
    write(‘n = ‘);
    read(n);

    for i:=1 to n do
    begin
    y:=2*Pi*i/n;
    a:=(360 div n)*i;

    writeln(‘a=’,a,’ ‘, ‘sin =’,(trunc(sin(y)*10000))/ 10000);
    end;
    end.

  44. Сергей

    Задача 1.4. до 4-х значащих цифр
    Решение:

    var
    i,n,a: integer;
    y: real;
    begin
    write(‘n = ‘);
    read(n);

    for i:=1 to n do
    begin
    y:=2*Pi*i/n;
    a:=(360 div n)*i;

    writeln(‘a=’,a,’ ‘, ‘sin =’,(trunc(sin(y)*10000))/ 10000);
    end;
    end.

  45. Сергей

    задача 2.6. сумма 100 синусов

    var
    i,n,a: integer;
    y,s: real;
    begin
    write(‘n = ‘);
    read(n);

    for i:=1 to n do
    begin
    y:=2*Pi*i/n;
    a:=(360 div n)*i;
    s:=s+y;

    writeln(‘a=’,a,’ ‘, ‘sin =’,(trunc(sin(y)*10000))/ 10000,’ ‘,’сумма’,i,’синусов = ‘,s);

    end;
    end.

  46. Сергей

    Первая задача:
    var
    p:real;
    i:integer;
    begin
    p:=1;
    for i:=1 to 10 do
    begin
    p:=i*5;
    writeln(i’* 5 = ‘,p);
    end;
    end.

  47. Nord

    1.3
    ))
    Var z:integer;
    begin;
    writeln(‘Nord Nord’);
    for z:=1 to 8 do
    writeln(‘ ‘);
    writeln(‘Nord Nord’);
    end.

Добавить комментарий