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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2017, 20:52   #1
Romeshek
Пользователь
 
Регистрация: 29.09.2017
Сообщений: 33
По умолчанию [Pascal ABC.NET] Не выдает результат

Задание : Модель компьютера характеризуется кодом и маркой компьютера, типом процессора (может содержать цифры и буквы), датой выпуска на рынок, стоимостью компьютера в рублях. Поиск - по типу процессора.


Код:
Program point; 
Uses Crt;
Type 
Link = ^comp;
comp = record
Kod : String [20]; {Код} 
Marka:String [20];{марка}
processor:String [20];{тип процессора}
price : real;    {Стоимость}
data:String [15];{дата}
Next : Link;     {Поле для связи со следующим объектом в списке}
end;
Var p,First : Link;    {Указатели на запись: текущую, первую} 
NamFind : String [20];      {Марка автомобиля для поиска} 
V : 0..5;                          {Селектор меню}
EndMenu : boolean;      {Окончание вывода меню}
{Поиск объекта с именем FN, по результатам поиска возвращает указатель на найденный объект или Nil, если объект не найден} 
function Find_LineSingleList(DataElem: String[20];
                    var ptrHead, ptrCurrent: Link): boolean;
  {Поиск элемента в линейном однонаправленном списке}
var
  ptrAddition: Link;  {Дополнительный указатель}
begin
  if (ptrHead <> nil)
  then begin  {Если существует список}
    ptrAddition := ptrHead;
    while (ptrAddition <> nil) and
          (ptrAddition^.Marka <> DataElem) do
      {пока не конец списка и не найден элемент}
      ptrAddition := ptrAddition^.Next;
    {Если элемент найден,
     то результатом работы функции является – true}
    if ptrAddition <> nil then begin
      Find_LineSingleList := true;
      ptrCurrent := ptrAddition;
    end else begin
      Find_LineSingleList := false;
    end;
  end else begin
    Find_LineSingleList:= false;
  end;
end;
Function FindName(FN:String [20]) : Link;   
Var
Curr : Link;
begin
Curr:=First;     {Установить указатель на первом объекте в списке }        
{Повторять пока не дойдем до конца списка} 
while Curr <> 	Nil do 
if Curr^.Marka=FN then {Если нашли заданный объект} 
begin
FindName:=Curr;        {Возвращаем значение указателя на него}
Exit;         {Завершаем функцию} 
end 
else
Curr:=Curr^ .Next;      {Перейти к следующей записи} 
FindName:=Nil;         {В списке нет искомого объекта} 
end; {Конец FindName}
{Добавление записи первой в связанный список}
procedure AddFirst(A:Link); 
begin                      
A^.Next:=First;     {Новый объект первый в списке} 
First:=a;               {Голова списка ссылается на новый объект}
end;                     {Конец AddFirst}
{Удаление первого объекта из списка}
procedure DelFirst(var A:Link); 
begin
A:=First;
First:=First^.Next; {Теперь First указывает на тот объект, на который ранее ссылался объект А}
end; {Конец DelFirst}
{Удаление из списка объекта, стоящего после объекта Old} 
procedure DelAfter(Old:Link; var A:Link); 
begin
A:=Old^.Next;   {Переменной А присваивается значение указателя на удаляемый объект}
Old^.Next:=Old^.Next^.Next; {Теперь Old указывает на тот объект, на который ранее ссылался следующий за ним объект, а объект А исключен из связанного списка}
end; {Конец DelAfter} 
{Ввести данные об объекте}
procedure InpAvto;
var p:link;
begin
New(p);       {Создать очередной объект типа Auto}
Write('Введите Код :');
Readln(P^.Kod) ;
Write('Марка :');
Readln(p^.Marka);
Write('Процессор:');
Readln(p^.processor);
Write('Стоимость:');
Readln(p^.price);
Write('Дата:');
Readln(p^.data);
AddFirst(p);   {Вызов процедуры добавления записи, на которую ссылается указатель Р (Р- фактический параметр, А - формальный параметр-значение) } 
end;             {Конец InpAvto} 
{Вывести на экран все объекты из связанного списка} 
procedure MyList;
var
 Curr : Link; {Локальная переменная - указатель на очередной объект}
begin
Curr:=First;   {Установить указатель на первом объекте в списке} 
{Повторять, пока не дойдем до конца списка}
while Curr <> Nil do 
begin 
Writeln('Код: ' , Curr^. Kod, 'Марка : ' , Curr^. Marka,' Процессор : ', Curr^. processor) ;
Curr:=Curr^.Next;  {Перейти к очередному объекту связанного списка} 
end ;
Write('Вывод списка окончен. Нажмите Enter');
Readln;
end;      {Конец MyList}
///
Begin      {Основная программа}
New(P);  {Создать новую динамическую переменную и установить на нее переменную-указатель} 
EndMenu:=False ;
repeat    {Очищать экран и выводить меню до тех пор, пока EndMenu<>True} 
ClrScr;
Writeln('Укажите вид работы:');
Writeln('1. Запись первым в список');
Writeln('2. Удаление первого объекта из списка');
Writeln('3. Просмотр всего списка') ;
Writeln('4. Удаление объекта, следующего в списке за указанным') ;
Writeln('5. Поиск объекта') ;
Writeln('0. Окончание работы');
Readln(V) ;
Case V of {Вызов разных процедур в зависимости от выбора пункта меню}
1 : InpAvto;        {Ввод данных об объекте}
2 : DelFirst(P);    {Удаление первого в списке}
3 : MyList; {Вывод списка всех элементов связанного списка}
5 : begin
Write('Введите тип процессора: ');
Readln(NamFind) ;
p:=FindName(NamFind);
Writeln('Код: ' , p^. Kod, 'Марка : ' , p^. Marka,' Процессор : ', p^. processor) ;
if Find_LineSingleList(NamFind,first,first)=true then //VOT TUT
writeln ('ЕСТЬ!') else writeln ('нет!') 
end;
4 : begin {Удаление объекта, следующего за указанным}
Readln(NamFind) ;
DelAfter(FindName(NamFind),p); {Вызов процедуры
DelAfter с параметрами: функцией FindName(NamFind) и указателем Р}
end 
else
EndMenu:=True; {Завершить вывод меню} 
end;
until EndMenu;  {Если EndMenu=True, то завершить вывод меню на экран}
Dispose(p); {Уничтожить динамическую переменную Р и освободить память в куче}
end.
Считает он все правильно, только почему-то не выводит результат(дела не во writeln) , подскажите как исправить



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(это кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 30.10.2017 в 22:09.
Romeshek вне форума Ответить с цитированием
Старый 31.10.2017, 14:46   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Romeshek Посмотреть сообщение
Считает он все правильно, только почему-то не выводит результат(дела не во writeln)
что именно не работает и какой результат не выдаётся?


p.s.
Цитата:
Сообщение от Romeshek Посмотреть сообщение
{Ввести данные об объекте}
procedure InpAvto;
var p:link;
begin
New(p); {Создать очередной объект типа Auto}
Цитата:
Сообщение от Romeshek Посмотреть сообщение
NamFind : String [20]; {Марка автомобиля для поиска}
комментарии остались от предыдущей программы (которую, по всей видимости, Вы взяли в качестве шаблона и переделали )

Последний раз редактировалось Serge_Bliznykov; 31.10.2017 в 15:29.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2017, 14:57   #3
Romeshek
Пользователь
 
Регистрация: 29.09.2017
Сообщений: 33
По умолчанию

После того, как мы запустили программу у нас появилось окно, в котором у нас есть пять пунктов, которые мы можем выбрать. Выбираем первый(запись первым в список), после нас просят ввести данные, т.е марку, цену, тип процессора и т.д. Мы можем вводить так несколько раз и после нам нужно выполнить поиск по типу процессора(условие задачи). Для этого нажимаем 5( и вводим тип процессора) и соответственно он нам должен будет показать данные этого типа, которые мы писали выше. И вот именно эти данные он не выводит
Romeshek вне форума Ответить с цитированием
Старый 31.10.2017, 15:14   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Код:
Link = ^comp;
comp = record
Я бы не советовал использовать слово comp для обозначения пользовательского типа данных. Такой тип данных для Pascal является встроенным: https://studfiles.net/preview/1043560/
Вадим Мошев вне форума Ответить с цитированием
Старый 31.10.2017, 15:27   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Вадим Мошев Посмотреть сообщение
Я бы не советовал использовать слово comp для обозначения пользовательского типа данных.
на самом деле, ничего страшного в этом нет.
Хотя, конечно, лучше не использовать.
Но ошибка точно не в этом.

p.s. И, кстати, неизвестно, какой Паскаль у TC: в PascalABC, PascalABC.Net типа данных comp нет.
А в TurboPascal/FreePascal этот код вообще не компилируется.

Последний раз редактировалось Serge_Bliznykov; 31.10.2017 в 15:36.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2017, 15:39   #6
Romeshek
Пользователь
 
Регистрация: 29.09.2017
Сообщений: 33
По умолчанию

PascalABC.Net
Romeshek вне форума Ответить с цитированием
Старый 31.10.2017, 15:48   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Romeshek Посмотреть сообщение
После того, как мы запустили программу у нас появилось окно, в котором у нас есть пять пунктов, которые мы можем выбрать. Выбираем первый(запись первым в список), после нас просят ввести данные, т.е марку, цену, тип процессора и т.д. Мы можем вводить так несколько раз и после нам нужно выполнить поиск по типу процессора(условие задачи).
смотрим пункт 5.

Цитата:
Код:
     5:
        begin
          Write('Введите тип процессора: ');
          Readln(NamFind);
          p := FindName(NamFind);
          Writeln('Код: ', p^.Kod, 'Марка : ', p^.Marka, ' Процессор : ', p^.processor);
          if Find_LineSingleList(NamFind, first, first) = true then //VOT TUT
            writeln('ЕСТЬ!') else writeln('нет!')
        end;
Вы вводите тип процессора в переменную NamFind и вызываете процедуру FindName

смотрим, что ищет процедура FindName
Цитата:
Код:
function FindName(FN: String[20]): Link;
var
  Curr: Link;
begin
  Curr := First;     {Установить указатель на первом объекте в списке }        
  {Повторять пока не дойдем до конца списка} 
  while Curr <> 	nil do 
    if Curr^.Marka = FN then {Если нашли заданный объект} 
    begin
видим, что
1) она ищет совпадение в поле Marka ( Marka: String[20];{марка})
2) если не нашла, то она возвращает nil

ИСПРАВЛЯЕМ.
1)исправляем процедуру, чтобы искала по процессору
Код:
function FindName(FN: String[20]): Link;
var
  Curr: Link;
begin
  Curr := First;     {Установить указатель на первом объекте в списке }        
  {Повторять пока не дойдем до конца списка} 
  while Curr <> 	nil do 
    if Curr^.processor = FN then {Если нашли заданный объект} 
    begin
      FindName := Curr;        {Возвращаем значение указателя на него}
      Exit;         {Завершаем функцию} 
    end 
    else
      Curr := Curr^.Next;      {Перейти к следующей записи} 
  FindName := nil;         {В списке нет искомого объекта} 
end;{Конец FindName}
2) исправляем поиск - если не нашлось - нужно корректно обработать:
Код:
      5:
        begin
          Write('Введите тип процессора: ');
          Readln(NamFind);
          p := FindName(NamFind);
          if p=nil then WriteLn('Нет записей с таким процессором')
          else
             Writeln('Код: ', p^.Kod, 'Марка : ', p^.Marka, ' Процессор : ', p^.processor);
        end;

есть вопросы?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.10.2017, 16:17   #8
Romeshek
Пользователь
 
Регистрация: 29.09.2017
Сообщений: 33
По умолчанию

Спасибо, пойду исправлять
Romeshek вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В Pascal.net норм,а на PascalABC выдает ошибку palyach Паскаль, Turbo Pascal, PascalABC.NET 0 03.05.2013 23:41
Как скопировать результат выполнения программы из Pascal ABC? Женька Good Помощь студентам 1 18.12.2011 16:36
Pascal ABC.NET BuTaJI Помощь студентам 1 26.04.2011 20:10
Pascal ABC net DiLLe Паскаль, Turbo Pascal, PascalABC.NET 1 08.06.2010 23:20