Форум 3DNews

Форум 3DNews (http://forum.3dnews.ru/index.php)
-   Программирование (http://forum.3dnews.ru/forumdisplay.php?f=44)
-   -   Помогите усовешенствовать и разобратся - Задание в паскале. (http://forum.3dnews.ru/showthread.php?t=45109)

flashg 02.08.2005 18:04

Помогите усовешенствовать и разобратся - Задание в паскале.
 
Мне было задана куча заданий - и вот решил тут одно заданице набить.

Посмотрел пример и набил - и получается. Но хочу усовершенствовать работу программы.

Вот задание: РАЗРАБОТАТЬ БАЗУ ДАННЫХ "ДЕТСКАЯ БИБЛИОТЕКА" (ФАМИЛИЯ, ИМЯ, ОТЧЕСТВО, АВТОРА КНИГИ, НАЗВАНИЕ КНИГИ, ГОРОД И ИЗДАТЕЛЬСТВО, ГОД ВЫПУСКА). ВЫВЕСТИ НА ЭКРАН ДАННЫЕ О КНИГАХ, ВЫПУЩЕННЫХ В 1995 ГОДУ.
======================================
Вот что я набил:
-----------------------
Program pr_12;
uses crt;
type person=record
sname,name,otc,avtr,nb,pub,year:string[14];
end;

var rbook:array[1..20] of person;
f1,f2:text; i,n:integer;
st1:string;

BEGIN clrscr; Assign(f1,'p1.pas'); Rewrite(f1);

writeln('Введите количество записей'); readln(n);
for i:=1 to n do with rbook[i] do begin

WRITELN('Фамилия '); readln(sname); writeln(f1,sname);

WRITELN('имя'); readln(name); writeln(f1,name);

WRITELN('Отчество'); readln(otc); writeln(f1,otc);

WRITELN('Автар книги');readln(avtr); writeln(f1,avtr);

WRITELN('Название книги');readln(nb); writeln(f1,nb);

WRITELN('Издательство');readln(pub); writeln(f1,pub);

WRITELN('Год выпуска');readln(year); writeln(f1,year);


end;


Assign(f2,'p2.pas'); rewrite(f2);
Writeln('Введите год');
Readln(st1); Writeln('Ф И О Автар книги Название книги Издательство Год выпуска');
Writeln(f2,'Ф И О Автар книги Название книги Издательство Год выпуска');
for i:=1 to n do begin With rbook[i] do
if year=st1 then begin
Writeln(sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
Writeln(f2,sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
end; end;
close(f1); Close(f2); readln; END.
-------------------------------------------
!!! как в выше описанной программе (что вней под корректировать чтобы) - сделать так чтобы после того как я введу N количество данных она не спрашивал по какому году искать а сразу за меня искала и вывела резултьата года 1995 !!! - покажите какие строки на что заменить.
--------------------------------------------
программа работает но вот что мне не нравится - фантазировать имена фаимли отчества итд для N количества персон - это немного нудно

и я подумал а почему бы не сделать так создать уже файл P1.pas вбить туда эти данные (вот тока сразу возникает вопрос каким оброзом) запустив уже удавшеюся программуу и минутку думая на соченяв имена прогнав её выполнев все действия я уже получил этот файл мне тока остаётся переписать программу чтобы уже содержимое файла считать)

вот как выглядит содержимое файла:B]P1.pas[/B] :
Федотов
Игорь
Алексеев
Азимов
Академия


это на одну персону данные

я прочитал в книге чтобы паскаль считал мне этот файл надо ввести вот такую строку Assign(f1,'p1.pas'); reset(f1); т.е. мне надо её по идее заменить в и получается вот что
====================
Program pr_12;
uses crt;
type person=record
sname,name,otc,avtr,nb,pub,year:string[14];
end;

var rbook:array[1..20] of person;
f1,f2:text; i,n:integer;
st1:string;

BEGIN clrscr; Assign(f1,'p1.pas'); reset(f1);

Assign(f2,'p2.pas'); rewrite(f2);
Writeln('Введите год');
Readln(st1); Writeln('Ф И О ');
Writeln(f2,'Ф И О А');
for i:=1 to n do begin With rbook[i] do
if year=st1 then begin
Writeln(sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
Writeln(f2,sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
end; end;
close(f1); Close(f2); readln; END.
===============================
Программа запускается (об ошибках не сообщаентся т.е. с виду их нет):
Но Во первых я не вижу (как сделать так что когда я указываю паскалю что данные необходимо взять из другого файла т.е. считать - чтобы содержимое этого файла (текстового) отоброзилось на экране т.е. вылетает соодержимое потом вопрос какой год?
Во вторых я указываю год 96 и в текстовом файле там есть такой (при работе с тем текстом к программае что я набил в самом верху где я должен всё вручную персонально набить - это работает а в этом случае варианта - высвечивается тока ФИО - т.е. заголовок но нет данных - в чём ошибка?

KpeHgeJIb 03.08.2005 01:29

Цитата:

Сообщение от flashg
(что вней под корректировать чтобы)

уверен что сам писал? :)
Код:

Assign(f2,'p2.pas');
rewrite(f2);
st1:='1995';
Writeln('Ф И О Автар книги Название книги Издательство Год выпуска');
Writeln(f2,'Ф И О Автар книги Название книги Издательство Год выпуска');
for i:=1 to n do
begin
  With rbook[i] do
    if year=st1 then
      begin
        Writeln(sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
        Writeln(f2,sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);
      end;
end;
close(f1);
Close(f2);
readln; 
END.

Цитата:

Сообщение от flashg
Код:

for i:=1 to n do
  with rbook[i]do
    begin
      WRITELN('Фамилия '); readln(sname); writeln(f1,sname);
      WRITELN('имя'); readln(name); writeln(f1,name);
      ...


А тут я подазреваю ты [i] пропустил.

PS Ну и почерк у вас, уважаемый ;)

flashg 03.08.2005 02:26

спасибо за помощь а почему ты не поверил что я её сам набил?

KpeHgeJIb 03.08.2005 09:05

Цитата:

Сообщение от flashg
а почему ты не поверил что я её сам набил?

Да потомучто вроде ты все набил, и считывание и поиск, а переделать чтоб прога автоматом все искала затрудняешся, что на мой взгляд странно. Так что либо писал не сам, либо сам но просто совмещая куски кода из разных примеров из книги.
Цитата:

Сообщение от flashg
я прочитал в книге чтобы паскаль считал мне этот файл надо ввести вот такую строку Assign(f1,'p1.pas'); reset(f1); т.е. мне надо её по идее заменить в и получается вот что

Паскаль сам ничего ни откуда не читает. Reset открывает файл не обнуляя его внутренность как rewrite, но это не означает что содержимое файла самом по себе попадет в масив rbook. Всю инфу нужно считать из файла.

flashg 03.08.2005 11:48

да я взял с книги пример.

Так можно сделать чтобы не самому вбивать персон а взять из заранее набитого текстового файла и чтобы фильтрация осуществилась по этому текстовому файлу. Если да то как?

KpeHgeJIb 03.08.2005 16:48

Цитата:

Сообщение от flashg
Так можно сделать чтобы не самому вбивать персон а взять из заранее набитого текстового файла и чтобы фильтрация осуществилась по этому текстовому файлу. Если да то как?

Да, можно. Содержимое файла надо считать. Я не буду писать тебе готовый алгоритм, дойди до него сам.
Но подсказки могу дать. И так Для того чтоб начать считывать данные из уже существующего файла, нужно открыть его с помощью Reset, а затем считать из него данные используя Read или Readln. Это почти тоже самое что читать с клавиатуры, но только в Read и Readln первым параметром передается файловая переменная.
Тоесть если есть файловая переменная f и строка s
Код:

Var
  f:Text;
  s:string;

то
Код:

begin
  Assign(f, 'Drive:\Path\filename.ext');
  Reset(f);
  Readln(f,s);
...
end.

Считает первую строчку из файла.

Также удели внимание функции Eof которая возвращает True когда дстигнут конец файла и False в противном случае. В купе с циклом While эта функция позволит прочитать файл до конца, а не только N значений как это делает for.
Вот впринципе и вся информация к размышлению.

flashg 03.08.2005 19:47

а мне обязательно полный путь указывать

Assign(f, 'Drive:\Path\filename.ext');

если фаил в той же директории т.е. можно ли прописать
Assign(f, 'filename.ext');

и ещё обязательно ли формат ext или же можно в другой1 фомат в том числе и PAS

flashg 03.08.2005 19:58

Вложений: 1
вот я тут пытался иным немного способом сделать (посовету) - хотя неочень выходит.

Посмотри прототип

скажи своё мнение насчёт идеи

а идея такая


Смотри где вводятся данные о годе:
"Writeln('Введите год');
Readln(st1);" Меняй на
st1 := '1995';

"вот тока сразу возникает вопрос каким оброзом" Открываешь свой файл в блокноте.... Так как в первой программе данные пишуться в файл с помощью оператора WriteLN, то следовательно поля записи разделяються между собой знаком переноса строки... Т.е. вот твой файл для N записей:
Фамилия1
Имя1
Отчество1
Автор1
Название1
Издательство1
Год1
Фамилия2
Имя2
Отчество2
...
ИздательствоN
ГодN
Значит в блокноте забиваешь Фамилию1, жмешь <Enter>, забиваешь Имя1 и т.д.


я уже вновом файле p1.pas писал и просто
0
и
фамилия0
и
sname0
и так до года прописывал но это ничего не меняет
оно не выводит что надо м.б ответ (решение) близко я м.б. чуть чуть строкой ошибся

глянь вложение

flashg 03.08.2005 23:35

Вложений: 1
Решил ещё заданице паролельно решить - но....
Вот дано
Дан двумерный массив (матрица) А размерностью 180 на 180 элементов типа integer с произвольными значениями. Сформировать из него массив В(180,180), путем замены каждого пятого элемента матрицы суммой четырех предыдущих элементов. Вывести на экран 2 фрагмента размером 10 на 10 исходной и полученной матриц, а также элементы А(5,5) и В(5,5).

а вот прога которая не запускается - в чём дело где ошибка

flashg 04.08.2005 12:37

Вложений: 1
Выводит заголовок но не результат у меня уже крыша едет :fie:

KpeHgeJIb 04.08.2005 21:36

Вложений: 1
И так разбор полетов
Код:

Program pr_12;
  uses crt;
  type person=record
  sname,name,otc,avtr,nb,pub,year:string[14];
  end;
 
  var  rbook:array[1..20] of person;
  f1,f2:text; i,n:integer;
  st1:string;
  s:string;

BEGIN
  clrscr; 
  Assign(f1, 'E:\p1.pas');
  Reset(f1);
  Readln(f1,s); {Что и куда ты тут считываеш? Читай п. 1}
               
  Assign(f2,'p2.pas'); 
  rewrite(f2);
  st1:='1995';
  Writeln('Ф И О Автар книги Название книги Издательство Год выпуска');
  Writeln(f2,'Ф И О Автар книги Название книги Издательство Год выпуска');
  for i:=1 to n do {Чему равно n ? читай п. 2}
  begin 
    With rbook[i] do   
      if year=st1 then     
      begin       
        Writeln(sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);     
        Writeln(f2,sname:10,name:10,otc:10,avtr:10,nb:10,pub:10,year:10);   
      end;
  end;
  close(f1);
  Close(f2);
  readln;
END.

1. Ты внмательно читал то, что я писал выше? От того что ты считываеш одну строку из файла, да еще и в переменную s, твой масив rbook не заполняется а остается пустым. Ты когда с клавы вводиш, ты что читаеш только одну строку? Нет, ты читаеш все, и из фала нужно читать ВСЕ.
2. Этот цикл for не выполняется вообще, потому что ты не задаеш начальное значение переменной n. А это означает что ее значение не определено. Правда pascal изначально нулюет переменные главной программы, поэтому n=0. А цикл for от 1 до 0 выполнятся не будет.

И совет на будущее, начни табировать код, а то так как ты пишеш, без сдвигов, несколько команд в одну строчку, ничерта не понятно, кто под кем сидит.

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

PS будут вопросы по коду спрашивай.

KpeHgeJIb добавил :

Цитата:

Сообщение от flashg
а вот прога которая не запускается - в чём дело где ошибка

Код:

type a=array[1..180,1..180] of integer;
    b=array[1..180,1..180] of integer;

Написав это ты обявляеш два типа данных, один под именем "a", а другой под именем "b".
Вышеописаный код не создает переменных данного типа, а лиш определяет тип.
если тебе надо объявить два двухмерных масива, то делается это так
Код:

var
  a,b:array[1..180, 1..180] of integer;


flashg 04.08.2005 23:16

Спасибо.

А куда мне деватся - в смысле задаче по проще - это мои задания :(

flashg 07.08.2005 11:52

Вложений: 1
Вот ещё одно задание что надо решить нашёл примерное похожие задание для решения:

для задания
Для каждого слова заданного предложения указать долю согласных. Определить слово в котором доля согласных максимальна.

- только первую часть задания и оно высчитывает процент слов содержаших согласные только набранные латинскими а не русскими буквами что необходимо поменять чтобы понимало русский язык.

KpeHgeJIb 07.08.2005 23:39

flashg
Не ленись полистай учебник. :дед:

flashg 07.08.2005 23:42

ещё бы знать какие уебники хорошие а какие не стоит читать

flashg 08.08.2005 16:57

ну в смысле какие на товй взягляд книги лучше не брать в руки (сжигать) а какие медали достойны

KpeHgeJIb 08.08.2005 20:18

Цитата:

Сообщение от flashg
ну в смысле какие на товй взягляд книги лучше не брать в руки (сжигать) а какие медали достойны

Да я уже не помню, я последний раз книгу по паскалю, держал лет 6 назад. Я уже даже и не помню как она выглядела. Но поидее если вам задают такие задания, то все что нужно, должно быть в книге по которой вы занимаетесь.
В принципе тебе пойдет любая книга описывающая азы языка.
Да и писать всетаки по началу нужно задания попроще, что бы понять как это все выполняется.

Johnnie Walker 08.08.2005 21:10

Я программировать начал со старой советской книжки. Потом за все время прочитал только еще одну по Дельфи, которую подарили, очень качественная, хоть и старая. Все остально, что я видел - дрянь. Если есть желание программировать, то книжки не нужны.

ender 09.08.2005 13:34

Лучшая книга, которую я читал по Паскалю, это:

Прайс Д. Программирование на языке Паскаль: Практическое руководство. Пер. с англ. - М.: Мир, 1987.- 232с.

flashg 09.08.2005 17:53

Цитата:

Сообщение от Johnnie Walker
Я программировать начал со старой советской книжки. Потом за все время прочитал только еще одну по Дельфи, которую подарили, очень качественная, хоть и старая. Все остально, что я видел - дрянь. Если есть желание программировать, то книжки не нужны.


да и как мне без книг чему нибудь научится - я не говорю супер справочники на 500 страниц а типа паскаль в примерах итп

flashg добавил :

а реально книгу Прайс Д. Программирование на языке Паскаль: Практическое руководство. Пер. с англ. - М.: Мир, 1987.- 232с. в интернете найти в электроном варинте для скачки


Текущее время: 11:17. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot