Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на языке Pascal


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Асмик Александровна
Статус: Академик
Рейтинг: 8279
∙ повысить рейтинг »
Орловский Дмитрий
Статус: Академик
Рейтинг: 5448
∙ повысить рейтинг »
Гусятинер Леонид Борисович aka lamed
Статус: Академик
Рейтинг: 5393
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Pascal (Паскаль)

Номер выпуска:1190
Дата выхода:09.06.2011, 20:00
Администратор рассылки:Boriss (Академик)
Подписчиков / экспертов:174 / 176
Вопросов / ответов:1 / 2

Вопрос № 183501: Здравствуйте уважаемые эксперты. Прошу помощь в следующем вопросе: Дан файл с набором структур типа: номер, фамилия, курс, оценка. Не используя дополнительного файла, разместить в исходном файле сведения сначала об отличниках, потом о хорошистах и...



Вопрос № 183501:

Здравствуйте уважаемые эксперты. Прошу помощь в следующем вопросе:
Дан файл с набором структур типа: номер, фамилия, курс, оценка. Не используя дополнительного файла, разместить в исходном файле сведения сначала об отличниках, потом о хорошистах и т. д.
***
Файл будет создаваться в начале программы.

Будет запрос на заполнение типа
"номер"
"фамилия"
"курс"
"оценка"

Полагаю что выглядит это так (данные отделятся будут пробелами):
Есть файл в котором написано

//№ фамилия курс оценка
1 Иванов 2 2
2 Петров 2 3
3 Кукушкина 2 5
4 Сидоров 2 4

А после того как программа отработает то должны получить

3 Кукушкина 2 5
4 Сидоров 2 4
2 Петров 2 3
1 Иванов 2 2

Отправлен: 04.06.2011, 10:45
Вопрос задал: Посетитель - 376401 (Посетитель)
Всего ответов: 2
Страница вопроса »


Отвечает Гусятинер Леонид Борисович aka lamed (Академик) :
Здравствуйте, Посетитель - 376401!
PascalABC.Net
Вариант с текстовым файлом.
Код :
const
  MaxN=100;
var
  i,j,n: integer;
  f: text;
  s, tmp: string;
  nom, fm, kurs, ocenka: string;
  a: array[1..MaxN] of string;
begin
// Создали файл
  assign(f,'1.txt');
  rewrite(f);
  write('n=');
  readln(n);
  
// Заполнили файл, введя n произвольных строк
  for i:= 1 to n do
    begin
      write('номер ');
      readln(nom);
      
      write('фамилия ');
      readln(fm);
      
      write('курс ');
      readln(kurs);
      
      write('оценка ');
      readln(ocenka);
      
      writeln(f, nom+' '+fm+' '+kurs+' '+ocenka);
    end;
  close(f);
  
// Распечатали содержимое
  reset(f);
  while not eof(f) do
    begin
      readln(f,s);
      writeln(s);
    end;
  writeln;
  close(f);

// Загрузили данные в массив  
  n:= 0;
  reset(f);
  while not eof(f) do
    begin
      inc(n);
      readln(f, a[n]);
    end;

// Отсортировали массив
  for i:= 1 to n-1 do
    for j:= n downto i+1 do
      if a[j-1][length(a[j-1])]<a[j][length(a[j])] then
        begin
          tmp := a[j];
          a[j] := a[j-1];
          a[j-1] := tmp;
        end;
  close(f);

// Загрузили данные в файл
  rewrite(f);
  for i:= 1 to n do
    writeln(f, a[i]);
  close(f);
  
// Распечатали содержимое
  reset(f);
  while not eof(f) do
    begin
      readln(f,s);
      writeln(s);
    end;
  writeln;
  close(f);

// Удалили всю информацию
  rewrite(f);
  close(f);

// Убедились, что файл пуст
  reset(f);
  if eof(f) then
    writeln('Файл пуст');
  close(f);

end.

Вариант с файлом записей
Код :
const
  MaxN=100;
type
  TStudent = record
    nom: integer;
    fm: string[30];
    kurs: integer;
    ocenka: integer;
  end;
var
  i,j,n: integer;
  st, tmp: TStudent;
  f: file of TStudent;
  a: array[1..MaxN] of TStudent;
begin
// Создали файл
  assign(f,'1.datt');
  rewrite(f);
  write('n=');
  readln(n);
  
// Заполнили файл, введя n произвольных строк
  for i:= 1 to n do
    begin
      write('номер ');
      readln(st.nom);
      
      write('фамилия ');
      readln(st.fm);
      
      write('курс ');
      readln(st.kurs);
      
      write('оценка ');
      readln(st.ocenka);
      
      write(f, st);
    end;
///  close(f);
  
// Распечатали содержимое
///  reset(f);
  seek(f,0);
  while not eof(f) do
    begin
      read(f,st);
      writeln(st.nom, ' ', st.fm, ' ', st.kurs, ' ', st.ocenka);
    end;
  writeln;
///  close(f);

// Загрузили данные в массив  
  n:= 0;
///  reset(f);
  seek(f,0);
  while not eof(f) do
    begin
      inc(n);
      read(f, a[n]);
    end;

// Отсортировали массив
  for i:= 1 to n-1 do
    for j:= n downto i+1 do
      if a[j-1].ocenka<a[j].ocenka then
        begin
          tmp := a[j];
          a[j] := a[j-1];
          a[j-1] := tmp;
        end;
  close(f);

// Загрузили данные в файл
  rewrite(f);
  for i:= 1 to n do
    write(f, a[i]);
///  close(f);
  
// Распечатали содержимое
///  reset(f);
  seek(f,0);
  while not eof(f) do
    begin
      read(f,st);
      writeln(st.nom, ' ', st.fm, ' ', st.kurs, ' ', st.ocenka);
    end;
  writeln;
///  close(f);

// Удалили всю информацию
///  rewrite(f);
  seek(f,0);
  truncate(f);
///  close(f);

// Убедились, что файл пуст
///  reset(f);
  seek(f,0);
  if eof(f) then
    writeln('Файл пуст');
  close(f);

end.

Приложение:

Ответ отправил: Гусятинер Леонид Борисович aka lamed (Академик)
Ответ отправлен: 04.06.2011, 14:34
Номер ответа: 267572
Россия, Ковров
Тел.: +79107793141

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267572 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Отвечает Орловский Дмитрий (Академик) :
    Здравствуйте, Посетитель - 376401!
    Не мог пройти мимо сортировки в массиве. Я бы сделал по-другому:

    Приложение:

    Ответ отправил: Орловский Дмитрий (Академик)
    Ответ отправлен: 04.06.2011, 22:16
    Номер ответа: 267576
    Россия, Москва
    Организация: МИФИ

    Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
    Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 267576 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное