Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

будет содержать коэффициент уравнения и его знак,




а также букву '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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...