Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с массивом типа запись. 
:(
    Опции темы
Merry_milkman
Дата 17.3.2005, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Пишу программу(консольное приложение),некое подобие записной книжки.В меню присутствуют пункты : добавить новую запись ,просмотр записей,выход.Добавлять можно имя фамилию и номер телефона.
в меню просмотра нужно сделать возможность удаления записи.Также надо сделать возможность занести данные в файл.
Я написал уже головную часть программы,довить запись и просмотреть запись я решил вынести в отдельные процедуры.В програме я использую массив типа запись,в каждом элементе три поля(имя,фамилия,номер).
Вот что у меня пока что получилось:
Код

program Blocknot;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type TRec = record         
Name    : string[100];       
Surname : string[100];
PhNum   : integer;
end;

var
p : integer;
i : integer;                     {счетчик цикла}
com : integer;
n : integer;
Notebook : array of TRec;

{-------------------------------------------------}
{      Раздел описания подпрограмм     }

procedure Rec (arr:array of TRec);
  begin
+++процедура создающая новую запись и пишущая в файл++++++++
  end;

procedure view(arr : array of TRec);
  begin
++++++++процедура просмотра записей++++++++++
  end;

{-------------------------------------------------}

begin
  { TODO -oUser -cConsole Main : Insert code here }
  writeln('Enter the size of Blocknot');
  read(n);
  SetLength(Notebook,n);


  while (com<>3) do
   begin
      writeln('                         Main menu');
      writeln('1-Greate a new record in Blocknot');
      writeln('2-View records');
      writeln('3-Exit');
      writeln('');
      Read(com);
      writeln('');
      if (com<1) or (com>3)then
       begin
         writeln('You must enter 1 or 2 or 3');
         writeln('');
       end;
           case com of
                1:Rec(Notebook,p);
                2:view(Notebook);
           end
   end;
end.


Проблема в том,что у меня не получается ничего записать в массив,как только непробовал к нему обращаться.
Помогите пожалуйста с процедурой Rec.

PM MAIL   Вверх
Girder
Дата 17.3.2005, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



1)Type
TArrRec=array of TRec; - для удобства
2)procedure Rec (arr:TArrRec);...procedure view(arr :TArrRec); - для удобства
3)SetLength(arr,Length(arr)+1); - добавляем запись
arr[Length(arr)-1].PhNum:=0 - что-то пишим




--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Merry_milkman
Дата 17.3.2005, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Цитата

1)Type
TArrRec=array of TRec; - для удобства
2)procedure Rec (arr:TArrRec);...procedure view(arr :TArrRec); - для удобства
3)SetLength(arr,Length(arr)+1); - добавляем запись
arr[Length(arr)-1].PhNum:=0 - что-то пишим

Не могли бы вы поподробнее объяснить. smile
PM MAIL   Вверх
Merry_milkman
Дата 17.3.2005, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Блин,ничего не получается.Почему вот так процедура работает:
Код

procedure Rec (arr:array of TRec;n : integer);
var
j : integer;
  begin
   for j:=1 to n do
    begin
    arr[j].Name:='hello';
    writeln(arr[j].Name)
    end;
   end;

А если вставить в процедуру read , то нифига не работает:
Код

procedure Rec (arr:array of TRec;n : integer;na : string);
var
j : integer;
  begin
   for j:=1 to n do
    begin
    read(na);
    arr[j].Name:=na;
    writeln(arr[j].Name)
    end;
   end;

Я тока разбираюсь с подпрограмами,динамическими массивами(тока сегодня начал изучать).Если не сложно напишите пожалуйста процедуру Reс smile .
А может нужна не процедура а функция?

З.Ы. to Girder:
добавить запись-это имеется заполнить поля(Name,Surname,PhNum) одного из элементов массива.Т.е. добавить в записную книжку запись о новом человеке.
PM MAIL   Вверх
Merry_milkman
Дата 18.3.2005, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Теперь вообще вылетает и выдает такую ошибку:
Project Blocknot.exe raised exception class EInOutError with message 'I/O error 103'.Process stopped.Use step and run to continue.
PM MAIL   Вверх
Snowy
Дата 18.3.2005, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



1. зачем ты передаешь массив, как параметр? Он же у тебя и так глобальный.
2.
Цитата(Merry_milkman @ 18.3.2005, 00:24)
read(na);
Если ты вводишь na, то объяви его внутри функции, а не передавай, как параметр.

PM MAIL   Вверх
Girder
Дата 18.3.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лентяй 2
***


Профиль
Группа: Участник Клуба
Сообщений: 1993
Регистрация: 12.5.2004

Репутация: 31
Всего: 155



Цитата(Merry_milkman @ 17.3.2005, 23:54)
З.Ы. to Girder:
добавить запись-это имеется заполнить поля(Name,Surname,PhNum) одного из элементов массива.Т.е. добавить в записную книжку запись о новом человеке.
smile Что-то тормознул smile

PS: read(na) замени на readln(na)




--------------------
Как слышим, так и пишим.
Истина где-то там...
PM   Вверх
Pakshin A. S.
Дата 19.3.2005, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Код

program Blocknot;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type 
 TRec = record         
  Name    : string[100];       
  Surname : string[100];
  PhNum   : integer;
 end;
 TArray = array of TRec;

{-------------------------------------------------}
{      Раздел описания подпрограмм     }

procedure CreateRec(var arr: TArray);
begin
 SetLength(arr, Length(arr) + 1);
end;
 

procedure AddRec (var arr:TArray);
begin
   readln(arr[High(arr)].Name);
   {...}
end;

procedure view(arr : TArray);
var
 i:integer;
begin
 for i:=Low(arr) to High(arr) do
  begin
   writeln(arr[i].Name);
   {...}
   readln; 
  end;
end;

{-------------------------------------------------}

var
com : integer;
Notebook : TArray;

begin
  repeat
      writeln('                         Main menu');
      writeln('1-Сreate a new record in Blocknot');
      writeln('2-View records');
      writeln('3-Exit');
      writeln;
      Read(com);
      writeln;
      if (com<1) or (com>3)then
       begin
         writeln('You must enter 1 or 2 or 3');
         writeln;
       end;
           case com of
                1: begin
                     CreateRec(Arr);
                     AddRec(Notebook);
                    end;
                2:view(Notebook);
           end
  until com = 3;
end.



Вот... подправленный вариант с точки зрения "культуры"
Добавлено @ 12:34
Можно еще и вписать суда оператор присоединия with при работе с записями... smile smile

Это сообщение отредактировал(а) Pakshin A. S. - 19.3.2005, 12:36
PM   Вверх
Merry_milkman
Дата 19.3.2005, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Вообщем почемуто не хочет работать read,readln когда надо считать значение типа string.
Например тут:
Код

.......
n : integer;

begin
  writeln('Enter the size of Blocknot');
  read(n);
......

все работает нормально.
А тут:
Код

imya : string;

begin
  readln(imya);
....

не работает.Так как будто этой строчки вообще нет!Ее просто перепрыгивает.
Не знаете почему может не работать read и readln(в случае со строками)?
PM MAIL   Вверх
Pakshin A. S.
Дата 19.3.2005, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Приведи более распространенный пример!!!
Например Вот это не роботает:
Код

var
 s:string;
begin
 readln(s);
 writeln('s');
end.

А вот это уже работает:
Код

var
 s:string;
begin
 readln(s);
 writeln(s);
end.


Просто компилятор выбрасывает работу с теми переменными, с оторыми потом не ведется никакой работы... smile

ДАвай сюда пример и я помогу тебе его переделать так, как надо... smile Если по задаче, то смотри мой пример... smile
PM   Вверх
Merry_milkman
Дата 20.3.2005, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 17.3.2005

Репутация: нет
Всего: нет



Всем спасибо за помощь.Прога готова.Вот как выглядит финальная версия smile .
Код

program Blocknot;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
TRec = record                {создаем тип запись с тремя         }
Name    : string[100];       {полями: имя,фамилия,номер телефона }
Surname : string[100];
PhNum   : integer
end;



var
com : integer;                 {Команда вводимая пользователем     }
n : integer;                   {Размер записной книжки             }
Notebook : array of TRec;      {Массив для хранения вводимых данных}
i : integer;
imya : string[100];
fam : string[100];
num : integer;
anshwer : string[100];
f : text;
g : integer;
del : integer;

{--------------------------------------}
{      Раздел описания подпрограмм     }

procedure view(arr : array of TRec);
var
cel : integer;
  begin
   writeln('          View menu');
   writeln('Enter number of cell');
   readln(cel);
   writeln;
   with arr[cel] do
    begin
     writeln('--------');
     Writeln('Name :',Name);
     writeln('Surname :',Surname);
     writeln('Phone Number :',PhNum);
     writeln('--------');
     writeln;
    end;
  end;

begin
  { TODO -oUser -cConsole Main : Insert code here }
  writeln('Enter the size of Blocknot');
  read(n);
  SetLength(Notebook,n);
  writeln;

  while (com<>4) do
   begin
      writeln('+++++++++++++++++++++++++++++++++');
      writeln(       'Main menu');
      writeln('1-Greate a new record in Blocknot');
      writeln('2-View records');
      writeln('3-Delete record');
      writeln('4-Exit');
      writeln('+++++++++++++++++++++++++++++++++');
      writeln('');
      Read(com);
      writeln('');
      if (com<1) or (com>4)then
       begin
         writeln('You must enter 1 or 2 or 3 or 4');
         writeln('');
       end;
           case com of
                1:begin
                    writeln('-----');
                    writeln('Enter number of cell');
                    readln(i);
                    writeln('-----');
                    writeln('Enter name');
                    readln(imya);
                    writeln('-----');
                    writeln('Enter surname');
                    readln(fam);
                    writeln('-----');
                    writeln('Enter phone number');
                    readln(num);
                    writeln('-----');
                    writeln;
                    with Notebook[i] do
                     begin
                        Name:=imya;
                        Surname:=fam;
                        PhNum:=num;
                     end;
                    writeln;
                    writeln('Record this data in file(y\n)?');
                    readln(anshwer);
                    if anshwer = 'y' then
                      begin
                        assign(f,'test.txt');
                        rewrite(f);
                          writeln(f,Notebook[i].Name);
                          writeln(f,Notebook[i].Surname);
                          writeln(f,Notebook[i].PhNum);
                        close(f);
                        writeln('Record in file finished');
                        writeln;
                      end;
                  end;
                2:view(Notebook);
                3:begin
                  writeln;
                  writeln('Enter number cell');
                  readln(del);
                     with Notebook[del] do
                       begin
                        Name:='';
                        Surname:='';
                        PhNum:=0;
                        Writeln('Delete finished');
                       end;
                  end;
           end;
   end;
   end.

PM MAIL   Вверх
Pakshin A. S.
Дата 21.3.2005, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



smile smile
Плохо! Очень плохо! Щас пойду переделаю тебе, как лучше...
PM   Вверх
~FoX~
Дата 21.3.2005, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



ИМХО приемлемо, но телефонный номер не должен иметь тип интеджера. Потому как разделители в нем присутствуют. Хотя я бы использовал типизированный файл и не заморацивался. smile


--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Pakshin A. S.
Дата 21.3.2005, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



Код

program Blocknot;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
 TUser = record
  Name: string;
  Surname: string;
  PhNum: integer;
 end;
 TUserA = array of TUser;

procedure IncLen(var m: TUserA; k:integer);
begin
 SetLength(m, Length(m) + k);
end;

procedure AddUser(var m: TUserA);
var
 n: integer;
begin
 writeln('-----');
 writeln('Enter number of cell ( >0)');
 readln(n);
 if n > Length(m)
  then
   IncLen(m, n-Length(m));
 with m[n-1] do
  begin
   writeln('-----');
   writeln('Enter name');
   readln(name);
   writeln('-----');
   writeln('Enter surname');
   readln(surname);
   writeln('-----');
   writeln('Enter phone number');
   readln(phnum);
  end;
end;

procedure DelUser(var m: TUserA);
var
 n:Integer;
begin
 writeln;
 writeln('Enter number cell');
 readln(n);
 with m[n] do
  begin
   name:='';
   surname:='';
   phnum:=0;
  end;
 Writeln('Delete finished');
end;

procedure Show(m :TUserA);
var
 n:integer;
begin
 writeln('Enter number of cell');
 readln(n);
 with m[m] do
   if (name <> '') and (surname <> '') and (phnum <> 0)
    then
     begin
      writeln('--------');
      Writeln('Name :',Name);
      writeln('Surname :',Surname);
      writeln('Phone Number :',PhNum);
      writeln('--------');
      writeln;
     end;
end;

var
 UserA: TUserA;
 com:integer;
begin
 repeat
      writeln('+++++++++++++++++++++++++++++++++');
      writeln(       'Main menu');
      writeln('1-Greate a new record in Blocknot');
      writeln('2-View records');
      writeln('3-Delete record');
      writeln('4-Exit');
      writeln('+++++++++++++++++++++++++++++++++');
      writeln('');
      Read(com);
      writeln('');
      if (com<1) or (com>4)then
       begin
         writeln('You must enter 1 or 2 or 3 or 4');
         writeln('');
       end;
           case com of
            1: AddUser(UserA);
            2: Show(UserA);
            3: DelUser(UserA);
           end;
 until com = 4;
end.

Вот...

Здесь нам нужно разобраться с некоторыми вещами:
1) Нужны еще много проверок вводимых данных
2) Использование файла... Нужно? Если да, то надо все от начала до конца организовать через типизированный
3) Телефонный номер... smile smile
PM   Вверх
~FoX~
Дата 21.3.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЕ рыжий!!!
****


Профиль
Группа: Участник Клуба
Сообщений: 2819
Регистрация: 8.10.2003
Где: Зеленоград

Репутация: 13
Всего: 68



[offtop]Идея.......реализовать все это на основе mdb через JET и ADO smile[/offtop]

Что то я не пойму в чем смысл этого дела?
Код

procedure IncLen(var m: TUserA; k:integer);
begin
 SetLength(m, Length(m) + k);
end;

И нафига в качетсве параметра передавать "m: TUserA", если он и так глобально описан?



--------------------
user posted image
…множественность никогда не следует полагать без необходимости…
PM MAIL WWW ICQ Jabber   Вверх
Pakshin A. S.
Дата 21.3.2005, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: 21
Всего: 61



1) Это просто так... Здесь реализован вариант безразмерной записной книжки...
2) А нифиг описывать глобально? Вообще все эти процедуры должны быть в отдельном модуле, а все рабочая часть из этих профедур в библиотеке, к примеру... Надо привыкать все по-человечески делать... smile
PM   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1371 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.