24. Поиск и исправление ошибок в программе – продолжение

Дано натуральное число N, не превосходящее 108. Необходимо найти и вывести число, которое получится при записи N справа налево и удалении всех единиц. Ведущие нули выводить не надо. Если в числе N нет цифр кроме единиц и нулей, необходимо вывести 0. Например, при вводе числа 1984 нужно вывести 489, а при вводе 2001 нужно вывести 2. Для решения этой задачи ученик написал такую программу:

Delphi/Pascal
1234567891011121314 var n, m: longint;d: integer;begin  read(n);  m := 0;  while n>=1 do begin    d := n mod 10;    if d > 1 then begin      m := 10*d + m;    end;    n:= (n d) div 10;  end;  write(m);end.

C
1234567891011121314 #include <stdio.h> int main(void)  { int d, n, m;   scanf(%d, &n);   m = 0;   while (n>=1) {    d = n % 10;     if (d > 1)  {      m = 10*d + m;       }    n= (n d) / 10;     }  printf( %d, m); }

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 1984.
  2. Приведите пример числа, при вводе которого программа выдаст верный ответ.
  3. Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки: выпишите строку, в которой сделана ошибка, и приведите правильный вариант строки.

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

Решение:

n=42 -> m=20+40=60; программа находит сумму цифр, не равных 1, умноженную на 10.

1. 1984 = 40+80+90 = 210

2. 102 => 20; 103 => 30

3.

Ошибка исправление
m := 10*d + m; m := 10*m + d;
if d > 1 then begin

нули не включаются

if d <> 1 then begin


Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число x, не превосходящее 1000, и выводится количество значащих цифр в двоичной записи этого числа. Программист торопился и написал программу неправильно.

Delphi/Pascal
12345678910 var x,cnt: integer;begin  readln(x);  cnt := 0;  while x > 0 do begin    cnt:=cnt + x mod 2;    x := x div 10  end;  writeln(cnt)end.

C
1234567891011 #include <stdio.h> int main(void)   { int x, cnt;   scanf(%d, &x);   cnt = 0;   while (x > 0)  {    cnt=cnt + x % 2;     x = x / 10;     }  printf(%d\n, cnt); }

Последовательно выполните следующее:

  1. Напишите, что выведет эта программа при вводе числа 15.
  2. Приведите пример такого числа x, что, несмотря на ошибки, программа печатает правильный ответ.
  3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
    1) выпишите строку, в которой сделана ошибка;
    2) укажите, как исправить ошибку, т.е. приведите правильный вариант строки.

Решение:

1. 2

2. 1

3.

Ошибка исправление
cnt:=cnt + x mod 2; cnt:=cnt + 1;
x:=x div 10; x:=x div 2;


На обработку поступает натуральное число, не превышающее 109. Нужно написать программу, которая выводит на экран максимальную цифру числа, кратную 3. Если в числе нет цифр, кратных 3, требуется на экран вывести «NO». Программист написал программу неправильно. Напоминание: 0 делится на любое натуральное число.

Delphi/Pascal
12345678910111213141516 var N,digit,maxDigit: longint;beginreadln(N);maxDigit := N mod 10;while N > 0 do begin  digit := N mod 10;  if digit mod 3 = 0 then    if digit > maxDigit then      maxDigit := digit;  N := N div 10;end;if maxDigit = 0 then  writeln('NO')else  writeln(maxDigit)end.

C
1234567891011121314151617 #include <stdio.h> int main(void) { int N, digit, maxDigit;scanf(%i,&N);maxDigit = N % 10;while ( N > 0 ) {  digit = N % 10;  if ( digit % 3 == 0 )    if ( digit > maxDigit )      maxDigit = digit;  N = N / 10;}if ( maxDigit == 0 )  printf(NO");else  printf(%i, maxDigit);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 134.
  2. Приведите пример такого трёхзначного числа, что, несмотря на ошибки, программа печатает правильный ответ.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 4

2. 136

3.

Ошибка исправление
maxDigit := N mod 10; maxDigit := -1;
if maxDigit=0 then if maxDigit=-1 then


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

Delphi/Pascal
123456789101112 var a, s: real;    k: integer;begin  read(a);  k := 0;  s := 1;  while s < a do begin    k := k + 1;    s := s + 1.0/k;  end;  write(k);end.

C
12345678910111213 #include <stdio.h>  int main(void)  { float a, s;  int  k;  scanf(%f, &a);  k = 0;  s = 1;  while ( s < a ) {    k = k + 1;    s = s + 1.0/k;  } printf(%f, k);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 1.8.
  2. Приведите пример числа, при вводе которого программа выведет правильный ответ.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 1.8

2. 1.2

3.

ошибка исправление
k:=0; или s:=1; k:=1; или s:=0;
write(k); write(k-1);


Дано целое положительное число N, не превосходящее 1000. Необходимо определить, является ли это число степенью числа 3. То есть требуется определить, существует ли такое целое число K, что 3K = N, и вывести это число либо сообщение, что такого числа не существует. Для решения этой задачи ученик написал программу, но, к сожалению, его программа оказалась неверной.

Delphi/Pascal
12345678910111213 var n, k: integer;begin  read(n);  k := 0;  while k mod 3 = 0 do begin    k := k + 1;    n := n div 3  end;  if n > 0 then    writeln(k)  else    writeln('Не существует')end.
C
123456789101112131415 #include <stdio.h> int main(void) {   int n, k;  scanf(%i, &n);  k = 0;  while ( k % 3 == 0 ) { k = k + 1;    n = n / 3;  }  if ( n > 0 ) printf(%i, k);  else  printf(″Не существует″);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 9.
  2. Приведите пример числа, при вводе которого приведённая программа напечатает то, что требуется.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 1

2. 3

3.

ошибка исправление
while k mod 3 = 0 while n mod 3 = 0
if n > 0 if n = 1


Дано целое положительное число A. Требуется вывести такое минимально возможное натуральное число K, при котором

1 + (1+2) + (1+2+3) + … + (1+2+…+K)

окажется больше A. Для решения этой задачи ученик написал программу, но, к сожалению, его программа – неправильная.

Delphi/Pascal
1234567891011 var A, s, p, k: integer;begin  read(A);  s := 0; p := 0; k := 1;  while s < A do begin    p := p + k;    s := s + p;    k := k + 1;  end;  writeln(k);end.
C
12345678910111213 #include <stdio.h> int main(void) {   int A, s, p, k;  scanf(%i, &A);  s = 0; p = 0; k = 1;  while ( s < A ) {    p = p + k;    s = s + p;    k = k + 1;  }  printf(%i, k);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 12.
  2. Укажите любое значение A, при котором программа выведет верный ответ. Запишите этот ответ.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 5

2. 1

3.

ошибка исправление
while s < A do begin while s <= A do begin
writeln(k); writeln(k-1);


Даны натуральные числа A и B. Требуется найти такое минимально возможное натуральное число K ≥ A, что сумма всех чисел от A до K больше, чем B. Для решения этой задачи ученик написал программу, но, к сожалению, его программа неправильная.

Delphi/Pascal
1234567891011 var A, B, s, k: integer;begin  read(A, B);  s := 0;   k := A;  while s < B do begin    k := k + 1;    s := s + k;  end;  writeln(k);end.
C
12345678910111213 #include <stdio.h> int main(void) {   int A, B, s, k;  scanf(%i %i, &A, &B);  s = 0;   k = A;  while ( s < B ) {    k = k + 1;    s = s + k;  }  printf(%i, k);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе чисел 13 и 18.
  2. Укажите любую пару значений A и B, при вводе которых программа выведет правильный ответ.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 15

2. A = 3, B = 3: ответ=4

3.

ошибка исправление
s := 0; s := A;
:while s < B do begin while s <= B do begin


Дано натуральное число A, большее 9, в записи которого нет нулей. Требуется найти максимальное двузначное число, которое можно увидеть в записи числа A. Например, для числа 18943 ответом будет число 94. Для решения этой задачи ученик написал программу, но, к сожалению, его программа неправильная.

Delphi/Pascal
1234567891011 var A, n2: integer;begin  read(A);  n2 := 0;  while A > 100 do begin    if A mod 100 > n2 then       n2 := A mod 100;    A := A div 100;  end;  writeln(n2); end.
C
12345678910111213 #include <stdio.h> int main(void) {   int A, n2;  scanf(%i, &A);  n2 = 0;  while ( A > 100 ) {    if (A % 100 > n2)       n2 = A % 100;    A = A / 100;  }  printf(%i, n2);}

Последовательно выполните следующее.

  1. Напишите, что выведет эта программа при вводе числа 9532.
  2. Укажите одно значение A, при вводе которого программа выведет правильный ответ. Укажите это ответ.
  3. Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.

Решение:

1. 32

2. 3295: ответ=95

3.

ошибка исправление
while A > 100 do begin while A > 0 do begin
A := A div 100; A := A div 10;