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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.11.2011, 17:34   #1
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию Указатели.

Составить программу, в которой переменная-указатель ссылается на запись.
Суть задания:
Задан массив записей с информацией о продукции предприятия: наименование изделия, код изделия, количество, цена. Упорядочить этот массив по возрастанию кода изделия и его цены.

Собственно у меня в процесе возникли вопросы ну и соответственно ошибки.Если у кого есть пара лишних минут подсобите советом.
Ошибку выделил красным.
На даном этапе выскочило вот такое: "Cannot read or write variables of this type", заменил поначалу integer на byte не помогло. Но что-то подсказало что не в этом соль. Когда заменил выскочила та же ошибка.

Код:
Program Ykazatel;
 Uses crt;
  type
   Prodykcia = record
   Nazvanie: string;
   cod: integer;
   Koli4estvo: integer;
   Cena: real;
  end;
 var A: array [1..4] of ^Prodykcia;
 i: integer;

begin
clrscr;
 for i:= 1 to 4 do new(a[i]);
  for i:=1 to 4 do begin
   write(i:3,':nazvanie');readln(a[i]^,nazvanie);
  end;
 for i:=1 to 4 do
  write(a[i],' ');
 for i:=1 to 4 do dispose(a[i]);
readln;
end.
Заранее благодарен. Думаю вопросы ещё будут, так как с указателями сталкиваюсь впервые.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 27.11.2011, 10:21   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Леший, так я тя же запятая вместо точки )). Исправь, и все будет Ок.
Дальше не смотрел.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 27.11.2011, 10:43   #3
Karpinsky
Подтвердите свой е-майл
 
Регистрация: 19.10.2011
Сообщений: 28
По умолчанию

Цитата:
Исправь, и все будет Ок.
Не будет. Надо еще вывод исправлять. Паскаль из коробки не умеет записывать структуры типа Prodykcia И даже указатели на них (что и делается в программе) - тоже не умеет. Выводить надо каждое поле по отдельности...
Karpinsky вне форума Ответить с цитированием
Старый 27.11.2011, 13:28   #4
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Tinman, ты ещё не все перлы видел какие я умею выдавать :D Но таки попрошу глянуть снова, пусть даже и бегло, и дать критику =)

Почти доделал. Но как писал выше "будут вопросы", собственно правильной ли я вообще дорожкой потопал, делая программу? Или же начал с указателей, а закончил просто виводом информации на экран( без участи сих же указателей ).
В даном варианте пошол по пути сравнения (функция Compare ) , ну и после упорядочивания по возрастанию( процедура Sort ).
Код:
Program Ykazatel;
 Uses crt;
 const n=2;
type
    Prod = ^Prodykcia;
    Prodykcia = record
    nazvanie: string;
    cod: integer;
    Kolichestvo: integer;
    Cena: real;
end;
var A: array [1..n] of ^Prodykcia;
    i, j: integer;
function Compare_cod (C1,C2: Prodykcia):integer;  
begin                                          
     if C1.cod > C2.cod then Compare_cod:= 1
     else if C1.cod = C2.cod then Compare_cod:= 0;
end;
{function Compare2 (C1,C2: Prodykcia):real;
begin
     if C1.cena > C2.cena then Compare2:= 1
     else if C1.cena > C2.cena then Compare2:= 0;
end;}
Procedure Sort ;
 var i,j: integer;
     buffer: Prodykcia;
 begin
  for i:=1 to Pred(N) do
   for j:= Succ(i) to n do
    if Compare_cod (a[i]^, a[j]^) > 0 then
     begin
      buffer:= a[i]^;
      a[i]^:= a[j]^;
      a[j]^:= buffer;
     end;
 end;

begin
clrscr;
 for i:= 1 to n do new(a[i]);
  for i:=1 to n do with a[i]^ do begin
   write('nazvanie: ');readln(a[i]^.nazvanie);
   write('cod: ');readln(a[i]^.cod);
   write('Kolichestvo: ');readln(a[i]^.kolichestvo);
   write('Cena: ');readln(a[i]^.Cena);
  end;
Sort;
 for i:=1 to n do with a[i]^ do begin
  writeln(nazvanie);
  writeln(cod);
  writeln(kolichestvo);
  writeln(Cena:3:2);
 end;
 for i:=1 to n do dispose(a[i]);
readln;
end.
Люблю на ты.Я человек простой

Последний раз редактировалось Leshii; 27.11.2011 в 13:50.
Leshii вне форума Ответить с цитированием
Старый 27.11.2011, 14:54   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, это уже что-то!
Почти хорошо.

недостатки решения (внимание! порядок указания недочётов произвольный, никакого приоритета в перечислении их нет!)
1) зачем создавать элементы в отдельном цикле? Логично это делать в том же цикле, где и читаете элементы исходного массива

2) Вы при вводе значений указали конструкцию with a[i]^
однако её не пользуетесь (эта конструкция позволяет "опускать" указания объекта, к которому идёт обращение. Вы же всё равно полностью указываете элемент. Либо опустите имена (как это Вы сделали в процедуре вывода данных), либо уберите конструкцию with a[i]^

3) теперь посерьёзней претензия. А зачем Вы меняете СОДЕРЖИМОЕ записей массива, хотя Вам достаточно поменять местами УКАЗАТЕЛИ ?!
т.е. надо менять местами не a[i]^ и a[j]^
а элементы a[i] и a[j]
Это принципиально и важно!

4) Ещё важно. а если C1.cod < C2.cod то какое значение вернёт функция Compare_cod Ноль? -1 ? 23410 ? Или какое?
Это важно учесть. Нужно или проиницилизировать значение функции перед проверками, или написать так IF ELSE - чтобы не было вариантов, когда Compare_cod не будет присвоено значение.

5) ну и последнее маленькое замечание.
в условиях исходной задачи сказано:
"по возрастанию кода изделия и его цены"
Где у Вас проверка на возрастание цены ?
hint. если нужно сортировать по двум и более параметрам, значит надо учитывать, что первый из сортируемых параметров может совпасть. В этом случае, если первый параметер(критерий), по которому сортируем, одинаков у двух записей, тогда сравниваем записи по второму критерию..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 28.11.2011, 11:51   #6
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Прислушался переделал. Узнал что лучше без процедур и функций ( я уже походу дела полез в списки ). Вот собственно понял что надо сделать вот только касательно сортировки по двум параметрам это будет выглядеть приблизительно так ?

Код:
IF a[i]^.cod = cod1 then begin
   if a[i]^.cena = cena1
    ....
Мог напортачить есть ошибки но к замечания прислушался.

Код:
Program Vkazivnuk;
Uses crt;
const n=2;
type
  Prodykcia = record
  nazva: string;
  cod: integer;
  Kilkist: integer;
  Cina: real;
end;
var A:array [1..n] of ^Prodykcia;
    i,j, Cod1 :integer;
    buffer: Prodykcia;
    Cina1: real;
begin
clrscr;
cod1:=1;
Cina1:=1;
 for i:=1 to n do new(a[i]);
  for i:=1 to n do begin
      write(i,' Vvedit nazvy: ');readln(a[i]^.nazva);
      write('   Vvedit cod: ');readln(a[i]^.cod);
      write('   Vvedit Kilkist: ');readln(a[i]^.Kilkist);
      write('   Vvedit Ciny: ');readln(a[i]^.Cina);
  end;
  for i:=1 to Pred(n) do
   for j:=Succ(i) to n do
    if (a[i]^.cod = cod1)  then
       buffer:=a[i]^;
       a[i]:=a[j];
       a[j]^:=buffer;
 for i:=1 to n do
     writeln(i,'|',a[i]^.nazva:3,'|',a[i]^.cod:6,'|',a[i]^.Kilkist:8,'|',a[i]^.Cina:10:2);
for i:=1 to n do dispose(a[i]);
readkey;
end.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Старый 03.12.2011, 17:37   #7
Leshii
Форумчанин
 
Регистрация: 26.07.2011
Сообщений: 376
По умолчанию

Ну собственно с учётом выше сказанного и предложенного получилость вот что:

Теперь вопрос, правильно ли я сделал?

Условие:
Задан массив записей с информацией о продукции предприятия: наименование изделия, код изделия, количество, цена. Упорядочить этот массив по возрастанию кода изделия и его цены.

Код:
Program Vkazivnuk;
Uses crt;
const n=4;
type
  Prodykcia = record
  nazva: string;
  cod: integer;
  Kilkist: integer;
  Cina: real;
end;
var A:array [1..n] of ^Prodykcia;
    i,j :integer;
    buffer, buffer_two: pointer;

begin
clrscr;

 for i:=1 to n do new(a[i]);
  for i:=1 to n do begin
      write(i,' Vvedit nazvy: ');readln(a[i]^.nazva);
      write('   Vvedit cod: ');readln(a[i]^.cod);
      write('   Vvedit Kilkist: ');readln(a[i]^.Kilkist);
      write('   Vvedit Ciny: ');readln(a[i]^.Cina);
  end;
  for i:=1 to Pred(n) do
   for j:=Succ(i) to n do
    if a[i]^.cod > a[j]^.cod then begin
         buffer:=a[i];
         a[i]:=a[j];
         a[j]:=buffer;
    end
    else if a[i]^.cina > a[j]^.cina  then begin
         buffer_two:=a[i];
         a[i]:=a[j];
         a[j]:=buffer_two;
    end;
  writeln;
  writeln('n   nazva     cod    Kilkist    Cina');
  writeln('------------------------------------');
  for i:=1 to n do begin
     writeln(i,'|',a[i]^.nazva,' | ',a[i]^.cod,' | ',a[i]^.Kilkist,' | ',a[i]^.Cina:3:2);
  end;
  for i:=1 to n do dispose(a[i]);
readkey;
end.
Люблю на ты.Я человек простой
Leshii вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
указатели Narim Общие вопросы C/C++ 10 06.04.2011 20:01
Указатели(С++) Scarletred Помощь студентам 0 05.04.2010 22:53
Указатели(С++) Scarletred Помощь студентам 0 05.04.2010 22:50
C++ Указатели KLOP Помощь студентам 4 06.03.2010 20:27
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39