newbi frage :(
-
Wie wäre es mit ner map<char, int>
Also einfach
map<char, int> foo;
char ch = 'e';
++foo[ch];
Und das für jedes Zeichen, vorher könnte man noch mit isAlpha prüfen ob es sich
auch tatsächlich um Zeichen handelt, soll zwischen Groß- und Kleinschreibung nicht
unterschieden werden, einfach alle Zeichen vorher mit toLower in kleine Zeichen umwandeln.Kleines Beispiel:
map<char, int> foo; for (int i = 0; i < 26; ++i) { char ch = i+65; ++foo[ch]; } map<char, int>::const_iterator it = foo.begin (); map<char, int>::const_iterator it_end = foo.end (); for (; it != it_end; ++it) cout << "Zeichen " << it->first << " wurde " << it->second << " mal gefunden." << endl;
/Edit
Unglaublich wieviele Rechtschreibfehler ich heute in ein Posting bekomme
-
cool vieln dank für die tolln antworten
also ich habs alles mal so'n bisschen versucht aba ich habs nich wirklich hinbekomm (schon einige sachen bei von dennen ich noch garnix versteh - ausser die variante von newkid - aber um das umzusetztn bin ich glaube zu blöd :/)was ich halt hab ist das hier :
main() { char buf[100]; int count[26]; int i; for( i = 0; i < 26; i++) count[i] = 0; printf( "buf:"); gets( buf); for( i = 0;buf[i] != 0; i++) count[buf[i]-'a']++; printf( "\nAuswertung:\n"); for( i = 0; i <= 'z'-'a'; i++) printf( "%c: %d\n", 'a'+i, count[i]); }
das gibt halt die anzahl der buchstaben aus... hab aber nich wirklich n'plan wie ich das weiter machen soll
-
Hi,
ja sind ziemlich weit auseinandergehende Vorschläge.
Das Problem bei deinem Ansatz ist, dass eben nach ASCII nicht die Großbuchstaben direkt hinter den kleinen liegen. Umlaute gibt es ja auch noch.Ich mache einfach mal folgenden Gegenvorschlag.
Ich denke, er ist recht einfach zu verstehen.int main() { int buch[128] = {0}; //gute Möglichkeit das ganze Array mit 0 zu füllen char *wort = "hallo"; for (int i=0;i<strlen(wort);i++) buch[wort[i]]++; //Arrayfeld des entsprechenden Zeichens um 1 erhöhen for (int i=0;i<128;i++) if (buch[i]) printf("%c : %d\n", i, buch[i]); }
Nun hast du direkt die Anzahl aller ASCII Zeichen von 0 bis 127 im Array.
Von hier ist es recht einfach, weiterzumachen.Dein nächster Schritt sollte sein, zu ermitteln, wie hoch die am meisten vorkommende Buchstabenzahl ist.
PS: Man verzeihe mir bitte die C Elemente und denke sich das printf als geeignetes cout
-
danke, so gehts perfekt, nur bin ich noch nich dahinter gestiegen wie ich das mit der sortierung hinbekommen ... hab halt kaum erfahrung mit arrays... könnt ihr mir da weiterhelfen? und vll den quelltext dazu erklären? also das SeppSchrot versteh ich ja alles ... nur die arrays sortieren ...
thx, elvis
-
es gibt nur ein array..... dieses array beinhaltet mehrere einträge(128)... diese musst du nun in einer for-schleife durchlaufen und ermitteln, welcher array-eintrag die höchste zahl hat....
-
ja, des is schon klar, aba wie ermittel ich des?
-
Ja, eben.
Sortieren bringt dir hier gar nichts, damit bringst du alles durcheinander.
Denn für welche Buchtaben die Zahlen in den Feldern stehen, das erkennt man ja an der Position des Feldes.
-
Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.
-
wenns dann keinen größeren wert als max gibt, dann kannste ja den eintrag anzeigen... musst aber die zahl des buch-arrays dann ins char casten... nun musst du nur überlegen, wie du verhinderst, dass nicht 2 mal dasselbe ausgegeben wird(tipp: veränder den wert des arrays dieser stelle)
-
SeppSchrot schrieb:
Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.na soll ich dann "i" überprüfen oder "buch[i]" ... ô.0
n quelltextbeispiel wäre hilfreich
-
da_ElViS schrieb:
SeppSchrot schrieb:
Na du nimmst dir eine neue Variable max mit dem Anfangswert 0.
Dann läufst du das ganze Array durch und wenn der Wert eines Feldes größer ist als max, dann setzt du max auf diesen Wert.na soll ich dann "i" überprüfen oder "buch[i]" ... ô.0
n quelltextbeispiel wäre hilfreichwenn du aber immer nur alles vorgesetzt bekommst, dann hilft dir das nicht wirklich weiter... überleg doch erst mal ne zeit... nicht nur eben mal ne min. wenn man selber drauf kommt, dann ist's einfach besser, auch wenn's länger dauert...
-
Hier ist der Quellcode für deine Lösung:
#include <iostream>
#include <iomanip.h>
#include <string.h>
#include <ctype.h>using namespace std;
void main()
{char line[81];
char let[4] = "aA ";
int flet[26] = {0};
unsigned len;
int i;cout << "\n"
"------- BUCHSTABENHŽUFIGKEITEN FESTSTELLEN ------"
"\n\nGeben Sie Zeichen ein "
"(max. 80, Ende mit <ENTER>):\n\n";cin.getline(line,81);
len = strlen(line);for (i = 0; i < len; i++)
{
if(islower(line[i]))
flet[line[i]-'a']++;
else if (isupper(line[i]))
flet[line[i]-'A']++;
}cout << "\n\n";
for (i = 0; i < 26; i++)
{
cout << let;
let[0]++;
let[1]++;
}cout << "\n";
for (i = 0; i < 26; i++)
cout << setw(2) << flet[i] << " ";
}
-
also nochmal allgemein
wegen den max wertint max = 0; for( int i = 0; i < len; i++) // len = laenge vom array; bsp arr[] { if( max < arr[i] ) { max++; // ja ich klammere auch bei einer anweisung ;) } } //am schluss jetzt ist max halt die groesste haeufigkeit
du solltest wirlich lernen wie man pseudocode in c++/c code umsetzen kann.
denn wie du siehst ist dieses beispiel wirklich trivial
-
upsala die müdigkeit hat mich!!!!!
.... // max++; <-------------- falsch! max = arr[i]; // <----- richtig!
-
ja danke für die hilfe, aber so weit hat ich es ja im prinzip schon, also jedenfalls hab ich das so versucht(4 zahlen absteigend auflisten):
int zahl[4]; int max; zahl[1]=7; zahl[2]=9; zahl[3]=2; zahl[4]=6; for (int i=1; i<4; i++) { if( max < arr[i] ) { max = arr[i]; printf("%d", max); }
aber da listet er nur die zur zeit höchste zahl aus.. also "7999" steht denn da.. aber wie mach ich dass, das dann halt "9762" da steht?
ich hab versucht da noch ne for schleife rumzulegen - aba dann hat garnix mehr funktioniert
-
Naja also wenn du richtig gelesen hättest meinen langen Beitrag, dann hättest du gewusst das du
Einmal eine Schleife brauchst um max zu bestimmen. Da steht EXTRA das da noch nichts ausgegeben wird.
du kannst es dir einfach machen ( um mal dein bsp zu nehmen )
int zahl[4]; int max; zahl[1]=7; zahl[2]=9; zahl[3]=2; zahl[4]=6; for (int i=1; i<4; i++) { if( max < zahl[i] ) max = zahl[i]; // printf("%d", max); <--- ich sagte in der schleife nichts ausgeben } // so jetzt ist max = 9, und das ist gut so int flag = 0 do { flag = 0; // für abruchbedingung ( gut bei grossen arrays ) for( int i = 0; i < 4 && flag == 0; i++) { if( zahl[i] == max ) { cout << zahl[i] << endl; flag = 1; } } max--; // der nächst kleinere möglichere wert }while( max > 0)
Wenn es jetzt eine zahl nicht geben sollte, wie z.b. die 8 in deinem Bsp. macht das nichts.
Ist jetzt mal auf die schnelle ein Algoritmus der tut. Maybe nicht der intelligenteste, aber bei heutigen PC kein grosser Akt.
Natürlich würde ich das nicht per Hand programmieren sondern entsprechende klassen benutzen, wo man dann die int's reinspeichert und dann gleich absteigend sorieren kann. die vector klasse müsste das können. Aber das ist ein anderes Kapitel. Kannst ja mal hier im Forum nach "vector" suchen.
falls der fehlerteufel drinnen sein sollte, bitte bescheid sagen.
-
achso falls du z.b. auch ne 0 hast im array dann muss es heissen
..... while ( max > -1)
wenn du jetzt auch negative zahlen hast, oder sonst was. dann musst die kleinste bestimmen in einer schleife. z.b. kommt dann -344 raus
dann heisst es dann
while( max > -345)
-
achso, falls es auch doppelte zahlen geben kann. z.b. 4mal die 9 oder so und du möchtest dann auch nciht einmal sondern 4mal die 9 ausgeben, dann lösche das mit dem flag bitte.
-
jo danke, das hab ich gesucht
aba hab jetzt mal versucht die beiden dinger zu verbinden (also das auslesen der anzahl von den eigegebenen zeichen, und das "sortieren" nach der anzahl) :
also das hier
int main() { int buch[128] = {0}; char *wort = "hallo"; for (int i=0;i<wort;i++) buch[wort[i]]++; for (int i=0;i<128;i++) if (buch[i]) printf("%c : %d\n", i, buch[i]); }
mit dem hier:
int zahl[4]; int max; zahl[1]=7; zahl[2]=9; zahl[3]=2; zahl[4]=6; for (int i=1; i<4; i++) { if( max < zahl[i] ) max = zahl[i]; } do { for( int i = 0; i < 4 ; i++) { if( zahl[i] == max ) { cout << zahl[i] << endl; } } max--; }while( max > 0)
also dass dann da steht (2:l, 1:a, 1:h, 1
aba ich habs wiedermal (-.-) nich hinbekommen ... ja.. ich weiss - ich muss das selber machen um es zu lernen .. aba ich bekomms halt nich hin - und was kann ich'n sonst machn ausser nach hilfe zu fragen wenn ich es par tout nich hinbekomm... - ich hab mir die vorherigen kapitel noch n parr mal durchgelesen, aba ich hab tortzdem kein durchblick für die aufgabe... könnta das vielleicht "verbinden" und kurz sagen wie ihr das gemacht habt? würde mir ja schon weiterhelfen wenn ich die lösung sehe und es dann nochmal selber versuche... pls
thx im voraus
-
rolf ey
denk mal selber darueber nachdein erster teil
üble bugs drinnen.
vom prinzip kann ich nur schätzen was du da machen willstne da helf ich jetzt nicht.
zahl[1]=7; hier z.b. ist mir vorher gar nciht aufgefallen
es fängt mir 0 an nicht mit 1also zahl[0]
d.h. schau nochmal nach wie arrays gehen!
was du ja im 2ten teil hast, ist ein array wo du nur die anzahl drinnen hast. du hast da nirgends die buchstaben drinnen.
du kannst es so machen wie die einen es gesagt haben, oder meine lange fassung mit struct.
Wobei beides gut istda
1. du Ascci gut lernen solltest. und wie man von ints so auf die buchstaben kommt
2. struct zu kennen NIE verkehrt ist, ganz im gegenteil.
// was soll das hier sein??? for (int i=0;i<128;i++) // 128 mal machst du es! if (buch[i]) printf("%c : %d\n", i, buch[i]); // if(buch[i]) ist ja immer true // bei einem if macht man i.d.r einen VERGLEICH. du vergleichst ja NICHTS. dann kannst es dir gleich sparen }
buch[wort[i]]++; <--- sehr "mutig", was wolltest du damit machen? erklärs mal in eigenen sätzen.
also FAZIT:
nochmal alle aufgaben, die vorher im buch gestellt waren NOCHMALS machen.