будет содержать коэффициент уравнения и его знак,
⇐ ПредыдущаяСтр 3 из 3 а также букву 'a' или 'b', если это не свободный член } i:= 0; for k:=1 to 3 do Repeat i:=i+1; mas[k]:= mas[k] + s[i] until (s[i+1]='+') or (s[i+1]='-') or (i=length(s)); { если 1-й член положительный, добавляем ему его знак '+'} if s[1] <> '-' then mas[1]:= '+' + mas[1]; { если коэффициент при a и b указан неявно, т.е. равен 1, добавим эту 1 между знаком и буквой } for k:=1 to 3 do if (length(mas[k]) = 2) and ((mas[k][2] = 'a') or (mas[k][2] = 'b')) then mas[k]:= mas[k][1] + '1' + mas[k][2]; { в случае a или b на последнем месте, читаем до Предпоследнего символа, иначе - до последнего, и переводим строку в число } for k:=1 to 3 do begin s:= mas[k]; i:= length(s); if mas[k][i] = 'a' then begin s0:= Copy(s,1,i-1); Val(s0, a, r); End Else if mas[k][i] = 'b' then begin s0:= Copy(s,1,i-1); Val(s0, b, r); End Else begin s0:= Copy(s,1,i); Val(s0, c, r); end; end; { вычисление корней уравнения } D:= b*b - 4*a*c; x1:= (-b - sqrt(D)) /(2*a); x2:= (-b + sqrt(D)) /(2*a); Append(F); writeln(F, x1); writeln(F, x2); Close(F); End. 35) Простая задача, в которой нужно подсчитать, сколько раз встречается каждое из чисел из диапазона 1..12 во входных данных, а затем отсортировать список задач по возрастанию числа запросов. Для хранения данных удобнее использовать запись (структуру) с двумя целыми полями: в одном хранится номер задачи, во втором – количество запросов по ней: type TInfo = record zadacha: integer; count: integer; end; Всего может быть 12 задач, поэтому нужно объявить массив из 12 таких записей: const MAX = 12; var Info: array[1..MAX] of TInfo; Перед началом работы в поле zadacha каждой структуры нужно записать ее порядковый номер, а в поле count – нуль (обнулить счетчик): for i:=1 to MAX do begin Info[i].zadacha:= i; Info[i].count:= 0; end; Теперь читаем исходные данные: сначала общее количество запросов N, а потом N чисел (номеров задач), после чтения очередного номера задачи увеличиваем соответствующй счетчик: readln(N); for i:=1 to N do begin
readln(zNo); Info[zNo].count:= Info[zNo].count + 1; end; После этого массив записей сортируется по возрастанию поля count (здесь применен метод пузырька «наоборот» - за каждый проход самый тяжелый элемент едет вниз): for i:=1 to MAX do for j:=1 to MAX-i do if Info[j].count > Info[j+1].count then begin temp:= Info[j]; Info[j]:= Info[j+1]; Info[j+1]:= temp; end; Здесь чувствуется выгода от использования структур: иначе пришлось бы вводить два массива (номера задач и счетчики запросов) и в цикле переставлять одновременно два массива (см. решение задачи 25). Обратите внимание, что в циклах нужно использовать размер массива MAX, а не N! Осталось вывести результат, не забывая проверить на равенство счетчика нулю (задачи, которых нет в запросах, выводить не нужно): for i:=1 to MAX do if Info[i].count > 0 then writeln(Info[i].zadacha, ' ', Info[i].count); Полная программа для решения этой задачи: program qq; const MAX = 12; type TInfo = record zadacha: integer; count: integer; end; var Info: array[1..MAX] of TInfo; i, j, N, zNo: integer; temp: TInfo; Begin { начальные установки } for i:=1 to MAX do begin Info[i].zadacha:= i; Info[i].count:= 0; end; { ввод данных } readln(N); for i:=1 to N do begin readln(zNo); Info[zNo].count:= Info[zNo].count + 1; end; { сортировка } for i:=1 to MAX do for j:=1 to MAX-i do if Info[j].count > Info[j+1].count then begin temp:= Info[j]; Info[j]:= Info[j+1]; Info[j+1]:= temp; end; { вывод результата } for i:=1 to MAX do if Info[i].count > 0 then writeln(Info[i].zadacha, ' ', Info[i].count); End. Теперь посмотрим, как можно было решить задачу без записей, используя массивы. например, в решении, предложенном Е.Н. Смирновой (г. Брянск) используется только один массив счетчиков: var count: array[1..MAX] of integer; который сначала заполняется нулями: for i:=1 to MAX do count[i]:= 0; При этом ввод данных с увеличением счетчиков выглядит так: readln(N); for i:=1 to N do begin readln(zNo); сount[zNo]:= count[zNo] + 1; end; Остается решить проблему вывода результата. Заметим, что данные неотсортированы, если просто отсортировать массив счетчиков по неубыванию, то будет потеряна информация о номерах задач. Поэтому предлагается такой алгоритм, учитывающий, что значение счетчика уже не нужно после того, как оно выведено на экран:
1) ищем минимальный по величине ненулевой счетчик с номером nMin 2) выводим соответствующий номер задачи (nMin) и значение счетчика (count[nMin]) 3) обнуляем count[nMin], чтобы не учитывать его при следующем проходе 4) При выполнении шага 1 сначала находим первый ненулевой элемент в массиве count и записываем его номер в переменную nMin: nMin:= 1; while (count[nMin]=0) and (nMin < MAX) do nMin:= nMin+1; Если такого элемента нет, будет выполняться условие count[nMin]=0, это значит, что все результаты выведены. При этом можно досрочно выйти из цикла с помощью оператора break: if count[nMin] = 0 then break; Иначе (если найден ненулевой счетчик), мы ищем далее по массиву минимальный ненулевой элемент: for j:=nMin to max do if (count[j]<>0) and (count[j]<count[nMin]) then nMin:=j; выводим на экран его номер (номер задачи) и значение (количество запросов по этой задаче) и обнуляем этот счетчик: writeln (nMin, ' ', count[nMin]); count[nMin]:= 0; Вот полная программа: program qq; const MAX = 12; var count: array[1..MAX] of integer; i, j, nMin, N, zNo: integer; Begin { начальные установки } for i:=1 to MAX do count[i]:= 0; { ввод данных и увеличение счетчиков } readln(N); for i:=1 to N do begin readln(zNo); count[zNo]:= count[zNo] + 1; end; { вывод результатов } for i:=1 to MAX do begin { поиск первого ненулевого счетчика } nMin:= 1; while (count[nMin]=0) and (nMin < MAX) do nMin:= nMin+1; if count[nMin] = 0 then break; { поиск минимального ненулевого счетчика } for j:=nMin to max do if (count[j]<>0) and (count[j]<count[nMin]) then nMin:=j; { вывод результата } writeln (nMin, ' ', count[nMin]); count[nMin]:= 0; end; End. 36) В сравнении с предыдущей задачей, здесь есть одно усложнение. При вводе нужно определять, встречался ли этот фильм в списке раньше. Если встречался, то нужно просто увеличить соответствующий счетчик, если нет – запомнить название фильма и записать в его счетчик единицу. Так же, как и в предыдущей задаче, будем использовать записи (структуры), каждый элемент хранит название фильма и число поданных за него голосов: type TInfo = record film: string; count: integer; end; Введем целую переменную K – счетчик уже найденных фильмов, который в начале равен нулю. Когда прочитано очередное название фильма (в символьную строку s, нужно проверить если ли уже в списке этот фильм. Если есть, мы просто увеличиваем его счетчик. Для поиска удобно использовать цикл с условием, который просматривает первые K элементов массива:
j:= 1; while j <= K do if s = Info[j].film then begin Info[j].count:= Info[j].count + 1; j:= MaxInt; End else j:= j + 1; Если фильм нашли в списке, кроме увеличения счетчика в переменную j записывается значение MaxInt, это сделано для того, чтобы цикл завершился. Таким образом, после окончания цикла переменная j может быть равна MaxInt (если фильм уже был в списке) или K+1 (если фильм не найден и цикл закончился при нарушении условия j<=K). В последнем случае добавляем его в список и записываем в счетчик 1: if j = K+1 then begin K:= K + 1; Info[K].film:= s; Info[K].count:= 1; end; При сортировке нужно использовать не весь массив, а только первые K записей (столько, сколько было фактически найдено разных фильмов): for i:=1 to K do for j:=1 to K-i do if Info[j].count < Info[j+1].count then begin temp:= Info[j]; Info[j]:= Info[j+1]; Info[j+1]:= temp; end; При выводе, в отличие от предыдущей задачи, не нужно делать проверку на неравенство нулю – если фильм был найден, его счетчик заведомо не меньше 1: for i:=1 to K do writeln(Info[i].film, ' ', Info[i].count); Вот полная программа: const MAX = 10; type TInfo = record film: string; count: integer; end; var Info: array[1..MAX] of TInfo; i, j, N, K: integer; s: string; temp: TInfo; Begin K:= 0; readln(N); for i:=1 to N do begin readln(s); j:= 1; while j <= K do if s = Info[j].film then begin Info[j].count:= Info[j].count + 1; j:= MaxInt; End else j:= j + 1; if j = K+1 then begin K:= K + 1; Info[K].film:= s; Info[K].count:= 1; end; end; for i:=1 to K do for j:=1 to K-i do if Info[j].count < Info[j+1].count then begin temp:= Info[j]; Info[j]:= Info[j+1]; Info[j+1]:= temp; end; for i:=1 to K do writeln(Info[i].film, ' ', Info[i].count); End. [1] Вообще говоря, без массива Total можно обойтись, потому что Total[i] – это сумма i -ой строки матрицы Count. Но его использование сильно упрощает дело при обработке данных. На досуге вы можете написать программу без него. [2] На практике это не обязательно, потому что глобальные переменные и массивы обнуляются автоматически во всех известных автору версиях Паскаля. Тем не менее, на экзамене вы должны показать эксперту, что вы понимаете суть дела. [3] Решение, предложенное в проекте демо-варианта ФИПИ 2010 года, содержит массивы, описанные как array[92..98], что само по себе очень неграмотно. [4] Это ограничение снято в Delphi.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|