IT-Academy Logo
Sign Up Login Help
Home - Programmieren - C++ - Array in C aufsummieren



Array in C aufsummieren

Hier wird ein Array von einem Benutzer initialisiert und anschließend per Funktion aufsummiert.


Autor: Patrick Bucher (paedubucher)
Datum: 01-06-2004, 17:38:48
Referenzen: keine
Schwierigkeit: Fortgeschrittene
Ansichten: 21247x
Rating: 7.8 (5x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Aufsummieren in C per Funktion

In diesen Artikel beschreibe ich, wie man in C die Summe aus einem Array mit Zahlen bilden kann. Die Schwierigkeit liegt nicht in der Berechnung, sondern viel mehr in der Auslagerung des Problems in eine Funktion.

Warum übergibt man nicht einfach das Array an die Funktion? Die Antwort auf diese Frage lautet kurz und trocken – C bietet die Möglichkeit nicht, Arrays an Funktionen zu übergeben! Eine andere Lösung muss her.

„Man könnte jedes einzelne Element des Arrays an die Funktion übergeben!“

Diese Problemlösung wird man jedoch beim Programmieren schnell wieder über den Haufen werfen. Man müsste eine Funktion mit einer variablen Anzahl an Parametern deklarieren, feststellen, wie viele Werte ins Array eingetragen wurden und zudem noch das Array zerhacken. Diese Lösung würde theoretisch funktionieren, das ganze ist aber in der Praxis sehr aufwändig. Vergessen wir diesen Vorschlag also schnell wieder.

„Man könnte die Stelle des Arrays, der Funktion als Referenz übergeben!“

Dieser Vorschlag hört sich schon besser an! Man übergibt der Funktion das Array als Referenz! Für diese Lösung braucht man jedoch Zeiger. Für alle, die nicht wissen, was ein Zeiger ist, gibt es hier Rat: http://www.dbg.rt.bw.schule.de/lehrer/ritters/info/c/zeiger.htm

Das Programm

Wie soll nun das Programm genau aussehen? Hier ein Lösungsvorschlag.

Präprozessor

Für dieses Programm wird nur eine Funktionsbibliothek benötigt, um Text auf den Bildschirm auszugeben und Werte von der Tastatur einzulesen. Es handelt sich um stdio.h.

#include <stdio.h>
Die Hauptfunktion

Wie immer folg zuerst der Funktionskopf.

int main()
{
Nun müssen einige Variablen deklariert werden:


double zahlen[9]; /* Ein Array für Zahlen mit 10 möglichen Werten */
double *pt; /* Der Zeiger */
double summe; /* Diese Variable nimmt später die Summe auf */
short m; /* eine Variable für den Schleifendurchlauf */
short n; /* noch eine Variable für die Schleife */
Nun beginnt die eigentliche Benutzerinteraktion. Wir fragen den User freundlich, wie viele Werte er eingeben will:

printf("Wie viele Zahlen wollen Sie aufsummieren? Maximal 10 Zahlen!\n\t");
scanf("%li",&n); /* Einlesen der Anzahl */
fflush(stdin); /* Leeren des Buffers */
Wie immer muss von einem DAU ausgegangen werden, also prüfen wir, ob auch bestimmt nicht mehr als 10 Werte eingegeben werden sollen.

if (n > 10)
{
	n = 10;
	printf("\nEs sind maximal 10 Zahlen möglich!\n");
}
Falls der DAU sich nicht an die Anweisungen hält, darf er halt 10 Eingaben machen ;-)

Nun wird es etwas schwieriger, wir wollen das Array initialisieren:

for(m=0;m<n;m++) /* m wird ausgeführt, solange es kleiner als n ist */
{
	printf("\nGeben Sie die %li. Zahl ein:\n\t",m+1); /* Aufforderung 
Die Zahl muss an Stelle m+1 geschrieben werden! */
	scanf("%lg",&zahlen[m]); /* Wert in Array an Stelle m ablegen */
	fflush(stdin); /* Buffer leeren */
}
Nun hat der User hoffentlich alle Werte initialisiert.

Jetzt passiert etwas interessantes, wir initialisieren den Pointer! Dieser soll auf das erste Element des Arrays verweisen:

pt = &zahlen[0]; /* Zeigerinitialisierung */
Hier muss man beachten, dass man keinen Dereferenzierungsoperator vor pt stellt und den Adressoperator vor dem Arraynamen nicht vergisst!
Die Speicherstelle des ersten Arrayelements wurde nun herausgefunden.

Nun rufen wir die Funktion auf, die uns die Summe des Arrays zurückgibt:

summe = summieren(pt, n); /* Funktionsaufruf */
Was in dieser Funktion passiert, schauen wir später an, hier geht es zunächst nur um das Hauptprogramm.

Nun haben wir die Summe erhalten und können diese auf dem Bildschirm ausgeben:

printf("\nDie Summe Ihrer Auflistung lautet:\t%lg",summe);
Am Ende des Hauptprogramms ist noch der Befehl getchar nötig, der das Programm anhält, damit der Benutzer die Ausgabe lesen kann:

getchar();
Zuletzt noch ein Formalismus, der 0 zurückgibt, um den ANSI Standard gerecht zu bleiben/werden.

return 0;
}
Die Funktion „summieren“

Nun kommt der Kern des Programms, die Summierung des Arrays. Zuerst ist die Deklaration der Funktion oberhalb des Hauptprogramms notwendig:

double summieren(double *, short);
Diese Funktion nimmt einen Pointer und eine Variable vom Typ Short entgegen.

Gehen wir gleich über zum Funktionskopf:

double summieren(double *pointer, short anzahl)
{
Für die Summierung des Arrays benötigen wir die Speicherstelle, wo sich das erste Arrayelement befindet. Diese wird uns über den Zeiger „*pointer“ übergeben. Weiter wird die Anzahl der Arrayelemente benötigt, also die Variable „anzahl“.

Nun brauchen wir eine Double Variable, die die Summe aufnehmen kann. Wir initialisieren diese sicherheitshalber mit 0.

double summe = 0;
Nun folgt die Aufsummierung des Arrays mit einer for-Schleife.

for(;anzahl>0;anzahl--)
{
	summe = summe + *pointer;
	pointer++;
}
Hier wird keine Initialisierung benötigt. Die Schleife wird so lange ausgeführt, wie die Variable „anzahl“ größer als 0 ist. Die Variable wird jedes Mal um 1 verringert. Die Anzahl der Arrayelemente wurde uns ja beim Funktionsaufruf übergeben.

Der erste Befehl der Schleife addiert die aktuelle Summe mit dem Wert, der sich hinter der Adresse von „pointer“ befindet. Hier müssen wird den Dereferenzierungsoperator einsetzen, damit wir den Wert des Arrayelements und nicht den Wert der Speicherstelle erhalten.

Der zweite Befehl in der Schleife springt dann auf das nächste Arrayelement. Hier darf der Dereferenzierungsoperator nicht verwendet werden, da wir sonst den Wert verändern würden!

Die for-Schleife ist nun abgeschlossen.

Zuletzt geben wir noch den Wert der Berechnung zurück, also die Summe

return summe;
und schließen die Funktion mit einer geschweiften Klammer ab.

}
Der gesamte Quellcode

/*******************************
**  20.05.2004 by paedubucher **
*******************************/

#include <stdio.h>
double summieren(double *, short);
int main()
{
	double zahlen[9]; /* Ein Array für Zahlen mit 10 möglichen Werten */
	double *pt; /* Der Zeiger */
	double summe; /* Diese Variable nimmt später die Summe auf */
	short m; /* eine Variable für den Schleifendurchlauf */
	short n; /* noch eine Variable für die Schelife */
	printf("Wie viele Zahlen wollen Sie aufsummieren? Maximal 10 Zahlen!\n\t");
	scanf("%li",&n); /* Einlesen der Anzahl */
	fflush(stdin); /* Leeren des Buffers */
	if (n > 10)
	{
		n = 10;
		printf("\nEs sind maximal 10 Zahlen möglich!\n");
	}
	for(m=0;m<n;m++) /* m wird ausgeführt, solange es kleiner als n ist */
	{
		printf("\nGeben Sie die %li. Zahl ein:\n\t",m+1); /* Eingabeaufforderung */
		scanf("%lg",&zahlen[m]); /* Wert in Array an Stelle m ablegen */
		fflush(stdin); /* Buffer leeren */
	}
	pt = &zahlen[0]; /* Zeigerinitialisierung */
	summe = summieren(pt, n); /* Funktionsaufruf */
	printf("\nDie Summe ihrer Auflistung lautet:\t%lg",summe);
	getchar();
	return 0;
}
double summieren(double *pointer, short anzahl)
{
	double summe = 0;
	for(;anzahl>0;anzahl--)
	{
		summe = summe + *pointer;
		pointer++;
	}
	return summe;
}
Der Quellcode darf beliebig weiterverwendet werden. Wer Kritik und Ideen hat, soll mir doch bitte eine E-Mail schreiben. Meine Adresse lautet: paeudubucher@bluewin.ch.


paedubucher
Professonial
Beitrag vom:
02-06-2004, 19:24:26

Alles wieder ok

Der Artikel ist jetzt wieder korrekt angezeigt!

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04511
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06248
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0