630 likes | 880 Views
Задачи С4. Технология программирования. Создание программ для решения задач средней сложности. Первичный балл – 4 (10%). Рекомендуемое время выполнения – 1 час (из 4-х часов экзамена) (25%). Литература.
E N D
Задачи С4 Технология программирования. Создание программ для решения задач средней сложности. Первичный балл – 4 (10%). Рекомендуемое время выполнения – 1 час (из 4-х часов экзамена) (25%)
Литература Отличник ЕГЭ. Информатика. Решение сложных задач / ФИПИ авторы-составители: С.С. Крылов, Д.М. Ушаков – М.: Интеллект-Центр, 2010. kpolyakov.narod.ru – сайт Константина Полякова
Этапы создания программы для решения задачи С4: • Анализ условия • Выбор алгоритма решения задачи и языка программирования для его реализации • Написание чернового варианта программы, его отладка и тестирование
Пример типичного условия задачи С4: На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N был проведен мониторинг цены бензина на различных АЗС. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, BorlandPascal 7.0), которая будет определять для каждого вида бензина, сколько АЗС продают его дешевле всего. Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи На вход программе в первой строке подается число данных N о стоимости бензина. В каждой из последующих N строк находится информация в следующем формате: <Компания><Улица><Марка><Цена> где <Компания> – строка, состоящая не более, чем из 20 символов без пробелов, <Улица> – строка, состоящая не более, чем из 20 символов без пробелов, <Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках. <Компания> и <Улица>, <Улица> и <Марка>, а также <Марка> и <Цена> разделены ровно одним пробелом. Пример входной строки: Синойл Цветочная 95 2250 Программа должна выводить через пробел 3 числа – количество АЗС, продающих дешевле всего 92-й, 95-й и 98-й бензин соответственно. Если бензин какой-то марки нигде не продавался, то следует вывести 0. Пример выходных данных: 12 1 0
Типичная постановка задачи С4 содержит: • Формат входных данных • Назначение программы (какую итоговую информацию программа должна извлечь из исходных данных и как их преобразовать) • Формат выходных данных • Дополнительные условия и рекомендации программисту.
1. Анализ условия: Выделяем основные элементы условия: • Формат входных данных: На вход программе в первой строке подается число данных N о стоимости бензина. В каждой из последующих N строк находится информация в следующем формате: <Компания><Улица><Марка><Цена> где <Компания> – строка, состоящая не более, чем из 20 символов без пробелов, <Улица> – строка, состоящая не более, чем из 20 символов без пробелов, <Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках. <Компания> и <Улица>, <Улица> и <Марка>, а также <Марка> и <Цена> разделены ровно одним пробелом. Пример входной строки: Синойл Цветочная 95 2250
Назначение программы Напишите …программу, которая будет определять для каждого вида бензина, сколько АЗС продают его дешевле всего. • Формат выходных данных Программа должна выводить через пробел 3 числа – количество АЗС, продающих дешевле всего 92-й, 95-й и 98-й бензин соответственно. Если бензин какой-то марки нигде не продавался, то следует вывести 0. Пример выходных данных: 12 1 0
Дополнительные условия и рекомендации программисту. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, BorlandPascal 7.0)… Обратите внимание, что часть условия не вошла ни в один из приведенных выше существенных элементов . Это литературное введение, т.е. фразы, поясняющие задачу, вводящие а курс дела, но не существенные для решения задачи: На автозаправочных станциях (АЗС) продается бензин с маркировкой 92, 95 и 98. В городе N был проведен мониторинг цены бензина на различных АЗС.
Внимательное чтение условия задачи ОЧЕНЬ ВАЖНО, т.к. значительное количество ошибок учащихся связано с невнимательным чтением, а, следовательно, с неверным пониманием того или иного компонента условия!!!!!!!!!!!!!!!!!!!!!!!!
Рассмотрим дополнительные условия и рекомендации программисту • «эффективная по времени работы программа» не должна содержать лишних операций, число которых пропорционально N (объему входных данных). Например, лишней была бы сортировка цен. • «эффективная по используемой памяти программа» не должна содержать лишних выделений памяти, число которых пропорционально N. Например, нерационально хранить названия компаний, их адрес, да и без хранения всех цен в данной задаче желательно обойтись
Пример правильного, но неэффективного по используемой памяти программы • При считывании исходных данных запоминаем цены на бензин в отдельном массиве для каждой марки бензина • В цикле найдем минимум для каждого их трех массивов • В следующем цикле найдем, сколько элементов в каждом массиве равны минимальному. Это решение является неэффективным, т.к. вводимые данные хранятся в дополнительном массиве. Поясним это на примере упрощенной задачи. Пусть на вход программе подается непустая последовательность из N целых чисел в диапазоне от 1000 до 3000. Написать фрагмент программы, в котором напечатать ее минимальный элемент и количество его повторений
Рекомендации: • На экзамене учащийся может решать задачи на любом языке программирования. В системе оценивания не предусмотрены бонусы за выбор «правильного» или «оригинального» языка программирования, поэтому не нужно руководствоваться принципом «удивить экзаменаторов редким или сверхновым языком программирования», а писать программу на том языке, который лучше знаете или который лучше подходит для решения поставленной задачи. • Несмотря на то, что некоторые версии языков программирования предусматривают автоматическую инициализацию переменных нулевыми значениями, этой возможностью пользоваться крайне не рекомендуется ни в учебном, ни в практическом программировании, т.к. очень велико число ошибок, порождаемых этим якобы упрощением. А в задачах С2 в критериях оценивания для экспертов ЯВНО прописано, что необходимо снижать оценку, если учащийся не инициализированы или неверно инициализированы переменные.
Типичные критерии оценивания задания С4 Содержание верного ответа и указания по оцениванию (допускаются иные формулировки ответа, не искажающие его смысла) Программа читает все входные данные один раз, не запоминая их в массиве, размер которого соответствует числу АЗС или диапазону цен. Во время чтения данных определяются минимальная цена каждой марки бензина и количество АЗС, продающих его по этой цене. Для этого используются 6 переменных или соответствующие массивы (например, для удобства из 8 элементов каждый). Баллы начисляются только за программу, которая решает задачу хотя бы для одного частного случая (например, когда для каждой марки бензина минимальная цена отмечена ровно на одной АЗС).
Указания по оцениванию Программа работает верно для любых входных данных произвольного размера и находит ответ, не сохраняя входные данные в массиве, размер которого соответствует числу N (количество данных мониторинга) или диапазону цен (3000). Программа просматривает входные данные один раз, используя для нахождения ответа два массива из 3-х (8-и) элементов каждый или 6 соответствующих переменных. Допускаетсяналичие в тексте программы ОДНОЙ синтаксической ошибки: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных (если одна и та же ошибка встречается несколько раз, то это считается за одну ошибку). 4 балла
Программа работает верно, но входные данные или только цены запоминаются в массиве, в том числе возможно в массиве (трех массивах) с индексами от 0 до 3000, обозначающем количество АЗС, продающих бензин по соответствующей цене, или входные данные считываются несколько раз. Возможно, вместо алгоритма поиска минимума используется сортировка всех цен. Допускается наличие от одной до трех синтаксических ошибок: Возможно, в принципиально верно организованном вводе данных есть одна ошибка. Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает не верно на некоторых (не типичных) наборах входных данных (например, все цены на одну из марок бензина равны 3000). 3 балла
Программа работает в целом верно, эффективно или нет, но, в реализации алгоритма содержатся до двух ошибок (неверная инициализация переменных, в частности значения минимума, возможно программа не верно работает, если минимальное значение равно 3000, выход за границу массива, перевод символов в числа, используется знак “<” вместо “<=”, “or” вместо “and” и т.п.). Возможно, некорректно организовано считывание входных данных. Возможно, не для всех марок бензина ответ находится верно. Допускается наличие от одной до пяти синтаксических ошибок, описанных выше. Программа, возможно, неверно работает при некоторых входных данных. Возможно, программа не определяет или неверно определяет, что бензина какой-то марки не было. Или минимальная цена марки бензина считается верно, а количество соответствующих АЗС – нет. При использовании сортировки допущены ошибки в ее реализации. Допускается до 4 различных ошибок в реализации алгоритма, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок, описанных выше. 2 балла 1 балл
Т.о. 4 балластавится за правильную и эффективную программу максимум с 1 синтаксической ошибкой. 3 балла ставится за правильную, но не эффективную программу или за правильную в целом и эффективную программу, но неверно работающую в одном из частных случаев и содержащую не более 3-х синтаксических ошибок. 2 балла ставится, если программа работает в целом верно, но не удовлетворяет критериям выставления 3-х баллов и содержащую не более 2-х логических и 5 синтаксических ошибок.
Синтаксические ошибки: • Ошибки в написании названий операторов или имен стандартных функций • Неверно расставлены или пропущены скобки • Использование неописанных переменных (Паскаль) • Не расставлены или неверно расставлены знаки препинания, например «;» в Паскале
Пример фрагментов программ с синтаксическими ошибками. Поиск минимального значения элемента непустой входной последовательности из N элементов:
Пример фрагментов программ с синтаксическими ошибками. Поиск минимального значения элемента непустой входной последовательности из N элементов:
Пример тех же фрагментов программ с логическими ошибками
Технология выполнения задания С4 Этапы создания программы для решения задачи С4: • Анализ условия • Выбор алгоритма решения задачи и языка программирования для его реализации • Написание чернового варианта программы, его отладка и тестирование
1. необходимо соблюдение формата ввода-вывода! Несоблюдение формата может быть расценено при проверке как неполное решение или содержащее логические ошибки с соответствующим понижением баллов. Наглядно представьте себе структуру входных и выходных данных, а также структуры данных, которые вы будете хранить и обрабатывать. 2. необходимо уяснить постановку задачи, отбросить лишние «литературно-художественные» подробности и представить себе задачу в формальном виде. Здесь нужно быть особенно внимательными, т.к. неверно понятое условие станет причиной создания принципиально неверной программы, которая может быть оценена в 0 баллов.
3. детально продумайте алгоритм решения задачи. Алгоритм лучше зафиксировать на бумаге в виде решения или схемы. Так будет легче не запутаться, а эксперту будет легче и приятнее проверять вашу работу. 4. при написании текста программы нужно контролировать соответствие типов переменных и применяемых к ним операций, не допускать использование неопределенных (неинициализированных переменных).
5. текст программы нужно писать аккуратно и разборчиво, структурированном, выделяя отступами уровень вложенности операторов, не скупясь на комментарии и пояснения. Отсутствие комментариев не является признаком высокой квалификации программиста, скорее наоборот. Не следует писать «комментарии ради самих комментариев» типа i:=1; {присваиваем переменной i значение 1} Разумны и уместны будут комментарии типа: Repeat Read (c); Until c=‘ ‘; {считана компания} Repeat Read (c); Untilc=‘ ‘; {считана улица}
6. после того как программа написана, необходимо выполнить ее тестирование и отладку (поиск возможных ошибок и их устранение). Проблема в том, что процедура отладки и тестирования – бумажная, бескомпьютерная. Это требует особой внимательности и тренировки. При тестировании старайтесь найти ошибку в своей программе, а не продемонстрировать себе ее правильность. При бескомпьютерном тестировании рекомендуется вести на черновике таблицу значений переменных.при тестировании следует подбирать набор тестовых данных так, чтобы «пройти» по всем «веткам» программы. Особое внимание следует уделить особым случаям исходных данных, пограничным, критическим точкам. Например: - бензин одной или нескольких марок отсутствует на всех АЗС- стоимость бензина достигает минимальных (или максимальных) значений на всех или на нескольких АЗС- число АЗС равно 0 или 1
Приемы программирования, типичные для заданий С4 1. Ввод данных. На вход программе в первой строке подается число данных N о стоимости бензина. В каждой из последующих N строк находится информация в следующем формате: <Компания><Улица><Марка><Цена> где <Компания> – строка, состоящая не более, чем из 20 символов без пробелов, <Улица> – строка, состоящая не более, чем из 20 символов без пробелов, <Марка> – одно из чисел – 92, 95 или 98, <Цена> – целое число в диапазоне от 1000 до 3000, обозначающее стоимость одного литра бензина в копейках. <Компания> и <Улица>, <Улица> и <Марка>, а также <Марка> и <Цена> разделены ровно одним пробелом. Пример входной строки: Синойл Цветочная 95 2250
1. Ввод данных. I способ: считать всю строку целиком в некоторую переменную строкового типа и далее обрабатывать ее посимвольно и преобразовывать символы в числа для их последующей обработки.
II способ: комбинированный - считываем символьные данные «вручную» по символу, а числовые вводим с помощью стандартной процедуры. var c: char; m, cen: integer; begin read (c); while c<> ‘‘ do read (c); {считали название компании} read (c); while c<> ‘‘ do read (c); {считали название улицы} {Теперь в текущей строке остались два целых числа. Их можно прочитать с помощью стандартной процедуры, что избавляет нас от необходимости возиться с выделением подстрок, соответствующих числам и их преобразованием} readln(m,cen); for i:=1 to 2 do begin read (c); while c<> ‘‘ do read (c); end{считалисначала название компании, потом - улицы}
В заданиях С4 встречаются исходные данные, которые имеют свой внутренний формат – обычно комбинацию числового и строкового типа, возможно с использованием некоторых разделителей, например: <Школьный класс> - номер класса из одной или двух цифр от 0 до 12 и вплотную за ним буква класса – 10Б или 1а (возможность использования строчных или прописных букв оговаривается в условии) <Время чч:мм> - два двузначных числа из соответствующего диапазона, разделенных двоеточием, например, 17:45; 6:15 или 06:15 (оговаривается в условии) <Дата дд.мм.гг> - двузначные числа из соответствующего диапазона, разделенных точками, например, 01.01.99 или 11.11.00 Данные такой сложной структуры вводятся в виде строки символов с последующем «разбором», если программе нужно получить доступ к отдельным элементам комбинированных данных.
Рассмотри разбор поля <Школьный класс> с выделением номера класса как числа и буквы класса как символа (будем считать что это поле содержится в отдельной строке исходных данных). var c, letter: char; N: 1..12; begin … … … read (c); {считали 1-й символ} N:=Ord(c) – Ord(‘0’); {в N – число, равное значению 1-й цифры} read (c); {считали 2-й символ} if c in ['0'..'9'] then {если 2-й символ - цифра} begin N:=N*10+ Ord(c) – Ord('0') {'вычисляем номер класса } read (c); {и читаем следующий символ – букву класса} end; Letter:=c; {в Letter – буква класса} Мы самостоятельно преобразовали символы, обозначающие цифры числа в само число: ASCII код символа минус код символа '0'
LINE INPUT S$ ‘считали строку целиком … … … С$=MID$(S$, 1, 1) N=ASC(C$)-ASC("0") ‘в N – число, равное значению 1-й цифры С$=MID$(S$, 2, 1) ‘ 2-й символ IF (C$>= "0") And (C$<= "9") THEN‘если 2-й символ - цифра N=N*10 + ASC(C$)-ASC("0") 'вычисляем номер класса С$=MID$(S$, 3, 1) ‘следующий символ – буквa класса ENDIF Letter$=C$ ‘… …обработка…
Рассмотри разбор поля <Время чч:мм> на целочисленные часы и минуты, причем количество часов может быть как одно-, так и двухсимвольным, например, 6:05 (будем считать что это поле содержится в отдельной строке исходных данных)
LINE INPUT S$ ‘считали строку целиком … … … С$=MID$(S$, 1, 1) h=ASC(C$)-ASC("0") ‘в h – число, равное значению 1-й цифры часов С$=MID$(S$, 2, 1) ‘ 2-й символ IF (C$>= "0") And (C$<= "9") THEN ‘если 2-й символ - цифра h=h*10 + ASC(C$)-ASC("0") 'вычисляем часы m1=4 'позиция первой цифры минут ELSE m1=3 'позиция первой цифры минут ENDIF С$=MID$(S$, m1, 1) ‘первая цифра минут m=ASC(C$)-ASC("0") ‘в m – число, равное значению 1-й цифры минут С$=MID$(S$, m1+1, 1) ‘вторая цифра минут m=m*10 + ASC(C$)-ASC("0") 'вычисляем минуты ‘… …обработка…
Пример задачи С4 из демо-версии ЕГЭ-2009 На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Инициалы> – строка, состоящая из 4-х символов (буква, точка, буква, точка), <номер школы> – не более чем двузначный номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы> разделены одним пробелом. Пример входной строки: Иванов П.С. 57 Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию, из каких школ было меньше всего участников олимпиады (но из этих школ был хотя бы один участник). Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи Максимальный балл за задачу:4
Для каждой строки повторять: • Прочитать строку • Выделить из нее номер школы • Значение в ячейке массива, соответствующей номеру школы, увеличить на 1 • кц • Просмотреть массив, найти в нем значение минимального из ненулевых элементов • Просмотреть массив еще раз, вывести на экран номера элементов, значения которых совпадают с найденным 5 Иванов П.С. 57 Петров И.С. 14 Сидоров К.Д. 25 Киселев П.О. 14 Трубов Д.Ю. 25 1 1 1 2 1 1 2
for i:=1 to n do begin {читаем строку} readln(f,s); {Выделяем из строки номер школы} k:=pos(' ',s); delete(s,1,k); {удалили фамилию} k:=pos(' ',s); delete(s,1,k); {удалили инициалы. Остался № школы} val(s,sc,osh); {->integer} {Значение в ячейке массива, соотв. номеру школы, увеличить на 1} msc[sc]:=msc[sc]+1; end; min:=32767; {макс. возможное. Можно взять число n+1} for i:=1 to 99 do if msc[i]<>0 then if msc[i]<min then min:=msc[i]; for i:=1 to 99 do if msc[i]=min then writeln(i); end. program demo2009; var f:text; {файловая переменная} s:string; {строка} sc:integer; {№ школы из строки} i,k,osh:integer; n:integer; {кол участников = кол строк} min:integer; {min кол участников из школы} msc:array[1..99] of integer; {массив школ, в кот. считаем кол-во участников из данной школы} begin assign (f,'c:\1.txt'); reset(f); readln(f,n); {обнуляем массив школ} for i:=1 to 99 do msc[i]:=0;
Находим минимум min = n FOR i = 1 TO 99 IF msc(i) <> 0 THEN IF msc(i) < min THEN min = msc(i) END IF NEXT I Вывод PRINT «меньше всего участников"; min; “из школ:" FOR i = 1 TO 99 IF msc(i) = min THEN PRINT i NEXT i END DIM msc(99) массив школ OPEN "c:\1.txt" FOR INPUT AS #1открываем файл для чтения из него FOR i = 1 TO 99обнуляем кол-во участников из каждой школы msc(i) = 0 NEXT i INPUT #1, nсчитываем кол-во участников для каждой строки повторяем: FOR i = 1 TO n INPUT #1, s$ввод строки FOR j = LEN(s$) TO 1 STEP -1находим последний пробел IF MID$(s$, j, 1) = " " THEN k = j: j = 1 NEXT j sc$ = RIGHT$(s$, LEN(s$) - k)вырезаем то, что после последнего пробела sc = VAL(sc$)преобразовываем символьную величину в число msc(sc) = msc(sc) + 1увеличиваем кол-во участников из соотв. школы NEXT iк след. строке
program demo2009var2; var c:char; {вводимый символ} sc:integer; {номер школы} i:integer; n:integer; {kol uchastnikov = kol strok} min:integer; {min kol uchastnikov iz shkol} msc:array[1..99] of integer; {massiv shkol} begin readln(n); for i:=1 to 99 do msc[sc]:=0; for i:=1 to n do begin repeat read(c); until c=' ‘; {ввели фамилию} repeat read(c); until c=' ‘; {ввели инициалы} readln(sc);{вводим номер школы} msc[sc]:=msc[sc]+1;{увеличиваем кол-во участников из этой школы} end; И т.д. • Другой вариант ввода данных: • читаем по символам фамилию (до пробела) и игнорируем ее • читаем по символам инициалы (до пробела) и также игнорируем. • далее считываем номер школы в числовом формате
Нарушение формата ввода исх. данных. За такое решение получить макс. кол-во баллов нельзя, но хоть что-то… (≤2 балла) … FOR i = 1 TO 99обнуляем кол-во участников из каждой школы msc(i) = 0 NEXT i INPUT n FOR i = 1 TO n INPUT fam INPUT ini INPUT sc msc(sc) = msc(sc) + 1увеличиваем кол-во участников из соотв. школы …
Кол-во участников из данной школы 5 Иванов П.С. 57 Петров И.С. 14 Сидоров К.Д. 25 Киселев П.О. 14 Трубов Д.Ю. 25 Массив номеров школ K=0 K=1 57 1 14 1 2 1 K=2 25 2 1 1 K=3
program demo2009v3; var f:text; {файловая переменная} s:string; {строка} sc:integer; {номер школы из строки} i,j,p,flag,osh:integer; n:integer; {кол участников} min:integer; {min кол участников из школы} k:integer; {кол-во записей в массиве} msc:array[1..99] of integer; {массив номеров школ} mkol:array[1..99] of integer; {массив кол-ва участников из школы} begin assign (f,'c:\1.txt'); reset(f); readln(f,n);k:=0; {кол-во записей в массиве школ} {Для каждой строки выделяем номер школы любым способом} for i:=1 to n do begin readln(f,s); p:=pos(' ',s); delete(s,1,p); {удалили фамилию} p:=pos(' ',s); delete(s,1,p); {удалили инициалы, остался № школы} val(s,sc,osh); {->integer}
k:=0; {кол-во записей в массиве школ = 0. Эта к-да стоит ДО начала цикла обработки записей} flag:=0; for j:=1 to k do begin{ищем запись в массиве номеров школ} if sc= msc[j] then begin mkol[j]:=mkol[j]+1; flag:=1; break;{если нашли, то количество участников из этой школы увеличиваем на 1, устанавливаем флаг, что нашли, и заканчиваем просмотр} end; end; if flag=0 then begin{если не нашли школу (флаг остался = 0)} k:=k+1;msc[k]:=sc; mkol[k]:=1;{кол-во записей в массиве школ увеличивается, записываем № школы и кол-во участников из этой школы = 1} end; end; min:=32767;{максимально возможное число} for i:=1 to k do if mkol[i]<min then min:=mkol[i]; {на 0 уже не проверяем} for i:=1 to k do if mkol[i]=min then writeln(msc[i]);{печатаем} close (f); end.
Этот вариант для предыдущей задачи менее эффективен, чем первый вариант, но в следующих задачах возможен только он: Имеется список результатов голосования избирателей за несколько партий, в виде списка названий данных партий. На вход программе в первой строке подается количество избирателей в списке N. В каждой из последующих N строк записано название партии, за которую проголосовал данный избиратель, в виде текстовой строки. Длина строки не превосходит 50 символов, название может содержать буквы, цифры, пробелы и прочие символы. Пример входных данных: Программа должна вывести список всех партий, встречающихся в исходном списке, в порядке убывания количества голосов, отданных за эту партию. При этом название каждой партии должно быть выведено ровно один раз, вне зависимости от того, сколько голосов было отдано за данную партию. Пример выходных данных для приведенного выше примера входных данных: При этом следует учитывать, что количество голосов избирателей в исходном списке может быть велико (свыше 1000), а количество различных партий в этом списке не превосходит 10. 6 Party one Party two Party three Party three Party two Party three Party three Party two Party one
Популярная газета объявила конкурс на выбор лучшего фильма, для которого стоит снять продолжение. На выбор читателей было предложено 10 фильмов. Вам предлагается написать эффективную, в том числе и по используемой памяти, программу, которая будет статистически обрабатывать результаты sms-голосования по этому вопросу, чтобы определить популярность того или иного фильма. Следует учитывать, что количество голосов в списке может быть очень велико. На вход программе в первой строчке подается количество пришедших sms-сообщений N. В каждой из последующих N строк записано название фильма. Пример входных данных: 6 Белое солнце пустыни Бриллиантовая рука Белое солнце пустыни Белое солнце пустыни Гараж Бриллиантовая рука Программа должна вывести список всех фильмов, встречающихся в списке, в порядке убывания (невозрастания) количества отданных за них голосов с указанием этого количества голосов. Название каждого фильма должно быть выведено только один раз. Пример выходных данных для приведенных входных данных: Белое солнце пустыни 3 Бриллиантовая рука 2 Гараж 1
На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от "." и букв "a".."z", во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать эффективную программу на языке Паскаль или Бейсик, которая будет печатать буквы, встречающиеся во входной последовательности, в порядке уменьшения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается. Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке. Например, пусть на вход подаются следующие символы: batat. В данном случае программа должна вывести atb Перед текстом программы кратко опишите используемый Вами алгоритм решения задачи
Заводим массив кол-ва встреченных символов a, а также массив, в котором храним символы m. Вводим символc. Определяем его номер и увеличиваем кол-во встреченных символов на 1. Сортируем массив кол-ва символов и параллельно - массив символов Печатаем значения отсортированного массива символов, пока в массиве кол-ва символов не встретится 0.