Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.04.2012, 21:50   #1
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию Выход за границы массива

Имеется следующая задача:


Имеется список результатов голосования избирателей за несколько партий, в виде списка названий данных партий. На вход программе в первой строке подается количество избирателей в списке N. В каждой из последующих N строк записано название партии, за которую проголосовал данный избиратель, в виде текстовой строки. Длина строки не превосходит 50 символов, название может содержать буквы, цифры, пробелы и прочие символы.
Пример входных данных:
6
Party one
Party two
Party three
Party three
Party two
Party three
Программа должна вывести список всех партий, встречающихся в исходном списке, в порядке убывания количества голосов, отданных за эту партию. При этом название каждой партии должно быть выведено ровно один раз, вне зависимости от того, сколько голосов было отдано за данную партию. Пример выходных данных для приведенного выше примера входных данных:
Party three
Party two
Party one
При этом следует учитывать, что количество голосов избирателей в исходном списке может быть велико (свыше 1000), а количество различных партий в этом списке не превосходит 10.

Имеется код:
Код:
program mmm;
uses crt;
const
p=10;
procedure swap(var z,y:integer);
   var t:integer;
 begin
    t := z;
    z := y;
    y := t
 end;
var
x:array [1..p] of record
               name:string;
               count:integer;
               end;
i,n,j:integer;
s:string;
begin
readln(n);
for i:=1 to n do
    begin
    readln(s);
    for j:=1 to p do
    if (x[j].name<>s) then
       begin
       x[j].name:=s;
       inc(x[j].count);
       break;
       end
    else
    inc(x[j].count);
    end;
for i:=2 to p do
    begin
    j:=i;
    while (x[j].count<x[j-1].count) do
          begin
          swap(x[j].count,x[j-1].count);
          dec(j);
          end;
    end;
for i:=1 to p do
if x[i].name<>'' then writeln(x[i].name);
end.
При вводе последней строки выдает выход за границы массива на нулевой строке. Подскажите, что подправить.
weech вне форума Ответить с цитированием
Старый 28.04.2012, 09:19   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Попробуйте пройти по шагам в программе и проконтролировать данные.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.04.2012, 16:50   #3
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Попробуйте пройти по шагам в программе и проконтролировать данные.
Я с инструментами отладки не очень дружу...
weech вне форума Ответить с цитированием
Старый 29.04.2012, 17:00   #4
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от weech Посмотреть сообщение
Я с инструментами отладки не очень дружу...
Это очень плохо. А по другому вы врядли ошибку найдете.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.04.2012, 17:10   #5
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Закинул в паскал. и ошибки не вылетело. все нормально прошло.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 29.04.2012, 20:15   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

dec(j) запросто может в цикле while к ошибке привести
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.04.2012, 17:39   #7
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
dec(j) запросто может в цикле while к ошибке привести
Согласен, но это, насколько я знаю, - "сортировка вставками", которая не должна приводить к ошибке.
weech вне форума Ответить с цитированием
Старый 30.04.2012, 23:26   #8
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Цитата:
Сообщение от weech Посмотреть сообщение
Согласен, но это, насколько я знаю, - "сортировка вставками", которая не должна приводить к ошибке.
Приводить к ошибке может ЛЮБОЙ код, который неверно написан. Оттого что это "сортировка обменами" или "вставками" ничего не зависит.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 30.04.2012, 23:52   #9
weech
Пользователь
 
Аватар для weech
 
Регистрация: 16.11.2011
Сообщений: 91
По умолчанию

Цитата:
Сообщение от WorldMaster Посмотреть сообщение
Приводить к ошибке может ЛЮБОЙ код, который неверно написан. Оттого что это "сортировка обменами" или "вставками" ничего не зависит.
Именно этот фрагмент написан верно. С программой разобрался: break еще один забыл.
weech вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выход за пределы массива NFXrus Помощь студентам 10 09.12.2011 23:13
Паскаль. Выдёт ошибку "выход за границы диапазона" Winterfox Помощь студентам 1 04.12.2011 14:13
как указать границы массива? TotKtoNado БД в Delphi 3 18.08.2011 20:30
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09
Ошибка "выход за границы диапазона" Luuun Помощь студентам 6 28.01.2010 22:39