×
  • 1. Системы счисления
  • 2. Логические функции
  • 3. Анализ информационных моделей
  • 4. Файловая система и базы данных
  • 5. Кодирование и декодирование. Условие Фано
  • 6. Выполнение и анализ простых алгоритмов
  • 7. Адресация в электронных таблицах
  • 8. Анализ программ с циклами
  • 9. Скорость передачи, объем памяти, время передачи
  • 10. Кодирование, комбинаторика
  • 11. Рекурсивные алгоритмы
  • 12. Адресация в сетях TCP/IP
  • 13. Вычисление количества информации
  • 14. Анализ и выполнение алгоритмов для исполнителя
  • 15. Поиск путей в графе
  • 16. Позиционные системы счисления
  • 17. Запросы в поисковых системах
  • 18. Логические выражения и множества
  • 19. Анализ программы по работе с массивом
  • 20. Анализ программ с циклами
  • 21. Анализ программ с циклами и подпрограммами
  • 22. Динамическое программирование
  • 23. Системы логических уравнений
  • 24. Исправление фрагмента программы и ошибок
  • 25. Программа на обработку массива
  • Спасибо за внимание
  • Подготовка к ЕГЭ по Информатике

    Задания на тему "Исправление фрагмента программы и ошибок".


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

    N = int(input()) 
    minDigit = N % 10 
    while N > 0:
      digit = N % 10
      if digit % 2 == 0:
        if digit < minDigit:
          minDigit = digit
      N = N // 10
    if minDigit == 0:
      print("NO")
    else:
      print(minDigit)
    var 
     N: longint; 
     digit, minDigit:integer;
    begin
      readln(N);
      minDigit := N mod 10;
      while N > 0 do begin 
        digit := N mod 10;
        if digit mod 2 = 0 then
           if digit < minDigit then
             minDigit := digit;
        N := N div 10;
      end;
      if minDigit = 0 then
        writeln('NO')
      else
        writeln(minDigit)
    end.
    #include <iostream> 
    using namespace std;  
    int main() {
      long N;
      int digit, minDigit;
      cin >> N;
      minDigit = N % 10;
      while (N > 0) {
        digit = N % 10;
        if (digit % 2 == 0)
          if (digit < minDigit)
            minDigit = digit;
        N = N / 10; 
      } 
      if (minDigit == 0) 
        cout << "NO" << endl;
      else 
        cout << minDigit << endl; 
     }

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




    2) На обработку поступает последовательность из четырёх неотрицательных целых чисел (некоторые числа могут быть одинаковыми). Нужно написать программу, которая выводит на экран количество делящихся нацело на 4 чисел в исходной последовательности и максимальное делящееся нацело на 4 число. Если делящихся нацело на 4 чисел нет, требуется на экран вывести «NO». Известно, что вводимые числа не превышают 1000. Программист написал программу неправильно.

    n = 4
    count = 0 
    maximum = 1000 
    for i in range (1, n+1):
      x = int(input())
      if x % 4 == 0: 
        count += 1
        if x < maximum:
          maximum = x
    if count > 0: 
      print (count)
      print (maximum) 
    else:  
      print ("NO")
    const n = 4; 
    var i, x: integer; 
    maximum, count: integer; 
    begin   
     count := 0; 
     maximum := 1000; 
     for i := 1 to n do begin
      read(x); 
      if x mod 4 = 0 then begin 
       count := count + 1;
       if x < maximum then
         maximum := x;
      end;
     end;
     if count > 0 then begin
      writeln(count);
      writeln(maximum);
     end
     else  
       writeln('NO');
    end.
    #include <iostream>
    using namespace std;  
    int main() {
      const int n = 4;
      int x, maximum, count;
      count = 0;
      maximum = 1000;
      for (int i = 1; i <= n; i++) {
       cin >> x;
       if (x % 4 == 0) {
         count++;
         if (x < maximum) 
           maximum = x;
       }
      }
      if (count > 0) {
       cout << count << endl;
       cout << maximum << endl;
      }   
      else
       cout << "NO" << endl;
      return 0;
     }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе последовательности: 2 8 4 3.
    2. Приведите пример такой последовательности, содержащей хотя бы одно делящееся нацело на 4 число, что при её вводе приведённая программа, несмотря на ошибки, выведет правильный ответ.
    3. Найдите допущенные программистом ошибки и исправьте их.




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

    N = int(input())
    m = N % 10
    while N > 0:
      d = N % 10
      if d < 5:
        if d > m:
          m = d
      N = N // 10
    if m == 0:
       print('NO')
    else:
       print(m)
    var 
     N: longint;
     d, m:integer;
    begin
     readln(N);
     m := N mod 10;
     while N > 0 do begin
       d := N mod 10;
       if d < 5 then
         if d > m then m := d;
       N := N div 10;
     end;
     if m = 0 then 
        writeln('NO')
     else 
        writeln( m )
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int d, m;
      cin >> N;
      m = N % 10;
      while (N > 0) {
        d = N % 10;
        if (d<5) {
          if (d>m) m=d;
        }
        N = N / 10;
      }
      if (m==0) 
        cout << "NO" << endl;
      else
        cout << m << endl;
    }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе числа 157.
    2. Укажите наибольшее трёхзначное значение входной переменной n, при вводе которого программа выведет правильный ответ.
    3. Найдите в программе все ошибки




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

    N = int(input())
    sum = N % 10
    while N > 0:
      digit = N % 10
      if digit % 3 == 0:
         sum = digit
      N = N // 10
    if sum > 0:
      print(sum)
    else:
      print('NO')
    var 
      N: longint;
      digit, sum:integer;
    begin
     readln(N);
     sum := N mod 10;
     while N > 0 do begin
       digit := N mod 10;
       if digit mod 3 = 0 then
         sum := digit;
       N := N div 10;
     end;
     if sum > 0 then
       writeln(sum)
     else
       writeln('NO')
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int digit, sum;
      cin >> N;
      sum = N % 10;
      while (N > 0) {
        digit = N % 10;
        if (digit % 3 == 0){
           sum = digit;
        }
        N = N / 10;
      }
      if (sum > 0)
        cout << sum << endl;
      else 
        cout << "NO" << endl;
    }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе числа 653.
    2. Укажите одно трёхзначное число, при вводе которого программа выведет правильный ответ.
    3. Найдите в программе все ошибки




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

    N = int(input())
    sum = N % 10
    while N > 0:
      digit = N % 10
      if digit % 3 > 0:
         sum = digit
      N = N // 10
    if sum > 0:
      print(sum)
    else:
      print('NO')
    var 
      N: longint;
      digit, sum:integer;
    begin
    readln(N);
    sum := N mod 10;
    while N > 0 do begin
      digit := N mod 10;
      if digit mod 3 > 0 then
        sum := digit;
      N := N div 10;
    end;
    if sum > 0 then
      writeln(sum)
    else
      writeln('NO')
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int digit, sum;
      cin >> N;
      sum = N % 10;
      while (N > 0) {
        digit = N % 10;
        if (digit % 3 > 0){
           sum = digit;
        }
        N = N / 10;
      }
      if (sum > 0)
        cout << sum << endl;
      else 
        cout << "NO" << endl;
    }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе числа 654.
    2. Укажите одно трёхзначное число, при вводе которого программа выведет правильный ответ.
    3. Найдите в программе все ошибки




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

    N = int(input())
    sum = 0
    while N > 0:
      digit = N % 10
      if digit < 7:
         sum = sum + 1
      N = N // 10
    print(digit)
    var N: longint;
    digit, sum:integer;
    begin
      readln(N);
      sum := 0;
      while N > 0 do begin
        digit := N mod 10;
        if digit < 7 then
          sum := sum + 1;
        N := N div 10;
      end;
      writeln(digit)
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int digit, sum;
      cin >> N;
      sum = 0;
      while (N > 0) {
        digit = N % 10;
        if (digit < 7) {
          sum = sum + 1;
        }
        N = N / 10;
      }
      cout << digit << endl;
    }

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




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

    N = int(input())
    maxDigit = N % 10
    while N > 0:
        digit = N % 10
        if digit % 3 == 0:
            if digit > maxDigit:
                maxDigit = digit
        N = N // 10
    if maxDigit == 0:
        print('NO')
    else:
        print(maxDigit)
    var N:longint;
    digit, maxDigit: integer;
    begin
    readln(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.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int digit, maxDigit;
      cin >> 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)
        cout <<  "NO" << endl;
      else 
        cout << maxDigit << endl;
    }

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




    8) На обработку поступает последовательность из четырёх целых чисел. Нужно написать программу, которая выводит на экран сумму всех отрицательных чисел последовательности и максимальное число в последовательности. Известно, что вводимые числа по абсолютной величине не превышают 1000. Программист написал программу неправильно.

    mx = 0
    s = 0
    for i in range(1,5):
        x = int(input())
        if x < 0:
            s = x
        if x > mx:
            mx = x
    print(s)
    print(mx)
    var s, i, x, mx: integer;
    begin
      mx := 0;
      s := 0;
      for i := 1 to 4 do begin
        read (x);
        if x < 0 then
          s := x;
        if x > mx then
          mx := x;
      end;
      writeln(s);
      writeln(mx)
    end.
    #include <iostream>
    using namespace std;  
    int main() {
      int s, i, x, mx;
      mx = 0;
      s = 0;
      for (int i = 1; i <= 4; i++) {
       cin >> x;
       if (x < 0)
         s = x;
       if (x > mx) 
           mx= x;
      }
      cout << s<< endl;
      cout << mx<< endl;
     }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе чисел -5 2 -4 3.
    2. Приведите пример такой последовательности, содержащей хотя бы одно неотрицательное число, что, несмотря на ошибки, программа печатает правильный ответ.
    3. Найдите в программе все ошибки




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

    x = int(input())
    count = 0
    while x > 0:
        count = count + 1
        x = x % 2
    print(count)
    var x, count: integer;
    begin
      readln(x);
      count := 0;
      while x > 0 do begin
        count:=count + 1;
        x := x mod 2
      end;
      writeln(count)
    end.
    #include <iostream>
    using namespace std;
    int main() {
      int x, count;
      cin >> x;
      count = 0;
      while (x > 0) {
        count = count + 1;
        x = x % 2;
      }
      cout << count << endl;
    }

    Последовательно выполните следующее:
    1. Напишите, что выведет эта программа при вводе числа 6.
    2. Приведите пример такого числа x, что, несмотря на ошибки, программа печатает правильный ответ.
    3. Найдите все ошибки в этой программе




    10) Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится сумма цифр этого числа. Программист торопился и написал программу неправильно:

    N = int(input())
    sum = 1
    while N > 0:
       d = N % 10
       N = N // 10
       sum = sum + 1
    print(sum)
    var 
       N: longint;
       sum, d: integer;
    begin
      readln(N);
      sum := 1;
      while N > 0 do begin
         d := N mod 10;
         N := N div 10;
         sum := sum + 1;
      end;
      writeln(sum);
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int sum, d;
      cin >> N;
      sum = 1;
      while (N > 0) {
        d = N % 10;
        N = N / 10;
        sum = sum + 1;
      }
      cout << sum << endl;
    }

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




    11) Требовалось написать программу, которая получает на вход натуральное число N, не превосходящее 109, и выводит число, которое получается из N после удаления всех единиц, порядок остальных цифр при этом не меняется. Например, число 19520125 должно быть преобразовано в число 952025. Число, в котором все цифры – единицы и нули, должно быть преобразовано в 0. Незначащие нули в старших разрядах полученного числа печатать не нужно. Программист торопился и написал программу неправильно.

    N = int(input())
    R = 0
    T = 1
    while N > 0:
        d = N % 10
        if d != 1:
            R = R + d*T
            T = T + 1
        N = N // 10
    print(T)
    var 
      N, R, T: longint;
      d: integer;
    begin
      readln(N);
      R:=0;
      T:=1;
      while N>0 do begin
        d := N mod 10;
        if d<>1 then begin
           R := R + d*T;
           T := T+1
        end;
        N := N div 10;
      end;
      writeln(T);
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N, R, T;
      int d;
      cin >> N;
      R=0;
      T=1;
      while (N>0) {
        d = N % 10;
        if (d != 1) {
           R = R + d*T;
           T = T+1;
        }
        N = N / 10;
      }
      cout << T;
    }

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




    12) Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится количество цифр этого числа. Программист торопился и написал программу неправильно:

    N = int(input())
    count = 1
    while N > 1:
        count = count + 1
        N = N // 10
    print(count)
    var 
      N: longint;
      count: integer;
    begin
      readln(N);
      count := 1;
      while N > 1 do begin
        count := count + 1;
        N := N div 10;
      end;
      writeln(count);
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int count;
      cin >> N;
      count = 1;
      while (N > 1) {
        count = count + 1;
        N = N / 10;
      }
      cout << count << endl;
    }

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




    13) Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится минимальную цифру этого числа. Программист торопился и написал программу неправильно:

    N = int(input())
    min_digit = 0
    while N > 0:
        digit = N % 10
        if digit > min_digit:
            min_digit = digit
        N = N // 10
    print(min_digit)
    var 
     N: longint;
     digit, min_digit: integer;
    begin
      readln(N);
      min_digit := 0;
      while N > 0 do begin
        digit := N mod 10;
        if digit > min_digit then
          min_digit := digit;
        N := N div 10;
      end;
      writeln(min_digit);
    end.
    #include <iostream>
    using namespace std;
    int main() {
      long N;
      int digit, min_digit;
      cin >> N;
      min_digit = 0;
      while (N > 0) {
         digit = N % 10;
         if (digit > min_digit) {
            min_digit = digit;
         }
        N = N / 10;
      }
      cout << min_digit << endl;
    }

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




    14) На вход программы поступает натуральное число N, не превышающее 109. Требуется найти и вывести наибольшую чётную цифру в десятичной записи этого числа или вывести «NO», если таких цифр нет. К сожалению, приведённая ниже программа неправильная.

    N = int(input())
    t = 0
    m = t
    while N > 1:
       d = N % 10
       if d % 2 == 0 or d > m:
          m = m + d
       N = N // 10
    if m == t:
       print("NO")
    else:
       print(m)
    var N, d, m, t: longint;
    begin
      read(N);
      t := 0;
      m := t;
      while N > 1 do begin
        d := N mod 10;
        if (d mod 2=0) or (d>m) then
           m := m + d;
        N := N div 10;
      end;
      if m = t then 
         writeln('NO')
      else 
         writeln(m)
    end.
    #include <iostream>
    using namespace std;
    int main() {
      int N, d, m, t;
      cin >> N;
      t = 0;
      m = t;
      while (N > 1) {
      d = N % 10;
      if (d % 2 == 0 || d > m)
           m := m + d;
           N := N / 10;
      }
      if (m == t)
         cout << "NO";
      else
         cout << m;
    }

    Последовательно выполните следующее.
    1. Напишите, что выведет эта программа при вводе числа 132.
    2. Какое наибольшее число может быть выведено при вводе трёхзначного числа? Сколько существует таких чисел N, при вводе которого программа выведет такой ответ?
    3. Найдите допущенные программистом ошибки и исправьте их.




    Задания взяты из базы данных ФИПИ, сайта К.Полякова или придуманы мною