# Array Mittelwert & Ausgabe der eingelesenen Werte



## PrinzPii (24. November 2010)

Heyho ich stehe vor folgendem problem.
Ich soll in C ein Programm schreiben bei dem man zunächst bis zu 6 Zahlen(floats) eingeben muss diese in ein Array eingelesen werden und mir hinterher die Anzahl an eingegeben werten, die einzelnden werte & der mittelwert der einzelnen werte ausgegeben werden soll.
Ich stehe gerade erst am Anfang mit meinen Programmierkünsten deswegen bitte nicht böse sein ;-).
Leider komme ich nicht weiter in unserem Script findet an nichts hilfreiches und in den ganzen Foren die ich mir shcon durchgelesen habe auch nicht wircklich.

Ich hab folgendes geschrieben :

```
#include <stdio.h>

int  main () {

        int i;
        float array[6];
        float summe=0;
        float mittelwert=0;

        for (i=0; i < 6; i++) {
                printf("Bitte geben Sie eine Zahl ein:\n",i );
                scanf("%f", &array[i]);
                summe+=array[i];
                summe/i==mittelwert;
        }







                printf("Anzahl der eingelesenen Werte:%d\n",i);
                printf("Die eingelesenen Werte sind:%f\n",array);
                printf("Der Mittelwert ist:%f\n",mittelwert);

        return 0;
}
```

Als Ausgabe bekomme ich ständig dass die eingegeben werte 0.0000... und der mittelwert auch 0.0000...ist. Außerdem hätte ich gerne eine Fehlermdlung und Programmabbruch wenn anstatt einer zahl z.b. ein Buchstabe eingegeben wird. wenn ich einen Buchstaben eingebe durchläuft er alle 6 eingabestellen und man kann nichts mehr eingeben.weiß allerdings nicht wie ich es anstellen soll. Bitte um Hilfe!


----------



## PrinzPii (24. November 2010)

Die ausgabe soll z.b. wie folgt aussehen:

Anzahl der eingelesenen Werte: 6
Ausgabe der eingelesenen Werte:
1.00 2.00 0.00 -3.00 4.00 2.00
Der Mittelwert der 6 Zahlen ist: 1.00


----------



## sheel (24. November 2010)

Hi

1) beim printf (Bitte geben sie eine Zahl ein) gehört am Schluss das ",i" weg.
Das brauchst du nur,wenn du i im printf ausgeben willst (mit %d). Machst du aber nicht, also hat das i dort auch nichts verloren.

2) Dann würde ichd en Mittelwert nach der for-Schleife berechnen.
Ausserdem ist die Zeile in der Schleife dazu Unsinn.
Du vergleichst, ob summe dividiert durch i das gleiche ergibt wie mittelwert, und ob ja oder nein interessiert dich dann erst wieder nicht?
Nimm die Zeile raus und schreib nach der Schleife sowas:

```
mittelwert=summe/i;
```

3) Das vorletze printf (in dem du die eingegeben Zahlen wieder ausgenen willst) muss auch in einer Schleife sein.
Man kann ein float-Array nicht einfach mit %f wie ein einzelnes float ausgeben.
Mach eine for-Schleife wie du sie weiter oben schoneinmal hast und mach drin ein printf für array[i]

Sonst schaut alles ganz Ordentlich aus...ich denke es sollte dann funktionieren

Gruß


----------



## PrinzPii (24. November 2010)

Danke schon mal dafür, ich werd gleich probieren.
Wir würdest du gedenken das problem zu lösen, dass bei einer Eingabe eines Buchstaben eine Fehlermeldung kommt und das Programm abzubrechen?
Ich hätte es mit einer if-anweisung gemacht, aber ich weiß nicht wie man schreiben soll "...wenn eingabe ungleich ganze zahl oder ungleich fließkommazahl dann abbruch..." i hätte irwie geschrieben "

```
if ( array[i] != %f || array[i] =! %d) {
       return 1; }
```

aber das scheint nicht zu klappen mit dem %f und %d wie kann man dies anders machen?


----------



## sheel (24. November 2010)

Nein, das klappt nicht.
%d, %f, %lf, %c etc interessieren nur printf, scanf und ähnliches.

Ich würde die Eingabe zuerst als String einlesen, so prüfen und dann ggf. in eine Zahl umwandeln
Und außerdem long double statt float nehmen (%lf, ist ca. das Gleiche, kann aber die Zahlen genauer speichern).

Ich schreib dir ein Beispiel...

edit: Hier

```
#include<stdio.h>
#include<string.h>

int main ()
{
	int i,j,anz=0;
	long double array[6];
	long double summe=0.0;
	long double mittelwert=0.0;
	char c[256],ok;

	while(anz<6)
	{
		printf("Bitte geben Sie die %d. Zahl ein:\n",anz+1);
		gets(c);
		j=strlen(c);
		ok=1;
		if( (c[0]<'0'||c[0]>'9') && c[0]!='+' && c[0]!='-' )ok=0;
		for(i=1;i<j;i++)
		{
			if( (c[i]<'0'||c[i]>'9') && c[i]!='.' )ok=0;
		}
		if(ok)
		{
			sscanf(c,"%lf",&array[anz]);
			summe+=array[anz];
			anz++;
		}
	}

	mittelwert=summe/ ((long double)anz) ;

	printf("Anzahl der eingelesenen Werte:%d\n",anz);
	for(i=0;i<anz;i++)
		printf("Wert %d ist:%lf\n",i,array[i]);
	printf("Der Mittelwert ist:%lf\n",mittelwert);

	return 0;
}
```

Gruß


----------



## PrinzPii (24. November 2010)

Ok das Programm läuft erst mal hab vielen Dank.

Ich glaube das mit den Buchstaben lasse ich dann doch besser weg das sieht mir zu sehr nach "Ich verstehe nichts" aus. ;-)


----------



## sheel (24. November 2010)

Mit gets(c) Lese ich zuerst einmal eine Zeile von der Tastatur ein, einfach nur Buchstabe für Buchstabe, egal ob es später einekommazahl werden soll oder nicht.

Mit strlen ermittle ich die Anzahl der eingegeben Buchstaben.

Dann wird geprüft, ob die Buchstaben zusammen sowas ergeben:
12
+12
-12
12.213
+12.123
-12.321

Also als erstes Darf wahlweise + oder - stehen, sonst eine Ziffer (einfach 0-9)
Jeder weitere Buchstabe darf eine Ziffer oder ggf. das Komma sein.

Das erste if ist für den ersten Buchstaben (der ja ein Sonderfall ist: kein Komma, aber dafür + oder - auch erlaubt)
Die Schleife ist dann für die restlichen Buchstaben.

Vor der ganzen Prüfung habe ich eine Variable ok auf 1 gesetzt.
Wenn jetzt einer der Buchstaben nicht passt, wird 0 reingeschrieben.
Dh: Wenn am Schluss noch immer 1 drinsteht, waren alle Buchstaben in Ordnung.

Das ist dann das "if(ok)"
Wenns nicht ok war, wird das if nicht gemacht, die Schleife beginnt wieder von vorn und fragt nocheinmal nach der Zahl.
Sonst wird:
1) Der Buchstabenhaufen in eine ordentliche Variable für Kommazahlen eingelesen
Das sscanf funktioniert praktisch gleich wie scanf, aber statt von der Tastatur holt es sich die "Eingabe" aus meinem String. Sieht man auch im ersten Parameter, da übergebe ich die Variable c.
2) Die schon bekannte Sache mit der Summe.
3) anz eins raufzählen, weil jetzt ja wieder eine Zahl dazugekommen ist.
Bei deinem Code ist das das i++ in der for-Schleife, ich hab die Variable anz genannt und eine while-Schleife genommen.
anz soll ja nur erhöht werden, wenn die Zahl gepasst hat, und in einer forschleife kann man schlecht ein if(...)i++ obenrein schreiben

Gruß


----------



## Matthias Reitinger (25. November 2010)

sheel hat gesagt.:


> Und außerdem long double statt float nehmen (%lf, ist ca. das Gleiche, kann aber die Zahlen genauer speichern).


Wozu denn? Die Genauigkeit braucht man für dieses Programm sicher nicht. Außerdem ist der Formatspezifizierer für long double %Lf, aber das hatten wir ja schon in einem anderen Thema.



sheel hat gesagt.:


> ```
> gets(c);
> ```


So entstehen Pufferüberläufe. Bitte stattdessen fgets verwenden. 



sheel hat gesagt.:


> ```
> if( (c[0]<'0'||c[0]>'9') && c[0]!='+' && c[0]!='-' )ok=0;
> for(i=1;i<j;i++)
> {
> ...


Wieso erfindest du das Rad komplett neu? scanf weiß doch schon wie ein Fließkommawert aussehen muss. Du hättest zumindest isdigit verwenden können. Du akzeptierst außerdem ungültige Strings wie 1.2.3 und weist gültige wie 1E+3 zurück.

Grüße,
Matthias


----------



## PrinzPii (25. November 2010)

Ich hatte vergessen in mein programm einzufügen, dass auch durchaus weniger als 6 Zahlen eingegeben werden können. ich hab dafür if anweisungen und goto anweisungen benutzt.
Allerdings bekomme ich immer einen "Segmentation fault (core dumped)"-Error.
Mein Programm sieht wie folgt aus...

```
#include <stdio.h>

int  main () {

    

        int a,i;
        float array[6];
        float summe=0;
        float mittelwert=0;



        for (i=0; i < 6; i++) {
                printf("Bitte geben Sie eine Zahl ein:\n");
                scanf("%f", &array[i]);
                summe+=array[i];
        eingabe:
                printf("Möchten Sie noch mehr Zahlen eingeben? Für weiter press 1, wenn nicht press 2:");
                scanf("%d", a);
                        if ( a == 2 )
                                goto rechnung;
                        if ( a == 1)
                                continue;

                        else {
                                printf("Fehlerhafte Eingabe");
                                goto eingabe; }

        }

        rechnung:
        mittelwert=summe/i;



                printf("\n");
                printf("Anzahl der eingelesenen Werte:      %d\n",i);
                for (i=0; i < 6; i++) {
                        printf("Die eingelesenen Werte sind: %10.3f\n",array[i]); }
                printf("Der Mittelwert ist:          %10.3f\n",mittelwert);

        return 0;
}
```


Könnte noch mal wer rüber schauen und sagen woran das liegt?
Gruß


----------



## deepthroat (25. November 2010)

Hi.

scanf benötigt die Adresse einer Variablen. Schalte Warnungen deines Compilers an!

```
f.c: In function 'main':
f.c:20:9: warning: format '%d' expects type 'int *', but argument 2 has type 'int'
```


```
scanf("%d", &a);
```
Gruß


----------



## PrinzPii (25. November 2010)

Ja danke habs gefunden^^
Da waren noch andere Sachen falsch, aber jetzt läufts.


----------

