24. Поиск и исправление ошибок в программе – продолжение
Дано натуральное число N, не превосходящее 108. Необходимо найти и вывести число, которое получится при записи N справа налево и удалении всех единиц. Ведущие нули выводить не надо. Если в числе N нет цифр кроме единиц и нулей, необходимо вывести 0. Например, при вводе числа 1984 нужно вывести 489, а при вводе 2001 нужно вывести 2. Для решения этой задачи ученик написал такую программу:
Delphi/Pascal1234567891011121314 | 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. |
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); } |
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе числа 1984.
- Приведите пример числа, при вводе которого программа выдаст верный ответ.
- Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки: выпишите строку, в которой сделана ошибка, и приведите правильный вариант строки.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения.
Решение:
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/Pascal12345678910 | 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. |
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); } |
Последовательно выполните следующее:
- Напишите, что выведет эта программа при вводе числа 15.
- Приведите пример такого числа x, что, несмотря на ошибки, программа печатает правильный ответ.
- Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:
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/Pascal12345678910111213141516 | 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. |
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);} |
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе числа 134.
- Приведите пример такого трёхзначного числа, что, несмотря на ошибки, программа печатает правильный ответ.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
1. 4
2. 136
3.
Ошибка | исправление |
maxDigit := N mod 10; | maxDigit := -1; |
if maxDigit=0 then | if maxDigit=-1 then |
Для заданного положительного вещественного числа A необходимо найти максимальное целое число K, при котором выполняется неравенство.Для решения этой задачи ученик написал такую программу:
Delphi/Pascal123456789101112 | 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. |
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.8.
- Приведите пример числа, при вводе которого программа выведет правильный ответ.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
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
|
C
|
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе числа 9.
- Приведите пример числа, при вводе которого приведённая программа напечатает то, что требуется.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
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
|
C
|
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе числа 12.
- Укажите любое значение A, при котором программа выведет верный ответ. Запишите этот ответ.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
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
|
C
|
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе чисел 13 и 18.
- Укажите любую пару значений A и B, при вводе которых программа выведет правильный ответ.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
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
|
C
|
Последовательно выполните следующее.
- Напишите, что выведет эта программа при вводе числа 9532.
- Укажите одно значение A, при вводе которого программа выведет правильный ответ. Укажите это ответ.
- Найдите в программе все ошибки (их может быть одна или несколько). Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Решение:
1. 32
2. 3295: ответ=95
3.
ошибка | исправление |
while A > 100 do begin | while A > 0 do begin |
A := A div 100; | A := A div 10; |