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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.03.2014, 22:40   #1
serge-first
Пользователь
 
Регистрация: 27.02.2013
Сообщений: 66
По умолчанию

Подскажите, как исправить код, чтобы программа считывала не текстовый файл, а типизированный, как в условии? А то получается что файл при выходе текстовый.

Код:
{Описать структуру UCHENIK, содержащую следующие поля:
 
FIO-фамилия и инициалы ученика;
STREET-улица;
HOUSE-дом;
FLAT-квартира; 
 
Написать программу №1, выполняющую следующие действия:
 
Ввод данных с клавиатуры в массив UCH состоящий из N (не более 34) структур типа UCHENIK;
Вывод данных в типизированный файл записей с именем NAME; }
 
program lab9_1;
uses crt; 
 
type 
  uchenik = record //запись - ученик
    fio, street: string; //фио, улица
    house, flat: integer; //дом, квартира
  end;
 
var
  uch: array [1..34] of uchenik; 
 
begin
  var n: byte; 
  writeln('Введите число записей: ');
  readln(n); 
  
  for var i := 1 to n do 
  begin
    writeln('Вводим данные об ученике #', i);
    writeln('Введи ФИО ученика');
    readln(uch[i].fio); 
    writeln('Введи название улицы, где живёт ученик: ');
    readln(uch[i].street); 
    writeln('Введи номер дома, где живёт ученик: ');
    readln(uch[i].house);
    writeln('Введи номер квартиры, где живёт ученик: ');
    readln(uch[i].flat);
    writeln('-------------------------');
  end;
  
  writeln('Введи путь к файлу, куда нужно вывести введённые данные');
  var name := System.Console.ReadLine(); 
  var t: text; 
  assign(t, name); 
  rewrite(t); 
  
  for var i := 1 to n do 
  begin
    writeln(t, uch[i].fio); 
    writeln(t, uch[i].street);
    writeln(t, uch[i].house);
    writeln(t, uch[i].flat);
  end;
  close(t); 
  
  writeln('Готово!');
end.
Подскажите, как исправить код, чтобы программа считывала не текстовый файл, а типизированный, как в условии? А то получается что файл при выходе текстовый.

Код:
{Описать структуру UCHENIK, содержащую следующие поля:
 
FIO-фамилия и инициалы ученика;
STREET-улица;
HOUSE-дом;
FLAT-квартира; 
 
Написать программу №2, выполняющую следующие действия:
 
Чтение данных с типизированного файла записей с именем NAME в массив UCH;
Вывод на экран всей информации об учениках;
Вывод на экран фамилий тех учеников, которые проживают на улице, введенной с клавиатуры; если таких учеников нет, вывести соответствующее сообщение. }
 
{Автор: Швайко С.А.}
 
program lab9_2;
uses crt; 
 
type
  uchenik = record
    fio, street: string;
    house, flat: integer;
  end;
 
var
  uch: array [1..34] of uchenik;
 
begin
  writeln('Введи путь к файлу, откуда нужно считать данные');
  var name := System.Console.ReadLine();
  var t: text; 
  assign(t, name); 
  reset(t); 
  var n:=0; 
  
  while not eof(t) do 
  begin 
    inc(n); 
    readln(t, uch[n].fio); 
    readln(t, uch[n].street);
    readln(t, uch[n].house);
    readln(t, uch[n].flat);
    writeln('Ученик #', n); 
    writeln('ФИО: ', uch[n].fio);
    writeln('Название улицы, где живёт ученик: ', uch[n].street);
    writeln('Номер дома, где живёт ученик: ', uch[n].house);
    writeln('Номер квартиры, где живёт ученик: ', uch[n].flat);
    writeln('-------------------------');
  end;
  
  writeln();
  
  writeln('Введи название улицы, ФИО учеников с которой надо вывести');
  var street := System.Console.ReadLine(); 
  var flag := true; 
  foreach u4enik: uchenik in uch do 
    if u4enik.street = street then 
    begin
      writeln(u4enik.fio); 
      flag := false; 
    end;
  if flag then writeln('Нет таких учеников!'); 
  writeln('Работа окончена');
end.

Последний раз редактировалось Stilet; 25.03.2014 в 22:48.
serge-first вне форума Ответить с цитированием
Старый 26.03.2014, 09:18   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Подскажите, как исправить код, чтобы программа считывала не текстовый файл, а типизированный, как в условии?

Это исправить не просто, а ОЧЕНЬ ПРОСТО (изменения выделил цветом):
Код:
type
  uchenik = record
    fio, street: string[45];
    house, flat: integer;
  end;
....
begin
  writeln('Введи путь к файлу, откуда нужно считать данные');
  var name := System.Console.ReadLine();
  var t: file of uchenik; 
  assign(t, name); 
  reset(t); 
  var n:=0; 
  
  while not eof(t) do 
  begin 
    inc(n); 
    read(t, uch[n]);   {читаем полностью структуру из типизированного файл ОДНИМ оператором}
    writeln('Ученик #', n); 
    writeln('ФИО: ', uch[n].fio);
    writeln('Название улицы, где живёт ученик: ', uch[n].street);
    writeln('Номер дома, где живёт ученик: ', uch[n].house);
    writeln('Номер квартиры, где живёт ученик: ', uch[n].flat);
    writeln('-------------------------');
  end;
....
НО возникает резонный вопрос, а как Вы считаете, откуда возьмётся типизированный файл нужной структуры?! Сам зародится в недрах файловой системы? Или Вы его случайно на флешке найдёте?!

Нет, ему неоткуда самому по себе взяться, его Вам нужно будет предварительно СОЗДАТЬ!
Причём, это можно сделать ИСКЛЮЧИТЕЛЬНО программным способом (например, отдельной программкой):
Код:
type
  uchenik = record
    fio, street: string[45];
    house, flat: integer;
  end;
....
  var i, n: integer; 
  var t: file of uchenik; 
       u : uchenik;
begin

  writeln('Введи путь к файлу, который нужно создать: ');
  var name := System.Console.ReadLine();
  assign(t, name); 
  rewrite(t); 

  WriteLn('Введите, сколько записей должно быть в файле: ');
  n := Int32.Convert( System.Console.ReadLine() );

  for i:= 1 to n do 
  begin 
    System.Console.Write('ФИО: ');
    u.fio := System.Console.ReadLine();
    System.Console.Write('Название улицы, где живёт ученик: ');
    u.street := System.Console.ReadLine();
    ... и т.д.

    write(t, u); {сохранили введённые оператором данные в типизированный файл}
  end;
  Close(t);  {обязательно ЗАКРЫЛИ файл, чтобы изменения не потерялись}

end.

а почему Вы смешиваете операторы ReadLn/WriteLn (Паскаль) и Console.ReadLine (.NET) ?! Разве нельзя исполльзовать что-то одно?!!


p.s. я эту помесь Паскаля и .NET не очень знаю и люблю, поэтому возможны мелкие неточности. Допилите шероховатости, если что, самостоятельно

Последний раз редактировалось Serge_Bliznykov; 26.03.2014 в 09:21.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2014, 09:36   #3
serge-first
Пользователь
 
Регистрация: 27.02.2013
Сообщений: 66
По умолчанию

СПАСИБО, что уделили внимание!)

Но, у меня вопрос!?

При замене строки на:

Код:
  var t: file of uchenik;
Ошибка: Типизированный файл не может содержать элементы такого типа.
serge-first вне форума Ответить с цитированием
Старый 26.03.2014, 09:40   #4
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Вы в записи длину строки указывали явно? Я про
Код:
fio, street: string[45];
Если нет - укажите и попробуйте снова собрать.

Сцылко на источник
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 26.03.2014, 14:36   #5
serge-first
Пользователь
 
Регистрация: 27.02.2013
Сообщений: 66
По умолчанию

Спасибо. Помогло. Я и не знал, не проходили почему-то.

Ещё вопрос по записям:

Код:
begin
  writeln('Введи путь к файлу, откуда нужно считать данные');
  var name := System.Console.ReadLine();
Как мне записать, чтобы программа автоматически считывала данные из файла, т.е. без ввода пути к файлу?

И можно ли заменить строки:
Код:
  var name := System.Console.ReadLine();
  n := Int32.Convert( System.Console.ReadLine() );
...и т.д. на более простые, скажем так Я не помню)))

А так за всё вам большое спасибо, разъяснили)
serge-first вне форума Ответить с цитированием
Старый 26.03.2014, 14:38   #6
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Для открытия файла можно что-то типа
Код:
n := 'path/to/file';
Насчет заменить - а нафига?
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 26.03.2014, 14:42   #7
serge-first
Пользователь
 
Регистрация: 27.02.2013
Сообщений: 66
По умолчанию

Такие записи:

Код:
n := Int32.Convert( System.Console.ReadLine() )
Я не проходил, не знаю как их в блок-схеме описать))) Я понимаю, что это всё правильно, но мы так не записывали, а как записывали вспомнить не могу.
serge-first вне форума Ответить с цитированием
Старый 26.03.2014, 14:44   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Как мне записать, чтобы программа автоматически считывала данные из файла, т.е. без ввода пути к файлу?
можно имя прописать прямо в коде:
Код:
const name = 'VashFile.dat';
Цитата:
И можно ли заменить строки:

Код:

var name := System.Console.ReadLine();
n := Int32.Convert( System.Console.ReadLine() );

...и т.д. на более простые, скажем так Я не помню)))
ну так напишите вместо этого:
Код:
Readln(name);
Readln(n);

Цитата:
Я не проходил, не знаю как их в блок-схеме описать)))
Это операции ввода-вывода.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.03.2014, 14:46   #9
serge-first
Пользователь
 
Регистрация: 27.02.2013
Сообщений: 66
По умолчанию

Всё, вспомнил) Вот я чайник)

Спасибо)
serge-first вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PascalABC.NET v1ktor Паскаль, Turbo Pascal, PascalABC.NET 0 21.06.2011 13:58
Типы PascalABC.NET ofenod Помощь студентам 0 14.05.2011 22:20
PascalABC.net gogomon93 Помощь студентам 5 17.04.2011 18:48
Типизированный файл с натуральными числами. Числа, встречающиеся 1 раз переписать в другой файл [Паскаль] mifomen Помощь студентам 7 16.12.2010 22:00
PascalABC.net *stRong* Помощь студентам 2 10.06.2010 17:50