2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение28.03.2010, 23:49 
Аватара пользователя
Задача. Информация про ученика состоит с его имени, фамилии и названия класса (например11а). Информацию про n учеников записать в файл f. Информацию про учеников вывести на экран в виде таблицы. Найти класс с максимальным количеством учеников.


Вот я начал делать программу:
код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
Program School;
uses crt;
type
  Forma = record
    name : string[15];
    surname : string[20];
    klass : string[5]
  end;
var
  f : file of Forma;
  a : array[1..10] of Forma;
  i,n,k : integer;
Begin
  TextColor(black);
  TextBackGround(White);
  clrscr;
  assign(f,'Forma');
  rewrite(f);
  close(f);
  reset(f);
  Writeln('Введите количество учеников:');
  readln(n);
  For i:=1 to n do
    with a[i] do
    begin
      Writeln('Введите имя ученика:');
      Readln(name);
      Writeln('Введите фамилию ученика:');
      Readln(surname);
      Writeln('Введите название класса:');
      Readln(Klass);
    end;
  Writeln('Введите количество учеников для вписывания в файл:');
  readln(k);
  For i:=1 to k do
    with a[i] do
    Begin
      Writeln(name);
      Writeln(surname);
    end;
  readln;
  close(f);
  repeat
  until keypressed;
end.
 



Проблема в том, я не знаю как конкретно записать в файл. Как видно в программе я выделил n количество учеников. Файл у меня открыт и если я не ошибаюсь вписывается информация в файл с помощью "Writeln". Что я и сделал. Но оно просто выбивает на экран, что принципе и должно делать, а вот или записало оно в файл я сомневаюсь. Кроме того, я не знаю каким образом найти класс наибольшем количеством учеников. Помогите пожалуйста, хотябы чтоб натолкнуть на правильное решение....Буду очень признателен.

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 00:10 
Аватара пользователя
Igor в сообщении #303799 писал(а):
Как видно в программе ...
 !  Не видно. Отформатируйте, пожалуйста, Ваш исходный код с помощью тега syntax: topic26708.html.
И про отступы не забудьте.

Прошли часы...

 i  Ладно, по поводу перехода на летнее время сам сделал. Но чтоб в следующий раз ...

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 04:16 
Если записываешь в файл, то у команды Writeln два параметра. Первый - сам файл (как раз f), второй - сам текст. То есть вот в этом цикле:
Код:
  For i:=1 to k do
    with a[i] do
    Begin
      Writeln(name);
      Writeln(surname);
    end;

ты выводишь на экран.
Нужно добавить еще один, почти аналогичный:
Код:
  For i:=1 to k do
    with a[i] do
    Begin
      Writeln(f, name);
      Writeln(f, surname);
    end;

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 11:16 
Аватара пользователя
В вашей программе будет не ясно к какому классу относится ученик, так как Вы не добавляете сий информации в файл.
Igor в сообщении #303799 писал(а):
 
Используется синтаксис Pascal
For i:=1 to k do
    with a[i] do
    Begin
      Writeln(name);
      Writeln(surname);
    end;
  readln;
  close(f);
 



Writeln(name); заменяем на Writeln(f, name);
Writeln(surname); заменяем на Writeln(f, surname);
и добавляем Writeln(f, Klass);

Вот после этого можете считывать данные из файла (при помощи функции ReadLn(f, str)), скажем, в массив, и производить поиск по массиву на наличие наиболее часто встречаемого значения переменной Klass (можете обычным перебором).

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 21:59 
Аватара пользователя
Я обратил внимание на ваши подсказки и отредактировал программу, чтоб она записывала информацию в файл f. То есть я просто записал весь массив в файл:

Код:
Writeln('Введите количество учеников для вписывания в файл:');
readln(k);
For i:=1 to k do
Write(f,a[i]);
readln;


А также, вывожу всю информацию в виде таблицы:

Код:
GotoXY(17,1);
Write('Ведомость про учеников');
GoToXY(10,3);
write('Имя');
GoToXY(25,3);
Write('Фамилия');
gotoxy(35,3);
write('Класс');
for i:=1 to n do
begin
GotoXY(10,i*2+3);
writeln(a[i].name);
GotoXY(25,i*2+3);
writeln(a[i].surname);
GoToXy(35,i*2+3);
writeln(a[i].klass);
end;


В итоге вышла программа:


Код:
Program School;
uses crt;
type
Forma = record
name : string[15];
surname : string[20];
klass : string[5];
end;
var f : file of Forma;
a : array[1..10] of Forma;
i,n,k,j : integer;
Begin
TextColor(black);
TextBackGround(White);
clrscr;
assign(f,'Forma');
rewrite(f);
j:=1;
Writeln('Введите общее количество учеников:');
readln(n);
For i:=1 to n do
with a[i] do
begin
Writeln('Введите имя ученика :');
Readln(name);
Writeln('Введите фамилию ученика:');
Readln(surname);
Writeln('Введите название класса:');
Readln(Klass);
end;
Writeln('Введите количество учеников для вписывания в файл:');
readln(k);
For i:=1 to k do
Write(f,a[i]);
readln;
close(f);
clrscr;
GotoXY(17,1);
Write('Ведомость про учеников');
GoToXY(10,3);
write('Имя');
GoToXY(25,3);
Write('Фамилия');
gotoxy(35,3);
write('Класс');
for i:=1 to n do
begin
GotoXY(10,i*2+3);
writeln(a[i].name);
GotoXY(25,i*2+3);
writeln(a[i].surname);
GoToXy(35,i*2+3);
writeln(a[i].klass);
end;
repeat until keypressed;
readln;
end.


Но у меня не получается только одно, это подсчитать класс наибольшем количеством учеников...Вот мне здесь писали:"...производить поиск по массиву на наличие наиболее часто встречаемого значения переменной Klass..." Каким образом произвести этот поиск? Если вручную каждую проверять, то я тоже не особо представляю, поскольку для этого должен быть конкретный список классов на которые я бы мог производить условие...но я ж не могу вписать, к примеру, 20 классов и каждый проверять через If...в этом смысла я не вижу... Если вам не сложно, то подскажите мне пожалуйста, каким образом мне подсчитать этот класс...

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 22:12 
Сперва надо подсчитать, сколько классов всего. Потом завести массив этой длинны, в каждой ячейке которого будет храниться численность класса. Потом пробежаться по всему основному массиву и заполнить этот самый дополнительный массив. И останется только найти максимум из элементов массива.
Может есть решение легче, но это то, что мне сразу пришло в голову..

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 08:48 
Аватара пользователя
Значить так:

Пусть у нас есть массив из 9-ти элементов, в которые записана информация о классах и учениках:
1 2 3 4 5 6 7 8 9
А Б Б А В Б В Б А

Видно, что класса Б - 4, класса А - 3 и класса В - 2.
Требуется написать алгоритм для определения числа максимального вхождения элемента в этом массиве.

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var
   indexes: set of integer;

indexes:=indexes + 1;
label:=m[1];
max:=0;
for i:=1 to n-1 do
begin  
   count:=1;
   if i in indexes then continue;
   for j:=i+1 to n do
   begin
      if j in indexes then continue;
      if m[j]=m[i] then
      begin
           count:=count+1;
           indexes:=indexes+j;          
      end;
    end;              
    if count>max then
    begin
        max:=count;
        label:=m[i];
    end;
end;
 


В конце получаем два значения: max - максимальное количесвто вхождений и label - собственно сам элемент.
В вашем случае следует использовать не m[i], а m[i].Klass.
Примечания:
if j in indexes then continue; нужно для того, чтобы ускорить прогонку
indexes - это множество, а не число.

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 15:37 
Перед закрытием файла, открытого с помощью Append или Rewrite, надо вызвать Flush, чтобы буфер вывода выписался в файл полностью. :-)

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 15:58 
arseniiv в сообщении #304492 писал(а):
Перед закрытием файла, открытого с помощью Append или Rewrite, надо вызвать Flush, чтобы буфер вывода выписался в файл полностью. :-)

Не нужно. Достаточно не забыть его (файл) закрыть. А вот если забыть -- выйдет действительно нехорошо (при записи).

----------------------------------------------------
А буфер, кстати, всегда выводится полностью. Или полностью не выводится. Если забыть. На то он и буфер.

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 16:55 
Хм, зачем тогда Flush? Он во всех "низкоуровневых" библиотеках ввода-вывода оставлен (например, fflush в си). :?

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 17:22 
fflush сбрасывает данные на диск без закрытия файла. Другими славами, если после операции вывода вызывать fflush, то данные сохранятся в выходном файле даже если этот файл не будет закрыт нормальным образом (например, в результате аварийного завершения программы).

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 18:05 
А, вот оно то самое! Не смог правильно сказать, увы.

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 18:13 
Maslov в сообщении #304554 писал(а):
, то данные сохранятся в выходном файле даже если этот файл не будет закрыт нормальным образом

, но с избытком. Т.е. длина файла окажется больше, чем было задумано.

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 18:28 
ewert в сообщении #304579 писал(а):
Т.е. длина файла окажется больше, чем было задумано.
На C под Windows точно все нормально (правильная длина получается). Для остальных -- не проверял.
А почему длина неправильная может оказаться?

 
 
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение30.03.2010, 18:54 
Maslov в сообщении #304585 писал(а):
А почему длина неправильная может оказаться?

а потому что в норме выплёвывается в файл целый буфер. Как таковой. Какова на данный момент конкретная длина задумывавшегося файла -- никому не интересно.

Впрочем, не знаю, как там в виндах. Может, та длина и отслеживается, не знаю. Я только имел в виду, на что можно надеяться (в разгильдяйских случаях) -- а на что лучше не стоит.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group