Einsendeaufgabe zu Studienheft CGP 2

- Perl 2 -

Frage 1

Erstellen Sie mithilfe des Moduls TK ein Perl-Script mit grafischer Oberfläche, das die Möglichkeit bietet, eine Ausgangsdatei im Textformat (.txt) zu spezifizieren. Der User muss außerdem den Namen einer Ausgabedatei selbst festlegen können. Durch das Anklicken eines Buttons soll das Skript die bestehende Datei einlesen und jeweils an der ersten Stelle einer Zeile eine Fortlaufende Zeilennummerierung einfügen. Außerdem müssen die festgelegte Ausgabedatei generiert und der Ereignistext in diese Datei ausgegeben werden, wobei über die grafische Oberfläche (Listbox) die erfolgreiche Ausführung angezeigt werden soll.

#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#
#           Der Pfad zum Interpreter ist vom Anwender einzustellen           #
#                  - sofern ein Unix-System benutzt wird -                   #
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#
#                                                                            #
#                        Einsendeaufgaben zu CGP02                           #
#          Aufgabe 1 - einfaches GUI für einfache Textverarbeitung           #
#                              von Frank Schmidt                             #
#                                                                            #
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::#

use strict;
use Tk;
use vars qw/$listbox/;

my $input="eingabe.txt";
my $output="ausgabe.txt";

my $mw = new MainWindow;
$mw->title ("Aufgabe 1 zu CGP02");
my $frame1 = $mw->Frame();                                      # Eingabedatei
my $frame2 = $mw->Frame();                                      # Ausgabedatei
my $frame3 = $mw->Frame();                                      # Protokoll
my $frame4 = $mw->Frame();                                      # Button
my $fstat = $mw->Frame(); # Statuszeile

# Frame für Eingabedatei
my $input_lable = $frame1 -> Label(-text	=> 'Eingabedatei:', -width =>'15'	);
my $input_filename_box =  $frame1 -> Entry(-textvariable	=> \$input,	-width => '30');
my $open= $frame1 -> Button(-text	=> 'Öffnen:', -command => sub { fileDialog($mw,  \$input, "open")},  -width =>'15' );

# Frame für Ausgabedatei
my $output_lable = $frame2 -> Label(-text	=> 'Ausagbedatei:', -width =>'15'		);
my $output_filename_box =  $frame2 -> Entry(-textvariable	=> \$output,	-width => '30');
my $execute = $frame2 -> Button(-text	=> 'Ausführen:', -command => \&execute,  -width =>'15' );

# Scrollbars für Text-Frame
my $listbox = $frame3->Text( -width =>'55'	);
my $yscr = $frame3->Scrollbar(-command =>
                             [yview => $listbox],
                          -orient  => 'vertical');
my $xscr = $frame3->Scrollbar(-command =>
                             [xview => $listbox],
                          -orient  => 'horizontal');

# Scrollbars mit dem Text-Frame verbinden
$listbox->configure(-yscrollcommand => [ set => $yscr ]);
$listbox->configure(-xscrollcommand => [ set => $xscr ]);

my $fname = $fstat->Label(	# dieses Label enthaelt spaeter unseren Dateinamen
						-textvariable => \$input,
						);
                        
# Frame für Button
my $exit = $frame4 -> Button(-text => 'Beenden', -command	=> [$mw => 'destroy'],  -width =>'15' );

$input_lable ->pack(-side => 'left', -fill => 'x');
$input_filename_box->pack(-side => 'left');
$open ->pack(-side => 'left', -fill => 'x');
$frame1->pack(-side=>'top', -fill => 'x');
$output_lable ->pack(-side => 'left', -fill => 'x');
$output_filename_box->pack(-side => 'left');
$execute ->pack(-side => 'left', -fill => 'x');
$frame2->pack(-side=>'top', -fill => 'x');
$frame3->pack(-expand => 'yes', -fill => 'both');
$yscr->pack(-side => 'right',  -fill => 'y');
$xscr->pack(-side => 'bottom', -fill => 'x');
$listbox->pack(-expand => 'yes', -fill => 'both', -side => 'left');
$fname->pack(-side=> 'left');
$exit -> pack(-pady => 10);
$frame4->pack(-side=>'bottom', -fill => 'x');
$fstat->pack;

MainLoop();

sub fileDialog { 
    my ($w, $ent, $operation) = @_;
	my $file;
	my $types;
    my @types =
      (["Text Dateien",           [qw/.txt .doc/]],
       ["Perl Scripte",         '.pl',		'TEXT'],
       ["C Quell  Dateien",	['.c', '.h']],
       ["Alle Quell Dateien",     [qw/.tcl .c .h/]],
       ["Alle Dateien",		'*']
      );
    if ($operation eq 'open') {
		$file = $w->getOpenFile(-filetypes => \@types);
	    if (defined $file and $file ne '') {
			$$ent = $file;
			&file_read($file);
	    }
	}
	elsif ($operation eq 'save') {
		$file = $input;
		$$ent = $file;
		&file_write($file);
	} else { # entspricht 'save_as'
		$file = $w->getSaveFile(-filetypes => \@types,
				-initialfile => 'text',
				-defaultextension => '.txt');
	    if (defined $file and $file ne '') {
			$$ent = $file;
			&file_write($file);
	    }
    }
}

sub file_read {  
 my $input = shift;
    unless( CORE::open (IFILE, "<$input") ){
	$mw->messageBox( -message => $input, -title => 'Fehler', -type => 'Ok', -icon=>'warning'); 
	return;
}
  while (<IFILE>){     
        $listbox->insert("end", $_);
    }
  close(IFILE);
}
sub execute
{
	my $input_filename  = $input_filename_box  -> get();
	my $output_filename = $output_filename_box -> get();

	$listbox -> insert('end','=====================================================================');
	$listbox -> insert('end','          Verarbeitung von "'.$input_filename.'" zu "'.$output_filename.'"...');
	$listbox -> insert('end','=====================================================================');
	$listbox -> insert('end','');
    
    
	my $input_file;
	my $output_file;
	

	if (!open($input_file , '<', $input_filename ))
	{
		$listbox -> insert('end','Die Eingabedatei darf nicht geöffnet werden existiert oder nicht  : '.$input_filename);
		$input_file = 0;
	}
	if (!open($output_file, '>', $output_filename))
	{
		$listbox -> insert('end','Die Ausgabedatei kann nicht erzeugt werden: '.$output_filename);
		$output_file = 0;
	}

	if ($input_file && $output_file)
	{
		my $textzeile;
		my $i = 1;
		while($textzeile = <$input_file>)
		{
			my $output_text = sprintf('%4i %s', $i, $textzeile);
			print $output_file $output_text;
			chomp($output_text);
			$listbox -> insert('end',$output_text);
			$i++;
		}
		
		close($input_file);
		close($output_file);
		$listbox -> insert('end','\n');
		$listbox -> insert('end','\Zeilennummern wurden eingefügt.');
	}

	$listbox -> insert('end','');
}
Frage 2

Wir stellen Ihnen für die zweite Einsendeaufgabe zwei Probleme zur Auswahl. Entscheiden Sie sich für eines der beiden. Senden Sie auf keinen Fall beide zur Beurteilung ein, denn welches soll Ihr/e Fachlehrer/in bewerten, wenn das eine richtig gelöst ist und das andere falsch?

  • Erstellen Sie eine Access-Datenbank, die aus zwei Tabellen besteht. Die erste Tabelle soll die Felder „Kundennummer“, „Adresse“, „Name“ und „Telefonnummer“ enthalten. In der zweiten Tabelle werden die Kundennummer und der Rechnungsbetrag gespeichert. Über einen Schlüsselwert (Kundennummer) müssen die beiden Tabellen in Verbindung stehen. Mithilfe eines HTML-Formulars soll diese Datenbank durch ein CGI-Skript nach dem Schlüsselwert durchsucht werden können. Bei einem Treffer sollen die Daten beider Tabellen, die sich auf diesen Schlüsselwert beziehen, in Tabellenform angezeigt werden. Außerdem soll eine Textdatei als Rechnung generiert werden, auf der die Adresse, der Name und die Rechnungssumme des jeweiligen Kunden angeführt sein sollen.
  • Erstellen Sie eine CSV-Datenbank mit beliebigen Zahlenwerten. Über ein HTML-Formular sollen alle Einträge in der Datenbank mithilfe eines CGI-Skripts in Tabellenform angezeigt werden können. Versuchen Sie außerdem über einen Link die Möglichkeit zu implementieren, diese Werte in einem Tortendiagramm mithilfe des Moduls GD darzustellen. Eine Anleitung zum Erstellen von Tortendiagrammen bietet die GD-Moduldokumentation.
print <<HERE_TEXT;

 Aufgabe 2: Umrechnung von DM in Euro...
 =======================================

 Geben Sie bitte einen DM-Wert ein:

HERE_TEXT

chomp ($betrag = <>);
$euro = $betrag / 1.955830;
$gerundet = sprintf('%.4f', $euro);

print "\n"."\n".
  " Dies entspricht ".$euro." Euro. \n"."\n".
  " Grundet auf 4 Nachkommastellen ergibt das einen Wert von: ".$gerundet." Eu-ro.\n";

Das Einlesen funktioniert, nur leider habe ich das Tortendiagramm nicht eingefügt bekommen.