2 Programmen im Pseudocode

Registriert
Okt. 2005
Beiträge
211
Guten Tag
Hab ein Problem mit 2 Aufgaben.


1. Aufgabe ist ich soll die Vokale in einem beliebigen Wort zählen lassen.

Mein Code
1 funct countVowel (word) returns int
2 if length of word = 1
3 then
4 if head-of word is-a vowel
5 then
6 return 1
7 else
8 return 0
9 fi
10 else
11 if head-of word is-a vowel
12 then
13 return 1 + countVowel (rest-of word)
14
15 else
16 return countVowel (rest-of word)
17 fi
18 fi
20 tcnuf

Nun zur Aufgabe: Notieren Sie den Ablauf für ein Wort Ihrer Wahl, das (I) mindestens 6 Zeichen lang und (II) mindestens 3
Vokale enthält. Der Ablauf ist ein Protokoll, in dem notiert wird
 ein rekursiver Aufruf mit den aktuellen Parametern, sowie der Zeile, in der der Aufruf stattfand
 ein Betreten des terminierenden Zweiges der Funktion
 die jeweils resultierenden Werte, sowie
 die eventuelle Weiterverarbeitung der Werte



2. Aufgabe ist es ein Schleifenseudocode (iterative Funktion) zu schreiben, in dem eine Division nur durch + und/oder - durchgeführt wird.


Ich hoffe auf schnelle Hilfe und möchte mich schonmal dafür bedanken.
 
Zuletzt bearbeitet:
Woran scheitert es denn genau, ohne deine Hausaufgaben machen zu wollen ;)
 
Is eben meine erste Woche in Informatik und ich weiss schonmal nicht, wie ich des mit nem Wort dann schreiben soll und in der zweiten Aufgabe fehlt mir die Formel.
 
Zuletzt bearbeitet:
Hab mir grad den Spaß gemacht und das ganze mal eben in Java umgesetzt (keine Ahnung, in welcher Sprache du das brauchst ;) ), weil ich mit dem Kollegen gestritten hab, welcher Lösungsansatz der schnellere wäre.

Lösung 1:
Code:
String lol = "ichbineinstringzumzaehlen";
char[] arr = {'a','e','i','o','u'};
int counter = 0;

for(int i=0;i<arr.length;i++)
{
	for(int j=0;j<lol.length();j++)
	{
		if(lol.charAt(j)==arr[i]) counter ++;
	}
}

Lösung 2:
Code:
String lol = "ichbineinstringzumzaehlen";
int counter = 0;

for(int i=0;i<lol.length();i++)
{
	String b = lol.substring(i,i+1);
	if(b.equals("a") ||b.equals("e") ||b.equals("i") ||b.equals("o") ||b.equals("u")) 
		counter++;
}

Tja leider ist meine langsamer (Lösung 2), allerdings, wie ich finde, einfacher zu durchschauen.
 
Zuletzt bearbeitet:
Zur ersten Aufgabe:

Du musst doch nur ein Beispiel-Wort nehmen und damit deinen gegebenen Pseudocode durchspielen.

Wenn Ihr keine konkreten Vorgaben habt, dann schreib es einfach als Stichpunkte untereinander

Ansonsten siehst Du ja hier schon ein Java-code für deinen Pseudo-Code. Wichtig ist hier die Rekursivität zu erkennen


Die zweite Aufgabe kannst Du lösen, indem Du überlegst wie Du dividieren kannst, indem Du nur mit minus-Operator arbeitest.
Bsp:

1000 : 100 = ??

Rechenweg:
1000 - 100 = 900 --> Rest --> also weiter und hochzählen (Zähler = 1)
900 - 100 = 800 --> Rest --> also weiter und hochzählen (Zähler = 2)
usw.

Wenn es ein Studium ist, was Du da machst, denk mal an den Stoff eines anderen Faches. Das ganze fällt nämlich in das Thema "Logik" rein.
Wahrscheinlich läuft es auf binäres Rechnen hinaus, vielleicht wurde da schon sowas angerissen.
 
Zuletzt bearbeitet:
Beim Dividenden fängst du bei der großwertigsten Ziffer (also der ganz linken) an und packst solange die nächsten Ziffern hinzu, bis die daraus resultierende Zahl durch den Divisor teilbar wird. Danach wird mit dem Rest weitergemacht, bis keine Teilung mehr möglich ist.

Code:
120360 / 60

1	/ 60	Ergebnis = 0,		Rest = 1
12	/ 60	Ergebnis = 00,		Rest = 12
120	/ 60	Ergebnis = 002,		Rest = 0
3	/ 60	Ergebnis = 0020,	Rest = 3
36	/ 60	Ergebnis = 00200,	Rest = 36
360	/ 60	Ergebnis = 002006,	Rest = 0

führende 0 kann man natürlich weglassen, also Ergebnis 2006
 
Mal sehen ob ich schnell was in VB.net zusammengenagelt kriege :D

ich bedien mich mal gerade bei manoman3^^
Code:
dim lol as String = "ichbineinstringzumzaehlen""
dim zähler as integer = 0
dim loltest as string 

for i as integer 0 to lol.length -1

  lol = lol.tolower
  loltest = lol(i,1)

  select case loltest
    case "a" 
      i +=
    case "e" 
      i +=
    case "i" 
      i +=
    case "u" 
      i +=
    case "o" 
      i +=
    case else
  
  end select

next
system.console.writeline("Es sind {0} Vokale", i)

Ich hoffe ich habs noch hingekriegt, ist lange her.
 
Kleine Anmerkung auch wenns niemand interessiert :D
Bei Lösung 2 in der for folgendes verwenden, und schon ist Lösung 2 zig mal schneller als Lösung 1 :cool_alt:

Code:
	char b = lol.charAt(i);
	if(b=='a'||b=='e'||b=='i'||b=='o'||b=='u') counter++;

Ende und aus von der Coding-Front :baby_alt:
 
und durch optimieren wäre auch das nochmal schneller:
Code:
	char b = lol.charAt(i);
	if(b=='a'||b=='e'||b=='i'||b=='o'||b=='u') ++counter;
aber ich glaube optimierung ist hier fehl am platze. es soll einfach nur funktionieren.
 
manoman3 schrieb:
Also egal ob ++counter oder counter++ in diesem Fall :)
der präfix (++x) brauch 3 takte um hochzuzählen, postfix (x++) brauch dagegen 4 takte. dass dir das nicht auffallen mag, mag korrekt sein, trotzdem ist präfix schneller.
 
Helf lieber mal dem John ;)

Ich hab nämlich kA, was das für eine Sprache ist :D
John kann es uns ja aber auch mal mitteilen :)

Ach btw. bitte einen Beweis für deine Theorie :D (per IM bitte, wollen hier ja nich den Thread unendlich zumüllen mit so ner Grundsatzfrage die mal leicht wie ATI vs Nvidia enden kann ;) )
 
Zuletzt bearbeitet:
ach tschuldigung ;-)

Ja is jetz keine spezielle Sprache, außer eben Pseudocode. Ham bis jetz aber nur mit Java programmiert.
 
als pseudocode kann man das aber auch nich grad bezeichnen. was z.b. ist fi, od, tcnuf. wenn das als ende von einem block dienen soll, dann ist das reichlich schlecht gewählt. viel eher sollte man lieber mit einrückung arbeiten, da man so gut sieht, was zusammenhängt und was nicht. weiterhin was beschreibt do 1 + (a-b, b)? was ich zumindest erkennen kann: irgendwas wird um 1 erhöht. nur was? beschreibst du hier einen vektor, einen bruch, rufst die funktion erneut auf, ...? pseudocode sollte so einfach wie möglich beschrieben sein und nicht auf etwas spezielles heruntergesetzt werden.
 
So wie ich es verstehe, muss er ein Javaprogramm schreiben (was hier ja nun zufällig schon fast fertig rumliegt :D ) und danach da an einem Beispiel mittels Pseudocode sich durcharbeiten.

Für Aufgabe 2 liegt hier auch schon ne Lösung rum ;)

Ach und, Pseudocode kann beliebig aussehen, hauptsache es ist verständlich für Außenstehende / Nichtinvolvierte
 
Zuletzt bearbeitet:
Ja bei mir in Word ises auch mit einrückung aber ging wohl beim kopieren verloren und ich finde den Code aussagend.
Er rechnet +1 und nimmt dann den rest und wiederholt dies solange, bis a kleiner als b ist.
 
ansich ne lösung, aber ich bezweifel, dass es sinnvoll ist, die zahl jedes mal in einen string zu konvertieren und mit dieser dann zu rechnen (erneutes konvertieren). ich würde eher sowas vorschlagen (simpel so lange den zähler hochzählen, bis die zahl kleiner als die eigentliche ist):
Code:
double Division( int x, int y )
{
  if( y == 0 ) return 0;
  if( x < y ) return x / (double)y;

  int r = 0, c = 0;
  while( r + y <= x )
  {
    r += y;
    ++c;
  }
  return c + Division( x - r, y );
}
das problem besteht halt nur im rest. man könnte diesen zwar auch noch ohne division lösen, aber die frage ist einfach, ob es der laufzeit zugute kommt (schließlich könnte man irgendwo bei 0,0000000000000000000000001 einfangen). im prinzip könnte man das auch auskommentieren, wodurch halt nur der wert ohne rest zurückgegeben wird.
 
In Java kannst du dann auch einfach Regular Expressions benutzen... das ist dann auch flexibler als Hochgeschwindigkeitshardcode ;)

Code:
public static int function(final String word){
	final String regex = "[aeiou]";
	int counter = 0;
	final Matcher matcher = Pattern.compile(regex).matcher(word);
	while(matcher.find()){
		++counter;
	}
	return counter;
}
 
Zurück
Oben