Schrift
[thread]387[/thread]

Zeichen, Zeilen u. Wörter zählen und ausgeben: (Aufgaben Programmieren)

Leser: 3


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Gast Gast
 2004-12-21 16:06
#3840 #3840
Hallo
Knobele an folgender Aufgabe :
1)
Schreiben Sie ein Programm "zaehle", das die Anzahl der Zeichen in der Eingabe ermittelt.
2)Erweiterung : Es soll ausgegeben werden wieviele Zeilen in der Eingabe getippt wurden.
3)Erweiterung: Es soll gezählt werden, wieviele Worte in der Eingabe getippt wurden.
Also Aufgabe 1 und 2 habe ich schon gelöst hier :

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#! /usr/bin/perl

$xziffern = 0;
$xzeilen = 0;
print "Geben Sie einen Satz ein:\n";

while(defined($y=getc STDIN)) {

$xziffern += 1;

if ($y eq "\n") {
($xziffern -= 1)
}
if ($y eq "\n") {
($xzeilen += 1)
}
}

print "------------------------------------------\n";
print "Es wurden soviele Ziffern eingegeben:$xziffern\n";
print "Es wurden soviele Zeilen eingegeben:$xzeilen\n";


Doch mit der 3 komme ich einfach nicht weiter
Es müsste in etwa so aussehen :
Code: (dl )
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#! /usr/bin/perl

$ibuchstaben=0;
$iword=0;
$bwort=0;
$inewlines=0;

while(defined($c=getc STDIN))
{
print $c;

if($c eq "\n")
{
++$inewlines;
if($bwort == 1)
{
$bwort=0;
++$iword;
}
}
elsif($c eq " ")
{
if($bwort == 1)
{
$bwort=0;
++$iword;
print "\n";
}
}
elsif($c eq ".")
{
if($bwort == 1)
{
$bwort=0;
++$iword;
print "\n";
}
}
}
elsif($c eq ",")
{
if($bwort == 1)
{
$bwort=0;
++$iword;
print "\n";
}
}
elsif($c eq "?")
{
if($bwort == 1)
{
$bwort=0;
++$iword;
print "\n";
}
}
elsif($c eq "!")
{
if($bwort == 1)
{
$bwort=0;
++$iword;
print "\n";
}
}
else
{
++$ibuchstaben;
$bwort=1;
}
}
print $ibuchstaben;
print "\n";
print $iword;
print "\n";
print $inewlines;

Doch leider habe ich da überhaupt kein Durchblick bei dieser "Muster"-Lösung
Mit welchem Verfahren kann ich da ran gehen ?
Genauso benötige ich dies soviel ich sehe bei der nöchsten Aufgabe
4)
Schreiben Sie ein Programm was alle Worte im Eingabetext untereinander ausgibt !
genauso suche ich noch wie wie ich ihm sagen kann, das er z.B. große Buchstaben in kleine Buchstaben macht :
Zug in zug
§z = [kleingeschrieben]

while (defined) $y = STDIN )
if ($y eq [aber zu was ?]);
print print $z

ich hoffe ihr habt eine idee und könnt mir weiterhelfen ?
Wäre echt nett
danke
Taulmarill
 2004-12-21 16:35
#3841 #3841
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hm, hier mal ein etwas perlisherer ansazt für das problem:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print "Geben Sie einen Satz ein:\n";

my $string;
{
local $/;
$string = <STDIN>;
}

print "------------------------------------------\n";
print "Es wurden soviele Ziffern eingegeben:";
print( scalar grep { $_ ne "\n" } split "", $string );
print "\n";

print "Es wurden soviele Zeilen eingegeben:";
print( scalar split "\n", $string );
print "\n";

print "Es wurden so viele Worte eingegeben:";
print( scalar split " ", $string );
print "\n";

print "Alle eingegebenen worte sind:\n";
print join "\n", split " ", $string;


---edit---
der von dir gepostete code funktioniert im prinzip auch, da ist nur eine schliessende geschweifte klammer zu viel. rücke den code mal vernünftig ein, dann solltest du das finden.\n\n

<!--EDIT|Taulmarill|1103639927-->
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Taulmarill
 2004-12-21 16:58
#3842 #3842
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Quote
Schreiben Sie ein Programm was alle Worte im Eingabetext untereinander ausgibt !
genauso suche ich noch wie wie ich ihm sagen kann, das er z.B. große Buchstaben in kleine Buchstaben macht


perldoc -f lc
Quote
lc EXPR
lc Returns a lowercased version of EXPR. This is the
internal function implementing the "\L" escape in
double-quoted strings. Respects current LC_CTYPE
locale if "use locale" in force. See perllocale and
perlunicode for more details about locale and
Unicode support.

If EXPR is omitted, uses $_.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Crian
 2004-12-21 19:33
#3843 #3843
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Was passiert, wenn jemand zwei oder mehr Leerzeichen eingibt?

Code: (dl )
split /\s+/
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Taulmarill
 2004-12-22 02:03
#3844 #3844
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
das funktioniert ganz hervorragend :)
Code: (dl )
1
2
$ perl -e'$foo="this    is    a test!";print join "-", split " ", $foo'
this-is-a-test!
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
ronald
 2004-12-22 08:40
#3845 #3845
User since
2003-08-15
76 Artikel
BenutzerIn
[default_avatar]
Für das Erkennen von Worten gibt es bei den regulären Ausdrücken noch das \b. Insbesondere werden dann auch Satzzeichen u.ä. korrekt behandelt.
Taulmarill
 2004-12-22 11:10
#3846 #3846
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
das \b ist aber für's split in diesem fall nicht zu empfehlen, da hier der spot zwischen wort- und nichtwort-zeichen gematcht wird.
evtl. könnte man das verbessern mit split /\W+/
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
Relais
 2004-12-22 11:41
#3847 #3847
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zu Aufgaben 3 und 4 tut ihr alle so helig, als wüßtet ihr, was Worte sind.
Wie ist ein Wort denn definiert?

Ist diese wirklich sehr spannende Frage erst gelöst, verschwinden auch die Programmierschwierigkeiten.

Definieren wir ein Wort einmal bequem als eine beliebige Folge ausschließlich der Zeichen A-Za-z0-9_, begrenzt von beliebigem Zeichen, daß nicht aus diesem Raum entstammt, dann ist ein Wort mit m/\w+/ zu matchen, ein Wortbegrenzer mit m/\W/ und dann ist
@Taulmarills Ansatz my @woerter = split ( /\W+/ , $text ); genau passend.

Definieren wir weiter ein Wort dürfe nicht mit einer Ziffer beginnen, dann würde es schwieriger...

Definieren wir ein Wort dürfe auch gar nicht erst Ziffern oder Underscore enthalten, dann ist ein Wort in Latin1 mit m/[A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\xff]+/ zu matchen, ein Wortbegrenzer mit m/[^A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\xff]/ und dann wär's my @woerter = split ( /[^A-Za-z\xc0-\xd6\xd8-\xf6\xf8-\xff]+/ , $text );

Unicode usw. haben wir dabei immer noch außer acht gelassen.
Was lernt man daraus? Computer und Menschen verstehen sich einfach nicht, die passen nicht zueinander.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
Relais
 2004-12-22 11:44
#3848 #3848
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Am handlichsten ist immer noch diese Definition von Wort: alles was sich ausschließlich durch Textanfang, Whitespace oder Textende sich begrenzen läßt und keines davon enthält.

my @woerter = split ( /\s+/ , $text );

Vorraussgesetzt, wir haben Whitespace so definiert, daß Perls \s es richtig trifft...

Update: Das ist ja ein später glorreicher Einfall von mir, aber die Aufgabenbeschreibung paßt sehr zum Unix-Shell-Tool wc

Quote
wc - print the number of newlines, words, and bytes in files
\n\n

<!--EDIT|Relais|1103710401-->
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
renee
 2004-12-22 12:43
#3849 #3849
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Anzahl Worte ohne wc:
Code: (dl )
C:\wampp1\perl\bin>perl -le "$var = 'dies sit  ein    stringvvvvvv          test'; $anz = () = $var =~ /\b(.+?)\b/g; print $anz"


Ausgabe:
5
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2004-12-21 16:06.