Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Daten im Array normalisieren

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
alex2001



Anmeldungsdatum: 27.09.2012
Beiträge: 9

BeitragVerfasst am: 29.09.2012, 18:04    Titel: Daten im Array normalisieren Antworten mit Zitat

hallo,
ich habe im moment eine Blockade. vielleicht kann mir jemand von euch da raus helfen:

ich habe ein gegebenes array, sagen wir x=100, y=2

y(1) enthält redundante daten
y(2) werte die in abhängigkeit von y(1) zu summieren sind

ziel:

y(1) enthält keine redundante daten mehr, und y(2) den jeweils summierten wert

weiss jemand ein brauchbares konstrukt in quickBasic?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 29.09.2012, 18:30    Titel: Leider furchtbar unverständlich Antworten mit Zitat

Hallo du.
Leider drückst du dich mit deinem Problem sehr konfus aus. Was ist x, was ist y?
Handelt es sich um ein zweidimensionales Array?
Quelltext liefern kann helfen, Skizzen können helfen, konkret das Ziel beschreiben kann helfen...
_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
alex2001



Anmeldungsdatum: 27.09.2012
Beiträge: 9

BeitragVerfasst am: 29.09.2012, 19:03    Titel: Antworten mit Zitat

Normailisieren siehe:

http://de.wikipedia.org/wiki/Normalisierung_%28Datenbank%29

Rundundanz siehe:

http://de.wikipedia.org/wiki/Redundant
_________________
Sottisen sind meist Ergebnis eigener Unzulänlichkeit
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 29.09.2012, 19:08    Titel: Re: Leider furchtbar unverständlich Antworten mit Zitat

SpionAtom hat Folgendes geschrieben:
Quelltext liefern kann helfen, Skizzen können helfen, konkret das Ziel beschreiben kann helfen...

Am besten ein Beispiel der Art
Code:
' Alles frei erfunden!
' Eingabedaten: 2 Arrays x() und y(), hier der Einfachheit halber nur
' wenige Elemente und aus DATAs initialisiert, in der richtigen Anwendung
' aus einem Textfile von einem Datenlogger, in der Regel mehrere tausend
' Elemente gross
DIM x(1 TO 5), y(1 TO 3)
FOR i%=1 TO 5
  READ x(i%)
NEXT i%
DATA 1, 77, -32, 55, 66
FOR i%=1 TO 3
  READ y(i%)
NEXT i%
DATA -22, 55, 88

' Ausgabedaten z(): Soll mit Algorithmus XYZ aus x() und y() berechnet
' werden und würde in diesem Fall 6 Elemente gross werden
DIM z(1 TO 6)
' ??? Summieren / Eure Hilfe

' z() sollte am Schluss in diesem Fall
' z(1) = 110, z(2) = 220, z(3) = 0, z(4) = -55, z(5) = 120, z(6) = 11
' enthalten

zusammenstellen. Einfach Dich klar ans EVA-Prinzip halten!
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
alex2001



Anmeldungsdatum: 27.09.2012
Beiträge: 9

BeitragVerfasst am: 29.09.2012, 19:35    Titel: Antworten mit Zitat

also versuchen wir es mal á la Markt&Technik-Bücher

mal angenommen, ich hätte 100 haustiere, (was natürlich schon polizeilich unzulässig wäre)
da wären vielleicht hunde, katzen, goldfische, hamster, meerschweinchen, wellensitiche, und kaulquappen

zu ermitteln wäre der tägliche futterbedarf je art (die eigenart des futters bleibt außer betracht)

der bedarf jedes einzelnen der tiere ist bekannt

wir können also eine tabelle anlegen (aha, nun kommt die datenbank wenigstens ansatzweise ins spiel):

spalte 1 art des tieres
spalte 2 indiviueller futterbedarf

die art der tiere ist in spalte 1 wahlfrei (unsortiert und mehrfach) eingetragen

aufgabe:
schreibe einen algorythmus, welcher den futter bedarf je vorhandener tierart ausgibt
_________________
Sottisen sind meist Ergebnis eigener Unzulänlichkeit
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
dreael
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 2507
Wohnort: Hofen SH (Schweiz)

BeitragVerfasst am: 29.09.2012, 20:21    Titel: Antworten mit Zitat

Danke für die genaueren Ausführungen. Dein Problem würde sich mit einer SQL-Datenbank logischerweise am einfachsten lösen lassen. Da es auf meinen diversen Linux-Servern ausreichend MySQL-Datenbanken gibt, habe ich das Ganze sonst einmal dort genauer eruiert.

Testdaten in einer MySQL-Datenbank mit folgenden Statements (Script) erzeugt:
Code:
-- Dies ist bereits eine normalisierte Form, weil die Haustierart
-- als separate Tabelle existiert
CREATE TABLE tierart(
  id INTEGER NOT NULL AUTO_INCREMENT,
  tiername VARCHAR(30) NOT NULL,
  PRIMARY KEY(id)
);

CREATE TABLE futterbedarf(
  id INTEGER NOT NULL AUTO_INCREMENT,
  tierart_id INTEGER NOT NULL,
  -- Ohne Normalisierung wäre tierart nur ein VARCHAR!
  name VARCHAR(30) NOT NULL,
  futtermenge INTEGER NOT NULL,
  PRIMARY KEY(id),
  FOREIGN KEY(tierart_id) REFERENCES tierart(id)
);

INSERT INTO tierart(tiername) VALUES("Hund");
SET @artid = LAST_INSERT_ID();
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Bello", 1000);
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Bobby", 850);
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Lupo", 900);
INSERT INTO tierart(tiername) VALUES("Katze");
SET @artid = LAST_INSERT_ID();
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Susi", 150);
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Florian", 120);
INSERT INTO tierart(tiername) VALUES("Hamster");
SET @artid = LAST_INSERT_ID();
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Hanserl", 90);
INSERT INTO futterbedarf(tierart_id, name, futtermenge) VALUES(@artid,
"Bippus", 80);

Am besten in eine Datei haustier.sql speichern und mit
Code:
mysql --user dbbenutzer -p tieredatenbank <haustier.sql

ausführen, so dass
Code:
mysql> show tables;
+-------------------+
| Tables_in_proebel |
+-------------------+
| futterbedarf      |
| tierart           |
+-------------------+
2 rows in set (0.00 sec)

mysql> select * from futterbedarf;
+----+------------+---------+-------------+
| id | tierart_id | name    | futtermenge |
+----+------------+---------+-------------+
|  1 |          1 | Bello   |        1000 |
|  2 |          1 | Bobby   |         850 |
|  3 |          1 | Lupo    |         900 |
|  4 |          2 | Susi    |         150 |
|  5 |          2 | Florian |         120 |
|  6 |          3 | Hanserl |          90 |
|  7 |          3 | Bippus  |          80 |
+----+------------+---------+-------------+
7 rows in set (0.00 sec)

mysql> select * from tierart;
+----+----------+
| id | tiername |
+----+----------+
|  1 | Hund     |
|  2 | Katze    |
|  3 | Hamster  |
+----+----------+
3 rows in set (0.00 sec)

mysql> _

als Ergebnis entsteht. In diesem Beispiel sei die Futtermenge in Gramm, welches jedes Tier täglich frisst.

So, und jetzt die eigentliche Auswertung: Zuerst einmal nur eine Tabelle erzeugen, die die Tiere auflistet, mit einem sog. Join:

Code:
mysql> SELECT b.name, a.tiername, b.futtermenge FROM tierart a, futterbedarf b WHERE a.id = b.tierart_id;
+---------+----------+-------------+
| name    | tiername | futtermenge |
+---------+----------+-------------+
| Bello   | Hund     |        1000 |
| Bobby   | Hund     |         850 |
| Lupo    | Hund     |         900 |
| Susi    | Katze    |         150 |
| Florian | Katze    |         120 |
| Hanserl | Hamster  |          90 |
| Bippus  | Hamster  |          80 |
+---------+----------+-------------+
7 rows in set (0.00 sec)

mysql> _


Und jetzt Deine gewünschte Auswertung selber: Tägliche Futtermengenbestimmung für jede Tierart selber:

Variante mit verschachteltem SELECT:

Code:
mysql> SELECT tiername, (SELECT SUM(futtermenge) FROM futterbedarf WHERE tierart_id = tierart.id) AS menge_gesamt FROM tierart;
+----------+--------------+
| tiername | menge_gesamt |
+----------+--------------+
| Hund     |         2750 |
| Katze    |          270 |
| Hamster  |          170 |
+----------+--------------+
3 rows in set (0.00 sec)

mysql> _


Aber dies lässt sich auch mit GROUP BY lösen:

Code:
mysql> SELECT a.tiername, SUM(b.futtermenge) AS menge_gesamt FROM tierart a, futterbedarf b WHERE a.id = b.tierart_id GROUP BY b.tierart_id;
+----------+--------------+
| tiername | menge_gesamt |
+----------+--------------+
| Hund     |         2750 |
| Katze    |          270 |
| Hamster  |          170 |
+----------+--------------+
3 rows in set (0.00 sec)

mysql> _


Bitte bestätigen, ob dies Deiner Problemstellung entspricht, dann kann ich etwas Passendes für in QB zusammenstellen.
_________________
Teste die PC-Sicherheit mit www.sec-check.net
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
SpionAtom



Anmeldungsdatum: 10.01.2005
Beiträge: 338

BeitragVerfasst am: 29.09.2012, 20:27    Titel: Antworten mit Zitat

Uuuuh, Qbasic programmieren. Nach so langer Zeit, geht immer noch einigermaßen.
Habe die Aufgabe nun so verstanden wie drael.
Die Aufgabenbeschreibung war diesmal wirklich gut. Und das ist auch die halbe Miete: Verständlich, möglicherweise auch ausführlich, beschreiben, was man eigentlich will.
Tabellen realisiert man in QB am besten mit Types.

Code:
TYPE Tierfutter
    rufname AS STRING * 12
    tier AS STRING * 12
    futter AS INTEGER
END TYPE

DATA 15
DATA "Luffi", "Affe", 5
DATA "Zorro", "Tiger", 12
DATA "Nami", "Papagei", 3
DATA "Ussop", "Hase", 7
DATA "Sanji", "K„nguruh", 12
DATA "Vivi", "Elch", 10
DATA "Chopper", "Elch", 6
DATA "Nico", "Katze", 2
DATA "Robin", "Katze", 4
DATA "Franky", "Nashorn", 9
DATA "Brook", "Elch", 1
DATA "Gold", "Nashorn", 14
DATA "Roger", "L”we", 11
DATA "Ace", "Affe", 4
DATA "Smoker", "L”we", 5

READ MAXTIERE
DIM futtertabelle(1 TO MAXTIERE) AS Tierfutter
FOR i% = 1 TO MAXTIERE
    READ futtertabelle(i%).rufname
    READ futtertabelle(i%).tier
    READ futtertabelle(i%).futter
NEXT


'Tabelle anzeigen
CLS
PRINT "Nr.  Name          Art           Anzahl Futtereinheiten"
PRINT "-------------------------------------------------------"
FOR i% = 1 TO MAXTIERE
    PRINT USING "##.  &  &  ##"; i%; futtertabelle(i%).rufname; futtertabelle(i%).tier; futtertabelle(i%).futter
NEXT


'Eingabeaufforderung
eingabe$ = ""
WHILE VAL(eingabe$) < 1 OR VAL(eingabe$) > MAXTIERE
  VIEW PRINT MAXTIERE + 4 TO 25: CLS
  LOCATE MAXTIERE + 4: INPUT "Bitte Nummer eines Tieres eingeben: ", eingabe$
WEND
eingabe% = VAL(eingabe$)

'Alle Futtereinheiten zusammenz„hlen, die dem Eingabetier entsprechen
tier$ = futtertabelle(eingabe%).tier
summe% = 0
anzahltiere% = 0
FOR i% = 1 TO MAXTIERE
    IF futtertabelle(i%).tier = tier$ THEN
      summe% = summe% + futtertabelle(i%).futter
      anzahltiere% = anzahltiere% + 1
    END IF
NEXT

'Ergebnis ausgeben
eingabeName$ = futtertabelle(eingabe%).rufname
PRINT RTRIM$(eingabeName$); " ist ein(e) "; RTRIM$(tier$); "."
PRINT "Es gibt davon"; anzahltiere%; "in der Tabelle und sie ben”tigen insgesamt"; summe%; "Futtereinheiten."
END

_________________
Inzwischen gehöre ich auch zu den BlitzBasicern. Also verzeiht mir, wenn mir mal ein LOCATE 100, 100 oder dergleichen rausrutscht.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
alex2001



Anmeldungsdatum: 27.09.2012
Beiträge: 9

BeitragVerfasst am: 04.10.2012, 18:47    Titel: Antworten mit Zitat

Hallo,
ich möchte mich bei allen bedanken, die über das Problem nachgedacht haben!
Die Blockade hat sich mittlerweile geöst.

Die Lösung war (wie häufig) verhältnismässig einfach:

FOR i = 1 TO postenzaehler

j = 1

DO UNTIL Bon.konto(i) = bonGegenkonto(j) OR bonGegenkonto(j) = 0
j = j + 1
LOOP

bonGegenkontoBetrag(j) = bonGegenkontoBetrag(j) + Bon.Gesamtpreis(i)
bonGegenkonto(j) = Bon.konto(i)

NEXT i

Zur Erklärung:
Ich schreibe an einem Program zur Buchhaltung für den privaten Gebrauch aber auf Grundlage der doppelten Buchführung(kaufmänische Buchführung)
Um die Sache bequem zu machen, kann der Einkauf über Artikelnummern oder Barcode(per Scanner) erfasst werden.
Nun wollte ich aber nicht für jeden einzelnen Posten eine Buchung im Journal und den einzelnen Konten haben, sondern sollten für den gesamten Einkauf nur Buchungen je Warengruppe(gesamt) erfolgen, also für Molkerei eine zusammengefasste Buchung, für Backwaren und so weiter...
Ich brauchte nur das "Konstrukt" wie man die (bereits vorhandenen Daten) "verdichtet" oder auch "normalisiert": Eine Buchung je Warengruppe.

Danke nochmal.
_________________
Sottisen sind meist Ergebnis eigener Unzulänlichkeit
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz