Задания и решения годовой контрольной работы для 9 классов
Решение 1
Решение 2
Решение 3
Задание 1.1. Напишите программу, меняющую в квадратной матрице элементы на главной и побочной диагонали по столбцам.
Вводится количество строк в квадратной матрице, далее элементы матрицы, построчно
Вывести измененную матрицу
Примечание: запрещенные операторы max, min, index
Пояснение к решению
Индексы для элементов матрицы, лежащие на главной диагонали: i=j
Индексы для элементов матрицы, лежащие на побочной диагонали: i+j=n-1
Примечание: запрещенные операторы max, min, index
n = int(input())
A = [list(map(int, input().split())) for i in range(n)]
for i in range(n):
A[i][i], A[n - i - 1][i] = A[n - i - 1][i], A[i][i]
for i in range(n):
print(*A[i])
n = int(input())
a = []
for i in range(n):
a.append(list(map(int, input().split())))
for i in range(n):
a[i][i], a[n-i-1][i] = a[n-i-1][i], a[i][i]
for i in range(n):
print(*a[i])
n = int(input())
A = []
for i in range(n):
A.append(list(map(int,input().split())))
for i in range(n):
for j in range(n):
if i + j == n - 1:
A[j][j],A[i][j] = A[i][j], A[j][j]
for stroka in A:
print(*stroka)
Задание 1.2. Напишите программу, меняющую местами два самых больших элемента в матрице, заполненной различными числами
Вводится количество строк в квадратной матрице, далее элементы матрицы, построчно
Вывести измененную матрицу
Примечание: запрещенные операторы max, min, index
Пояснение к решению
Примечание: запрещенные операторы max, min, index
Находим первый максимум, потом находим следующий максимум, переприсваиваем первый максимум второму максимуму, но не забыть проверить, что элемент матрицы может быть меньше первого максимума, но больше второго, поэтому обязательно надо делать две проверки с первым и вторым максимумом
n, m = map(int, input().split())
A = [list(map(int, input().split())) for i in range(n)]
ind_mx1, ind_mx2, mx1, mx2 = [0, 0], [0, 0], float('-inf'), float('-inf')
for i in range(n):
for j in range(m):
if A[i][j] >= mx1:
mx2, ind_mx2, mx1, ind_mx1 = mx1, ind_mx1, A[i][j], [i, j]
elif A[i][j] > mx2:
mx2, ind_mx2 = A[i][j], [i, j]
A[ind_mx1[0]][ind_mx1[1]], A[ind_mx2[0]][ind_mx2[1]] = A[ind_mx2[0]][ind_mx2[1]], A[ind_mx1[0]][ind_mx1[1]]
for i in range(n):
print(*A[i])
n = int(input())
m = int(input())
a = []
for i in range(n):
a.append(list(map(int, input().split())))
mx0 = mx1 = -10 ** 10
j0 = j1 = i0 = i1 = 0
for i in range(n):
for j in range(m):
if a[i][j] > mx0:
mx1, i1, j1 = mx0, i0, j0
mx0, i0, j0 = a[i][j], i, j
elif a[i][j] > mx1:
mx1, i1, j1 = a[i][j], i, j
a[i0][j0], a[i1][j1] = a[i1][j1], a[i0][j0]
for i in range(n):
print(*a[i])
N, M = map(int, input().split())
A=[[0] for _ in range(N)]
for i in range(N):
A[i]=list(map(int,input().split()))
i1_max=j1_max=i2_max=j2_max=0
for i in range(N):
for j in range(M):
if A[i1_max][j1_max]<A[i][j]:
i2_max, j2_max=i1_max, j1_max
i1_max, j1_max =i, j
elif A[i2_max][j2_max]<A[i][j]:
i2_max, j2_max =i, j
A[i1_max][j1_max],A[i2_max][j2_max]=A[i2_max][j2_max],A[i1_max][j1_max]
for x in A:
print(*x)
Задание 2.1. Напишите программу, которая по данному числу N выводит все строки длины N из цифр 3-ичной системы счисления в порядке возрастания.
Вводится число N (1<= N <= 15)
Вывести все указанные строки
Примечание: запрещенные операторы for, while
Пояснение к решению
Примечание: запрещенные операторы for, while
Решаем с использованием рекурсии, выход из рекурсии, когда длина строки равна n, пока нет, то добавляем к строке цифры
def F1(st):
if len(st) < n:
F1(st + '0')
F1(st + '1')
F1(st + '2')
else: print(st)
n = int(input())
F1('')
def rec(s, n):
if n < 1: print(s)
return
rec(s + '0', n - 1)
rec(s + '1', n - 1)
rec(s + '2', n - 1)
n = int(input())
rec('', n)
from itertools import *
N=int(input())
for i in product('012', repeat=3):
print(''.join(i))
def f(s):
if len(s) == n: print(s)
else:
f(s + '0')
f(s + '1')
f(s + '2')
n = int(input())
f('')
Задание 2.2. Напишите программу, которая по данному числу N выводит все строки длины N из алфавита, содержащего только буквы К, L, M, N, в лексикографическом порядке, причем рядом не могут находиться две одинаковые буквы.
Вводится число N (1<= N <= 15)
Вывести все указанные строки
Примечание: запрещенные операторы for, while
Пояснение к решению
Примечание: запрещенные операторы for, while
Решаем с использованием рекурсии, выход из рекурсии, когда длина строки равна n, пока нет, то добавляем к строке букву и проверяем,
если в строке больше одной буквы, то проверяем последние две буквы на совпадение, если совпадают, то данная комбинации запрещена.
ИЛИ
проверяем предпоследнюю букву, сравниваем ее с буквой, которую хотим добавить
def F1(st, ind):
if len(st) == n:
print(st)
else:
for el in s:
if st[ind] != el:
F1(st + el, ind + 1)
s = "KLMN"
n = int(input())
for el in s:
F1(el, 0)
#import string
#print(string.punctuation)
def F1(st, ind):
if len(st) == n: print(st)
else:
if st[ind] == 'K':
F1(st + 'L', ind + 1)
F1(st + 'M', ind + 1)
F1(st + 'N', ind + 1)
elif st[ind] == 'L':
F1(st + 'K', ind + 1)
F1(st + 'M', ind + 1)
F1(st + 'N', ind + 1)
elif st[ind] == 'M':
F1(st + 'K', ind + 1)
F1(st + 'L', ind + 1)
F1(st + 'N', ind + 1)
else:
F1(st + 'K', ind + 1)
F1(st + 'L', ind + 1)
F1(st + 'M', ind + 1)
n = int(input())
F1('K', 0)
F1('L', 0)
F1('M', 0)
F1('N', 0)
def rec(s, n):
if n < 1:
print(s)
return
if s == '' or s[-1] != 'K':
rec(s + 'K', n - 1)
if s == '' or s[-1] != 'L':
rec(s + 'L', n - 1)
if s == '' or s[-1] != 'M':
rec(s + 'M', n - 1)
if s == '' or s[-1] != 'N':
rec(s + 'N', n - 1)
n = int(input())
rec('', n)
def rec(s):
if len(s)>=2 and s[-1]==s[-2]:
return
if len(s)==n:
print(s)
else:
rec(s + 'K')
rec(s + 'L')
rec(s + 'M')
rec(s + 'N')
n = int(input())
rec('')
Задание 3.1. Напишите программу, определяющую, после какой буквы во введенной строке чаще всего встречается буква «т» (строчные и прописные буквы не различаются). Ввод данных осуществляется из файла.
Если несколько букв встречаются одинаковое наибольшее число раз, программа должна вывести первую по алфавиту букву
Вводится текст, состоящий из нескольких строк (ввод из файла)
Вывести букву (строчную), после которой во введенной строке чаще всего встречается буква «т».
Пояснение к решению
Обязательно при вводе данных из файла используем параметр encoding='utf-8' для раскодирования русского алфавита
Удаляем из строки все символы, кроме русских букв. Для подсчета количества используем словарь, где ключ - это буквы из вводимой строки
inp = open('input.txt', 'r', encoding='utf-8')
punctuation = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ \n"
s = inp.read().lower()
A = {chr(ord('а') + i):0 for i in range(32)}
arr = []
for l in s:
if l not in punctuation:
arr.append(l)
for i in range(len(arr) - 1):
if arr[i + 1] == 'т':
A[arr[i]] += 1
print(max(A, key = A.get))
file = open('name.txt', encoding = 'utf-8')
s = file.read()
file.close()
counter = [0] * 1200
alf = 'ячсмитьбюэждлорпавыфйцукенгшщзхъё'
for i in range(len(s)-1):
if s[i+1].lower() == 'т' and s[i].lower() in alf:
counter[ord(s[i].lower())] += 1
m = max(counter)
for i in range(1200):
if counter[i] == m:
print(chr(i))
break
file = open('name1.txt', encoding = 'utf-8')
s = file.read()
file.close()
s2=''
for i in s:
if 'А'<=i<='я': s2+=i.lower()
s1=set(list(s2))
d={x:0 for x in s1}
for i in range(len(s)-1):
if s[i+1] =="т": d[s[i]]+=1
max_n=max(d[i] for i in d)
for i in d:
if d[i]==max_n:
print(i)
break
Задание 3.2. Напишите программу, которая определяет слова, встречающиеся в тексте ровно два раза и выводит их в алфавитном порядке. Словом, будем считать любую непрерывную последовательность букв, справа и слева ограниченную любыми другими символами, кроме букв либо началом (концом) строки. Строчные и прописные буквы не различаются.
Вводится текст, состоящий из нескольких строк (ввод из файла)
Вывести в алфавитном порядке слова, встречающиеся в тексте ровно два раза.
Пояснение к решению
Обязательно при вводе данных из файла используем параметр encoding='utf-8' для раскодирования русского алфавита
Не забываем заменить прописные буквы на строчные.
Удаляем из строки все символы, кроме русских букв, и составляем слова. Для подсчета количества одинаковых слов используем словарь, где ключ - это слово из вводимой строки
import string
inp = open('name.txt', 'r', encoding='utf-8')
punctuation = "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ \n"
s = inp.read().lower().split()
A = {}
arr = list(map(lambda x: x.strip(punctuation), s))
for i in range(len(arr)):
if arr[i] in A and arr[i] != '':
A[arr[i]] += 1
else:
A[arr[i]] = 1
A = sorted(A.items())
for el in A:
if el[1] == 2:
print(el[0])
file = open('name.txt', encoding = 'utf-8')
s = file.read()
d = dict()
alf_ = '1234567890)(/*-+,.;:!?%$#@&^/{}[]№'
s1=''
for c in s:
for symbol in alf_:
c = c.replace(symbol, ' ')
s1+=c.lower()
s1 = s1.split()
for word in s1:
d[word] = d.get(word, 0) + 1
for key, value in sorted(d.items()):
if value == 2:
print(key)
file = open('name.txt', encoding = "utf-8")
s=''
for c in file:
s+=c
file.close()
s1=''
ss=[]
x=0
while x < len(s):
while 'А'<=s[x] and s[x]<='я' and x < len(s) - 1:
s1+=s[x]
x+=1
if s1!="": ss.append(s1.lower())
s1=''
x+=1
ss[-1] += s[-1]
d = dict()
for word in ss:
d[word] = d.get(word, 0) + 1
for key, value in sorted(d.items()):
if value == 2: print(key)
Задание 4.1. Напишите программу, которая находит в массиве элемент, самый близкий по величине к данному числу.
Вводится: В первой строке одно натуральное число N, не превосходящее 1000000 – размер массива. Во второй строке содержатся N чисел – элементы массива (целые числа, не превосходящие по модулю 1000). В третьей строке вводится одно целое число X, не превосходящее по модулю 1000.
Вывести значение элемента массива, ближайшее к X. Если таких чисел несколько, вывести любое из них.
Пояснение к решению
Не забываем сортировать список! Используем стандартный алгоритм бинарного поиска. Проверяем искомый элемент меньше самого маленького элемента списка или больше самого большого элемента списка, если это не выполняется, то используем бинарный поиск. Обязательно проверяем от полученного номера элемента вправо или влево.
def bin_poisk(x):
r = n
l = -1
while r - l > 1:
m = (r + l) // 2
if arr[m] >= x: r = m
else: l = m
if r == n: return arr[-1]
elif r == 0: return arr[0]
if abs(arr[r] - x) < abs(arr[l] - x): return arr[r]
else: return arr[l]
n = int(input())
arr = list(map(int, input().split()))
arr.sort()
print(bin_poisk(int(input())))
def bin_search(arr, x, n):
r = n
l = -1
while r - l > 1:
m = (r + l) // 2
if arr[m] >= x: r = m
else: l = m
return r
n = int(input())
a = list(map(int, input().split()))
x = int(input())
a.sort()
if x < a[0]: print(a[0])
elif x > a[-1]: print(a[-1])
else:
ans = bin_search(a, x, n)
if a[ans] == x: print(a[ans])
elif a[ans] - x < x - a[ans-1]: print(a[ans])
else: print(a[ans-1])
Задание 4.2. Напишите программу, реализующую алгоритм бинарного поиска
Вводятся: В первой строке входных данных два натуральных числа N и K (0<N, K<=1000000<N, K<=100000). Во второй строке задаются N элементов первого массива, отсортированного по возрастанию. В третьей строке – K элементов второго массива. Элементы обоих массивов - целые числа, каждое из которых по модулю не превосходит 109.
Вывести для каждого из K чисел второго массива в отдельную строку "YES", если это число встречается в первом массиве, и "NO" в противном случае.
Пояснение к решению
Не забываем сортировать список! Используем стандартный алгоритм бинарного поиска. Проверяем искомый элемент меньше самого маленького элемента списка или больше самого большого элемента списка, если это не выполняется, то используем бинарный поиск. Проверяем, элемента списка равен искомому числу
def bin_poisk(x):
r = n
l = -1
while r - l > 1:
m = (l + r) // 2
if arr[m] == x:
return True
elif arr[m] > x:
r = m
else:
l = m
return False
n, m = map(int, input().split())
arr = list(map(int, input().split()))
poisk = list(map(int, input().split()))
for i in range(m):
if bin_poisk(poisk[i]): print('YES')
else: print('NO')
def bin_search(x, n):
r = n
l = -1
while r - l > 1:
m = (r + l) // 2
if arr1[m] >= x:
r = m
else:
l = m
return r
n, k = map(int, input().split())
arr1 = list(map(int, input().split()))
arr2 = list(map(int, input().split()))
for number in arr2:
if number < arr1[0] or number > arr1[-1]:
print('NO')
else:
if arr1[bin_search(number, n)]==number: print('YES')
else: print('NO')
def bin_find(x, a):
l = -1
r = len(a)
while r - l > 1:
m = (r + l) // 2
if a[m] > x:
r = m
else:
l = m
return a[l] == x
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
for x in b:
if bin_find(x, a): print("YES")
else: print("NO")
Задание 5.1. Напишите программу, обрабатывающую и сортирующую числовые данные
Вводится строка, содержащая натуральные числа, разделенные одним пробелом. Количество чисел в строке неизвестно. Числа не превышают 1012
Вывести числа, содержащиеся во входных данных, упорядоченные по количеству содержащихся в них нулей. При равенстве количества нулей порядок следования чисел не изменяется.
Пояснение к решению
Для сортировки можно использовать для сортировки по ключу функцию lambda с параметрами, для подсчета используем функцию count()
def F1(x):
return str(x).count('0')
arr = list(map(int, input().split()))
print(*sorted(arr, key = F1))
arr = list(map(int, input().split()))
print(*sorted(arr, key = lambda x: str(x).count('0')))
s = input()
dig = s.split()
dig.sort(key = lambda x: x.count('0'))
print(*dig)
print(*sorted(input().split(), key=lambda num: num.count("0")))
def f(elem):
return elem.count('0')
A = input().split()
A.sort(key = f)
print(*A)
Задание 5.2. Напишите программу, обрабатывающую и сортирующую данные
Вводятся: В первой строке входных данных одно натуральные число N - количество учебных предметов, по которым проводился ОГЭ (0<N <=15). Далее идут N строк, в каждой содержится название предмета, количество сдававших и средний балл результатов сдачи. Данные в пределах одной строки отделены друг от друга одним пробелом.
Вывести названия предметов в порядке убывания среднего балла участников ОГЭ
Пояснение к решению
Для сортировки можно использовать для сортировки по ключу функцию lambda с параметрами, при переводе строкового типа в числовой необходимо заменить запятую на точку и только потом переводим в вещественное число.
n = int(input())
arr = [list(map(str, input().split())) for i in range(n)]
for i in range(n):
arr[i][2] = arr[i][2].replace(',', '.')
arr.sort(key = lambda x: -float(x[2]))
for i in range(n):
print(arr[i][0])
n = int(input())
list_student = []
for i in range(n):
s = input().split()
list_student.append([s[0], float(s[2].replace(',', '.'))])
list_student.sort(key = lambda x: -x[1])
for i in range(n):
print(list_student[i][0])
n = int(input())
a = []
for _ in range(n):
b = input().split()
c = b[2].find(",")
a.append([b[0], float(b[2][:c] + "." + b[2][c + 1:])])
for el in sorted(a, key=lambda x: (-x[1], x[0])):
print(el[0])