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

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

7. Переменные-флаги

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

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

Задание 7: Переменные-флаги

1. Найдите все простые числа от 1 до 100. Используйте параметризацию, чтобы потом легко было искать простые числа в других диапазонах. Составной частью программы должен быть блок, проверяющий наличие делителей и записывающей эту информацию в переменную-флаг.

2. Пусть имеется корабль с 10-ю грузовыми отсеками. Максимальная грузоподъемность корабля 100 тонн. Пока не заполнены все отсеки или не достигнута максимальная грузоподъемность, ваша программа должна запрашивать массу груза, помещаемого в очередной отсек. Как только дальнейшая загрузка станет невозможной, программа должна прекратить запрашивать массу новых грузов и вывести сообщение о причинах этого прекращения: «Трюм полон» или «Достигнута максимальная грузоподъемность». Запрос массы грузов и вывод результатов загрузки рассматривайте как отдельные блоки программы, информация между которыми передается с помощью переменной-флага.

3. Последовательность чисел, заданной формулой

    y_n=\sin(x^n),

не содержит отрицательных элементов при малых значениях x. С точностью до 0.0001 определите, начиная с какого x, отрицательные числа появляются среди первых 20-ти элементов этой последовательности. Используйте переменную-флаг для обозначения наличия или отсутствия отрицательных чисел в последовательности.

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

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

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

  1. Константин

    Нужна подсказка на второе задание ;p

  2. Taras

    Даже не знаю, как подсказать :) Вроде бы все очень просто.

  3. Константин

    Надо ещё раз внимательно прочитать :D

  4. Константин

    Ваши слова волшеблны :D С первой попытки после того как прочитал сделал xD

  5. Тори

    Не понимаю, как сделать задачу №3. Даже с чего начать не знаю.((( Подскажите, пожалуйста.
    P.S. Вот… если бы формула выглядела так: y=sin(x^n) — проблем не возникло бы… а тут…

  6. Taras

    Извиняюсь, n должна быть в низу
      y_n=\sin(x^n)

  7. оксана

    Здравствуйте, никак не могу выполнить задание 1, может дадите какую-то зацепку? задание 2 так или надо доработать?:
    var
    massa, tonna, grus: integer;
    max: boolean;
    begin
    grus:=0;
    for tonna:=1 to 100 do
    begin
    readln(massa);
    grus:=grus+massa;
    max:=(grus>=100);
    if max then
    begin
    write(‘stop’);
    break;
    end;
    end;
    end.

  8. Taras

    1-я, вроде, простая задача. Проверить, что одно число делится на другое, можешь?

    По 2-й есть недостатки:
    1) Отсеков 10, а запросов максимум сто.
    2) Когда погрузка оканчивается, надо прекращать запрашивать массу новых грузов.
    3) Сообщение в итоге должно быть не просто «стоп», а по какой из двух причин остановилась погрузка.

  9. оксана

    по второй задаче я наверное не совсем поняла условие, оператор break у меня в первом варианте ведь тоже используется, проверьте, пожалуйста, второй вариант:
    var
    massa, otsek, grus,x: integer;
    max, max1: boolean;
    begin
    grus:=0;
    for otsek:=1 to 10 do
    begin
    readln(massa);
    grus:=grus+massa;
    max:=(grus>=100);
    max1:=(otsek=10);
    x:=grus-100;
    if max then
    begin
    write(‘dostignuta max grusopod. ‘,’svishe normi ‘,x,’ tonn’);
    break;
    end;
    if max1 then
    begin
    write(‘trum perepolnen’);
    break;
    end;
    end;
    Первая задача наверняка легкая, но что-то я застопорилась на ней, попробую еще подумать))

  10. Taras

    2-я — правильна.

  11. Роман

    Задача с простыми числами оказалась не простой. Мой код получился такой, но вот куда воткнуть флаг — проблема.
    var
    a,b,c,d,i:integer;
    begin
    a:=2;
    b:=3;
    c:=5;
    d:=7;
    write(2,’, ‘,3,’, ‘,5,’, ‘,7,’, ‘);
    for i:=10 to 100 do
    if (i mod a)>0 then
    if (i mod b)>0 then
    if (i mod c)>0 then
    if (i mod d)>0 then
    write(i,’, ‘);
    writeln;
    end.

  12. АленА

    У меня тоже проблема с флагом (куда его) во второй, я ее расписала до полного заполнения трюмов и корабля, вот сокращенный вариант:
    Решение написано для 4-х трюмов 40-тонного корабля.

    program zadacha_2;
    var
    i, t: integer;
    n, g, v1, v2, v3, v4, z1, z2, z3, z4: real;
    begin
    g:=40; {Грузоподъемность корабля}
    v1:=10; {Вместимость трюма №1}
    v2:=10; {Вместимость трюма №2}
    v3:=10; {Вместимость трюма №3}
    v4:=10; {Вместимость трюма №4}
    for i:= 1 to 100000 do
    begin
    writeln (‘введите вес в тоннах’);
    readln(n);

    if g>0 then
    begin
    writeln (‘в трюме №1 — ‘, v1, ‘ тонн свободного места’);
    writeln (‘в трюме №2 — ‘, v2, ‘ тонн свободного места’);
    writeln (‘в трюме №3 — ‘, v3, ‘ тонн свободного места’);
    writeln (‘в трюме №4 — ‘, v4, ‘ тонн свободного места’);
    writeln (‘Введите номер трюма’);
    readln (t);

    if t = 1 then
    begin
    if v1=0 then
    begin
    writeln (‘Трюм уже полон, выберите другой.’);
    g:=g+n;
    end;
    if v1>0 then
    begin
    z1:=v1;
    v1:=v1-n;
    end;
    if v10 then
    begin
    z2:=v2;
    v2:=v2-n;
    end;
    if v20 then
    begin
    z3:=v3;
    v3:=v3-n;
    end;
    if v30 then
    begin
    z4:=v4;
    v4:=v4-n;
    end;
    if v4<0 then
    begin
    writeln ('в трюме недостаточно места для этого груза, выберите другой трюм или груз поменьше');
    v4:=z4;
    g:=g+n;
    end;
    end;

    end;

    g:=g-n;
    writeln('Осталось загрузить ', g, ' тонн.');

    if g=0 then
    begin
    writeln ('Достигнута максимальная грузоподъемность.');
    break;
    end;
    end;
    end.

  13. АленА

    Третья с перебором от x=0,0001, 0,0002 до x, при котором формула содержит отрицательный элемент. Ответ:
    при х = 1.059, элемент последовательности №20 отрицательный.
    Правильно?

  14. АленА

    Роман, первая у меня так выглядит с флагом:

    program zadacha_1;
    var
    c, n, i, k, d: integer;
    R: boolean; {Переменая-флаг}
    begin

    writeln (‘Найдите все простые числа от 1 до n, введите n’);
    readln(n);

    for k:= 1 to n do
    begin
    d:=0;
    for i:= 1 to k do
    begin
    c:= k mod i;
    if c = 0 then
    d:= d + i;
    R:= (d=1+k);
    end;

    if R then
    begin
    write(k,’ ‘);
    end;
    end;
    end.

  15. АленА

    Ответ в четвертой задачи:
    785711 точек из 1000000 попало в круг.
    Писала отдельно блок для верхнего полукруга и нижнего полукруга, можно ли так и есть ли способ проще?

  16. АленА

    Не сюда по четвертой написала, относится к следующему блоку заданий, сотрите, пожалуйста.

  17. Роман

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

  18. Davit

    program zadacha7_2;
    var
    a,b,c,d,e,v:boolean;
    x,y,z,h:integer;
    n,g,k:real;
    begin
    for x:=1 to 1 do
    begin
    for y:= 1 to 10 do
    begin
    n:=g;
    b:= (n>=0) and (n=10) or (k<=0);
    if a=true then
    break;
    end;
    if a=true then
    for h:=1 to 1 do
    begin
    if (a=true) then
    break;
    end;
    g:=n-10;
    if k<=0 then
    writeln('Please enter a valid number!!!');
    if k<=0 then
    break;
    c:= (y<10) and (g=0);
    d:= (y0);
    e:= (y=10) and (g=0);
    v:= (y=10) and (g>0);
    if c=true then
    writeln(‘The compartment number ‘,y,’ is full.’);
    if d=true then
    writeln(‘The compartment number ‘,y,’ is full. The remained ‘,g,’ tones are transfered to next compartments.’);
    if e=true then
    writeln(‘The compartment number 10 is full.’);
    if v=true then
    writeln(‘The compartment number 10 is full. There are remained ‘,g,’ tones.’);
    end;
    if k>0 then
    writeln(‘The ship is full!!’);
    end;
    end.

  19. Davit

    d:= (y0);

  20. Darkhan

    program N_2;{погрузка корабля}
    var
    i, k, p:integer;
    x, y, s, d:real;
    R:boolean;
    begin
    y:=0; s:=0; p:=1;
    for i:=1 to (i+10-p) do
    for k:=1 to 11-p do
    begin
    readln(x);
    x:=x+d;
    d:=0;
    writeln(‘Масса нового груза=’, x);
    if y+x<=10 then
    begin
    y:=y+x;
    s:=s+x;
    end else
    begin
    d:=y+x-10;{излишек веса отсека}
    s:=s+10-y;
    y:=10;
    end;
    if y=10 then
    begin
    p:=p+1;
    y:=0;
    end;
    R:=(s=100);
    writeln('Общая масса груза=', s);
    end;
    if R then
    writeln('STOP!Достигнута максимальная грузоподъемность');
    end.

  21. Darkhan

    Ответ:начиная с х=1,0152 sin(x в степени n)<0

    program N7_3; {y_n=sin(x в степени n}
    var
    i, k, g:integer;
    x, p, Step:real;
    R:boolean;
    begin
    g:=8;
    p:=1;
    x:=1+Step;
    Step:=0.0001;
    for i:=1 to g+i do
    for k:=1 to 20 do
    begin
    p:=p*x;
    if p<=pi then
    begin
    x:=x+Step;
    end else
    begin
    R:=true;
    g:=0;
    end;
    end;
    if R then
    write('x=', x);
    end.

  22. Alex_Kot

    Program Z_7_1;
    var
    i, k, n: integer;
    flag: boolean;
    begin
    readln(n);
    writeln(‘ N=’, n);
    for i:=1 to n do
    begin
    flag:=true;
    for k:=2 to i-1 do
    begin
    if ((i mod k)=0) then
    flag:=false
    else
    flag:=flag and true;
    end;
    if (flag) then
    write(‘ ‘,i);
    end;
    writeln;
    writeln(‘ FINISH’);
    end.

  23. Alex_Kot

    Program Z_7_2; {ПОГРУЗКА КОРАБЛЯ с 5 трюмами}
    Const
    Vmax=100; {грузоподъемность корабля}
    v1=15; v2=20; v3=40; v4=20; v5=15; {v1+v2+v3+v4+v5>Vmax}
    var
    massa, gruz, gr, dv, i: integer;
    gr1, gr2, gr3, gr4, gr5: integer;
    flag1, flag2: boolean;
    begin
    gruz:= 0;
    gr1:=0; gr2:=0; gr3:=0; gr4:=0; gr5:=0;

    for i:=1 to 100 do
    begin
    write(‘ gr1=’, gr1, ‘ gr2=’, gr2, ‘ gr3=’, gr3, ‘ gr4=’, gr4, ‘ gr5=’, gr5);
    writeln(‘ gruz=’, gruz);

    writeln(‘ запрос массы нового груза’);
    readln(massa);
    writeln(‘ massa=’, massa);
    gruz:= gruz+massa;
    flag2:=(gruz>=Vmax);
    if (flag2) then
    begin
    writeln(‘ STOP, Достигнута макс.грузоподъемность судна, dv=’, gruz-Vmax);
    break;
    end else
    if ((gr1+massa)<=v1) then
    begin
    gr1:=gr1+massa;
    writeln(' gr1=', gr1);
    end else
    if ((gr2+massa)<=v2) then
    begin
    gr2:=gr2+massa;
    writeln(' gr2=', gr2);
    end else
    if ((gr3+massa)<=v3) then
    begin
    gr3:=gr3+massa;
    writeln(' gr3=', gr3);
    end else
    if ((gr4+massa)<=v4) then
    begin
    gr4:=gr4+massa;
    writeln(' gr4=', gr4);
    end else
    if ((gr5+massa)<=v5) then
    begin
    gr5:=gr5+massa;
    writeln(' gr5=', gr5);
    end else
    begin
    flag1:=true;
    end;
    if (flag1) then
    begin
    writeln(' STOP, ТРЮМ ПОЛОН');
    break;
    end;
    end;
    end.

  24. Alex_Kot

    Кажется так лучше:

    Program Z_7_2; {ПОГРУЗКА КОРАБЛЯ с 5 трюмами}
    Const
    Vmax=100; {грузоподъемность корабля}
    v1=15; v2=20; v3=40; v4=20; v5=15; {v1+v2+v3+v4+v5>Vmax}
    var
    massa, gruz, gr, dv, i: integer;
    gr1, gr2, gr3, gr4, gr5: integer;
    flag1, flag2: boolean;
    begin
    gruz:= 0;
    gr1:=0; gr2:=0; gr3:=0; gr4:=0; gr5:=0;

    for i:=1 to 100 do
    begin
    write(‘ gr1=’, gr1, ‘ gr2=’, gr2, ‘ gr3=’, gr3, ‘ gr4=’, gr4, ‘ gr5=’, gr5);
    writeln(‘ gruz=’, gruz);

    writeln(‘ запрос массы нового груза’);
    readln(massa);
    writeln(‘ massa=’, massa);
    if ((gr1+massa)<=v1) then
    begin
    gr1:=gr1+massa;
    writeln(' gr1=', gr1);
    end else
    if ((gr2+massa)<=v2) then
    begin
    gr2:=gr2+massa;
    writeln(' gr2=', gr2);
    end else
    if ((gr3+massa)<=v3) then
    begin
    gr3:=gr3+massa;
    writeln(' gr3=', gr3);
    end else
    if ((gr4+massa)<=v4) then
    begin
    gr4:=gr4+massa;
    writeln(' gr4=', gr4);
    end else
    if ((gr5+massa)=Vmax);
    if (flag2) then
    begin
    writeln(‘ STOP, Достигнута макс.грузоподъемность судна, dv=’, gruz-Vmax);
    write(‘ gr1=’, gr1, ‘ gr2=’, gr2, ‘ gr3=’, gr3, ‘ gr4=’, gr4, ‘ gr5=’, gr5);
    writeln(‘ gruz=’, gruz);
    break;
    end;
    end;
    end;
    end.

  25. Alex_Kot

    В предидущем коменте не все скопировалось:
    Program Z_7_2; {ПОГРУЗКА КОРАБЛЯ с 5 трюмами}
    Const
    Vmax=100; {грузоподъемность корабля}
    v1=15; v2=20; v3=40; v4=20; v5=15; {v1+v2+v3+v4+v5>Vmax}
    var
    massa, gruz, gr, dv, i: integer;
    gr1, gr2, gr3, gr4, gr5: integer;
    flag1, flag2: boolean;
    begin
    gruz:= 0;
    gr1:=0; gr2:=0; gr3:=0; gr4:=0; gr5:=0;

    for i:=1 to 100 do
    begin
    write(‘ gr1=’, gr1, ‘ gr2=’, gr2, ‘ gr3=’, gr3, ‘ gr4=’, gr4, ‘ gr5=’, gr5);
    writeln(‘ gruz=’, gruz);

    writeln(‘ запрос массы нового груза’);
    readln(massa);
    writeln(‘ massa=’, massa);
    if ((gr1+massa)<=v1) then
    begin
    gr1:=gr1+massa;
    writeln(' gr1=', gr1);
    end else
    if ((gr2+massa)<=v2) then
    begin
    gr2:=gr2+massa;
    writeln(' gr2=', gr2);
    end else
    if ((gr3+massa)<=v3) then
    begin
    gr3:=gr3+massa;
    writeln(' gr3=', gr3);
    end else
    if ((gr4+massa)<=v4) then
    begin
    gr4:=gr4+massa;
    writeln(' gr4=', gr4);
    end else
    if ((gr5+massa)=Vmax);
    if (flag2) then
    begin
    writeln(‘ STOP, Достигнута макс.грузоподъемность судна, dv=’, gruz-Vmax);
    write(‘ gr1=’, gr1, ‘ gr2=’, gr2, ‘ gr3=’, gr3, ‘ gr4=’, gr4, ‘ gr5=’, gr5);
    writeln(‘ gruz=’, gruz);
    break;
    end;
    end;
    end;
    end.

  26. Alex_Kot

    Непонятные искажения копирования программы.
    Определите сами место вставки:
    if ((gr5+massa)=Vmax);

  27. Ruslan

    //Задание 7: Переменные-флаги
    //2. Пусть имеется корабль с 10-ю грузовыми отсеками. Максимальная грузоподъемность корабля 100 тонн.
    //Пока не заполнены все отсеки или не достигнута максимальная грузоподъемность, ваша программа должна запрашивать массу груза, помещаемого в очередной отсек.
    //Как только дальнейшая загрузка станет невозможной, программа должна прекратить запрашивать массу новых грузов и вывести сообщение о причинах этого прекращения:
    //«Трюм полон» или «Достигнута максимальная грузоподъемность». Запрос массы грузов и вывод результатов загрузки рассматривайте как отдельные блоки программы,
    //информация между которыми передается с помощью переменной-флага.
    program a72;
    var
    otsek, qruz, massa: integer;
    max, max1: boolean;
    begin
    qruz:=0;
    for otsek:=1 to 10 do
    begin
    write (‘Введите массу добавляемого груза (можно в граммах) ‘);
    read (massa);
    qruz:=massa+qruz;
    max:=(qruz>=100);
    max1:=(otsek=10);
    if max then
    begin
    write (‘Достигнута максимальная грузоподъемность ‘);
    break;
    end;
    if max1 then
    begin
    write (‘Трюм полон’);
    break;
    end;
    end;
    end.

    Задача сформулирована неправильно.
    2. Пусть имеется корабль с 10-ю грузовыми отсеками. Максимальная грузоподъемность корабля 100 тонн. Пока не заполнены все отсеки или не достигнута максимальная грузоподъемность, ваша программа должна запрашивать массу груза, помещаемого в очередной отсек. Как только дальнейшая загрузка станет невозможной, программа должна прекратить запрашивать массу новых грузов и вывести сообщение о причинах этого прекращения: «Трюм полон» или «Достигнута максимальная грузоподъемность». Запрос массы грузов и вывод результатов загрузки рассматривайте как отдельные блоки программы, информация между которыми передается с помощью переменной-флага.
    Ошибка тут в «Пока не заполнены все отсеки». Откуда мы можем знать заполнен ли определенный отсек. Нам не известно сколько тон вмещает каждый отсек. Неизвестно какого типа груз вмещается в них (если это хлопок, то естественно отсек заполнится при меньшей массе, чем если это свинец).
    Ну а если просто взять, что в каждый отсек будем класть по 1 грамму груза, то программа выведет ‘Трюм полон’. Это смешно.

  28. Сергей

    program задача_1;
    var
    i, n1, n2, x, y: integer;
    a: real;
    simple: boolean;
    begin
    writeln(‘1. Найдите все простые числа от 1 до 100. Используйте параметризацию, чтобы потом легко было искать простые числа в других диапазонах. Составной частью программы должен быть блок, проверяющий наличие делителей и записывающей эту информацию в переменную-флаг.’);
    n1:=1;
    n2:=100;
    for i:=n1 to n2 do
    begin
    y:=0;
    // составной блок
    for x:=2 to i-1 do
    begin
    a:=i/x-i div x;
    if a=0 then
    y:=y+1;
    end;
    // составной блок
    simple:=(y=0) and (i>1);
    if simple then
    write(i,’, ‘);
    end;
    writeln(‘…’);
    end.

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