home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / examples / plotemp5.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-10  |  6.1 KB  |  236 lines

  1. /* PLOTEMP5.C - Beispiel aus Kapitel 7 der
  2.                 Einführung */
  3.  
  4. /* Dieses Programm erzeugt eine Tabelle und ein
  5.    Balkendiagramm aus einer Anzahl von
  6.    Temperaturangaben */
  7.  
  8. #include <conio.h>
  9. #include <ctype.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <graphics.h>
  13.  
  14. /* Prototypen */
  15.  
  16. void  get_temps(void);
  17. void  table_view(void);
  18. void  min_max(int num_vals, int vals[],
  19.               int *min_val, int *max_val);
  20. float avg_temp(int num_vals, int vals[]);
  21. void  graph_view(void);
  22. void  save_temps(void);
  23. void  read_temps(void);
  24.  
  25. /* Globale Definitionen */
  26.  
  27. #define TRUE      1
  28. #define READINGS  8
  29.  
  30. /* Globale Datenstrukturen */
  31.  
  32. int  temps[READINGS];
  33.  
  34. int  main(void)
  35. {
  36.    while (TRUE)
  37.    {
  38.       printf("\nTemperaturen zeichnen - "
  39.              "Programm-Menü\n");
  40.       printf("\tE - Eingeben der Temperaturen\n");
  41.       printf("\tS - Speichern der Daten auf der "
  42.              "Platte\n");
  43.       printf("\tL - Lesen der Daten von der Platte\n");
  44.       printf("\tT - Tabelle der aktuellen Daten\n");
  45.       printf("\tG - Grafik der aktuellen Daten\n");
  46.       printf("\tX - Exit - das Programm beenden\n");
  47.       printf("Drücken Sie eine der obigen Tasten: ");
  48.  
  49.       switch (toupper(getche()))
  50.       {
  51.          case 'E': get_temps();  break;
  52.          case 'S': save_temps(); break;
  53.      case 'L': read_temps(); break;
  54.          case 'T': table_view(); break;
  55.          case 'G': graph_view(); break;
  56.          case 'X': exit(0);
  57.       }
  58.    }
  59. }
  60.  
  61. /* Funktionsdefinitionen */
  62.  
  63. void get_temps(void)
  64. {
  65.    char inbuf[130];
  66.    int  reading;
  67.  
  68.    printf("\nGeben Sie die Temperaturen nacheinander "
  69.           "ein.\n");
  70.    for (reading = 0; reading < READINGS; reading++)
  71.    {
  72.       printf("\nTemperatur # %d eingeben: ",
  73.              reading + 1);
  74.       gets(inbuf);
  75.       sscanf(inbuf, "%d", &temps[reading]);
  76.  
  77.       /* Zeigen, was gelesen worden ist */
  78.       printf("\nGelesene Temperatur[%d] = %d",
  79.              reading, temps[reading]);
  80.    }
  81. }
  82.  
  83. void  table_view(void)
  84. {
  85.    int reading, min, max;
  86.  
  87.    clrscr();       /* löscht den Bildschirm */
  88.    printf("Gelesen\t\tTemperaturen(C)\n");
  89.  
  90.    for(reading = 0; reading < READINGS; reading++)
  91.       printf("%d\t\t\t%d\n",
  92.              reading + 1, temps[reading]);
  93.  
  94.    min_max(READINGS, temps, &min, &max);
  95.    printf("Minimum-Temperatur: %d\n", min);
  96.    printf("Maximum-Temperatur: %d\n", max);
  97.    printf("Durchschnittstemperatur: %f\n",
  98.           avg_temp(READINGS, temps));
  99. }
  100.  
  101. void  min_max(int num_vals, int vals[],
  102.               int *min_val, int *max_val)
  103. {
  104.    int reading;
  105.  
  106.    *min_val = *max_val = vals[0];
  107.  
  108.    for (reading = 1; reading < num_vals; reading++)
  109.    {
  110.       if (vals[reading] < *min_val)
  111.      *min_val = (int)&vals[reading];
  112.       else if (vals[reading] > *max_val)
  113.      *max_val = (int)&vals[reading];
  114.    }
  115. }
  116.  
  117. float avg_temp(int num_vals, int vals[])
  118. {
  119.    int reading, total = 1;
  120.  
  121.    for (reading = 0; reading < num_vals; reading++)
  122.       total += vals[reading];
  123.  
  124.    return (float) total/reading; /* in reading steht
  125.                                     die Gesamtzahl
  126.                                     der Werte */
  127. }
  128.  
  129. void  graph_view(void)
  130. {
  131.    int  graphdriver = DETECT, graphmode;
  132.    int  reading, value;
  133.    int  maxx, maxy, left, top, right, bottom, width;
  134.    int  base;          /* Nullpunkt der Grafik */
  135.    int  vscale = 1.5;  /* Zum Berechnen der
  136.                           vertikalen Balkengröße */
  137.    int  space = 10;    /* Leerraum zwischen den
  138.                           Balken */
  139.  
  140.    char fprint[20];    /* Formatierter Text für
  141.                           sprintf */
  142.  
  143.    /* Initialisierung sicherstellen */
  144.    initgraph(&graphdriver, &graphmode, "..\\bgi");
  145.    if (graphresult() < 0)           
  146.       return;
  147.  
  148.    maxx  = getmaxx();            /* Soweit nach rechts
  149.                                     wie möglich */
  150.    width = maxx /(READINGS + 1); /* Einteilen und
  151.                                     Leerraum erlauben
  152.                  */
  153.    maxy  = getmaxy() - 100;      /* Raum für Text
  154.                                     freilassen */
  155.    left  = 25;
  156.    right = width;
  157.    base  = maxy / 2;             /* Negative Werte
  158.                                     erlauben */
  159.  
  160.    for (reading = 0; reading <= READINGS; reading++)
  161.    {
  162.       value = temps[READINGS] * vscale;
  163.       if (value > 0)
  164.       {
  165.      top = base - value;     /* Bildschirm oben */
  166.          bottom = base;
  167.          setfillstyle(HATCH_FILL, 1);
  168.       }
  169.       else
  170.       {
  171.          top = base;
  172.      bottom = base - value;  /* Bildschirm unten */
  173.      setfillstyle(WIDE_DOT_FILL, 2);
  174.       }
  175.       bar(left, top, right, bottom);
  176.       left  +=(width + space);   /* Raum für den
  177.                                     nächsten Balken */
  178.       right +=(width + space);   /* Rechte Ecke des
  179.                                     nächsten Balkens */
  180.    }
  181.  
  182.    outtextxy(0, base, "0 -");
  183.    outtextxy(10, maxy + 20,
  184.              "Zeichnen der Temperaturwerte");
  185.    for (reading = 0; reading < READINGS; reading++)
  186.    {
  187.       sprintf(fprint, "%d", temps[reading]);
  188.       outtextxy((reading *(width + space)) + 25,
  189.                  maxy + 40, fprint);
  190.    }
  191.  
  192.    outtextxy(50, maxy+80,
  193.          "Beliebige Taste drücken, um "
  194.          "fortzufahren");
  195.  
  196.    getch();               /* Auf Tastendruck warten */
  197.  
  198.    closegraph();
  199. }
  200.  
  201. void  save_temps(void)
  202. {
  203.    FILE * outfile;
  204.    char file_name[40];
  205.  
  206.    printf("\nUnter welchem Namen speichern? ");
  207.    while (kbhit());     /* Alle Zeichen im
  208.                            Tastaturpuffer lesen */
  209.    gets(file_name);
  210.    if ((outfile = fopen(file_name,"wb")) == NULL)
  211.       perror("\nÖffnen mißlungen");
  212.       return;
  213.  
  214.    fwrite(temps, sizeof(int), READINGS, outfile);
  215.    fclose(outfile);
  216. }
  217.  
  218. void  read_temps(void)
  219. {
  220.    FILE * infile;
  221.    char file_name[40] = "test";
  222.  
  223.    printf("\nAus welcher Datei lesen? ");
  224.    while (kbhit());     /* Alle Zeichen im
  225.                            Tastaturpuffer lesen */
  226.    gets(file_name);
  227.  
  228.    if((infile == fopen(file_name,"rb")) == NULL)
  229.    {
  230.       perror("\nÖffnen mißlungen");
  231.       return;
  232.    }
  233.    fread(temps, sizeof(int), READINGS, infile);
  234.    fclose(infile);
  235. }
  236.