void function
-
Hallo zusammen, sitze gerade an meinen Informatikaufgaben und zerbereche mir den kopf, ist sollte die PRE und POST conditions fur folgende function finden:
void g (unsigned int n) { if (n==0) {std::cout << "*"; return; } g(n-1); g(n-1); }ich wollte diese function mal einbauen, nur klappt das - wohl wegen dem void - irgendwie nicht, zuerst wollte ich folgendes machen
#include <iostream> void g (unsigned int n) { if (n==0) {std::cout << "*"; return; } g(n-1); g(n-1); } int main() { std::cout << "Enter a small number n. n=? "; unsigned int a; std::cin >> a; void ret=g(a); std::cout << ret << " "; return 0; }das gab diese fehlermeldungen:
g++ Tfunc.C
Tfunc.C: In functionint main()': Tfunc.C:20: error: variable or fieldret' declared void
Tfunc.C:20: error: void value not ignored as it ought to beCompilation exited abnormally with code 1 at Sun Dec 2 13:39:37
Dann baute ich um, und der hammer:
#include <iostream> void g (unsigned int n) { if (n==0) {std::cout << "*"; return; } g(n-1); g(n-1); } int main() { std::cout << "Enter a small number n. n=? "; unsigned int a; std::cin >> a; //void ret=g(a); std::cout << g(a) << " "; return 0; }Kam das:
Tfunc.C: In function `int main()':
Tfunc.C:21: error: no match for 'operator<<' in 'std::cout << g(a)'
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:63: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>&()(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:74: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>&()(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:86: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base&()(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:121: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:155: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:98: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:178: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:189: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:193: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:204: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:179: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:214: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:238: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:219: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:261: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:284: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:307: note: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:504: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const unsigned char) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:499: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const signed char*) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:612: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, const char*) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:567: note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, const char*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:465: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, unsigned char) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:460: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, signed char) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ostream.tcc:505: note: std::basic_ostream<char, _Traits>& std::operator<<(std::basic_ostream<char, _Traits>&, char) [with _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/ostream:449: note: std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char) [with _CharT = char, _Traits = std::char_traits<char>]Compilation exited abnormally with code 1 at Sun Dec 2 13:41:11
Kann mir bitte jemand helfen, und sagen wo der fehler liegt, bzw. wie ich die function einbauen kann.
Merci, lg Frauke
-
Was bedeutet void? Und dann überleg mal warum du void (übersetzt: nichts) nicht ausgeben kannst und warum du keine Variable vom Typ void anlegen kannst.
-
Aber was macht dann diese Funktion? Bzw. was nützt sie, wenn ich sie nicht ausgeben kann?
Klar, wenn n==0 ist dann gibt sie * aus.
aber wenn der input, sagen wir 3 kommt,
dann führt sie g(n-2), also g(2) aus und darin ja wieder g(1), g(0) -- gibt ein sternlein?
und das zweite g(n-1), ist das also für nichts? wird das gar nie ausgeführt?
-
Frauke schrieb:
Aber was macht dann diese Funktion? Bzw. was nützt sie, wenn ich sie nicht ausgeben kann?
Klar, wenn n==0 ist dann gibt sie * aus.
aber wenn der input, sagen wir 3 kommt,
dann führt sie g(n-2), also g(2) aus und darin ja wieder g(1), g(0) -- gibt ein sternlein?
und das zweite g(n-1), ist das also für nichts? wird das gar nie ausgeführt?
Tipp: Rekursion, in diesem Fall Baum-Rekursion. Such mal danach.
Die Funktion hat zwar keinen Rückgabewert, gibt aber Sternchen aus, ist doch was.Hier wird dir sicher niemand die Lösung vorschreiben/vorkauen, dir zuliebe.
Sowas muss man selbst verstehen lernen, ist manchmal anstregend, weiss ich selbst
-
In anderen Sprachen bezeichnet man Funktionen ohne Rückgabewert als Prozeduren (vllt. ist dir dieser Begriff geläufiger).
Und wenn du dir die Funktion g genauer anschaust, dann siehst du, wie man sie aufruft, nämlich einfach "g(x)".
Diese Funktion ist im mathematischen Sinne keine (eben eine Prozedur), aber sie hat dennoch eine Funktionalität, nämlich die Ausgabe von Sternchen auf die Konsole.
Und weil die Funktion sich selber wieder aufruft, bezeichnet man dies als Rekursion.Bzgl. der Pre- und Postconditions bedeutet dies also im mathematischen Sinne, daß sie nichts macht, aber im technischen Sinne, daß sie einen Nebeneffekt hat.
-
Meines Wissens bedeuten preconditions genau das was es wörtlich übersetzt ist: Vorbedingungen. Sprich, welche Bedingungen erfüllt sein müssen um diese Funktion sinnvoll auszuführen. Mit den Bedingungen ist dann der Status des Programms vor Ausführung gemeint und ggf. Bedingungen an Parameter.
Postconditions ist dann der Programmstatus den die Funktion hinterlässt, wenn sie fehlerfrei (hier ohne exceptions) gelaufen ist.