Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  testmfz.c   Sprache: C

 
#include "defs.h"

#define MSP 100000
#define MM 200
#define MV 1000
#define MDIM 100
char opt[5];
int  msp = MSP;
int  mv = MV, mm = MM, mdim = MDIM, dim, *spv, **spm, mspace[MSP], *vec[MV],
    **mat[MM], cp[500];
FILE *ip, *op;

int main(void)
{
  int  i, j, l, m, n, *p, **dp, maxv, maxm, ord;
  int  quot;
  char c, fault, flnm[80], f;
  printf("Do you wish to read matrices from a file(y/n)? ");
  if ((c = getchar()) == 'y') {
    f = 1;
    seeknln();
  reenter:
    printf("Input filename: ");
    scanf("%s", flnm);
    if ((ip = fopen(flnm, "r")) == 0) {
      fprintf(stderr, "Cannot open %s.\n", flnm);
      seeknln();
      goto reenter;
    }
    fscanf(ip, "%d%d", &dim, &n);
  }
  else {
    f = 0;
    printf("Input dimension: ");
    scanf("%d", &dim);
  }
  if (dim > mdim) {
    fprintf(stderr, "dim too big.\n");
    exit(1);
  }
  seeknln();
  /* Set matrix and vector pointers as in mcd.c  */
  quot = msp / dim;
  if (quot >= mv)
    quot = mv - 1;
  maxv = quot;
  for (i = 1; i <= maxv; i++)
    vec[i] = mspace - 1 + (i - 1) * dim;
  maxm = (maxv - 10) / dim - 1;
  if (maxm >= mm)
    maxm = mm - 1;
  for (i = 0; i <= maxm; i++)
    mat[i] = vec + 10 + i * dim;
  dp = mat[0];
  p = *dp;
  for (i = 1; i <= dim * dim; i++)
    *(++p) = 0;
  for (i = 1; i <= dim; i++)
    dp[i][i] = 1;
  spm = mat[maxm];
  spv = spm[1];
  printf("10 free vectors and %d matrices can be defined.\n", maxm - 1);
  printf("Mat 0 is the identity.\n");
  if (f) {
    for (i = 1; i <= n; i++)
      readmat(mat[i]);
    fclose(ip);
  }
  while (1) {
    printf("Choose option. Print 'l' for list.\n");
    scanf("%s", opt);
    if (strcmp(opt, "l") == 0) {
      seeknln();
      printf("rv n or rm n = read vec or mat no. n.\n");
      printf("pv n or pm n = write vec or mat no. n.\n");
      printf("tr m n = calc transpose m[n] of m[m].\n");
      printf("inv m n = calc inverse m[n] of m[m].\n");
      printf("im l m n = calc image v[m] of v[l] under m[n].\n");
      printf("c l m n = calc comm v[m] of v[l] under m[n].\n");
      printf(
          "pr n l i(1)..i(l) = calc prod m[n] of m[i(1)]...m[i(l)].\n");
      printf("sum n l i(1)...i(l) = calc sum m[n] of m[i(1)]...m[i(l)].\n");
      printf(" (mat nos may be negative for "
             "difference.)\n");
      printf("ch n i j k = change m[n][i][j] to k.\n");
      printf("eq m n = test equality of m[m],m[n].\n");
      printf("ord m n = calc order of m[m] and put inverse in "
             "m[n].\n");
      printf("op filename = output some matrices to filename.\n");
      printf("q = quit.\n");
    }
    else if (strcmp(opt, "rv") == 0) {
      scanf("%d", &n);
      seeknln();
      if (n <= 0 || n >= 10) {
        fprintf(stderr, "Invalid vector number %d\n", n);
        continue;
      }
      for (i = 1; i <= dim; i++)
        scanf("%d", vec[n] + i);
      seeknln();
    }
    else if (strcmp(opt, "rm") == 0) {
      scanf("%d", &n);
      seeknln();
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      for (i = 1; i <= dim; i++)
        for (j = 1; j <= dim; j++)
          scanf("%d", mat[n][i] + j);
      seeknln();
    }
    else if (strcmp(opt, "pv") == 0) {
      scanf("%d", &n);
      seeknln();
      if (n <= 0 || n >= 10) {
        fprintf(stderr, "Invalid vector number %d\n", n);
        continue;
      }
      for (i = 1; i <= dim; i++)
        printf(" %3d", vec[n][i]);
      printf("\n");
    }
    else if (strcmp(opt, "pm") == 0) {
      scanf("%d", &n);
      seeknln();
      if (n < 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      for (i = 1; i <= dim; i++) {
        for (j = 1; j <= dim; j++)
          printf(" %3d", mat[n][i][j]);
        printf("\n");
      }
    }
    else if (strcmp(opt, "tr") == 0) {
      scanf("%d%d", &m, &n);
      seeknln();
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (m < 0 || m >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", m);
        continue;
      }
      trans(mat[m], mat[n]);
    }
    else if (strcmp(opt, "inv") == 0) {
      scanf("%d%d", &m, &n);
      seeknln();
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (m < 0 || m >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", m);
        continue;
      }
      inv(mat[m], mat[n]);
    }
    else if (strcmp(opt, "im") == 0 || strcmp(opt, "c") == 0) {
      scanf("%d%d%d", &l, &m, &n);
      seeknln();
      if (l <= 0 || l >= 10) {
        fprintf(stderr, "Invalid vector number %d\n", l);
        continue;
      }
      if (m <= 0 || m >= 10) {
        fprintf(stderr, "Invalid vector number %d\n", m);
        continue;
      }
      if (n < 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (strcmp(opt, "im") == 0)
        im(vec[l], vec[m], mat[n]);
      else
        comm(vec[l], vec[m], mat[n]);
    }
    else if (strcmp(opt, "pr") == 0) {
      scanf("%d%d", &n, cp);
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        seeknln();
        continue;
      }
      fault = 0;
      for (i = 1; i <= *cp; i++) {
        scanf("%d", &m);
        if (m < 0 || m >= maxm) {
          fprintf(stderr, "Invalid matrix number %d\n", m);
          fault = 1;
          break;
        }
        cp[i] = m;
      }
      seeknln();
      if (fault)
        continue;
      prod(cp, mat[n]);
    }
    else if (strcmp(opt, "sum") == 0) {
      scanf("%d%d", &n, cp);
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        seeknln();
        continue;
      }
      fault = 0;
      for (i = 1; i <= *cp; i++) {
        scanf("%d", &m);
        if (m < 0 || m >= maxm) {
          fprintf(stderr, "Invalid matrix number %d\n", m);
          fault = 1;
          break;
        }
        cp[i] = m;
      }
      seeknln();
      for (i = 1; i <= dim; i++)
        for (j = 1; j <= dim; j++) {
          m = 0;
          for (l = 1; l <= *cp; l++)
            if (cp[l] > 0)
              m += mat[cp[l]][i][j];
            else
              m -= mat[-cp[l]][i][j];
          mat[n][i][j] = m;
        }
    }
    else if (strcmp(opt, "ch") == 0) {
      scanf("%d%d%d%d", &n, &i, &j, &l);
      seeknln();
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (i <= 0 || j <= 0 || i > dim || j > dim) {
        fprintf(stderr, "Invalid row or column no %d,%d\n", i, j);
        continue;
      }
      mat[n][i][j] = l;
    }
    else if (strcmp(opt, "eq") == 0) {
      scanf("%d%d", &m, &n);
      seeknln();
      if (n < 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (m < 0 || m >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", m);
        continue;
      }
      f = 1;
      for (i = 1; i <= dim; i++) {
        for (j = 1; j <= dim; j++)
          if (mat[m][i][j] != mat[n][i][j]) {
            f = 0;
            break;
          }
        if (f == 0)
          break;
      }
      if (f)
        printf("Matrices are equal.\n");
      else
        printf("Matrices differ in place %d,%d.\n", i, j);
    }
    else if (strcmp(opt, "ord") == 0) {
      scanf("%d%d", &m, &n);
      seeknln();
      if (n <= 0 || n >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", n);
        continue;
      }
      if (m < 0 || m >= maxm) {
        fprintf(stderr, "Invalid matrix number %d\n", m);
        continue;
      }
      *cp = 1;
      cp[1] = m;
      prod(cp, mat[n]);
      prod(cp, spm);
      ord = 1;
      while (1) {
        f = 1;
        for (i = 1; i <= dim; i++) {
          for (j = 1; j <= dim; j++)
            if (mat[0][i][j] != spm[i][j]) {
              f = 0;
              break;
            }
          if (f == 0)
            break;
        }
        if (f) {
          printf("Order=%d\n", ord);
          break;
        }
        *cp = 1;
        cp[1] = maxm;
        prod(cp, mat[n]);
        ord++;
        *cp = 2;
        cp[1] = m;
        cp[2] = n;
        prod(cp, spm);
      }
    }
    else if (strcmp(opt, "op") == 0) {
      scanf("%s", flnm);
      op = fopen(flnm, "w");
      printf("Input matrix nos to be saved preceded by their number\n");
      scanf("%d", &n);
      fprintf(op, "%4d%4d\n", dim, n);
      fault = 0;
      for (i = 1; i <= n; i++) {
        scanf("%d", &j);
        if (j < 0 || j >= maxm) {
          fprintf(stderr, "Invalid matrix number %d\n", j);
          fault = 1;
          break;
        }
        printmat(mat[j]);
      }
      seeknln();
      if (fault) {
        fclose(op);
        unlink(flnm);
        continue;
      }
      fclose(op);
    }
    else if (strcmp(opt, "q") == 0) {
      seeknln();
      break;
    }
    else {
      seeknln();
      printf("Invalid option.\n");
    }
  }
  exit(0);
}

void seeknln(void)
{
  while (getchar() != '\n')
    ;
}

Messung V0.5
C=95 H=84 G=89

¤ Dauer der Verarbeitung: 0.10 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge