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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.01.2014, 16:48   #1
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию Записи. Сформировать массив из лучших учеников школы

Сведения об ученике состоят из его имени и фамилии, названия класса (года обучения и буквы), в котором он учится, оценок, полученных учеником за последнюю четверть. Пусть дан массив, содержащий сведения об учениках школы. Сформируйте массив из лучших учеников школы, то есть из учеников, не имеющих отметок ниже "четырех" и по сумме баллов, не уступающих другим ученикам своего и параллельного классов.
Код:
const
  n = 50; k = 5;
type
  Student = record
    Name: string[30];
    Form: string[3];  
    Mark: array[1..k] of 2..5;
  end;
  Students = array[1..n] of Student;
var
  Mas: Students;
  kol: integer;

procedure FormMas(const kol: integer; const Mas: Students);
var
  i, j: byte;
begin
  writeln('Введите имя, фамилию и класс ученика');
  for i := 1 to kol do
  begin
    writeln(i, '-й ученик: '); 
    write('Имя и фамилия: ');
    readln(Mas[i].name);
    write('Класс: ');
    readln(Mas[i].Form);
    write('Оценки за четверть: ');
    for j := 1 to k do
      read(Mas[i].Mark[j]); 
    readln;
    writeln;
  end;  
end;

procedure BestStudents(const kol: integer; const Mas: Students);
var
  i, j: byte; 
  digit: array[1..n] of 1..11;
  summ: array[1..n] of byte;
begin
  for i := 1 to kol do
  begin
    for j := 1 to k do
      summ[i] += mas[i].mark[j];
    if Mas[i].Mark[j] < 4 then
    begin
      summ[i] := 0;
      break;
    end;  
    if length(mas[i].Form) = 2 then digit[i] := StrToInt(copy(mas[i].Form, 1, 1));
    if length(mas[i].Form) = 3 then digit[i] := StrToInt(copy(mas[i].Form, 1, 2)); //выделили класс
    
    
  end;
end;

begin
  write('Введите количество учеников: ');
  readln(kol);
  FormMas(kol, Mas);
  BestStudents(kol, Mas);
end.
azalia вне форума Ответить с цитированием
Старый 03.01.2014, 16:54   #2
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

Надо внутри каждой параллели (digit) найти человека (или людей) с наибольшим количеством баллов и создать новый массив из них. Но как это сделать, не знаю. Помогите, пожалуйста.
azalia вне форума Ответить с цитированием
Старый 09.01.2014, 12:41   #3
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

Код:
const
  k = 5;//количество оценок

type
  Student = record
    Name: string[10];
    Surname: string[20];
    Form: string[3];
    Mark: array[1..k] of byte;
  end;
  Students = array[byte] of Student;

var
  Mas, B_st: Students; kol: integer;

procedure input(var Mas: students; var kol: integer);
begin
  write('Количество учеников: '); readln(kol);
  writeln;
  
  for var i := 1 to kol do
    with mas[i] do
    begin
      writeln(i, '-й ученик: ');
      write('Имя: '); readln(name);
      write('Фамилия: '); readln(surname);
      write('Класс: '); readln(form);
      write('Оценки (', k, ' оценок через пробел): ');
      for var j := 1 to k do 
        read(mark[j]); 
      readln;
      writeln;
    end;
end;

procedure FindBest(var Mas: Students; var B_st: Students; const kol: integer; var b: integer);
  function No3(const st: student): boolean;
  var
    i: integer;
    res: boolean;
  begin
    res := true;
    for i := 1 to k do
      if st.Mark[i] < 4 then
      begin
        res := false;
        break;
      end;
    No3 := res;
  end;
  
  function Summ(var st: Student): integer;
  var
    j: integer;
  begin
    for j := 1 to k do   
      result += st.mark[j];
    summ := result;  
  end;

var
  i, j, cn, max, x, p: word; 
  c: students; 
  set_rez: set of string;
begin
  for i := 1 to kol do
    if length(mas[i].Form) = 2 then mas[i].Form := copy(mas[i].Form, 1, 1) else
    if length(mas[i].Form) = 3 then mas[i].Form := copy(mas[i].Form, 1, 2); //выделили класс
  
  for i := 1 to kol do
  begin
    if No3(Mas[i]) then
    begin
      cn := 1;
      if not (mas[i].Form in set_rez) then 
        c[cn] := mas[i] else continue;
      for j := i + 1 to kol do 
        if (mas[j].Form = mas[i].Form) and (No3(mas[j])) then begin
          inc(cn); c[cn] := mas[j]; end;
      
      max := summ(c[1]);
      for x := 2 to cn do
        if summ(c[x]) > max then max := summ(c[x]);
      for p := 1 to cn do
        if summ(c[p]) = max then begin
          inc(b); b_st[b] := c[p]; end;     
      set_rez += [mas[i].Form];      
    end;   
  end; 
end;

procedure output(var b_st: Students; const b: integer);
begin
  write('Лучшие ученики: ');
  for var i := 1 to b do
    write(b_st[i].Name, ' ', b_st[i].Surname, '--');
end;

begin
  input(mas, kol);
  FindBest(Mas, b_st, kol);
  output(b_st, kol);
end.
azalia вне форума Ответить с цитированием
Старый 09.01.2014, 14:33   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

azalia, хорошая попытка!

Вопроса по коду к Вам два.
1) судя по
Цитата:
Код:
procedure FindBest(var Mas: Students; var B_st: Students; const kol: integer; var b: integer);
строчка
Цитата:
Код:
FindBest(Mas, b_st, kol);
не должна компилироваться (подсчитайте число фиктивных параметров в процедуре и число передаваемых параметров)

2)
Цитата:
Код:
  
      result += st.mark[j];
...
      set_rez += [mas[i].Form];
Это какой Паскаль так умеет? Небось, какой-нибудь Pascal ABC.NET ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 12.01.2014, 14:10   #5
azalia
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 21
По умолчанию

все, исправила) теперь работает. Да, это Pascal ABC.NET
azalia вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дан одномерный массив, сформировать новый массив по заданному правилу {Delphi} Nickolai47 Помощь студентам 5 16.12.2012 14:51
Задание на "записи". Описать группу учеников. Распечатать эти данные в виде таблицы и найти нужных. Free Pascal fleur* Паскаль, Turbo Pascal, PascalABC.NET 3 27.04.2012 14:45
С# задан массив 5х5. сформировать массивы А и В. в массив А поместить элементы с четными индексами, в массив В с нечетны Koksa Помощь студентам 0 10.10.2011 11:26
Как сформировать новую таблицу из старой, исключив записи с нулевым итогом PhilAT Microsoft Office Excel 9 12.01.2011 14:34
Сформировать оценки учеников. toliabest Общие вопросы C/C++ 6 10.05.2010 01:00