Hallo Leute, ich muss folgenden Sache in Visual Basic schreiben. Ich habe insgesamt ca. 700 Namen, dabei sind es ca. 10 verschiednene Namen, die einfach unsoritier verteilt sind. Jetzt muss ich folgendes machen. Ich muss diese Namen in eine kleinere Tabelle zusammenfassen. So das in der Tabelle folgendes steht: Name1 kommt z.B. 100 mal vor, Name2 kommt 3 mal vor. Habt Ihr vielelciht Idee wie man sowas realiseren kann. Sitze schon die ganze Zeit und überlege mir wie man es machen kann! Die Namen werden aus einer Datenbank ausgelesen und werden nicht zwischengespeichert.
Du musst doch nur die Namen ablegen und dann Zeile für Zeile einfach nur gucken wie der name ist. Am besten machst du dir ein leeres Array (z.B. Namen(20), für die unterschiedlichen Namen) und fängst an zu scannen. Den Namen aus der ersten Zeile speicherst du in diesem Array. Dann suchst du in einer for-Schleife jede Zeile der Liste nach den Namen dem Array Namen() ab. Sollte der Name gefunden werden inkrementierst du den Namenszähler ansonsten packst du den Namen in das Array Namen() mit rein damit du einen weiteren namen hast. In C würde ich das in etwa so lösen:
1 | #include <stdio.h> |
2 | #include <string.h> |
3 | |
4 | |
5 | typedef struct { |
6 | char name[50]; |
7 | int count; |
8 | }name_struct; |
9 | |
10 | int main(){ |
11 | char tab_names[][20] = {"Hannes","Tomas","Anna","Anna","Hannes","Hannes",0}; |
12 | name_struct namen[20]={0,0}; |
13 | int i,j; |
14 | |
15 | i=0; |
16 | strcpy(namen[0].name, tab_names[0]); /* 1. Namen speichern */ |
17 | |
18 | while(tab_names[i][0] != 0){ /*Suchen bis Ende */ |
19 | j = 0; |
20 | while(1){ |
21 | if(!strcmp(namen[j].name,tab_names[i])){ |
22 | namen[j].count++; |
23 | break; |
24 | }
|
25 | j++; |
26 | if(namen[j].name[0] == 0){ |
27 | strcpy(namen[j].name, tab_names[i]); |
28 | namen[j].count++; |
29 | break; |
30 | }
|
31 | }
|
32 | i++; |
33 | }
|
34 | i=0; |
35 | /* Ausgabe */
|
36 | while(namen[i].name[0] != 0){ |
37 | printf("%s: %d\n",namen[i].name,namen[i].count); |
38 | i++; |
39 | }
|
40 | |
41 | return 0; |
42 | }
|
In VB ist das natürlich noch etwas einfacher, aber ich habe beim Jahrelangen C-Programmieren irgendwie das meiste aus VB Zeiten vergessen.
Eine einfache Methode ist das Array mit den Namen erst zu sortieren und dann durchzuzählen. Das benötigt je nach Umsetzung sehr wenig Speicherplatz und kann schön modularisiert werden. Wenn die Option besteht würde ich die Liste direkt beim Auslesen aus der Datenbank sortiert anfordern (ORDER BY name). Dann könnte man aber auch direkt das Durchzählen dabei erledigen (GROUP BY name) ;)
Wie Kai schon schreibt. 1. Sortieren 2. in einer Schleife gucken ob der nächste Name Identisch ist. Wenn ja Zähler plus eins, andernfalls ab der Position wieder von vorne. So wird die Liste nur einmal durchlaufen, schneller und simpler gehts eigentlich nicht.
Könnte diese "Datenbank" evtl. eine Excel-Liste sein? Dann gibt es die Funktion "Zählewenn". Für 10 verschiedene Namen ist das die einfachste und schnellste Möglichkeit. Falls es keine Excel-Tabelle ist, könnte man die Datenbank evtl. nach CVS (oder CSV?) konvertieren, in Excel importieren und die 3 Formeln in eine Zelle tippen.
Naja, am einfachsten wäre es, das Zählen direkt per "SELECT COUNT..." in der DB-Abfrage zu erledigen. Aber VB ist natürlich etwas kniffliger. Kennt Visual Basic Hash-Tabellen? Damit wäre es einfach. Alternativ kannst du die Tabelle selbst implementieren, ist aber etwas komplizierter. Dazu kenne ich Visual Basic auch zu wenig. Ach ja, Hash-Tabellen werden in einigen Programmiersprachen nicht explizit so bezeichnet. Man kann dann einfach Arrays mit beliebigen Werten indizieren. Z.B. in Javascript (ungetestet): function count() { var counts = []; var i; var name; for (i in names) counts[names[i]]++; } virtuPIC /ggadgets for tools & toys
In vielen Programmiersprachen gibt es so gegannte assoziative Arrays. Das sind Arrays, die nicht über nur über eine fortlaufenden Ganzzahl, sondern über einen (fast) beliebigen Datentyp adressiert werden können. In C++ heißen sie Maps, in Python Dictionaries und in Lisp Association Lists. VB kenne ich nicht, aber ich kann mir gute vorstellen, dass es dort ebenfalls so etwas gibt. Wenn ja, legst du ein assoziatives Array mit den Anzahlen der einzelnen Namen an, das über die Namen adressiert wird. In Python würde das etwas so aussehen:
1 | count = {} # Leeres Dictionary anlegen |
2 | while True: |
3 | name = raw_input() # Eingabe eines Namens |
4 | if name == "": # Eine Leerzeile beendet die Eingabe |
5 | break |
6 | try: |
7 | count[name] += 1 # Zähler für den Namen eins erhöhen |
8 | except KeyError: # Wenn der Name zum ersten Mal auftritt |
9 | count[name] = 1 # Zähler auf eins setzen |
10 | |
11 | for name, cnt in count.items(): # Inhalt des Dictionarys als Liste |
12 | print name, cnt # von Namen und Anzahlen ausgeben |
Falls es diese assoziativen Arrays nicht gibt, kannst du eine Liste (oder ein erweiterbares normales Array) anlegen, deren Elemente Paare aus Name und Anzahl sind. Eine Scuhfunktion nach dem Namen führt zum richtigen Element, dessen Anzahlwert anschließend erhöht wird. Wird ein Name nicht gefunden, wird eine neues Element an das Ende der Liste angehängt.
Hallihallo, ich suche verzweifelt nach einem quelltext der es ermöglicht, obstarten mit verschiedenen farben und preisen in einer neuen tabell zusammenzufassen: so sollt dort dann stehen: X Äpfel, Farbe rot, und der preis aller x äpfel soll addiert werden... vllt kann mit ja jemand helfen, bin echt verzweifelt:) vielen dank schonmal...alex
Hallo Alex. Ein Forum wie dieses ist ein sehr mächtiges Werkzeug, allerdings muss man es richtig benutzen. Eine Frage a la "macht ma meine hausaugfaben ihr deppen aber ich sage euch nich wie!!!!!!1eins" wird selten wie gewünscht beanwortet. Mit etwas Eigeninitiative, sinnvollem Fragen, Lesen (+ evtl. Dummschwätzeranteil ausfiltern), Verstehen, Ausprobieren, Nachfragen, Lesen, Verstehen, ... sind Fragende hier erfahrungsgemäß sehr erfolgreich. Etwas Respekt dem potentiell hilfsbereiten Leser gegenüber in Form eines erträglich gestalteten Textes schadet dabei sicherlich auch nicht. 1.) Was geht in dein Programm rein und wie ist die Eingabe formatiert(Textdatei, Exceltabelle, manuelle Eingabe)? 2.) Was soll in welcher Form herauskommen? 3.) Kleines Beispiel für 1.) und 2.) 4.) Welche Progammiersprace willst/musst du benutzen? Oder egal, Hauptsache kostenlos und in Windows? Bunte Knöpfe oder Konsole? 5.) Vorkenntnisse? 6.) Was hast Du zur Problemlösung unternommen? Was hast Du Dir dabei gedacht? Ideen, wie es funktionieren könnte? Wo kommst Du nicht weiter? Quelltext? Grüße
Ach, um Gottes Willen, Obstarten sind gemeint. Durch die konsequente Kleinschreibung habe ich das tatsächlich überlesen. Trotzdem, die Asche geht auf das Haupt des rechtschreibbefreiten Trottels, vor allem auch aus den von "Matt" aufgeführten Gründen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.