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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.06.2012, 08:57   #1
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию Почему read не вводит строку со структуры?

Код:
uses Crt;

type
 NOTE=record
  telephone_number:integer;
  date:array[1..3]of integer;
  name:string;
 end;

var a:array[1..100] of NOTE; k,i:integer;

procedure GetNote(ii:integer);
begin
 for i:=k to ii do
 begin                                                  
 writeln('Введите Имя:                   ');
 readln(a[i].Name);
 writeln('Введите номер телефона:        ');
 read(a[i].telephone_number);
 writeln('Введите введите дату рождения: ');
 read(a[i].date[1]); read(a[i].date[2]); read(a[i].date[3]);
 end; k:=k+ii;
end;

procedure PrintNote(obj:NOTE);
begin                                                    
 writeln('Имя:            ', obj.name);
 writeln('Номер телефона: ', obj.telephone_number);
 writeln('Дата рождения:  ', obj.date[1], ' ', obj.date[2], ' ', obj.date[3]);
end;


begin
k:=1;
write('Сколько элементов ввести? '); read(i);
GetNote(i);

PrintNote(a[1]);
end.
WebbMan вне форума Ответить с цитированием
Старый 26.06.2012, 09:29   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

почитайте, чем отличаются Read и ReadLn..

фактически, ответ на ваш вопрос. вам нужно
заменить read(i) на ReadLn(i) и когда ввели дату - в конце выполнить Readln

но я позволил себе ещё небольшие изменения в код внести (избавился от глобальных переменных, которые - ЗЛО!

Код:
uses Crt;

const
  maxRecord = 100;
type
  NOTE = record
    telephone_number: integer;
    date: array[1..3] of integer;
    name: string[100];
  end;

type
  ArrNote = array[1..maxRecord] of NOTE;

procedure GetNote(ii: integer; var aa: ArrNote; var k: integer);
var i: integer;
begin
  for i := k to ii do
  begin
    write('Введите Имя:                   ');
    readln(aa[i].Name);
    write('Введите номер телефона:        ');
    readln(aa[i].telephone_number);
    write('Введите введите дату рождения: ');
    read(aa[i].date[1]); read(aa[i].date[2]); readln(aa[i].date[3]);
  end;
  k := k + ii;
end;

procedure PrintNote(obj: NOTE);
begin
  writeln('Имя:            ', obj.name);
  writeln('Номер телефона: ', obj.telephone_number);
  writeln('Дата рождения:  ', obj.date[1], ' ', obj.date[2], ' ', obj.date[3]);
end;

procedure PrintAll(const aa: ArrNote; N: integer);
var i: integer;
begin
  ClrScr;
  for i := 1 to N do begin
    PrintNote(aa[i]);
    WriteLn('----------------------------');
  end;
end;

var a: ArrNote;
  k, n: integer;

begin
  k := 1;
  write('Сколько элементов ввести? ');
  readln(n);

  GetNote(n, a, k);

  PrintAll(a, n);
  Readln
end.

Последний раз редактировалось Serge_Bliznykov; 26.06.2012 в 09:32.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.06.2012, 09:40   #3
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

Всё ясно спс!
WebbMan вне форума Ответить с цитированием
Старый 26.06.2012, 10:08   #4
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

А как сделать чтение с файла и запись в файл, сразу структуры?
Почему так ругается?
Код:
uses Crt;

const
  maxRecord = 100;
type
  NOTE = record
    telephone_number: integer;
    date: array[1..3] of integer;
    name: string[100];
  end;

type
  ArrNote = array[1..maxRecord] of NOTE;

procedure GetNote(ii: integer; var aa: ArrNote; var k: integer);
var i: integer;
begin
  for i := k to ii do
  begin
    write('Введите Имя:                   ');
    readln(aa[i].Name);
    write('Введите номер телефона:        ');
    readln(aa[i].telephone_number);
    write('Введите введите дату рождения: ');
    read(aa[i].date[1]); read(aa[i].date[2]); readln(aa[i].date[3]);
  end;
  k := k + ii;
end;

procedure PrintNote(obj: NOTE);
begin
  writeln('Имя:            ', obj.name);
  writeln('Номер телефона: ', obj.telephone_number);
  writeln('Дата рождения:  ', obj.date[1], ' ', obj.date[2], ' ', obj.date[3]);
end;

procedure PrintAll(const aa: ArrNote; N: integer);
var i: integer;
begin
  ClrScr;
  for i := 1 to N do begin
    PrintNote(aa[i]);
    WriteLn('----------------------------');
  end;
end;

var a: ArrNote;
  k, n, flag: integer;
  f: file;
begin
  k := 1; {flag:=10;}
 { while(flag <> 0)
  writeln(1. Ввести данные:);
  writeln(2. Вывести данные:);
  writeln(3. );
  writeln(4. );}
  

  Assign(f, 'base_pas');
  Reset(f);
  Read(f, ArrNote);
  
  write('Сколько элементов ввести? ');
  readln(n);
  
  GetNote(n, a, k);

  PrintAll(a, n);
  Readln
end.
WebbMan вне форума Ответить с цитированием
Старый 26.06.2012, 10:14   #5
WebbMan
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 168
По умолчанию

как сделать типизированный файл на структуру NOTE?
WebbMan вне форума Ответить с цитированием
Старый 26.06.2012, 10:21   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

во-первых, вам нужно использовать не абстрактный f : file, а строго ТИПИЗИРОВАННЫЙ файл! (это файл ОПРЕДЕЛЁННОГО типа.

во-вторых, можно выбрать два подхода.
1-й (рекомендую). каждый элемент файла - это ОДНА запись типа NOTE. Это позволит эффективно читать/писать только НУЖНУЮ запись.
Это подход не зависит от размерности массива в программе. Её можно изменять так, как удобно (и даже использовать динамические структуры)
именно такой подход и используется в подавляющем большинстве случаев использования типизированных файлов!

вот пример, как можно записать ваш массив в файл такого типа:
Код:
var
   f : file of NOTE;
...
  Assign(f, 'base_pas.bin'); {расширение не обязательно, 
         но я рекомендую придумать какое-нибудь типа .DAT или .BIN или .NOT и т.д. 
         исключительно для удобства при просмотре файловой папки}  

  Rewrite(f); {перезаписали файл. всё что было - стёрли и начали писать с нуля}
 
  for i:=1 to N do
    Write(f, A[i] );
...
  Close(f); {обязательно закрыли файл, чтобы не потерять записанное}
читать в массив - точно таким же образом можно.



2-й. (не рекомендую). Вы именно его и пытались реализовать.
назначаете файл - как типизированный, где ОДИН элемент - это ЦЕЛИКОМ весь массив:
Код:
var f : file of ArrNote;
удобства. записать (и прочитать ) ВЕСЬ массив ЦЕЛИКОМ можно ОДНОЙ строчкой кода.
НЕУДОБСТВА!. Если изменить размер массива, тогда прочитать записанный ранее файл будет НЕЛЬЗЯ (ведь тогда размер структуры изменяется). Даже если у вас в массиве используется один элемент (N равно 1), на диске всё развно запишется 100 (maxrecord) элементов типа NOTE.

короче, прежде чем Вы выберёте второй способ использования типизированного файла, рекомендую трижды подумать - точно ли это Вам надо!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
почему в данной программе по условию мы вводит отрицательные числа? Настяyu Помощь студентам 20 28.12.2011 15:09
почему не правильно заполняет поля структуры ... ??? MichaelRED Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 09.06.2010 17:49
Почему вылетает ошибка Read beyond end of file? KoBRaAndrey Общие вопросы Delphi 4 24.01.2010 11:24
Почему не вводит в поток??? girkoff Общие вопросы C/C++ 1 07.11.2009 14:27
Программа Вводит символьную строку и число N и выводит строку, состоящую из первых N символов (С++) Yulai Помощь студентам 1 11.05.2009 11:39