Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Помогите исправить задачу (http://www.tehnari.ru/f41/t256814/)

Лена12 26.11.2017 19:54

Помогите исправить задачу
 
В условии сказано: Составьте программу, позволяющую определить, есть ли в школе в 8-х классах однофамильцы. Данные об учениках должны идти в следующем порядке: имя, фамилия, год обучения, буква.
Когда вводишь например фамилию Иванов в 8 класс и в 9 классе, на выходе выдает, что есть однофамильцы... и Например еще когда вводишь Иванов 8 класс и Иванова 8 класс, пишет что нет однофамильцев. Язык программирования Pascal. Помогите исправить задачку, на обработку записей.
Код:

  program z6;
 
  type
  cl = record
  name: string[20];
      familia: string[45];
      year: integer;
      bukva: string;
    end;
 
  var
  kl: array [1..100] of cl;
  i, n, c: integer;
 
  begin
  Write('Введите количество учеников= ');
  readln(n);
    for i := 1 to n do
  begin
  writeln('Введите сведения о ', I, '-м ученике:');
  write('Имя ');
      readln(kl[I].name);
      write('Фамилия ');
      readln(kl[I].familia);
      write('Класс ');
      readln(kl[I].year);
      write('Буква ');
      readln(kl[I].bukva);
    end;
    writeln;
    c := 0;
    for i := 1 to n - 1 do
    begin
      if ((kl[I].year = 8) and (kl[I].familia = kl[I + 1].familia)) then inc(c);
    end;
    if c >= 1 then writeln('Однофамильцыесть') else write('Однофамильцевнет');
  end.


prima 26.11.2017 20:08

А почему вы сравниваете только две соседних записи?
I-тую и I+1-ую?
И можно уточнить диалект языка?

Лена12 26.11.2017 20:31

Pascal ABC

Vladimir_S 26.11.2017 20:54

Цитата:

Сообщение от prima (Сообщение 2536251)
И можно уточнить диалект языка?

Андрей, да не важно. Скорее всего, ненавистный мне АВС.
Цитата:

Сообщение от prima (Сообщение 2536251)
А почему вы сравниваете только две соседних записи? I-тую и I+1-ую?

Причем абсолютно неправильно.
Лена, значит, так.
1. Смысл поля Letter я, извините, не понял. Вас интересуют однофамильцы или ученики, фамилии которых начинаются на одну и ту же букву?
2. С разнополыми однофамильцами (если иметь в виду русский язык, а не, скажем, английский) — сложно. Предлагаемая ниже программка сработает для фамилий типа Петренко, Кацман, Черемных, Ревич, а вот для "Иванов" и "Иванова", "Савицкий" и "Савицкая" увы, нет, только для однополых. Научить её такому можно, но очень трудно: нужно перебрать все варианты окончания фамилий и т.д.
3. В программе сообщения замены английскими потому, что мне так удобнее (связано с кодировками кириллицы). Не принципиально, можете заменить обратно.
Код:

type
 cl = record
      name: string[20];
      familia: string[45];
      year: integer;
      end;

var
 kl: array [1..100] of cl;
 i,j,n: integer;
 b:boolean;

begin
 Write('Enter the number of pupils ');
 readln(n);
 for i := 1 to n do
  begin
  writeln('Enter the data for ', i, '-th pupil:');
  write('Name: ');
  readln(kl[i].name);
  write('Surname: ');
  readln(kl[i].familia);
  write('Year: ');
  readln(kl[i].year);
  end;
  writeln;
  b:=false;
  for i:=1 to n-1 do
  for j:=i+1 to n do
    if (kl[i].year=8) and (kl[j].year=8) and (kl[i].familia=kl[j].familia) then b:=true;
  if b then writeln('Namesakes present') else write('No namesakes');
 Readln
end.


Vladimir_S 26.11.2017 20:56

Цитата:

Сообщение от Лена12 (Сообщение 2536255)
Pascal ABC

Ну вот, как я и думал.
Можете последний Readln выкинуть. Мне в моём Free Pascal он нужен для останова.

prima 26.11.2017 21:21

Цитата:

Сообщение от Vladimir_S (Сообщение 2536258)
Андрей, да не важно.

Смутно помню грабли с разной работой этого цикла в разных компиляторах.
Хотя возможно это у меня блуждающие токи от ЕС-1035, там были два компилятора Паскаля с очень разным программированием, приходилось их автоматически различать средствами REXX :))

Лена12 27.11.2017 15:49

Скажите, пожалуйста что перебирать j- элементом?

Vladimir_S 27.11.2017 16:14

Цитата:

Сообщение от Лена12 (Сообщение 2536531)
Скажите, пожалуйста что перебирать j- элементом?

Да всё то же — фамилии.
Допустим, количество учеников в восьмых классах — 10.
Цикл работает следующим образом.
Берём первого (i=1). Пусть его фамилия Глушко.
Начинаем перебирать ОСТАЛЬНЫХ со 2 по 10, т.е. j=2, 3, 4 и т.д. до 10. Если мы снова увидим фамилию Глушко, например, у четвёртого, то фамилия[1]=фамилия[4], и мы нашли однофамильца!
Потом берём второго ученика (i=2), пусть его фамилия — Иванов. Перебираем по j остальных с 3 по 10 и ищем фамилию Иванов (с "Иванова", увы, не сработает: отбор однофамильцев с фамилиями на -ов, -ин, -ский, -цкий, -цкой осуществляется только среди однополых). И т.д.
Вот так.
Если всё-таки нужно, чтобы срабатывало по разнополым, напишите, подумаем. Но это очень непросто.


Часовой пояс GMT +4, время: 07:02.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.