Forum: PC-Programmierung Zahlen Zusammenfassen


von neuling (Gast)


Lesenswert?

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.

von Timmo H. (masterfx)


Lesenswert?

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.

von Kai G. (runtimeterror)


Lesenswert?

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) ;)

von Benny (Gast)


Lesenswert?

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.

von Daniel R. (drd)


Lesenswert?

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.

von Thomas B. (Firma: Druckerei Beste) (virtupic)


Lesenswert?

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

von yalu (Gast)


Lesenswert?

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.

von yalu (Gast)


Lesenswert?

Habe gerade gegoogelt: In VB scheinen die Dinger "Collections" zu
heißen.

von alex204_neuling (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was bitte sind "obstarten mit verschiedenen farben und preisen"?

von Matt (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.