Listing des Programms LINASSOZ.C


/*      Programm linassoz.c                             */        
/*      Linearer Assoziierer mit Hebb-Lernregel         */
/*      Burkhard Lenze                                  */
/*      13.02.2009                                      */

/*      header-files                                    */

#include <stdio.h>
#include <math.h>
#include "linassoz.h"

/*      globale Variablen                */

float x[10];                             /*  Eingabevektorfeld           */
float y[10];                             /*  Ausgabevektorfeld           */
float theta[10];                         /*  Schwellwertvektorfeld       */
float w[10][10];                         /*  Matrixfeld der Gewichte     */
int n;                                   /*  Anzahl der Eingabe-Neuronen */
int m;                                   /*  Anzahl der Ausgabe-Neuronen */
char com;                                /*  Menuparameter               */

/*      Funktionen                       */

void lese_x(void)
    {
    int i;
    printf("\n");
    for (i=1;i<=n;i++)
         {
         printf("x[%1d] = ? ",i);
         scanf("%f",&x[i]);
         }
    }

void lese_y(void)
    {
    int j;
    printf("\n");
    for (j=1;j<=m;j++)
         {
         printf("y[%1d] = ? ",j);
         scanf("%f",&y[j]);
         }
    }

float T(float A)
    {
    return(A);
    }

void lernen(void)
    {
    int i,j;
    lese_x();
    lese_y();
    for (j=1;j<=m;j++)
         {
         theta[j]=0.0;
         for (i=1;i<=n;i++) {w[i][j]=w[i][j]+(y[j]*x[i]);}
         }
    }

void ausfuehren(void)
    {
    int i,j;
    float A;
    lese_x();
      for (j=1;j<=m;j++)
          {
          A=0.0;
          for (i=1;i<=n;i++) {A=A+(w[i][j]*x[i]);}
          y[j]=T(A-theta[j]);
          }
    printf("\n");
    for (j=1;j<=m;j++) {printf("y[%1d] = %8.2f\n",j,y[j]);}
    }

void veraendern(void)
    {
    int i,j;
    printf("\n");
    printf("Anzahl n der Neuronen in der Eingabeschicht ? ");
    scanf("%d",&n);
    printf("Anzahl m der Neuronen in der Ausgabeschicht ? ");
    scanf("%d",&m);
    for (i=1;i<=n;i++) {x[i]=0.0;}
    for (j=1;j<=m;j++) {y[j]=0.0;}
    for (j=1;j<=m;j++)
        {
        theta[j]=0.0;
        for (i=1;i<=n;i++) {w[i][j]=0.0;}
        }
    }

void zeigen(void)
    {
    int i,j;
    printf("\nDie Gewichte w[i][j] lauten: \n");
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++)
            {
            printf("w[%1d][%1d]=%8.2f   ",i,j,w[i][j]);
            }
        printf("\n");
        }
    printf("\nDie Schwellwerte theta[j] lauten: \n");
    for (j=1;j<=m;j++)
        {
        printf("theta[%1d] = %8.2f\n",j,theta[j]);
        }
    printf("\n");
    }

void speichern(void)
    {
    int i,j;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten und Schwellwerten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"w");
    fprintf(f,"%d\n",n);
    fprintf(f,"%d\n",m);
    for (j=1;j<=m;j++)
        {
        for (i=1;i<=n;i++) {fprintf(f,"%f\n",w[i][j]);}
        }
    for (j=1;j<=m;j++) {fprintf(f,"%f\n",theta[j]);}
    fclose(f);
    }

void einlesen(void)
    {
    int i,j,r;
    FILE *f;
    char dat[20];
    printf("\nWie lautet die Datei mit den Gewichten und Schwellwerten ? ");
    scanf("%s",&dat);
    f=fopen(dat,"r");
    fscanf(f,"%d",&r);
    if (r==n)
       {
       fscanf(f,"%d",&r);
       if (r==m)
          {
          for (j=1;j<=m;j++)
              {
              for (i=1;i<=n;i++) {fscanf(f,"%f",&w[i][j]);}
              }
          for (j=1;j<=m;j++) {fscanf(f,"%f",&theta[j]);}
          }
       else
          {
          printf("\nFehler! m ist in Datei %2d statt %2d \n",r,m);
          }
       }
    else
       {
       printf("\nFehler! n ist in Datei %2d statt %2d\n",r,n);
       }
    fclose(f);
    }

/*      Hauptprogramm                    */

int main(void)
    {
    veraendern();
    do
      {
      printf("\nlernen ausfuehren zeigen veraendern speichern einlesen beenden:\n");
      fflush(stdin);
      scanf("%c",&com);
      switch(com)
            {
            case 'l': lernen(); break;
            case 'a': ausfuehren(); break;
            case 'z': zeigen(); break;
            case 'v': veraendern(); break;
            case 's': speichern(); break;
            case 'e': einlesen(); break;
            default:  break;
            }
      }
    while (com!='b');
    return(0);
    }





Burkhard Lenze
Im Februar 2009