Hilfe bei aufgabe

Schnelle objektorientierte, kompilierende Programmiersprache.
maria1789
Beiträge: 5
Registriert: Mo Dez 30, 2013 5:33 pm

Hilfe bei aufgabe

Beitrag von maria1789 » Mo Dez 30, 2013 5:36 pm

Hallo freunde zuerst poste ich mal die aufgabe und dann den quelltext von mir, ich weiß ist lächerlich aber nunja :(
ich hoffe ihr könnt mir weiterhelfen :)

3) Gegeben seien 1440 chronologisch geordnete Messwerte von einer Überwachungsstation für bestimmte Emissionsdaten (für 24 Stunden mit je einer Messung pro Minute; 24*60 = 1440).
Die Messwerte sind ganzzahlig und liegen im Bereich zwischen 71 und 130, die beiden Randwerte eingeschlossen.
Die 1. Auswertung soll pro Stunde den Durchschnitt der gemessenen Werte sowie die Anzahl von Grenzwertüberschreitungen (wenn ein Messwert größer als 115 ist) ermitteln und ausgeben.

Vereinbaren Sie für die 1440 Messwerte einen ausreichend dimensionierten bzw. großen Array vom Typ Integer und füllen ihn mit Zufallszahlen in dem oben genannten Wertebereich.

Ermitteln Sie die Auswertungsergebnisse und geben Sie sie wie folgt aus:
Stunde Durchschnitt Anzahl Grenzwertüberschreitungen
---------------------------------------------------------------------------
1 103 14
2 95 7
3 112 23
4 87 0
5 84 0
6 80 0
7 86 0
8 81 0
9 88 0
10 100 0
11 89 0
12 89 0
13 79 0
14 104 16
15 83 1
16 85 0
17 104 13
18 105 22
19 104 3
20 108 10
21 114 28
22 85 0
23 95 16
24 119 42


quelltext:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
int i;

int a [1440],

for (int i=71;i<=131;i++)
{
int i = rand();

if ( i>115)
{ 
printf ("%d", i);

else
int mittelwert = 0;
for (i= 71; i<= 131; i++)
{ 
 mittelwert += zahl1[i]; 
 }
printf ("%d", i);
}
system("PAUSE");
}
Edit by cloidnerux: code-tags

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Hilfe bei aufgabe

Beitrag von FritziFoppel » Mo Dez 30, 2013 6:58 pm

Hi ;)

Erst mal ne Frage: Hast du den Code überhaupt mal kompiliert? Sieht mir nämlich nicht so aus.
Es fehlen ein paar grundlegende Sachen wie Semikolon und geschweifte Klammern.

Wenn ich das mal so grob überblicke, gehst du die Aufgabenstellung glaube ich falsch an.
maria1789 hat geschrieben:Vereinbaren Sie für die 1440 Messwerte einen ausreichend dimensionierten bzw. großen Array vom Typ Integer und füllen ihn mit Zufallszahlen in dem oben genannten Wertebereich.

Code: Alles auswählen

for (int i=71;i<=131;i++)
{
int i = rand();
}
Hier gibst du an, dass die Schleife von 71 bis 131 durchlaufen wird und jedesmal "i" dabei ein zufälliger Wert zugewiesen wird. Im schlimmsten Fall ist das eine Endlosschleife :?
Du willst aber eigentlich 1440 verschiedene Zahlen mit zufälligen Werten besetzen, d.h. die Schleife muss 1440 mal durchlaufen werden und nicht 50 mal.
Außerdem sollte "i" nicht noch einmal deklariert werden, sondern eine andere Variable in der du Werte zwischen 71 und 130 speichern willst.

Code: Alles auswählen

for (int i=0;i<1440;i++)
{
a[i] = rand(); //nur ein bisschen Code, sollst ja auch noch was zu tun haben
}
In diesem Fall in a und da du passender Weise schon ein Array mit 1440 ganzen Zahlen hast kannst du die Werte da speichern.
Bei einer Überschreitung des Grenzwertes soll dieser extra mitgezählt werden. Hier am besten einen extra "Counter" deklarieren der mitzählt.
Am Ende soll noch der Mittelwert aller Zufallszahlen ermittelt werden. Dafür solltest du "int mittelwert;" global deklarieren, da die Variable nach jedem Durchlauf von else "stribt".
Wo kommt übrigens "zahl1[]" her? Auch hier: benutz

Code: Alles auswählen

mittelwert += a[i];
Mach alles am besten schrittweise:
1) Zählschleife 1440 mal durchlaufen
2) dabei jedes mal einen zufälligen Wert zwischen 71 und 130 speichern und diesen Wert auch noch zum Mittelwert dazu addieren.

Wenn du nicht weißt was und wie du weitermachen sollst, schau mal auf cpluslpus.com nach.

maria1789
Beiträge: 5
Registriert: Mo Dez 30, 2013 5:33 pm

Re: Hilfe bei aufgabe

Beitrag von maria1789 » Mo Dez 30, 2013 7:30 pm

danke für die schnell antwort und vorallem ausführlich :)
ich habe das mal versucht zu ändern....
ich bin leider nicht so gut in der programmierung...habe schon soviele studienbriefe durchgelesen, aber es will einfach nicht in meinen kopf :(

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
int i, sum=0, mittelwert=0, a [1440];

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
if(a[i]>115)
sum=sum+a[i]; 
}
printf ("%d", sum);

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
mittelwert = 0;
mittelwert = a[i] / 60; 
 }
printf ("%d", mittelwert);

system("PAUSE");
Edit by cloidnerux: Code-Tags

acclrtr
Beiträge: 19
Registriert: Sa Dez 21, 2013 4:49 pm

Re: Hilfe bei aufgabe

Beitrag von acclrtr » Mo Dez 30, 2013 7:53 pm

Bist du dir sicher das du das:

Code: Alles auswählen

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
mittelwert = 0;
mittelwert = a[i] / 60;
}
printf ("%d", mittelwert);
machen willst?
Du setzt hier in jedem Schleifendurchlauf den mittelwert auf 0, dann auf einen Wert, aber im nächsten Durchlauf wieder auf 0.
Nachdem du die Schleife 1440 mal durchlaufen hast gibst du den letzten dieser Werte aus.
Du solltest das printf wohl in die Schleife packen. Und mittelwert einfach den Wert zuweisen anstatt der Variable eine 0 zuzuweisen und dann die eigentliche Zuweisung zu machen.

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Hilfe bei aufgabe

Beitrag von FritziFoppel » Mo Dez 30, 2013 8:01 pm

Gerne.
Da merke ich gerade das ich mich vielleicht verzählt habe :mrgreen: .

Das ganze sieht schon besser aus, aber es ist dennoch nicht ganz korrekt. (Schau das nächste Mal, dass du die code tags in der oberen Leiste anfügst, sieht übersichtlicher aus)

Vielleicht hätte ich die Nummerierung im vorherigen Beitrag weglassen sollen.

Code: Alles auswählen

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
if(a[i]>115)
sum=sum+a[i]; 
}
printf ("%d", sum);
Du weist hier, wie du auch sollst, jedem Element des Arrays a[] einen Wert zu, danach addierst du allerdings den Betrag von a (falls dieser > 115 ist) nach "sum" dazu. Du musst aber lediglich einen Zähler um 1 erhöhen, der dann anzeigt wie viele Werte über 115 sind (0, 1, 2, 3....).

Code: Alles auswählen

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
mittelwert = 0;
mittelwert = a[i] / 60; 
}
printf ("%d", mittelwert);
Hier weist du dem Array a[] neue Werte zu, die nicht identisch mit den oberen Werten sind. Das Ergebnis wird dadurch verfälscht.

Code: Alles auswählen

mittelwert = 0;
Bei jedem Durchlauf der Zählschleife wird der Mittelwert auf 0 gesetzt, sprich es hat gar keinen Effekt. Setz die Initialisierung auch nach oben. Wenn ich die Aufgabenstellung richtig verstanden habe, sollst du den Durchschnitt der Messwerte nach jeder Stunde neu berechnen. Das geht am besten mit einer Abfrage, ob schon eine Stunde vorbei ist. Siehe hier:

Code: Alles auswählen

for(int i = 0; i < 1440; i++)
{
   //Zufallszahl generieren
   //Zufallszahl zum Mittelwert dazu addieren

    if(((i+1) % 60) == 0) 
    /* (i+1):   Du beginnst die Zählschleife mit 0, du willst aber dass die 
                   Messung nach 60 min resetet wird
        % 60:   Wenn  (i+1) / 60 einen Rest von 0 ergibt dann
    */
    {
        mittelwert = mittelwert / 60;
        
        printf("Mittelwert von Stunde %d: %d\n", (i+1) / 60, mittelwert); 
        // da du int verwendest wird gerundet
        // also lieber float verwenden (%f)
        mittelwert = 0;           
        // setze den mittelwert auf 0 für die 
        // nächste Stunde
    }
}

   //Zum Schluss noch die Anzahl der Werte, die über dem Grenzbereich liegen, ausdrucken.
Lass am Ende lieber ein paar mal das Programm ablaufen, damit du dir ganz sicher sein kannst, dass du richtige Werte ausgespuckt bekommst.

Code: Alles auswählen

a[i]= rand()%71+60;
liefert nämlich nicht die gewünschten Werte.

maria1789
Beiträge: 5
Registriert: Mo Dez 30, 2013 5:33 pm

Re: Hilfe bei aufgabe

Beitrag von maria1789 » Mo Dez 30, 2013 8:39 pm

puh danke, du scheinst es echt drauf zu haben, aber es hat mich ziemlich verwirrt... hmm ich poste mal was ich nun habe, wahrscheinlich lachst du mich aus

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


int main(void)
{
int i, sum, mittelwert=0, a [1440];

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
if(((i+1) % 60) == 0) 
{
mittelwert = mittelwert / 60;
printf("Mittelwert von Stunde %f: %f\n", (i+1) / 60, mittelwert);
 }
}
for (i=0;i<1440;i++)
{
if(a[i]>115)
sum=sum + 1

printf ("%d",sum) 

}
system("PAUSE");
}

wie setze ich nun den
mittelwert erneut auf 0 für die
nächste Stunde ????

Edit by cloidnerux: Code-Tags

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Hilfe bei aufgabe

Beitrag von cloidnerux » Mo Dez 30, 2013 8:40 pm

Hi und Willkommen im Forum :D

Generell Tipps zum Programmieren:
Strukturiere immer alles ordentlich, je ordentlicher du arbeitest, desto weniger Fehler passieren.
Wenn du eine Klammer( "(", "{", "[") Öffnest, musst du sie auch wieder schließen( ")", "}", "]").
Strukturiere deine Programme in Blöcke mit fest definierter Funktion, pack nicht so viel zusammen, hier z.B:
Variablen Anlegen, Werte in Array schreiben, Array auswerten.
Das macht dein Programm verständlicher(wird auch Teile und Herrsche genannt).

Für dich würde das etwa so aussehen:

Code: Alles auswählen

[...]
int values[1440];
int avg;
int count;
for(int i = 0; i < 1440; i++)    //Wenn nur eine Zeile Code im Schleifenkörper folgt benötigt man keine Klammern
    values[i] = GetValue();     //Hier dann deine Zufallswerte zwischen 71 und 131 generieren
for(int i = 0; i < 24; i++)
{
    count = 0;
    avg = 0;
    for(int a = 0; a < 60; a++)
    {
        if(values[i*60 + a] > 115)
            count++;
        avg += values[i*60 + a];
    }
    avg /= 60;
    printf("%d %d %d", i, avg, count);
}
Mit freundlichen Grüßen
cloidnerux
Redundanz macht wiederholen unnötig.
quod erat expectandum

FritziFoppel
Beiträge: 101
Registriert: Sa Mär 02, 2013 6:53 pm
Wohnort: Göppingen

Re: Hilfe bei aufgabe

Beitrag von FritziFoppel » Mo Dez 30, 2013 9:10 pm

maria1789 hat geschrieben:puh danke, du scheinst es echt drauf zu haben, aber es hat mich ziemlich verwirrt... hmm ich poste mal was ich nun habe, wahrscheinlich lachst du mich aus
Gar nicht. Ich hab genau so angefangen und so lange programmier ich auch noch nicht ( demnächst das Einjährige :) ). Das wichtigste ist nen klaren Kopf zu haben, nicht in Panik ausbrechen, Ordnung halten und Motivation nicht verlieren.

Tut mir leid wenn ichs ein wenig komplizierter ausdrücke, ich versuchs ein wenig klarer zu machen. Habe leider keine Ahnung, ob du hobbymäßig programmierst, studierst, oder sonst wie aufs Programmieren gekommen bist, deshalb kenn ich deine "Anforderungen" nicht.
Ich kann dir schlecht den ganzen Code einfach hier rein kopieren, weil du dabei wahrscheinlich nichts/kaum was lernen wirst (kenn ich aus eigener Erfahrung, man kopiert gerne Sachen einfach ab). Man lernt am besten wenn man sich selber klar macht, was man programmiert hat.

Generell rate ich dir, genau wie cloidnerux es beschrieben hat, Ordnung in deinen Code zu bringen.
Ich weiß allerdings nicht wie weit du mit dem Programmieren fortgeschritten bist, deshalb versuch ich den Code so einfach wie möglich zu schreiben.

Mach dir wirklich klar, was GENAU du in deinem Code haben willst.
(Vllt. hilft es dir umgangssprachlich zu übersetzen ^^ Wenn i größer 115 dann erhöhe die Anzahl der Grenzwertüberschreitungen.....)

Code: Alles auswählen

for (i=0;i<1440;i++)
{
a[i]= rand()%71+60;
if(((i+1) % 60) == 0) 
{
mittelwert = mittelwert / 60;
printf("Mittelwert von Stunde %f: %f\n", (i+1) / 60, mittelwert);
}
}
for (i=0;i<1440;i++)
{
if(a[i]>115)
sum=sum + 1

printf ("%d",sum) 

}
Das bringt wieder nicht das gewünschte Ergebnis.

(1.) Wie zuvor hast du 2 Zählschleifen: Du kannst die if-Anweisung genau so in die erste packen. Wenn du eine weiter Schleife druchläufst braucht dein Pc die doppelte Zeit und das Programm wird langsamer.
Ausdrucken würde ich die Anzahl der Grenzwertüberschreibungen erst am Ende. -> Programm ist wieder langsamer, da es alle Zahlen die über 115 sind ausdrucken muss ( macht bei kleinen Programmen nicht viel aus, aber trotzdem...)

2. Du hast in printf das Format %f eingefügt: %f fordert, dass du im auch eine float Zahl lieferst, du hast aber oben sum und i als int deklariert.

Code: Alles auswählen

int a = 0, b = 5.9;
float c = 5, d = 6.8

printf("%d %d\n", a, b);
printf("%f %f", c, d);

Output: 
0 5
5.0 6.8
Für die Anzahl der Stunden brauchst du keine Kommazahl, da du nur ganze Stunden ausdrucken willst.

Schau dir am besten das C-Tutorial von Xin an wenn du Zeit hast.

EDIT:
Da du nach jeder Stunde den Mittelwert abfragst, musst du nach jedem mal Ausdrucken den Mittelwert auf 0 setzen, damit ein anderer Mittelwert herauskommt.

Code: Alles auswählen

        if(((i+1) % 60) == 0)
        {
            mittelwert = mittelwert / 60;
   // nach voller Stunde alle Werte bis dahin geteilt durch 60
            printf("Mittelwert von Stunde %d: %f\n", (i+1) / 60, mittelwert);
   // druckt mittelwert der x-ten Stunde aus
            mittelwert = 0;
   // resetet den Mittelwert, damit bei der nächsten vollen Stunde ein neuer/anderer
   // Wert ausgedruckt werden kann
        }

maria1789
Beiträge: 5
Registriert: Mo Dez 30, 2013 5:33 pm

Re: Hilfe bei aufgabe

Beitrag von maria1789 » Di Dez 31, 2013 11:50 am

müsste es dann nun so aussehen? ich weiß habe viel von dem vorrigen beitrag übernommen :(


#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int a[1440];
int werte;
int zählen;

for (i = 0;i<1440;i++)
{
werte = rand()%71+60;;

for (i=0;i<24;i++)
{
zählen = 0;
mittelwert = 0;
for(a=0;a<60;a++)
{
if(werte[i*60 + a] > 115)
zählen++;
mittelwert += werte[i*60 + a];
}
mittelwert /= 60;
printf("%d %d %d", i, mittelwert, zählen);
}
system("PAUSE");
}

maria1789
Beiträge: 5
Registriert: Mo Dez 30, 2013 5:33 pm

Re: Hilfe bei aufgabe

Beitrag von maria1789 » Di Dez 31, 2013 1:49 pm

Code: Alles auswählen

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (void)
{

int a[1440];
int werte;
int zaehlen;
int i;
int mittelwert;
int a;
int j;

 for (i = 0;i<1440;i++)
 {
	werte[i] = rand()%71+60;    
 }
for (j=0;j<24;j++)
{
    zaehlen = 0;
    mittelwert = 0;
}
    for(j=0;j<60;j++)
    {
        if(werte[i*60 + j] > 115)
            zaehlen++;
        mittelwert += werte[i*60 + i];
    
    mittelwert /= 60;
    printf("%d \n %d \n %d \n", j, mittelwert, zaehlen);
	}
system("PAUSE");
}

Antworten