Форум программистов, компьютерный форум, киберфорум
Наши страницы

Turbo Pascal

Войти
Регистрация
Восстановить пароль
 
Seems_
0 / 0 / 0
Регистрация: 07.09.2017
Сообщений: 18
#1

Определить средний возраст мужчин в группе - Turbo Pascal

07.09.2017, 22:30. Просмотров 335. Ответов 14
Метки нет (Все метки)

Дан список группы в 10 человек в вида
ФАМИЛИЯ И.О. ПОЛ ГОД_РОЖДЕНИЯ
15 сив. 4 симв. 1 симв. 4 симв.
Данные в одной строке отделяются друг от друга пробелами. Например:
Иванов И.И. м 1970
Определить средний возраст мужчин в группе.
Выполнить с использованием двумерных символьных массивов, текстовых файлов и без процедур.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.09.2017, 22:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить средний возраст мужчин в группе (Turbo Pascal):

Записи: В группе студентов определить средний балл у каждого студента - Turbo Pascal
Примечание: Из текстового файла, где в каждой строке задана информация об одном человеке, прочитать соответствующую информацию по полям...

Записи: Определить средний балл по группе студентов по каждому из предметов - Turbo Pascal
Исходная таблица представляет собой список студентов (ф.и.о) по всем предметам за предыдущую сессию. Требуется: 1. Определить средний...

В группе из 25 человек (мужчины и женщины) определить средний рост женщин - Turbo Pascal
Программу записать на языке Pascal с использованием процедур (функций) Всем,заранее, спасибо!!!

Записи. Дана група людей (пол,рост). Определить средний рост мужчин - Turbo Pascal
Дана група людей (пол,рост). Определить средний рост мужчин

Записи. Известны возраст и пол каждого из 20-ти человек. Найти общую массу мужчин - Turbo Pascal
Известны возраст и пол каждого из 20-ти человек.Найти общую массу мужчин.

Определить средний рост студентов в группе, если известно количество студентов и рост каждого студента - Turbo Pascal
Такая вот задачка: Определить средний рост студентов в группе, если известно количество студентов и рост каждого студента. Данные ввести...

14
JuriiMW
Эксперт Pascal/Delphi
1509 / 790 / 673
Регистрация: 10.12.2014
Сообщений: 2,793
08.09.2017, 06:56 #2
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var
  T : Text;
  S, name : String;
  V, Y, C : Integer;
begin
  Write('Имя файла: '); ReadLn(name);
  Write('Текущий год: '); ReadLn(V);
  Assign(T, name); Reset(T); C := 0; Y := 0;
  while Not EOF(T) do
    begin
      ReadLn(T, S);
      if S[Length(S)-6]='м' then
        begin
          Y := Y+(((Ord(S[Length(S)-3])-48)*10+Ord(S[Length(S)-2])-48)*10+Ord(S[Length(S)-1])-48)*10+Ord(S[Length(S)])-48;
          C := C+1;
        end;
    end;
  Close(T);
  if C=0 then WriteLn('Нет мужчин или структура файла не соответствует стандарту.') else WriteLn('Средний возраст мужчин ', (V*C-Y)/C);
end.
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3558 / 2253 / 1154
Регистрация: 22.11.2013
Сообщений: 5,930
08.09.2017, 08:39 #3
Можно попробовать получение года сделать чуть лаконичнее, заодно избавившись и от «магической константы»:
Pascal
12
13
    n:=0; for i:=Length(s)-3 to Length(s) do n:=n*10+Ord(s[i])-Ord('0');
    y:=y+n;
Добавлено через 4 минуты
Вероятно, имеет смысл суммировать возраст, во избежание переполнения
Pascal
1
2
3
    y:=y+n-v;
...
  WriteLn(..., y/c);
0
JuriiMW
Эксперт Pascal/Delphi
1509 / 790 / 673
Регистрация: 10.12.2014
Сообщений: 2,793
08.09.2017, 09:07 #4
Цитата Сообщение от bormant Посмотреть сообщение
сделать чуть лаконичнее
И ради этого добавлено 2 переменные?
А смысл?
Если можно обойтись без них…

Цитата Сообщение от bormant Посмотреть сообщение
избежание переполнения
Это да!
Хотя, в данном контексте маловероятно, что в списке будет больше 32 человек мужского пола, да ещё и рождённых после 2000 года…

А проще тогда в моём коде сделать Y действительным!
0
Puporev
Модератор
52428 / 40275 / 13602
Регистрация: 18.05.2008
Сообщений: 93,123
08.09.2017, 09:56 #5
Цитата Сообщение от Seems_ Посмотреть сообщение
с использованием двумерных символьных массивов, текстовых файлов
Пример файла
Иванов И.И. м 1970
Петров А.А. м 1981
Иванова Е.В. ж 1980
Сидоров П.И. м 1969
Ветрова А.Н. ж 1990
Мишин С.Е. м 1985
Сергеев В.В. м 1970
Порошина М.С. ж 1965
Петров А.Г. м 1951
Иванова С.В. ж 1950
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
uses crt;
{перевод русских символов из ANSI в файле в ASCII на экране}
function Convert(s:char):char;
var i:integer;
begin
if ord(s) in [192..239] then Convert:=chr(ord(s)-64)
else if ord(s) in [240..255] then  Convert:=chr(ord(s)-16)
else if ord(s)=168 then Convert:=chr(240)
else if ord(s)=184 then Convert:=chr(241)
else Convert:=s;
end;
const m=10;
      n=27;
      tg=2017;
var f:text;
    a:array[1..m,1..n] of char;
    c:char;
    i,j,k,gr:integer;
    s:real;
begin
clrscr;
assign(f,'1.txt');{файл в папке с программой}
reset(f);
{читаем матрицу из файла}
i:=1;
j:=0;
while not eof(f) do
 begin
  read(f,c);
  if not (c in[#10,#13,#26]) then
   begin
    inc(j);
    a[i,j]:=convert(c);
    write(a[i,j]);
    if j=n then
     begin
      j:=0;
      inc(i);
      writeln;
     end;
   end;
 end;
close(f);
writeln;
s:=0;
k:=0;
for i:=1 to m do
if a[i,22]='м' then
 begin
  val(a[i,24]+a[i,25]+a[i,26]+a[i,27],gr,j);
  s:=s+tg-gr;
  inc(k);
 end;
if k=0 then write('В группе нет мужчин')
else write('Средний возраст мужчин=',s/k:0:1);
readln;
end.
Добавлено через 5 минут
Цитата Сообщение от JuriiMW Посмотреть сообщение
маловероятно, что в списке будет больше 32 человек мужского пола
Так в условии
Цитата Сообщение от Seems_ Посмотреть сообщение
Дан список группы в 10 человек
0
JuriiMW
Эксперт Pascal/Delphi
1509 / 790 / 673
Регистрация: 10.12.2014
Сообщений: 2,793
08.09.2017, 11:21 #6
Цитата Сообщение от Puporev Посмотреть сообщение
Так в условии…
Дык, и я говорю, что не нужно лишних операций!
Это мне bormant, на вид ставил…
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3558 / 2253 / 1154
Регистрация: 22.11.2013
Сообщений: 5,930
08.09.2017, 11:22 #7
Pascal
48
if a[i,22]='м' then
с учётом строки 33
Pascal
33
    a[i,j]:=convert(c);
и раздела Turbo Pascal с исходником скорее всего в кодировке OEM, скорее должно было быть
Pascal
1
    if a[i,22]=convert('м') then
или даже
Pascal
1
2
3
  t:=convert('м');
...
    if a[i,22]=t then
0
Comrade2017
7 / 7 / 2
Регистрация: 30.12.2016
Сообщений: 93
08.09.2017, 11:36 #8
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
   
 program fff;
  uses crt;
    var
      k,i,n:integer;
      a:array[1..100] of string;
       c:array[1..100] of string;
      b:array[1..100] of integer;
   begin
     clrscr;
     a[1]:='ggdfgf';
     c[1]:='m';
     b[1]:=1970;
 
    a[2]:='ggdffsdfgf';
     c[2]:='m';
     b[2]:=1980;
 
     a[3]:='ggdfgf';
     c[3]:='m';
     b[3]:=1977;
 
     a[4]:='ggdfgf';
     c[4]:='m';
     b[4]:=1985;
 
     a[5]:='ggdfgf';
     c[5]:='m';
     b[5]:=1985;
 
    a[6]:='ggdfgf';
     c[6]:='m';
     b[6]:=1989;
 
    a[7]:='ggdfgf';
     c[7]:='m';
     b[7]:=2000;
 
    a[8]:='ggdfgf';
     c[8]:='m';
     b[8]:=1989;
 
    a[9]:='ggdfgf';
     c[9]:='m';
     b[9]:=2010;
 
     a[10]:='ggdfgf';
     c[10]:='m';
     b[10]:=2011;
 
     n:=0;
     for i:= 1 to 10 do
     n:=n+(2017-b[i]);
     n:=n div 10;
     write(n);
end.
0
Puporev
08.09.2017, 11:43
  #9

Не по теме:

bormant, Вот хороший экземпляр для обучения.

0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3558 / 2253 / 1154
Регистрация: 22.11.2013
Сообщений: 5,930
08.09.2017, 11:57 #10
Цитата Сообщение от Seems_ Посмотреть сообщение
15 сив. 4 симв. 1 симв. 4 симв.
Данные в одной строке отделяются друг от друга пробелами
И да, нужно отметить возможное противоречие в условии.
Вариантов бывает обычно 2:
1) фиксированная ширина полей,
2) поля через разделитель (тогда дана максимальная ширина каждого из полей).

Если поле пола ровно 1 символ, можем мы рассчитывать на наличие пробела между ним и годом?

Или формат нужно читать вообще третьим образом:
15 символов фамилии
1 пробел
4 символа инициалов
1 пробел
1 символ пола
1 пробел
4 символа года

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

Один из вариантов, не претендующий на универсальность:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
  a: array [0..31] of Char;
  n, s, y, t, i: Integer;
begin
  Write('Текущий год: '); ReadLn(y);
  Assign(input, 'input.txt'); Reset(input);
  while not SeekEoF do begin
    ReadLn(a);
    i:=0; while a[i]<>#0 do Inc(i);
    { ожидаем ... <пол:1> пробел:1 <год:4> #0 }
    if (i>=6) and (a[i-6] in ['M','m','М','м',#$cc,#$ec]) then begin
      t:=0; for i:=i-4 to i-1 do t:=t*10+Ord(a[i])-Ord('0');
      Inc(s,y-t); Inc(n);
    end;
  end;
  Close(input);
  if n>0 then WriteLn('Средний возраст: ',s/n:0:1)
  else WriteLn('Подходящих строк нет');
end.
Предлагаю покритиковать/пообсуждать.
JuriiMW, присоединяйтесь.

Добавлено через 4 минуты
Comrade2017,
жаль, но код не соответствует заданию:
1) вы поместили данные в код программы, но их нужно прочитать из файла.
2) данные на ФИО, пол и год вы заранее разделили руками, но это должна сделать программа.
3) год заранее задан в виде числа, а это должна сделать программа.
4) использованы string, но, скорее всего, этого делать нельзя по условию.
0
Comrade2017
7 / 7 / 2
Регистрация: 30.12.2016
Сообщений: 93
08.09.2017, 12:37 #11
bormant Дан список группы в 10 человек в вида
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3558 / 2253 / 1154
Регистрация: 22.11.2013
Сообщений: 5,930
08.09.2017, 12:52 #12
Цитата Сообщение от Comrade2017 Посмотреть сообщение
bormant Дан список группы в 10 человек в вида
Если вы этим хотели что-то сказать, то скажите, но пока непонятно. В любом случае, это не означает, что даны 3 готовых массива, как у вас в коде. Кроме того, в сообщении на форуме, не воспользовавшись тегом CODE, невозможно разместить текст с несколькими пробелами подряд (сюрприз). Вот здесь ниже набрано 5 пробелов между 1 и 2:
Без тега:
1 2
С тегом:
Код
1     2
Добавлено через 2 минуты
Так вот, в исходном сообщении пример на самом деле вот такой ("линейка" моя). По линейке хорошо видно, что пример описанию немного не соответствует.
Код
         1         2         3
123456789012345678901234567890
=============== ==== = ====
Иванов          И.И.  м  1970
Иванов          И.И. м 1970
=============== ==== = ====
0
JuriiMW
Эксперт Pascal/Delphi
1509 / 790 / 673
Регистрация: 10.12.2014
Сообщений: 2,793
11.09.2017, 06:48 #13
bormant, ну и получается, что мой код из самого первого ответа прочитает эти данные без проблем и сможет ответить на вопрос задания ;–)
Ну а на счёт
Цитата Сообщение от Seems_ Посмотреть сообщение
Выполнить с использованием двумерных символьных массивов, текстовых файлов и без процедур.
могу сказать следующее:
— символьные массивы — есть, но только линейные (тип String), а больше и не нужно! Зачем занимать больше памяти для хранения данных, если их можно обработать сразу при чтении;
— текстовые файлы — есть такое дело;
— без процедур — вот тут есть непонятки, ибо даже в помощи по TP написано, что Write, WriteLn, Read, ReadLn, Assign, Reset и Close — это всё процедуры…
А как без них то?
0
bormant
Модератор
Эксперт Pascal/DelphiЭксперт NIX
3558 / 2253 / 1154
Регистрация: 22.11.2013
Сообщений: 5,930
11.09.2017, 08:16 #14
JuriiMW,
прочитает и ответит. Потом получит данные соответствующие данному в задании описанию, а не примеру, и не ответит.
А по поводу остального — если правильно путаю, можем уточнить у ТС, подобные неуклюжие задачи и ограничения дают в самом начале обучения, когда циклы и условия уже знают, а строки — еще нет. Ну или учебник из тех времен, когда в паскале строк (String) еще не было. А вот чем обусловлено требование прочитать все в память до начала обработки, если не чтением с перфокарт или перфоленты,— теряюсь в догадках.
0
Seems_
0 / 0 / 0
Регистрация: 07.09.2017
Сообщений: 18
16.09.2017, 21:20  [ТС] #15
Благодарю
0
16.09.2017, 21:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2017, 21:20
Привет! Вот еще темы с ответами:

Вычислить средний возраст членов группы - Turbo Pascal
В туристической группе 15 человек разного возраста. Вычислить средний возраст членов группы.

Подпрограммы,найти средний возраст среди мальчиков и девочек. - Turbo Pascal
Имеются сведения о годах рождения. Найти средний возраст среди мальчиков и девочек. Через процедуры. Добавлено через 5 часов 31 минуту

Выведите список предприятий, у которых R/S выше чем средний по свей группе - Turbo Pascal
http://s2.ipicture.ru/uploads/20110220/xzl35YUH.jpg нужно с 7 по 11 помогите пожаалуйстаа

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


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

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

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