Программирование

Давайте здесь устроим поле для обсуждения неясных моментов программирования на Паскале

4задача var

  1. 4задача
  2. var i,j,n,m:integer;
  3. begin
  4. write('n=');
  5. read(n);
  6. write('m=');
  7. read(m);
  8.   for i:=1 to n do begin
  9.   for j:=1 to m do begin
  10.       if (n mod i)=0 and (m mod j)=0 and (i=j) then write(i);
  11.   end;
  12.   end;
  13. end . <\pre>

Задача 3. Дано 2 натуральных

Задача 3. Дано 2 натуральных числа M и N. Вывести в порядке убывания все их общие делители.

  1. Program deliteli;
  2.    var i:integer; m,del, del2, n:Word;
  3. begin
  4.    readln(n,m);
  5.    if n>m then begin
  6.       for i:=n downto 1 do begin
  7.          if ((n mod i)=0) and ((m mod i)=0) then begin
  8.              del:=i;
  9.              writeln(del)
  10.          end;
  11.        end;
  12.    end;
  13.    if n<m then begin
  14.       for i:=m downto 1 do begin
  15.          if ((n mod i)=0) and ((m mod i)=0) then begin
  16.              del:=i;
  17.              writeln(del);
  18.          end;
  19.        end
  20.    end
  21. end.

Зарина, в этой задаче

Зарина, в этой задаче соревнуемся за минимизацию числа использованных операторов (Вы снова не внимательны). Пока рекорд 3 (Вика,Никита), у Вас - 6. К тому же, в условии явно указано - 100.

Да я имел в виду именно эту

Да я имел в виду именно эту задачу, ошибка также стала мне понятной тогда я не обратил внимание на знак сравнения case A < 0 of true:else A:= -A end , и поэтому выбрал 2 вариант (Её действие полностью эквивалентно вычислению abs(A);)
сам код является правильным для простоты восприятия представим его в следующем виде
case A<0 of
true: <пустой оператор>
else A:= -A
end

программа работает следующим образом: если А отрицательное то переход выполняется переход по True следовательно ничего не произойдет
если А не отрицательное то оно меняет знак значит код равен отрицанию модуля числа А

К сожалению в данный момент

К сожалению в данный момент не могу проверить работу программы..не судите строго) проверю..и исправлю все ошибки

в моей 3ей задаче не выведит

в моей 3ей задаче не выведит правильно..только делители n

Зарина

решённая тобой задача 4, будет выводить n нулей

Никита

спасибо,что проверяешь мои "решения",так как у меня самой программы для проверки НЕТ

Зуева Вика, поздравляю!

Задача 3 закрыта. Впрочем, возможен вариант с более коротким кодом.
Все остальные задачи (включая задачу с case) висят!

Задача 3

  1.    var n,m,d:integer;
  2. begin
  3.  write('n=');
  4.  read(n);
  5.  write('m=');
  6.  read(m);
  7.  for d:=n downto 2 do
  8.    begin
  9.      if (n mod d=0) and (m mod d=0) then
  10.      Write(d, '  ')
  11.    end;
  12.  readln
  13. end.

Sorry...

Пропустил мелкую ошибочку, Вика ... Не закрыта ...

О моём решении

Валерий Шахамболетович, не могли бы Вы прокомментировать мой вариант решения четвёртой задачи?

N5 ЗАДАЧА var s:string;

N5 ЗАДАЧА
var s:string; b,c:longint; a:word;
begin readln(s); val(s,c,b); a:=c; writeln(a); readln end.

OK, Зарина!

OK, Зарина! Это и есть более короткий выриант. Но почему Вы 1 не сочли делителем?

Задача 1

  1. program zadacha1;
  2. var  N, S, i, j, result :Word;
  3. begin
  4. S := 0;
  5. Writeln('Vvedite chislo');
  6. Readln(N);
  7. for i := 1 to N do begin
  8.    result := N div 10;
  9.    j := result;
  10.    if j > 0 then begin
  11.        S := S + 1;
  12.        N := result;
  13.    end;
  14.    if j = 0 then begin
  15.        S := S + 1;
  16.        break
  17.    end;
  18. end;
  19. Writeln(S);
  20. Readln
  21. end.                              

Валерий Шахамболетович

вы меня извините,но я не поняла смысл вопроса

Ошибка

Это из-за лишней переменной в описании? Просто экспериментировала и забыла ее убрать

  1. Program deliteli;
  2.    var i:integer; m,del,n:Word;
  3. begin
  4.    readln(n,m);
  5.    if n>m then begin
  6.       for i:=n downto 1 do begin
  7.          if ((n mod i)=0) and ((m mod i)=0) then begin
  8.              del:=i;
  9.              writeln(del)
  10.          end
  11.        end
  12.    end;
  13.    if n<m then begin
  14.       for i:=m downto 1 do begin
  15.          if ((n mod i)=0) and ((m mod i)=0) then begin
  16.              del:=i;
  17.              writeln(del)
  18.          end
  19.        end
  20.    end
  21. end.

Задача 2. Уже не считается,но исправить думаю стоит

  1.  var i:integer;
  2. begin
  3.   for i := 1 to 100 do
  4.     begin
  5.      if (i mod 2=1) then
  6.      write(i, '  ');
  7.     end;
  8. end.

ИЗВИНЯЮСЬ за задачу номер

ИЗВИНЯЮСЬ за задачу номер 5,просто нет программы рядом для проверки , возможно вот так
var x : integer;
s : string;
BEGIN
read(x);
s := s + IntToStr(x);
WRITE(S);
END.

Саша, Зарина.

Александр, я успеваю комментировать только близкие к правильным решения. У Вас в коде проблема с переменными (n, например).
Зарина, я спрашиваю: А число один - не делитель?

задача 2 закрыта уже? нашлось

задача 2 закрыта уже? нашлось решенее с меньшим кол-вом операторов?

Задача 5.program

Задача 5.

  1. program Number_5;
  2. var
  3.    n,i,s:integer;
  4. Begin
  5.    readln (n);
  6.    readln (s);
  7.    for i:=0 to n-2 do begin
  8.        readln(n);
  9.        s:=s*10+n;
  10.    end;
  11.    writeln(s)
  12. end.

Увидела ошибочку

  1.  var n,m,d:integer;
  2. begin
  3.  write('n=');
  4.  read(n);
  5.  write('m=');
  6.  read(m);
  7.  for d:=n downto 1 do
  8.    begin
  9.      if (n mod d=0) and (m mod d=0) then
  10.      Write(d, '  ')
  11.    end;
  12.  readln
  13. end.

Вика, ну разве это ошибка?

Вика, ну разве это ошибка? Да, я придирчив, но не настолько же ... Ищите!
Андрей, это верно, но далеко от совершенства.
Роман, можно использовать только средства ТП и только те, которые мы рассмотрели.

Задача 2 не закрыта!

Так что, дерзайте, Ксения.

задача 1 var n:word;

задача 1
var n:word;
i:integer;
begin
readln(n);
for i:=1 to 5 do begin n:=n div 10; if n=0 then break end;
writeln(i); readln
end.
вроде так

Задача 4, исправленная

  1. program Task4;
  2.   var n, i, x, max : integer;
  3.  
  4. begin
  5.   write ('Введите n: ');
  6.   readln (n);      // Ввод размера последовательности
  7.   readln (x);      // Ввод первого члена последовательности
  8.   max:= x;
  9.   for I := 2 to n do begin
  10.     readln (x);
  11.     if x > max then max:= x  // Проверям больше ли x максимума, если да то в качестве максиму берём x
  12.   end;
  13.   writeln ('Максимум: ', max);
  14.   readln
  15. end.

В первый раз решил сэкономить на переменных, зря. Объясню своё решение, чтобы оно было понятно всем:
Строки 7 и 8: я читаю первый элемент последовательности вне цикла, т.к. необходимо инициализировать переменную max, но последовательность состоит из целых чисел (т.е. содержит и отрицательные) и поэтому сделать простое присваивание max:= 0; нельзя так при этом программа не будет работать с отрицательными значениями.
Поэтому в 9 строке цикл начинается с 2, т.к. первый элемент нами уже прочитан. Остальной код, я надеюсь, понятен.

Сурен, Роман! Внимательней

Сурен, Роман!
Внимательней читайте условие задачи 5 и смотрите пример.

Валерий Шахамболетович

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

  1. Program deliteli;
  2.    var i:integer; m,del,n:Word;
  3. begin
  4.    readln(n,m);
  5.    if n>m then begin
  6.       for i:=n downto 1 do begin
  7.          if ((n mod i)=0) and ((m mod i)=0) then begin
  8.              del:=i;
  9.              writeln(del);
  10.          end;
  11.       end
  12.    end
  13.    else begin
  14.          for i:=m downto 1 do begin
  15.            if ((n mod i)=0) and ((m mod i)=0) then begin
  16.              del:=i;
  17.              writeln(del)
  18.            end
  19.          end
  20.    end
  21. end.

Задача 1. Stable Release

  1. program zadacha1;
  2. var  N, i, result, S :Word;
  3. begin
  4. S := 0;
  5. Writeln('Vvedite chislo');
  6. Readln(N);
  7. for i := 1 to N do begin
  8.    result := N div 10;
  9.    if result > 0 then begin
  10.        S := S + 1;
  11.        N := result;
  12.    end;
  13. end;
  14. S := S + 1;
  15. Writeln(S);
  16. Readln
  17. end.  

Переменную N можно использовать для выхода из цикла. Ценное замечание, Валерий Шахамболетович, спасибо))

Валерий Шахамболетович, а в

Валерий Шахамболетович, а в чем именно неправильность рельефа моей программы?

да,я понял что надо через оп.

да,я понял что надо через оп. FOR и A типа Word :-(

в задаче 2: допускается,что

в задаче 2: допускается,что проверка на нечетность чисел происходит в выводе...? .

  1. programChislo;
  2. var i:integer;
  3. begin
  4.   for i:=1 to 100 do begin
  5.      writeln(odd(i));
  6.   end;
  7. end .<\pre>

Роман,

Это существенно лучше, чем решение Андрея. Почти оптимально.
Но читать невозможно! Вы же научились, кажется, вставлять код в прошлых Ваших упражнениях?
А ну-ка, перепишите как надо!

моя исправленная 4 задача,поспешила и сотворила глупость=)

  1. var i,n,max:integer;
  2. begin
  3.  max:=0;
  4.  write('n=');
  5.  read(n);
  6.  for i:=n downto 1 do
  7.     begin
  8.       if n>max then  max:=n;
  9.       write(max);
  10.     end;
  11.  readln
  12. end.

нет, Ксюш, задача просто

нет, Ксюш, программа просто будет выводить то True, то False

Виктория

Если я не ошибаюсь, то по этому тексту возникли вопросы о рельефе?

  1. program Chislo;
  2. var i:integer;
  3. begin
  4.     for i:=1 to 100 do begin
  5.         if odd(i) then begin
  6.         writeln(i,', ');
  7.        end;
  8.     end;
  9. end.

Тут пропущен отступ оператора writeln, он ведь вложен внутрь оператора if then. Каждый отступ означает вложенность одного оператора в другой. Тогда будет так:

  1. program Chislo;
  2.    var i:integer;
  3. begin
  4.     for i:=1 to 100 do begin
  5.         if odd(i) then begin
  6.            writeln(i,', ');
  7.        end;
  8.     end;
  9. end.

Задача 5. program

Задача 5.

  1. program Number_5;
  2. var
  3.    n,i,s:byte;// исправлен тип
  4. Begin
  5.    readln (n);
  6.    readln (s);
  7.    for i:=0 to n-2 do begin
  8.        readln(n);
  9.        s:=s*10+n;
  10.    end;
  11.    writeln(s)
  12. end.

да,Виктория, ты права,

да,Виктория, ты права, спасибо что указала на ошибку:-)

спасибо, Вика Белецкая)) в

спасибо, Вика Белецкая)) в экстрим.условиях не могу проверить программу( т.е. меньшее кол-во операторов -это 3?

program

program isprovlenie_po_prikazu;
uses crt;
var n:word;
i:integer;
Begin
readln(n);
for i:=1 to 5 do
begin n:=n div 10;
if n=0 then break
end;
writeln(i);
readln
end.

Ксюша, получается что

Ксюша, получается что да...хотя можно еще поразмыслить

Сурен и Зарина не поняли

Сурен и Зарина не поняли условий задач.
"Ксюш" - Вика Б. права; Вика Б. - Вика З. права.
Андрей, это несколько лучше, но посмотрите решение Романа.

Рома

Вначале текста напиши < pre> а в конце < /pre>. Только без пробелов.

Сурен, а чему будет равно

Сурен, а чему будет равно первоначальное значение s?

По поводу "рельефа" кода.

  1. program Chislo;//название программы и объявление переменных, все в один столбик.
  2. var i:integer;
  3. begin// начало программы
  4. for i:=1 to 100 do begin// начало цикла, всё ещё без отступов.
  5.     if odd(i) then writeln(i,', ');// тело цикла, отступ. в if-е begin не нужен, краткая форма.
  6. end;//конец цикла, на одном уровне с его началом.
  7. end.

Думаю так нужно оформлять.

Задача 4 закрыта.

Задача 4. Саша Решеткин.

Валерий Шахамболетович

Да, вижу, что реализация лучше, а балл кому?))

Андрей Ведлер

А цикл for разве не вложен в составной оператор begin end? Насчет writeln - можно и так, но и переход на новую строку тоже возможен.

program

  1. program isprovlenie_po_prikazu;
  2. uses crt;
  3. var n:word;
  4.     i:integer;
  5. Begin
  6.   readln(n);
  7.      for i:=1 to 5 do
  8.        begin n:=n div 10;
  9.            if n=0 then break
  10.        end;
  11.       writeln(i);
  12.    readln
  13.  end.