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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2012, 18:14   #1
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию Задача на списки

Ну собственно условие ниже. А проблема такая: задача не правильно считает количество. Получается всегда, что нужное количество на единицу меньше, чем количество слов в общем.
Код:
program Project1;
{Выполнила студентка 2 курса, 61 группы Гребенщикова Ольга
 type
   slovo=packed array[1..10] of char;
   telem=slovo;
 Описать функцию, подсчитывающую количество слов списка L,
 которые начинаются с тойже литеры, что и следующее слово }
{$APPTYPE CONSOLE}
uses
  SysUtils;
type
  telem=char;
  slovo= packed array [1..50] of telem;
  list=^Node;
  Node=record
         inf:slovo;
         next:list;
       end;
procedure add(var n:list;x:slovo;num:integer);
{данная процедура добавляет в список "n" элемент "x" на порядковое место "num"}
var
   p,q:list;
   i:integer;
begin
   new(p);
   p^.inf:=x;
   if n=nil then
      begin
        n:=p;
        p^.next:=nil;
      end
   else if num=1 then
            begin
              p^.next:=n;
              n:=p;
            end
   else
     begin
       i:=0;
       q:= n;
       while (i<>num-2) and (q^.next<>nil) do
          begin
     	      i:= i+1;
	          q:= q^.next;
          end;
       p^.next:=q^.next;
       q^.next:=p;
     end;
end;
function Kolvo(n:list):integer;
{функция определяющая КОЛ-ВО, требовающееся в задании}
var
   q:list;
   slovo1,slovo2:slovo;
   i,k:integer;
begin
   q:=n;
   i:=0;
   k:=0;{обнуляем количество}
   if q=nil then writeln ('Spisok pust ')
   else
     begin
       while q<>nil do
         begin
	          i:=i+1;
	          if i=1 then slovo2:=q^.inf
              else
                begin
                  slovo1:=slovo2;
                  slovo2:=q^.inf;
                end;  {считываем 2 слова со списка}
            if i<>1 then
                if slovo1[1]=slovo2[1] then
                    k:=k+1;
	          q:=q^.next;
         end;
   end;
   Kolvo:=k;
end;
var
  sl:slovo;
  i,n:integer;
  L:list;
begin
  write('Vvedite kol-vo slov v spiske: ');
  readln(n);
  writeln('Vvedite sam SPISOK L: ');
  for i:=1 to n do
    begin
      write(i,' slovo= ');
      readln(sl[i]);
      add(L,sl,i);
    end;
  writeln('OTVET= ',Kolvo(L));
  readln;
end.
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Старый 25.10.2012, 20:21   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Мда. А что мешает взять вполне стандартные функции для списков и ими вращать, зачем свои какие-то хитрые ?
Магии цикла
Код:
write(i,' slovo= ');
readln(sl[i]);
add(L,sl,i);
не понял вообще, ридлном каретка переводится, читаются не понять какие буквы
, и сразу же не слово, а какие-то его куски из букв кидаются в список. Глубже убоялся идти во мрак о_()

Ну, а что говорит трассировка (пошаговая отладка) ?

оффтоп: подпись кошерна
phomm вне форума Ответить с цитированием
Старый 25.10.2012, 21:33   #3
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию

Цитата:
не понял вообще, ридлном каретка переводится, читаются не понять какие буквы
, и сразу же не слово, а какие-то его куски из букв кидаются в список. Глубже убоялся идти во мрак о_()

Ну, а что говорит трассировка (пошаговая отладка) ?
Дело в том, что я не очень разобралась в ней. Как отладку сделать?
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Старый 25.10.2012, 22:04   #4
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

f7 кнопочка по шагам гонит программу, также можно использовать f4 f5 (плюс к ней много можно про брейкпоинты посмотреть) f8 shift+f8 - о них лучше в справке или мануале прочитать
Завтра с утра ещё погоняю на работе, авось что увижу, а сейчас уже баю надо.. для работы в 630 встаю (430 по мск)

Последний раз редактировалось phomm; 25.10.2012 в 22:10.
phomm вне форума Ответить с цитированием
Старый 25.10.2012, 22:13   #5
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
f7 кнопочка по шагам гонит программу, также можно использовать f4 f5 (плюс к ней много можно про брейкпоинты посмотреть) f8 shift+f8 - о них лучше в справке или мануале прочитать
Завтра с утра ещё погоняю на работе, авось что увижу, а сейчас уже баю надо.. для работы в 630 встаю (430 по мск)
Спасибо за помощь=)
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Старый 25.10.2012, 22:55   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
function Kolvo(n:list):integer;
{функция определяющая КОЛ-ВО, требовающееся в задании}
var
   q:list;
   slovo1,slovo2:slovo;
   i,k:integer;
begin
   q:=n;
   k:=0;{обнуляем количество}
   if q=nil then writeln ('Spisok pust ')
   else
     begin
       while q^.next<>nil do
         begin
          if(copy(q^.inf,1,1)=copy(q^.next^.inf,1,1) then inc(k);
          q:=q^.next;
         end;
   end;
   Kolvo:=k;
end;
Вот как по мне лучще так.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 26.10.2012, 07:45   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Ну вообще, погонял я тут программу, и с Вашей Kolvo и в варианте Stilet , но результата не было.

Пошёл поменял цикл, который мне сразу не понравился, точнее чтение самих слов, вот так:
Код:
type 
//  telem=char; // убрать
  slovo= shortstring;//packed array [1..50] of telem; //заменить
...
//цикл
readln(sl); // вместо readln(sl[i]);
и погонял, вроде адекватно считает, согласно заданию. Но советую всё же пройтись трассировкой несколько раз , чтобы в глубинах покопать и увериться в правильной работе самого алгоритма.
phomm вне форума Ответить с цитированием
Старый 26.10.2012, 09:08   #8
(Нафаня)
Пользователь
 
Аватар для (Нафаня)
 
Регистрация: 08.03.2011
Сообщений: 56
По умолчанию

Все работает, спасибо большое=)))
Если бы люди,вдруг,узнали,о чем я думаю... Со мной бы сначала перестали здороваться,а потом,вообще,на костре сожгли бы нафиг
(Нафаня) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на списки (Нафаня) Помощь студентам 2 11.10.2012 22:47
Задача на списки blademish Паскаль, Turbo Pascal, PascalABC.NET 7 06.02.2012 01:20
задача на списки ekaterina123 Помощь студентам 1 03.11.2011 17:44