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

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