Расчеты из значений БД Perl CGI - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь получить подсчет gpa учащегося, получая его оценку и количество кредитов, которые его класс составляет, и вычисляя его.У меня возникла проблема, когда он не рассчитывает правильно начисленные кредиты и средний балл.Для оценки U или F заработанные кредиты должны быть 0, но это не то, что результат.Я не уверен, что не так с моими утверждениями.

#!/usr/bin/perl 
#This is going to be the user login check and will set a cookie

use DBI;
use CGI qw(:standard);

use strict;

#Connection error 
sub showErrorMsgAndExit {
    print header(), start_html(-title=>shift);
    print (shift);
    print end_html();
    exit;
}

#Connecting to the database
my $dbUsername = "root";
my $dbPassword = "password";

my $dsn = "DBI:mysql:f18final:localhost";
my $dbh = DBI->connect($dsn, $dbUsername, $dbPassword, {PrintError => 0});

#error checking
if(!$dbh) {
    print header(), start_html(-title=>"Error connecting to DB");
    print ("Unable to connec to the database");
    print end_html();
    exit;
}

print header;
print start_html(-title=>'Edit Classes');

#Need to execute sql command and then iterate row by row
my $sql = "SELECT * FROM tblclasses";
my $sth = $dbh->prepare($sql);
$sth->execute();

my $passedCredits = 0;
my $attemptedCredits = 0;
my $totalHonor = 0;
my $gpa = 0.000;


##SSSssssssearch part


print "<table border=solid 1px>"; #start of table
print "<tr><th>Class Name</th><th>Department</th><th>Class Number</th><th>Grade</th><th>Credits</th>";
print "</tr>";
while( my @row = $sth->fetchrow_array) {
    print "<tr><td>";
    print $row[1];
    print "</td>";
    print "<td>";
    print $row[2];
    print "</td>";
    print "<td>";
    print $row[3];
    print "</td>";
    print "<td>";
    print $row[4];
    print "</td>";
    print "<td>";
    print $row[5];
    print "</td>";

    $attemptedCredits = $attemptedCredits + $row[5];
    if($row[4] == 'A' || $row[4] == 'a') {
        $passedCredits = $passedCredits + $row[5];
        $gpa = $gpa + (4 * $row[5]);
    }
    elsif($row[4] == 'B' || $row[4] == 'b') {
        $passedCredits = $passedCredits + $row[5];
        $gpa = $gpa + (3 * $row[5]);
    }
    elsif($row[4] == 'C' || $row[4] == 'c') {
        $passedCredits = $passedCredits + $row[5];
        $gpa = $gpa + (2 * $row[5]);
    }
    elsif($row[4] == 'D' || $row[4] == 'd') {
        $passedCredits = $passedCredits + $row[5];
        $gpa = $gpa + (1 * $row[5]);
    }
    elsif($row[4] == 'F' || $row[4] == 'f') {

    }
    elsif($row[4] == 'S' || $row[4] == 's') {
        $passedCredits = $passedCredits + $row[5];
    }
    elsif($row[4] == 'U' || $row[4] == 'u') {

    }

    #calculate

    print "</tr>";

}


print "</table>";

#Need to make a table and populate it with text boxes of all the class data


print "</table>"; #End of table

$gpa = $gpa / $attemptedCredits;

##RReturn values
print qq{
<table border = '1px solid'>
<tr>
<td>
Attempted Credits
</td>
<td>
Passed Credits
</td>
<td>
GPA
</td>
</tr>
<tr>
<td>
$attemptedCredits
</td>
<td>
$passedCredits
</td>
<td>
$gpa
</td>
</tr>
</table>
};
print "<form action=http://localhost/cgi-bin/actions.pl method = 'post' >";
print "<input type = 'submit' name = 'submit' value = 'More Options'>";
print "</form>";
print "<form action=http://localhost/cgi-bin/searchingTran.pl method = 'post' >";
print "<input type = 'text' name = 'search' size = '25'><br>";
print "<input type = 'submit' name = 'submit' value = 'Search'>";
print "</form>";
print end_html();

Вот мой вывод enter image description here

Также есть способ распечатать GPA до трехдесятичные разряды?

1 Ответ

0 голосов
/ 13 декабря 2018

Для оценки U или F заработанные кредиты должны быть 0, но это не то, что вывод.

Когда вы генерируете вывод, вы печатаете содержимое $row[5], прежде чем даже смотреть на то, что оценка была.Чтобы правильно отобразить его как 0, вам нужно сначала проверить оценку, а затем вывести либо 0 (если оценка была "F" или "U"), либо $row[5] (если оценка была чем-то еще).

В реальном коде я бы рекомендовал использовать систему шаблонов (например, Template :: Toolkit ) вместо прямой печати HTML, что поможет избежать ошибок такого рода, но явижу, что это похоже на домашнее задание, и я сомневаюсь, что использование альтернативных методов, подобных этому, будет в пределах границ задания.

Также есть ли способ вывести GPA с точностью до трех знаков после запятой?

Использование printf или sprintf:

$gpa = sprintf('%0.3f', $gpa / $attemptedCredits);
...