Zum Inhalt springen

Wie gut seit ihr wirklich ???


maddin

Empfohlene Beiträge

dies ist eigenlicht nicht so richtig eine frage. mehr eine überprüfung wie gut ihr seit. gab ja abundzu ein paar streitigkeiten darüber.

aufgabe:

eine funktion soll geschrieben werden, die mir folgendes hauptprogramm ermöglicht.

// prototyp

int main ()

{

summe (2, 4, 5 ); // gibt 9 zurück

summe (3, 5, 6, 7); // gibt 18 zurück

}

na da bin ich mal auf eure lösungen gespannt.

ps: ihr dürft sowohl c als auch c++ mittel verwenden.

viel spass

Link zu diesem Kommentar
Auf anderen Seiten teilen

Weiss nich, ob ich Dich richtig verstanden habe...

#include <stdio.h>

int summe(int a,int b,int c,int d=0)

{

return b+c+d;

}

int main()

{

int wert1, wert2=0;

wert1=summe (2, 4, 5 ); // gibt 9 zurück

wert2=summe (3, 5, 6, 7); // gibt 18 zurück

printf("\nWert1: %i, Wert2: %i\n",wert1,wert2);

return 0;

}

Aber ich hoffe, daß Du mir keine 4- gibst, Herr Lehrer ! :):)

gruß gugel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hm, irgendwie habe ich da das Problem, das die Anzahl der Parameter nicht konstant ist.

Bei C++ wäre das kein Problem, aber die Klasse darf ja wohl auch nur eine Memberfunktion "Summe" besitzen.

Aber da ich ja nun nicht wirklich gut bin, wie geht das denn?

(variable Anzahl Parameter???)

Gr33tz

Ketzer

Link zu diesem Kommentar
Auf anderen Seiten teilen

@gugelhupf

ok nicht ganz das was ich wollte aber geht auch.

erweiterung.

summe ( 1 ); // liefert 0

summe ( 100, ... ) // liefert die summe von 100 bei ... eingegebenen zeichen.

das zeichen "=" ist für den prototypen verboten.

[ 05. Juni 2001: Beitrag editiert von: maddin ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

#include <iostream.h>

class summe

{

int m_summe;

public:

summe(int, int, int);

summe(int, int, int, int);

~summe(){};

print();

};

summe::summe(int a,int b,int c)

{

m_summe=b+c;

}

summe::summe(int a, int b, int c, int d)

{

m_summe=b+c+d;

}

summe: :print()

{

cout<<m_summe<<endl;

}

int main()

{

summe a(2, 4, 5 ); // gibt 9 zurück

summe b(3, 5, 6, 7); // gibt 18 zurück

a.print();

b.print();

return 0;

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ok,Ok, nachdem wir nun wissen, daß der Herr Lehrer keine Überladungen will und meine Wenigkeit es auch verstanden zu haben scheint, hier mein Vorschlag:

#include <stdio.h>

#include <stdarg.h>

int summe(int Count_Params,...)

{

int Sum=0;

va_list Param_Field;

va_start(Param_Field,Count_Params);

for(int loop=1;loop<=Count_Params;loop++)

Sum+=va_arg(Param_Field,int);

va_end(Param_Field);

return Sum;

}

int main()

{

int Var1=summe (2, 4, 5 ); // gibt 9 zurück

int Var2=summe (3, 5, 6, 7); // gibt 18 zurück

printf("\nWert1: %i, Wert2: %i\n",Var1,Var2);

return 0;

}

gruß gugel

Jetzt aber mündlich ne 1 !!! *ggg* :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ihr Pfeifen, wer waren denn Eure Dozenten?!?!

Man muß die Funktion überladen (2faches Definieren der Funktion zum Einen mit 2 und einmal mit 3 Parametern). Der 1. Parameter ist überflüssig, da er die Anzahl weiterer Parameter angeben soll - beim überladen ist die Anzahl der Parameter und der Typ eh klar.

Eine Echte Lösung wäre es ein CArray anzulegen mit ints oder floats. Da kann man problemlos drüberiterieren und alles zusammenrechnen. .Insert & .RemoveAll sind auch schon vordefiniert. Aber bis zu den Templates sind wohl nur die Wenigsten gekommen.

Erst mal der Inlcude:

#include <afxtempl.h>

das läuft dann so:

CArray<int,int> x;

Nun kann man alles über den Punkt-Operator benutzen.

x.Add(5);

x.Add(6);

usw

die Funktion heißt dann:

int Summe(CArray x)

{

int summe=0;

for (int i=0;i<x.GetSize();i++)

{

summe+=x.GetAt(i);

}

return summe;

}

Zum löschen des Arrays nur x.RemoveAll(); aufrufen!

Ist doch einfacher und man braucht keine 1000 Funktionen definieren.

Das nennt sich dann übrigens wirklich C++!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush1

ok deine lösung läuft auch aber verate mir einmal wie man der funktion "int Summe (CArray x);" drei Integerwerte übergeben kann. Entweder ich habe da etwas verpasst oder es geht nicht. also liefert dann der ausdruck "Summe (2,3,6);" keine 9 wie er sollte sondern einen FEHLER.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush: Oje, da werfen Leute mit der ATL um sich, als ob der kostbare Speicherbedarf heutzutage nichts mehr wäre....

Abgesehen davon lässt sich feststellen, daß fast alles über die ATL ein längeres Laufzeitverhalten hat.

So long, macht was ihr wollt, aber machts richtig ! :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush: Oje, da werfen Leute mit der ATL um sich, als ob der kostbare Speicherbedarf heutzutage nichts mehr wäre....

Abgesehen davon lässt sich feststellen, daß fast alles über die ATL ein längeres Laufzeitverhalten hat.

So long, macht was ihr wollt, aber machts richtig ! :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie kann man eine solch einfache Aufgabe nur dermassen verkomplizieren.

Gugelhupfs Lösung war die optimale, seht das einfach ein.

Und wer vorhat für einen Rechenfunktion ATL oder ne komplette Klasse zu verwenden, sollte vielleicht noch mal ein paar Stunden zum Thema "Optimierung des Programmcodes" verwenden :).

Link zu diesem Kommentar
Auf anderen Seiten teilen

Maddin: Die Zahlen sind im CArray!!! Die müssen da vorher schon drin sein!!!

Ich weiß nicht, was ihr wollt.

Gugglhupf: Speicher hammer alle genug und wenns nicht reicht ist die Platte dran.

Ein Test der Laufzeit um die Zahlen abzufragen lag im nanosekundenbereich, also mir ist das schnell genug.

Cool-Matthias: Lies nochmal den 1. Satz von meinem Briefschen! Da habe ich nur nochmal Gugglhupfs Lösung bestätigt. Außerdem ist Wert a überflüssig (wird ja auch gar nicht verwendet) wenn nicht sogar blödsinnig solang man nicht mit Arrays arbeitet.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hi,

also Crush1, ich möchte dir ja nicht zu Nahe treten aber wenn ich meinem Chef für so ne Aufgabe ne Funktion schreiben würde bei der ich ein CArray oder überhaupt ein Array übergebe, brät der mich am Spiess!

Das ist kein fortgeschrittenes C++, das ist unnützer Overhead.

Hast du dir mal überlegt was intern für Operationen für ein CArray ausgeführt werden?

Und das alles nur um ein paar Zahlen zu übergeben.

Aber falls du immer genügend Speicher hast und dein Chef der gleichen Meinung ist, dann ist das natürlich richtig :) :cool:

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jungs, wenn wir alle nur noch Speicher sparen und optimieren bis zum Abwinken, dann gibt´s doch von der Industrie keinen Grund mehr noch schnellere Kisten mit größerem Hirn auszuspucken!!!

Ihr habt wohl vergessen, daß wir Programmierer mit den Hardwareentwicklern im Wettrennen sind.

Oder wolltet ihr heute noch auf Eurem alten C64 rumhacken um die letzten Raster-Effects aus dem Brotkasten zu kitzeln (jaja, das war´n noch Zeiten ...) und mit Vizawrite Textchen tippen?!?!

Vielleicht ist Euch allen nicht klar, daß C++ kein Schritt nach hinten sondern nach vorne ist um uns das Leben einfacher zu machen und SOFTWAREENTWICKLUNG ZU BESCHLEUNIGEN!!! Denn Eure Optimierungen wird kein Schwein extra zahlen wollen, sehr wohl aber Euer feriges Produkt!

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush1: Ich gebe Dir insofern Recht wenn es um normale Apps geht! Aber stell Dir z.B. das Marshaling bei COM-Objekten vor. Hier gibst zig Abhandlungen wie man Apartments speicherschonend in Threads einbaut...

Das hat einfach mit den vtbls und vptr zu tun, die effizient eingesetzt werden müssen, um verteilte Anwendunden über Netzwerk in einem akzeptablen Zeitfenster aufrufen zu können.

Zu obiger Aufgabenstellung: Wenn jemand Dir diese Aufgabe gibt - nehmen wir an ein Anwendungsentwickler - dann geht der davon aus, daß er einen Methodenaufruf bekommt der variabel ist. Vielleicht implementiert er schon weiter während er annimmt, daß du ihm die Lösung von oben gibst. Nun lieferst du ihm eine Methode mit einem Array als Übergabewert...was der wohl denken, oder fluchen wird ???!!!

Wenn wir davon ausgehen, daß obige Aufgabenstellung eine Komponente sein soll und ein Team an der Applikation arbeitet, darf man davon NICHT abweichen, auch wenn Deine Lösung aus Deiner Sicht effizienter ist. Wenn man als Einzelner alles implementieren muss, dann is Dein Vorschlag auch OK

;)

gruß gugel

Link zu diesem Kommentar
Auf anderen Seiten teilen

juhu kloppe. :D

eigentlich ist die methode von gugelhupf die einzige, die das geforderte zu 100% erfüllt. es sollte nämlich eine funktion geben, die eine variable anzahl integerwerte übergeben wird. diese werte werden dann addiert und das ergebnis zurückgegeben. (ausgenommen der erste parameter, der die anzahl der übergebenen werte angibt) dazu brauche ich auf jeden fall den ersten parameter, den ich mit einem namen benennen muß. und zwar dazu das ich weiß, wo auf dem stack meine parameter anfangen.


int summe (int [b]anzahl[/b], ... )

{

   va_list tmp;

   va_start(tmp,[b]anzahl[/b]);

   ...

}

der erste parameter "anzahl" wird bei "va_start" benötigt.

sollte ich der funktion ein CArray übergeben kann ich nicht schreiben "summe (2,3,4)" da mir das einen fehler ausgeben würde. und dieser ausdruck sollte möglich sein.

zum anderen thema: wozu sollte ich um so ein relativ einfaches problem zu lösen die stl oder atl verwenden. das wäre für mich zumindest viel zu viel code, der in meinem programm mit eingebacken wird. auch wenn die laufzeitnachteile nicht auffallen werden, die größe fällt auf. und außerdem wer nimmt eine motorsäge um seine rosen zu schneiden. keep it simple ...

in diesem sinne STN (schönen tag noch)

[ 06. Juni 2001: Beitrag editiert von: maddin ]

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hast ja Recht Gugglhupf. Wobei die verteilten Anwendungen meist eh aus einer Hand kommen und da weiß man dann auch, daß man sich strikt an Vorgaben halten muß und nicht so eine unklare Beschreibung wie hier:

int main ()

{

summe (2, 4, 5 ); // gibt 9 zurück

summe (3, 5, 6, 7); // gibt 18 zurück

}

na da bin ich mal auf eure lösungen gespannt.

ps: ihr dürft sowohl c als auch c++ mittel verwenden.

Die Parameter sind gar nicht ausdokumentiert, erst recht nicht deren Typen und die Art des Rückgabewertes (wobei ich immer davon ausgehe wie der Eingabewert). C++ war definitiv ERLAUBT weshalb ich ja gar nicht so falsch liegen kann. Ich habe Deine Lösung ja auch nicht angefochten sondern wollte noch einen anderen Weg aufzeigen. Ich denke das ist auch der Sinn eines solchen Forums, daß man mal aus der eigenen Schublade in die anderen Räume gucken darf. Von Optimierungen usw. war ja eh keine Rede, also waren das auch nicht Teil der Anforderungen.

Ich stimme Dir zu, daß Deine Lösung prima ist.

Aber was können wir von Grady Booch lernen? Das Design eines Programms entscheided über dessen Aufbau. Da hier Herkunft, Art und Verwendung der Daten unklar ist ist auch jede Lösung eigentlich unklar und somit jeder Schritt erlaubt. Der Rest ist ansichtssache.

UML und andere Designmethoden wären ja auch gänzlich überflüssig, wenn wir nicht alle auf die C++ Paradigmas und deren Möglichkeiten setzen würden. Dann könnten wir ja gleich wieder zur prozeduralen Programmierung zurückgehen, Zeilennummern vergeben und mit Goto´s durch die Gegend hüpfen.

Wenn Templates so unnötig und zeitraubend sind, warum widmet Soustroup ihm den größten Batzen an Zuwendung in seinen Büchern und hämmert uns allen das ganze Thema gewalttätig ins Hirn? Weil wir´s benutzen SOLLEN! Wer damit nicht lernt umzugehen wird bald wie die Pascal-Leute am Daumen nuckeln können.

Die Industrie drängt nach Programmierung in OO und wer nicht mitmacht ist bald am AA!

Denen ist es eh egal wie toll wir noch ein paar Taktzyklen aus der CPU rupfen oder ein paar Bytes einsparen könnten.

(Alles klar? Einwände? Zusprüche? bin da und habe offene Ohren)

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Crush1: Also gut FRIEDE *gggg*

Wahrscheinlich schwappte die Diskussion über weil Du ein wenig persönlich geworden bist ("Wer waren denn Eure Dozenten?!").

Das gehört - wie ich finde - nicht hierher.

Man darf provokativ wirken,aber man sollte nicht übertreiben :)

In diesem Sinne: weiter so im Forum ! Alle Vorschläge und Lösungen her, damit jeder das davon rausziehen kann was er braucht !

gruß gugel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Original erstellt von Crush1:

<STRONG>Sorry das war nicht gegen die Leute gerichtet, sondern gegen die Dozenten die wohl nach dem was man so hört großtenteils bescheiden sind.

</STRONG>

Nun, also Dozenten hin oder her. Was ist der Sinn von Templates? Der Sinn von Templates ist es, Funktionen oder Klassen mit Typen oder Klassen zu parameterisieren. D. h., ein und dieselbe Codestruktur muss nur einmal geschrieben werden, und der Compiler erzeugt den mit der Parameterisierung verlangten Code individuell fuer die verschiedenen Klassen (oder Typen) mehrfach oder dies passiert optional zur Laufzeit.

Das fuehrt praktisch immer zu mehr Speicherbedarf, groesserer Compilierungszeit und zu keinem Perfomancevorteil. Der Vorteil liegt in der Verkuerzung des Quelltextes und seiner besseren Anpassungsfaehigkeit bei Aenderungen.

In diesem Beispiel nimmst Du mit den Templates die Nachteile dieser Methode in Kauf, ohne einen Nutzen davon zu haben.

Uli

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...