Berechnung eines Korrelationskoeffizienten Aufgabe: 1. Erstellen Sie eine Tabelle Verkauf mit den Feldern VERKAUF_ID, PRODUKT_ID und ANZAHL. Am einfachsten kopieren Sie die Tabelle Hulin.Verkauf. Dabei bedeutet der Datensatz (7, x, 12): Der Artikel x wurde beim Verkauf 7 insgesamt 12 mal gekauft. 2. Erstellen Sie ein C-Programm, das für alle Verkäufe den Korrelationskoeffizienten zwischen der Anzahl der gekauften Stücke von Produkt x und der Anzahl der gekauften Stücke von Produkt y berechnet. Wird bei einem Verkauf eines der Produkte x oder y nicht gekauft, so ist die Anzahl auf 0 zu setzen. Verwenden Sie ODBC zur Koppelung an die Datenbank. Die Formel für den Korrelationskoeffizienten lautet: n x y n x y i i n , mit x 1 n xi und y n yi n i 1 i 1 n 2 2 2 2 xi n x yi n y i 1 i 1 Dabei sind xi und yi die Ergebnisse einer n-fachen Stichprobe für die Zufallsgrößen x und y. i 1 1 n Lösung: // Berechnung des Korelationskoeffizienten von Verkaufszahlen #include <Stdiostr.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <windows.h> #include <sql.h> #include <sqlext.h> #include <odbcinst.h> #include <math.h> static char * szDSN = "ORACLE"; RETCODE rc; // Rückgabewert von ODBC-Funktionen HENV henv; // Umgebungs-Handle HDBC hdbc; // Verbindungs-Handle HSTMT hstmt; // Anweisungs-Handle char szSQLSTATE[6]; SDWORD nErr; char msg[200]; SWORD cbmsg; int ora_in () { SQLAllocEnv(&henv); // Umgebungshandle einrichten SQLAllocConnect(henv, &hdbc); // Verbindungshandle einr. rc = SQLConnect(hdbc, (unsigned char *) szDSN, SQL_NTS, (unsigned char *) "hulin@ora7db", 15, (unsigned char *) "passwort", 14); if (rc != SQL_SUCCESS) { printf("Fehlerconnect\n"); SQLError(0, 0, hstmt, (unsigned char *) szSQLSTATE, &nErr, (unsigned char *) msg, sizeof(msg), &cbmsg); cout << "SQLState= " << szSQLSTATE << "msg " << msg; return (0); } else return (1); } float korrelation () { // UWA int vid; UCHAR pid[10]; UCHAR produkt1[10] = "x"; UCHAR produkt2[10] = "y"; int zahl; // sonstige Variable fuer ODBC SDWORD cbData0, cbData1, cbData2; // Ausgabelaenge der Daten char * szSQL = "select * from Verkauf where produkt_id = 'x' or produkt_id = 'y' order by verkauf_id, produkt_id"; // SQL-Kommando,Cursor // sonstige Variable int i = 0; float ii; float xsum = 0; float ysum = 0; float xqsum = 0; float yqsum = 0; float xysum = 0; float xzahl, yzahl; int aktvid; SQLAllocStmt(hdbc, &hstmt); // Verbindungshandle einrichten // Abfrage ausfuehren SQLBindCol(hstmt, 1,SQL_INTEGER, &vid, sizeof(vid), &cbData0); SQLBindCol(hstmt, 2,SQL_C_CHAR, pid, sizeof(pid), &cbData1); SQLBindCol(hstmt, 3,SQL_INTEGER,&zahl,sizeof(zahl), &cbData2); rc = SQLExecDirect(hstmt, (unsigned char *) szSQL, SQL_NTS); // Berechnung if (rc != SQL_SUCCESS) { printf("Fehler_exec\n"); SQLError(0, 0, hstmt, (unsigned char *) szSQLSTATE, &nErr, (unsigned char *) msg, sizeof(msg), &cbmsg); cout << "SQLState= " << szSQLSTATE << "msg " << msg; return (10.0); } else { for(rc = SQLFetch(hstmt); rc == SQL_SUCCESS; i++) // for1 { pid[cbData1]='\0'; printf("%s, %s\n",pid, produkt1); if (!strcmp((const char *) pid,(const char *)produkt1)) { xzahl = (float)zahl; aktvid = vid; rc = SQLFetch(hstmt); if (!strcmp((const char *)pid,(const char *)produkt2) && aktvid == vid) { yzahl = (float)zahl; rc = SQLFetch(hstmt); } else yzahl = 0; } else // pid == produkt2 { xzahl = 0; aktvid = vid; yzahl = (float) zahl; rc = SQLFetch (hstmt); } xsum = xsum + xzahl; ysum = ysum + yzahl; xqsum = xqsum + xzahl * xzahl; yqsum = yqsum + yzahl * yzahl; xysum = xysum + xzahl * yzahl; printf("%f, %f, %f, %f, %f, %f, %f\n",xzahl,yzahl,xsum,ysum,xqsum,yqsum,xysum); } //end for1 ii = (float) i; } //end if return ((xysum - xsum * ysum/ii)/ sqrt((xqsum - xsum *xsum/ii)*(yqsum -ysum * ysum/ii))); } int main () { if (ora_in () == 1) printf ("Korrelationsk.: %f\n", korrelation ()); SQLFreeStmt(hstmt, SQL_DROP); //Aufraeumen SQLDisconnect(hdbc); SQLFreeConnect(hdbc); SQLFreeEnv(henv); return(TRUE); }