Первая прога на Перле не пашет (( Нужен хелп

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Gnix
мл. сержант
Сообщения: 127
Зарегистрирован: 2008-03-21 2:50:24
Откуда: Ukraine, Kiev
Контактная информация:

Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение Gnix » 2008-06-10 5:05:37

Начал читать книгу по Перлу("Программирование на Перл - Уолл") и первый код неработает :?
Нужно сложить две оценки для каждого ученика из файла (которые размещены через пробел), посчитать общее количество(учеников) и общее количество баллов, разделить второе на первое и получить средний балл.
Файл grades, ученики тут в виде ??????:

Код: Выделить всё

???1130 23 16
???1180 19 16
???1454 19 13
???1477 0 0
???1988 25 22
???2195 19 13
???3010 19 13
???3269 0 0
???3362 19 18
???3609 0 0
???3624 23 17
???3878 22 13
???4277 19 13
???4490 30 19
???4594 19 18

Код: Выделить всё

#!/usr/bin/perl  
 
open(GRADES,"grades") or die "Error: $!\n";
while ($line=<GRADES>){
  ($student, $grade1, $grade2) = split(" ", $line);
  $grade=$grade1+$grade2;
  $grades{$student} .=$grade . " "; 
}

foreach $student (sort keys %grades){
  $scores=0;
  $total=0;
  @grades=split(" ", $grades{$student});
  foreach $grade (@grades) {
   $total+=$grade;
   $scores++;
}
$average=$total/$scores;
print "$student: $grades{$student}\tRESULTS: $averege\n";
}
результат

Код: Выделить всё

???1130: 39     RESULTS: 39
???1180: 35     RESULTS: 35
???1454: 32     RESULTS: 32
???1477: 0      RESULTS: 0
???1988: 47     RESULTS: 47
???2195: 32     RESULTS: 32
???3010: 32     RESULTS: 32
???3269: 0      RESULTS: 0
???3362: 37     RESULTS: 37
???3609: 0      RESULTS: 0
???3624: 40     RESULTS: 40
???3878: 35     RESULTS: 35
???4277: 32     RESULTS: 32
???4490: 49     RESULTS: 49
???4594: 37     RESULTS: 37
а мне нужно чтобы в RESULTS стоял средний балл от всех баллов, не понимаю в инструкциях :st: :st:

буду благодарен если кто поможет :(

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение zg » 2008-06-10 7:22:26

Gnix писал(а):$average=$total/$scores;
Gnix писал(а):print "$student: $grades{$student}\tRESULTS: $averege\n";

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение zg » 2008-06-10 7:27:22

Gnix писал(а):@grades=split(" ", $grades{$student});
не надо давать разным переменным одинаковые имена :el:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение zg » 2008-06-10 9:25:07

Gnix писал(а): и первый код неработает
что-то код сложноватый для хелловорлд.

прочитай главу про работу с файлами, затем нумерованные массивы, затем ассоциативные, тогда будет понятней

Gnix
мл. сержант
Сообщения: 127
Зарегистрирован: 2008-03-21 2:50:24
Откуда: Ukraine, Kiev
Контактная информация:

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение Gnix » 2008-06-13 5:01:28

упростил код до такого: :smile: :fool:

Код: Выделить всё

#!/usr/bin/perl  
 
$scores=0;
$total=0;
open(GRADES,"grades") or die "File did not open: $!\n";
while ($line=<GRADES>){
  ($student, $grade1, $grade2) = split(" ", $line);
  $grade=$grade1+$grade2;
  $total+=$grade;
  $grades{$student} .=$grade . " "; 
  $scores++
  }
 
foreach $student (sort keys %grades){

 $average=$total/$scores;
 print "$student: $grades{$student}\n";
}
 print "RESULTS: $average\tUsers: $scores\n";


и получил свои средние значения ;-)

Код: Выделить всё

???1130: 39
???1180: 35
???1454: 32
???1477: 0
???1988: 47
???2195: 32
???3010: 32
???3269: 0
???3362: 37
???3609: 0
???3624: 40
???3878: 35
???4277: 32
???4490: 49
???4594: 37
RESULTS: 29.8   Users: 15

Спасибо zg

Gnix
мл. сержант
Сообщения: 127
Зарегистрирован: 2008-03-21 2:50:24
Откуда: Ukraine, Kiev
Контактная информация:

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение Gnix » 2008-06-13 5:49:37

А как сделать сортировку $grades{$student} по убыванию, или возрастанию ?? :unknown:

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение zg » 2008-06-13 10:16:24

Gnix писал(а):foreach $student (sort keys %grades){
тут и идёт сортировка, как я понял. Ну можешь мануал почитать http://perldoc.perl.org/functions/sort.html для меня это набор букв :cf:

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: Первая прога на Перле не пашет (( Нужен хелп

Непрочитанное сообщение ProFTP » 2008-06-13 18:30:35

Gnix писал(а):А как сделать сортировку $grades{$student} по убыванию

Код: Выделить всё

foreach $student (reverse sort  keys %grades){
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение