|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
alex2001
Anmeldungsdatum: 27.09.2012 Beiträge: 9
|
Verfasst am: 29.09.2012, 19:04 Titel: Daten im Array normalisieren |
|
|
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 |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 338
|
Verfasst am: 29.09.2012, 19:30 Titel: Leider furchtbar unverständlich |
|
|
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 |
|
|
alex2001
Anmeldungsdatum: 27.09.2012 Beiträge: 9
|
|
Nach oben |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 29.09.2012, 20:08 Titel: Re: Leider furchtbar unverständlich |
|
|
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 |
|
|
alex2001
Anmeldungsdatum: 27.09.2012 Beiträge: 9
|
Verfasst am: 29.09.2012, 20:35 Titel: |
|
|
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 |
|
|
dreael Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 2507 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 29.09.2012, 21:21 Titel: |
|
|
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 |
|
|
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 338
|
Verfasst am: 29.09.2012, 21:27 Titel: |
|
|
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 |
|
|
alex2001
Anmeldungsdatum: 27.09.2012 Beiträge: 9
|
Verfasst am: 04.10.2012, 19:47 Titel: |
|
|
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 |
|
|
|
|
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.
|
|