Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Starstuck
4 / 4 / 1
Регистрация: 01.02.2012
Сообщений: 124
#1

Определить самого старшего человека из списка и выводить его фамилию, имя и дату рождения

29.02.2012, 20:58. Просмотров 2061. Ответов 6
Метки нет (Все метки)

Открыть условие
19) Имеется список людей с указанием их фамилии, имени и даты рождения. Напишите эффективную по времени работы и по используемой памяти программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет определять самого старшего человека из этого списка и выводить его фамилию, имя и дату рождения, а если имеется несколько самых старших людей с одинаковой датой рождения, то определять их количество.
На вход программе в первой строке подается количество людей в списке N. В каждой из последующих N строк находится информация в следующем формате:
<Фамилия> <Имя> <Дата рождения>
где <Фамилия> – строка, состоящая не более, чем из 20 символов без пробелов, <Имя> – строка, состоящая не более, чем из 20 символов без пробелов, <Дата рождения> – строка, имеющая вид ДД.ММ.ГГГГ, где ДД – двузначное число от 01 до 31, ММ – двузначное число от 01 до 12, ГГГГ – четырехзначное число от 1800 до 2100.
Пример входной строки:
Иванов Сергей 27.03.1993
Программа должна вывести фамилию и имя самого старшего человека в списке.
Пример выходных данных:
Иванов Сергей
Если таких людей, несколько, то программа должна вывести их количество. Пример вывода в этом случае:
3


Смысл моего решения таков: считываю и тут же проверяю, исходя из условий(42 и 50 строчки).


Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
var
d,m,y:integer;
name:string[41]; {fam[20] name[20] mezhdy probel[1]!}
nn:string[41];
s:string;
c:char;
check:integer;
i,n,k:integer;
dm,mm,ym,p:integer;
 
begin
nn:='';
k:=0;
DM:=32; {Макс d}
MM:=14; {Макс m}
YM:=2101; {Макс y}
 
readln(n);
 
for i:=1 to n do begin
 
readln(s); {Вводим данные одного человека}
name:='';
p:=0;
repeat
  read(c);
  name:=name+c;
  p:=p+1; {posiziya s PROBELOM!}
until c=' ';
 
repeat
  read(c);
  if c<>' ' then
  name:=name+c;  
  p:=p+1; {2-oi PROBEL!}
until c=' ';
 
val(copy(s,p+1,2),d,check);
val(copy(s,p+4,2),m,check);
val(copy(s,p+7,4),y,check);
 
if (y<ym)or ((y=ym) and (m<mm)) or ((y=ym) and (m=mm) and (d<dm)) then
  begin
  dm:=d;
  mm:=m;
  ym:=m;
  nn:=name;
  k:=1;
  end
else if (d=dm) and (m=mm) and (y=ym) then 
  k:=k+1;
 
end;
 
if k=1 then 
  writeln(nn)
else 
  writeln(k);
 
readln;
end.
Но почему-то он "принимает" при вводе на одну строчку больше, нежели требуется.
Ввожу N=3, а строк он считывает N+1=4. И считает к тому же неправильно(находит самого старшего).
Если подскажете, буду весьма благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.02.2012, 20:58
Ответы с готовыми решениями:

Определить самого старшего человека из списка
помогите пожалуйста решить задачу.....имеется список людей с указанием их...

Определить порядковый номер самого старшего по возрасту человека
В массиве хранится информация о годе рождения каждого из 30 человек. Определить...

Вывести фамилию, имя и дату рождения студентов второго курса
1- Создать массив из 40 записей (Фамилия, Имя, дата рождения, адрес, курс и...

Определить фамилию самого младшего по возрасту человека среди военнообязанных
Известны данные о 16 сотрудниках фирмы: фамилия, возраст, отношение к военной...

Определить Фамилию, Имя и рост самого высокого ученика
Добрый вечер, помогите решить задачу Дан список учеников класса и рост....

6
Puporev
Модератор
54348 / 41941 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
29.02.2012, 21:17 #2
Цитата Сообщение от Starstuck Посмотреть сообщение
тому же неправильно(находит самого старшего).
Так если самого молодого, то нужно искать не самый маленькие значения, а самые большие.
12.12.2000 моложе чем 12.12.1995

Добавлено через 3 минуты
Вот что Вы еще считываете после того как считали введенную строку?
Pascal
1
2
3
4
5
6
7
8
9
10
readln(s); {Вводим данные одного человека}
  name:='';
  p:=0;
  repeat
   read(c);//здесь
   name:=name+c;
   p:=p+1; {posiziya s PROBELOM!}
  until c=' ';
  repeat
  read(c);//и здесь
Добавлено через 4 минуты
А парсить эти строки
Иванов Сергей 27.03.1993
нужно так.
Pascal
1
2
3
4
5
6
7
8
9
10
11
fio:=copy(s,1,pos(' ',s)-1);//фамилия
delete(s,1,pos(' ',s));
fio:=fio+' '+copy(s,1,pos(' ',s)-1);//+имя
delete(s,1,pos(' ',s));
s1:=copy(s,1,pos('.',s)-1);
val(s1,dn,c);//день
delete(s,1,pos('.',s));
s1:=copy(s,1,pos('.',s)-1);
val(s1,ms,c);//месяц
delete(s,1,pos('.',s));
val(s,gd,c);//год
1
Starstuck
4 / 4 / 1
Регистрация: 01.02.2012
Сообщений: 124
29.02.2012, 21:32  [ТС] #3
Puporev,
Цитата Сообщение от Starstuck Посмотреть сообщение
самого старшего человека из этого списка и выводить его фамилию
Добавлено через 30 секунд
Puporev, я имел ввиду неправильно находит самого старшего.

Добавлено через 2 минуты
Цитата Сообщение от Puporev Посмотреть сообщение
Вот что Вы еще считываете после того как считали введенную строку?
Код Pascal
1
2
3
4
5
6
7
8
9
10
readln(s); {Вводим данные одного человека}
* name:='';
* p:=0;
* repeat
* *read(c);//здесь
* *name:=name+c;
* *p:=p+1; {posiziya s PROBELOM!}
* until c=' ';
* repeat
* read(c);//и здесь
Это для того чтобы найти позицию последнего пробела(перед датой).
Ах да, в принципе, можно было обойтись одной ф-ией pos, дабы найти тот самый пробел, но не в этом суть.

Добавлено через 9 минут
Puporev, Меня смущает это:

Pascal
1
2
3
4
5
6
7
8
9
10
if (y<ym)or ((y=ym) and (m<mm)) or ((y=ym) and (m=mm) and (d<dm)) then
  begin
  dm:=d;
  mm:=m;
  ym:=m;
  nn:=name;
  k:=1;
  end
else if (d=dm) and (m=mm) and (y=ym) then 
  k:=k+1;
Такое условие правильно?
0
Puporev
Модератор
54348 / 41941 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
29.02.2012, 21:52 #4
Вроде правильно, а считает неправильно, нужно искать этот парадокс.

Добавлено через 11 минут
Вот ошибка
Pascal
1
2
3
4
5
6
7
 begin
  dm:=d;
  mm:=m;
  ym:=m;//ym:=y;
  nn:=name;
  k:=1;
  end
Добавлено через 1 минуту
Вот так получилось.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Uses crt;
var d,m,y:integer;
    name:string; {fam[20] name[20] mezhdy probel[1]!}
    nn:string;
    s,s1:string;
    check:integer;
    i,n,k:integer;
    dm,mm,ym,p:integer;
begin
clrscr;
nn:='';
DM:=31; {Макс d}
MM:=12; {Макс m}
YM:=2101; {Макс y}
write('n=');
readln(n);
for i:=1 to n do
 begin
  readln(s); {Вводим данные одного человека}
  name:=copy(s,1,pos(' ',s)-1);{фамилия}
  delete(s,1,pos(' ',s));
  name:=name+' '+copy(s,1,pos(' ',s)-1);{+имя}
  delete(s,1,pos(' ',s));
  s1:=copy(s,1,pos('.',s)-1);
  val(s1,d,check);{день}
  delete(s,1,pos('.',s));
  s1:=copy(s,1,pos('.',s)-1);
  val(s1,m,check);{месяц}
  delete(s,1,pos('.',s));
  val(s,y,check);{год}
  if (y<ym)or ((y=ym) and (m<mm)) or ((y=ym) and (m=mm) and (d<dm)) then
   begin
    dm:=d;
    mm:=m;
    ym:=y;
    nn:=name;
    k:=1;
   end
  else if (d=dm) and (m=mm) and (y=ym) then k:=k+1;
end;
 
if k=1 then
  writeln(nn)
else
   writeln(k);
readln;
end.
1
Starstuck
4 / 4 / 1
Регистрация: 01.02.2012
Сообщений: 124
29.02.2012, 21:54  [ТС] #5
Puporev, О, спасибо!
Но из-за чего он требует N+1 строк мне всё равно не ясно(в представленном мною варианте).
0
Puporev
Модератор
54348 / 41941 / 28977
Регистрация: 18.05.2008
Сообщений: 98,786
29.02.2012, 21:57 #6
Видимо из-за того что была ограничена длина строки и программе не хватало символов до 41, что-то вроде этого. Когда убрал ограничение по длине, это исчезло.
1
Starstuck
4 / 4 / 1
Регистрация: 01.02.2012
Сообщений: 124
29.02.2012, 22:01  [ТС] #7
Puporev, понял, thx.
0
29.02.2012, 22:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.02.2012, 22:01

Вывести на экран фамилию и имя самого высокого и самого низкого студентов
Имеются данные о студентах группы: фамилия, имя, рост в см. Составить программу...

Вывести на экран фамилию самого старшего студента и средний возраст для всех студентов
Создать файл, элементами которого являются сведения о студентах: фамилия,...

Записи. Считать из файла базу данных. Найти самого старшего человека из Москвы
В базе данных 14 человек. ФИО/Дата рождения/Город/Номер телефона 1) Вывести...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru