2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение28.03.2010, 23:49 
Аватара пользователя


14/12/09
10
Задача. Информация про ученика состоит с его имени, фамилии и названия класса (например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 
Админ форума
Аватара пользователя


19/03/10
8952
Igor в сообщении #303799 писал(а):
Как видно в программе ...
 !  Не видно. Отформатируйте, пожалуйста, Ваш исходный код с помощью тега syntax: topic26708.html.
И про отступы не забудьте.

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

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

 Профиль  
                  
 
 Re: Помогите пожалуйста разобратся с програмкой(Turbo Pascal).
Сообщение29.03.2010, 04:16 


15/02/09
38
Если записываешь в файл, то у команды 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 
Аватара пользователя


14/05/05
224
Баку
В вашей программе будет не ясно к какому классу относится ученик, так как Вы не добавляете сий информации в файл.
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 
Аватара пользователя


14/12/09
10
Я обратил внимание на ваши подсказки и отредактировал программу, чтоб она записывала информацию в файл 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 


15/02/09
38
Сперва надо подсчитать, сколько классов всего. Потом завести массив этой длинны, в каждой ячейке которого будет храниться численность класса. Потом пробежаться по всему основному массиву и заполнить этот самый дополнительный массив. И останется только найти максимум из элементов массива.
Может есть решение легче, но это то, что мне сразу пришло в голову..

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


14/05/05
224
Баку
Значить так:

Пусть у нас есть массив из 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 
Заслуженный участник


27/04/09
28128
Перед закрытием файла, открытого с помощью Append или Rewrite, надо вызвать Flush, чтобы буфер вывода выписался в файл полностью. :-)

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


11/05/08
32166
arseniiv в сообщении #304492 писал(а):
Перед закрытием файла, открытого с помощью Append или Rewrite, надо вызвать Flush, чтобы буфер вывода выписался в файл полностью. :-)

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

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

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


27/04/09
28128
Хм, зачем тогда Flush? Он во всех "низкоуровневых" библиотеках ввода-вывода оставлен (например, fflush в си). :?

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


09/08/09
3438
С.Петербург
fflush сбрасывает данные на диск без закрытия файла. Другими славами, если после операции вывода вызывать fflush, то данные сохранятся в выходном файле даже если этот файл не будет закрыт нормальным образом (например, в результате аварийного завершения программы).

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


27/04/09
28128
А, вот оно то самое! Не смог правильно сказать, увы.

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


11/05/08
32166
Maslov в сообщении #304554 писал(а):
, то данные сохранятся в выходном файле даже если этот файл не будет закрыт нормальным образом

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

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


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

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


11/05/08
32166
Maslov в сообщении #304585 писал(а):
А почему длина неправильная может оказаться?

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

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group