mikrocontroller.net

Forum: Compiler & IDEs Aufgabe Zahlenstatistik


Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Aufgabe gestellt bekommen, allerdings komme ich damit 
absolut nicht zu recht.

Die Fragestellung lautet:

Entwerfen Sie ein Unterprogramm void histogram( char * data, int length) 
nach der folgenden Spezifikation:

Es soll über einen vorgegebenen Speicherbereich nach ASCII-Ziffern 0..9 
gesucht und deren Häufigkeit registriert werden. Der Speicherbereich 
wird über den Parameter 'data' vorgegeben. 'length' ist die Anzahl der 
insgesamt zu durchsuchenden Bytes. Das Ergebnis ist in einem globalen 
int-Array abzulegen.
Vergessen Sie nicht, das Array zu deklarieren und bei Beginn zu 
initialisieren.

Das Unterprogramm in C kodiert werden.

Ich weiss nicht wie ich diese Aufgabe ansetzten soll bzw. wie ich 
Anfangen soll. Zu dem weiss ich nicht, wie ich die syntax nicht, wie ich 
ASCII verwenden soll. Das was ich bisher habe ist:

unsigned Array [10];
uint8_t data;
uint8_t length;

void histogram (char*data, int length)
{

}


-------

Ich hoffe das mir jemand helfen kann, denn ich bin mittlerweile übelst 
am verzweifeln :-( :-(

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da würde ich ein Feld machen, das so groß ist wie es Zeichen
gibt, alle Feldelemente zu 0 initialisieren, und dann den
Speicher durchlaufen und bei jedem Zeichen das Feldelement
mit dem Index des Zeichenwerts um 1 erhöhen.
Alle weitere im C-Buch deines Vertrauens...

Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
okay danke.

also ich hab jetzt das hier:

unsigned char array []={1,2,3,4};
unsigned char data []={1,2,3,4};
uint8_t length;

void histogram (char*data,int length)

{
     int i = 1;
     while(i=4)
     {
          data[i]==0;
          i++;
     }

}
...
..
.

den speicher kann ich genauso durchlaufen, oder?! und was meinst du mit' 
bei jedemZeichen das Feldelement
mit dem Index des Zeichenwerts um 1 erhöhen ' ? sry aber, das hab ich 
nicht ganz gerafft :-(

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das liegt daran, daß du von C keinerlei Ahnung hast.

Das ist insoweit keine Schande.
Aber niemand kann dir die Mühe abnehmen, das zu ändern.
Obwohl das Jahr erst gerade knapp drei Tage hat, bist du nicht der
erste, der hier seine Hausaufgaben gelöst haben will.
Aber so funktioniert das nicht.

Du musst selbst die Sprache lernen und deine Hausaufgaben lösen.
Das hier ist ein Mikrocontrollerforum und für gegenseitige Hilfe 
gedacht.

Wenn du dir nicht die Mühe machst, dir die Grundlagen anzueignen,
schaffst du die Aufgabe halt nicht.

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habe eine Aufgabe gestellt bekommen.
Wie kann man bloss so gemein sein? Einem Frisör solch eine Aufgabe 
stellen, also wirklich!

Jungchen, setz dich auf deine Arschbacken und hol nach was du im 
Unterricht verpennt hast! Ich glaub es ja nicht!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr_niete schrieb:

> den speicher kann ich genauso durchlaufen, oder?!

Kleiner Tip:
Die for-Schleife ist schon erfunden.

Ansonsten: sieh zu dass du das was du im ersten Halbjahr versäumt hast 
schleunigst nachholst. Du gerätst immer mehr ins Hintertreffen und 
kannst das nie wieder aufholen.

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr_niete schrieb:
> Hallo,
>
> ich habe eine Aufgabe gestellt bekommen, allerdings komme ich damit
> absolut nicht zu recht.
>
> Die Fragestellung lautet:
>
> Entwerfen Sie ein Unterprogramm void histogram( char * data, int length)
> nach der folgenden Spezifikation:
>
> Es soll über einen vorgegebenen Speicherbereich nach ASCII-Ziffern 0..9
> gesucht und deren Häufigkeit registriert werden. Der Speicherbereich
> wird über den Parameter 'data' vorgegeben. 'length' ist die Anzahl der
> insgesamt zu durchsuchenden Bytes. Das Ergebnis ist in einem globalen
> int-Array abzulegen.
> Vergessen Sie nicht, das Array zu deklarieren und bei Beginn zu
> initialisieren.
>
> Das Unterprogramm in C kodiert werden.
>
> Ich weiss nicht wie ich diese Aufgabe ansetzten soll bzw. wie ich
> Anfangen soll.

Okay zerlegen wir die aufgabe doch in Teile.

0.) du sollt wenn ich die aufgabe richtig lese in einen globalen Array 
die heufigkeiten der jeweiligen ASCII Zeichen von 0..9 Speichern. Was 
das ASCII meint, kommt später. Also legst du ein globales Array 
Häufigkeit an
in dein Programm und initialiesiert es an den beginn der Funktion 
histogram mit 0 in jeden feld. ist also eine for schleife die 10mal 0 in 
das Array Heufigkeit schreibt.

1.) du sollt über ab der Adresse data, length mal, gucken ob der Inhalt 
der Adresse denn Ascii zeichen 0...9 entspricht.
Das sagt die also du brauchst eine schleife denn data ist ein Feld und 
du must dir jedes element ansehen ob es zu dein Schema passt. Stichwort 
hier ist for schleife.

2.) wenn du via forschleife und Index das Aktuelle element untersuchst 
siehts du dir an ob dort  irgendwas zwischen '0' und '9' drin steht.
'0' ist die ASCII representation einer 0. '1' die ASCII Darstellung 
einer eins und so weiter. Wenn das Zeichen auf eine der Bedinungen 
zutrifft musst du den jeweiligen wert im Array Heufigkeit 
inkrementieren.
du brauchst also eine Art If abfrage oder ein switch, case.
Das switch case erscheint denn Anfängern erstmal Intuitiver aber du 
kannst hier die tatsache nutzen das wenn du '9'-'0' rechnest eine 
Differenz von 9 herauskommt und du somit schnell und einfach von den 
ASCII Werten zu den Interger werten kommst. Also reicht auch ein if 
abfrage.
unsigned heufigkeit[10];

void histogram (char*data, int length)
{
  int i,tmp;

  /* Init Array für aktuellen lauf*/
  for(i = 0; i <10 ; i++) {
       heufigkeit[i] = 0;
  }

  /* Zahlen der ASCII Zeichen */
  for( i = 0 ; i < length; i ++) {
        if (( data[i] >= '0' ) && ( data[i] <='9')) {
             tmp = data[i] - '0';
             heufigkeit[tmp]++;
        }
  }
}

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Imon (Gast)
WAS SOLL DAS?

Einerseits beschweren wir uns hier völlig zu Recht über die faulen Säcke 
die hier ihre Hausaufgaben gemacht haben wollen. Aber andererseits 
bekommen letztere schlussendlich doch immer von irgendjemandem die 
komplette Lösung serviert. Warum sollten sie sich also die Mühe machen 
selber zu denken? Stattdessen kommen sie bei der nächsten Aufgabe wieder 
und das Spiel geht von vorne los. Kapiert ihr das nicht oder wollt ihr 
es nicht kapieren?

@Mod:
Den Beitrag von Imon bitte löschen, einfach damit der TO mal selber 
denken muss.

Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Imon schrieb:
> for( i = 0 ; i < length; i ++) {
>         if (( data[i] >= '0' ) && ( data[i] <='9')) {
>              tmp = data[i] - '0';
>              heufigkeit[tmp]++;
>         }


die for schleife ist mir klar, allerdings kann ich mir nicht herleiten, 
warum im data[i] - '0' machen muss. hat das damit zu tun das mein array 
feld aus 11 elementen besteht?

Vielen Dank

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>warum im data[i] - '0' machen muss
Wenn du mal musst geh aufs Klo, ansonsten les ein C-Buch.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr_niete schrieb:
> die for schleife ist mir klar, allerdings kann ich mir nicht herleiten,
> warum im data[i] - '0' machen muss. hat das damit zu tun das mein array
> feld aus 11 elementen besteht?

Wenn dir diese Zeile nicht klar ist, machs anders.

In der Schleife:
  wenn Zeichen gleich '0'
    Element in data für '0' erhöhen (+1)
  wenn Zeichen gleich '1'
    Element in data für '1' erhöhen (+1)

und so weiter für alle 10 Zeichen.
schreiben musst dus selber. :-)

Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Floh schrieb:
> In der Schleife:
>   wenn Zeichen gleich '0'
>     Element in data für '0' erhöhen (+1)
>   wenn Zeichen gleich '1'
>     Element in data für '1' erhöhen (+1)
>
> und so weiter für alle 10 Zeichen.
> schreiben musst dus selber. :-)



ahhh dank dir. habs jetzt gerafft, was damit gemeint war.

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
??? schrieb:
> @Imon (Gast)
> WAS SOLL DAS?
>
Ich hatte nicht das gefühl das der Fragende ein Problem mit der Sprache 
C hat sondern eher das er nicht in der lage ist sein Problem in 
vernüfigte Brocken zu zerlegen. Ausserdem habe ich denn eindruck das der 
TO keine Ahnung hat was der Unterschied zwischen ASCII und anderen 
Darstellungen ist.

Ich denke wir haben alle mal klein angefangen und waren sicher nicht 
alle die Hellsten als wir mit der Entwicklung von C Programmen 
angefangen haben.
Sicher der C Code am ende war viel zu viel, Da bin ich über das Ziel 
weit hinausgeschossen. Aber mal ehrlich der TO hat ein Problem und 
einfach nur zu sagen kauf dir ein Buch, kann es echt nicht sein.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ihm fehlen die elementarsten Dinge - er hat sicher noch keinerlei
Übung in C. Und das ist erstmal sein Problem, das er selbst beheben
muß.

Imon schrieb:
> Ich denke wir haben alle mal klein angefangen und waren sicher nicht
> alle die Hellsten als wir mit der Entwicklung von C Programmen
> angefangen haben.

Das ist richtig.
Aber in dem Stadium habe ich nicht anderen Leuten meine
Hausaufgaben hingeworfen, sondern habe mich ums Programmieren
gekümmert.

Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das ist richtig.
> Aber in dem Stadium habe ich nicht anderen Leuten meine
> Hausaufgaben hingeworfen, sondern habe mich ums Programmieren
> gekümmert.

Woher weisst du mein Stadium? Das du darüber ein Urteil aussprechen 
kannst. Zu dem ob ich mit C programmiert habe. Ja habe ich. In den 
ersten beiden Semestern meine Studiums. Allerdings ist das schon einige 
Zeit her. Ich gebe zu das es so klang als ob ich meine Hausaufgaben hier 
hingeschmissen haette, aber nein, in diesem Sinne war es von mir nicht 
gedacht. Ich habe alle Beiträge gelesen - wollte eigentlich dazu nichts 
äußern- habe mich aber nun doch dazu entschieden.

Ich dachte mir nur, dass ich evntl. hier auf menschen stoßen könnte, die 
mir wieder einwenig auf die Sprünge helfen könnten - so wie das Imon 
gemacht hat, wofür ich ihm auch wirklich sehr dankbar bin. Das war nur 
eine Beispielaufgabe, die ich mit Hilfe von Imon und einigen andren 
Überwinden konnte. Nach dieser Aufgabe habe ich eine weitere, alleine 
gemeistert. Jetzt sitze ich grad an der dritten aufgabe.

soviel zu dem Thema ich würde ja nichts selber machen.

Aber ich bin weder auf Klaus noch auf ??? sauer wegen ihren Beiträgen, 
denn ich bin davon überzeugt das Sie mit ihren Reaktionen es nur gut mit 
mir gemeint haben. Ist ja auch okay. Der eine versteht unter Hilfe das 
eine, der andere versteht halt etwas anderes darunter. Aber trotzdem bin 
ich allen dankbar!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr_niete schrieb:

> Woher weisst du mein Stadium?

Aus deinem ersten Posting.

Klaus, ich und viele andere hier haben haufenweise C Code gesehen aus 
allen Lernstadien. Wir können anhand des Codes ganz gut einschätzen, wo 
jemand steht.

und wer so etw3as schreibt
void histogram (char*data,int length)

{
     int i = 1;
     while(i=4)
     {
          data[i]==0;
          i++;
     }

}
hat ganz einfach geglaubt er kann ein paar Lektionen überspringen. Ob 
das jetzt das Überspringen von ein paar Kapiteln eines Buches ist, oder 
ob das ein paar mal Fehlen in der Vorlesung ist oder ob das das 
Auslassen der ersten Übungen ist (weil ja eh alles so einfach ist), kann 
man von hier nicht feststellen. Aber dass sich hier jemand ein paar 
Brocken abgebissen hat, die zu groß für ihn waren, dass sieht man.
Denn wenn man in seiner Lernphase bei Funktionen und Arrays angelangt 
ist, dann dürfen diese Fehler hier einfach nicht mehr passieren. Noch 
nicht mal morgens um halb 5 nach einer durchzechten Nacht. Wenn du so 
was schreibst, dann müssen dir sofort die Augen weh tun.

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Denn wenn man in seiner Lernphase bei Funktionen und Arrays angelangt
> ist, dann dürfen diese Fehler hier einfach nicht mehr passieren. Noch
> nicht mal morgens um halb 5 nach einer durchzechten Nacht. Wenn du so
> was schreibst, dann müssen dir sofort die Augen weh tun.

Ich möchte nicht ausschließen dass ich aus Unachtsamkeit mal ein '=' 
vergesse oder eines zuviel tippe, wobei die Bedingung in der Schleife 
selbt korrekt (i==4) keinen Sinn macht.
Spätestens beim Compilieren fällt so etwas aber auf:
main.c|16|warning: suggest parentheses around assignment used as truth value|
main.c|18|warning: statement with no effect| <-- Das ist ja wohl eindeutig!
Aber Warnungen lesen (und versuchen sie zu verstehen) ist ja soooo 
uncool...

Autor: avr_niete (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
??? schrieb:
> Aber Warnungen lesen (und versuchen sie zu verstehen) ist ja soooo
> uncool...

nein ist es nicht. Das genau ist aber immer das problem wenn man auf dem 
blattpapier geprüft wird.

Autor: ??? (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Och komm, das ist ne dämliche Ausrede! Wenn ich mir deinen bisherigen 
"Ergüsse" so angucke, das liegt nicht am Papier. Bis zur Prüfung sollte 
man sich u.a. durch praktische Übungen (und sei es daheim mit der 
kostenlosen GNU Toolchain) genug Wissen angeignet haben um zumindestens 
Programme zu schreiben welche auch als solche erkennbar sind.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
avr_niete schrieb:
> Das Ergebnis ist in einem globalen int-Array abzulegen.
Und dann das:
   unsigned Array [10];
Warum mußt du da was neu erfinden? Wenn ein int-Array verlangt ist, dann 
legst du doch am einfachsten ein int-Array an... :-/
Das wäre sogar noch weniger Tipparbeit gewesen.


avr_niete schrieb:
>> Aber Warnungen lesen (und versuchen sie zu verstehen) ist ja soooo
>> uncool...
> nein ist es nicht. Das genau ist aber immer das problem wenn man auf dem
> blattpapier geprüft wird.
Das unterscheidet aber den, der schon oft den Fehler gemacht hat, von 
dem der den Fehler noch nie gemacht hat. Der, der den Fehler schon oft 
gemacht hat, macht den Fehler auch auf einem Blatt Papier nicht mehr!!

Um die Diskussion abzukürzen:
Hier eine Lösung, die ich in 1 Minute aus deiner Beschreibung oben 
hingeschreiben habe:
int Array [10];
int data;
int length;
 
void histogram (char *data, int length)
{
   int i;
   for(i=0; i<10; i++) Array[i]=0;

   for(i=0; i<length; i++) {
     if(data[i]>='0' && data[i]<='9')
        Array[data[i]-'0']++; 
   }
}
Urigerweise unterschiedet sich die Lösung beim Gegenlesen kaum von der 
von Imon im Beitrag "Re: Aufgabe Zahlenstatistik"

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:

>> nein ist es nicht. Das genau ist aber immer das problem wenn man auf dem
>> blattpapier geprüft wird.
> Das unterscheidet aber den, der schon oft den Fehler gemacht hat, von
> dem der den Fehler noch nie gemacht hat. Der, der den Fehler schon oft
> gemacht hat, macht den Fehler auch auf einem Blatt Papier nicht mehr!!


Musiker und Tänzer nenne das im Übrigen 'üben' bzw. 'proben'. Kein 
Musiker käme auf die Idee zu einem Konzert zu gehen (geprüft zu werden) 
ohne vorher ausgiebig geübt zu haben. Bis seine Finger die 
Tasten/Klappen/Löcher/Saiten ganz von alleine an den richtigen Stellen 
finden.

An dem Spruch 'Übung macht den Meister' ist mehr drann als viele 
glauben.

Autor: C ist cool (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> und wer so etw3as schreibt
> void histogram (char*data,int length)
> {
>      int i = 1;
>      while(i=4)
>      {
>           data[i]==0;
>           i++;
>      }
> }

...provoziert zumindest keinen BSOD. Mir gefällt das.

Autor: hmmm... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ev. so fänd ichs schöner (Hoffe, ich hab mich in der funktion nicht 
vertan). Dieses ganze globale Zeug ... brrrr ...
#define ARRAY_LEN   10

 
void histogram (char *data, int *Array)
{
  if(data && Array) {
    do {
      if(*data >= '0' && *data <= '9') {
        Array[*data - '0']++;
      }
    } while(*data++);
  }
}


int main()
{
  int Array[ARRAY_LEN];
  char *text = "4574374274813754";

  memset(Array, 0, ARRAY_LEN);

  histogramm(text, Array);

  return(0);
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.