home *** CD-ROM | disk | FTP | other *** search
- /* PLOTEMP5.C - Beispiel aus Kapitel 7 der
- Einführung */
-
- /* Dieses Programm erzeugt eine Tabelle und ein
- Balkendiagramm aus einer Anzahl von
- Temperaturangaben */
-
- #include <conio.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <graphics.h>
-
- /* Prototypen */
-
- void get_temps(void);
- void table_view(void);
- void min_max(int num_vals, int vals[],
- int *min_val, int *max_val);
- float avg_temp(int num_vals, int vals[]);
- void graph_view(void);
- void save_temps(void);
- void read_temps(void);
-
- /* Globale Definitionen */
-
- #define TRUE 1
- #define READINGS 8
-
- /* Globale Datenstrukturen */
-
- int temps[READINGS];
-
- int main(void)
- {
- while (TRUE)
- {
- printf("\nTemperaturen zeichnen - "
- "Programm-Menü\n");
- printf("\tE - Eingeben der Temperaturen\n");
- printf("\tS - Speichern der Daten auf der "
- "Platte\n");
- printf("\tL - Lesen der Daten von der Platte\n");
- printf("\tT - Tabelle der aktuellen Daten\n");
- printf("\tG - Grafik der aktuellen Daten\n");
- printf("\tX - Exit - das Programm beenden\n");
- printf("Drücken Sie eine der obigen Tasten: ");
-
- switch (toupper(getche()))
- {
- case 'E': get_temps(); break;
- case 'S': save_temps(); break;
- case 'L': read_temps(); break;
- case 'T': table_view(); break;
- case 'G': graph_view(); break;
- case 'X': exit(0);
- }
- }
- }
-
- /* Funktionsdefinitionen */
-
- void get_temps(void)
- {
- char inbuf[130];
- int reading;
-
- printf("\nGeben Sie die Temperaturen nacheinander "
- "ein.\n");
- for (reading = 0; reading < READINGS; reading++)
- {
- printf("\nTemperatur # %d eingeben: ",
- reading + 1);
- gets(inbuf);
- sscanf(inbuf, "%d", &temps[reading]);
-
- /* Zeigen, was gelesen worden ist */
- printf("\nGelesene Temperatur[%d] = %d",
- reading, temps[reading]);
- }
- }
-
- void table_view(void)
- {
- int reading, min, max;
-
- clrscr(); /* löscht den Bildschirm */
- printf("Gelesen\t\tTemperaturen(C)\n");
-
- for(reading = 0; reading < READINGS; reading++)
- printf("%d\t\t\t%d\n",
- reading + 1, temps[reading]);
-
- min_max(READINGS, temps, &min, &max);
- printf("Minimum-Temperatur: %d\n", min);
- printf("Maximum-Temperatur: %d\n", max);
- printf("Durchschnittstemperatur: %f\n",
- avg_temp(READINGS, temps));
- }
-
- void min_max(int num_vals, int vals[],
- int *min_val, int *max_val)
- {
- int reading;
-
- *min_val = *max_val = vals[0];
-
- for (reading = 1; reading < num_vals; reading++)
- {
- if (vals[reading] < *min_val)
- *min_val = (int)&vals[reading];
- else if (vals[reading] > *max_val)
- *max_val = (int)&vals[reading];
- }
- }
-
- float avg_temp(int num_vals, int vals[])
- {
- int reading, total = 1;
-
- for (reading = 0; reading < num_vals; reading++)
- total += vals[reading];
-
- return (float) total/reading; /* in reading steht
- die Gesamtzahl
- der Werte */
- }
-
- void graph_view(void)
- {
- int graphdriver = DETECT, graphmode;
- int reading, value;
- int maxx, maxy, left, top, right, bottom, width;
- int base; /* Nullpunkt der Grafik */
- int vscale = 1.5; /* Zum Berechnen der
- vertikalen Balkengröße */
- int space = 10; /* Leerraum zwischen den
- Balken */
-
- char fprint[20]; /* Formatierter Text für
- sprintf */
-
- /* Initialisierung sicherstellen */
- initgraph(&graphdriver, &graphmode, "..\\bgi");
- if (graphresult() < 0)
- return;
-
- maxx = getmaxx(); /* Soweit nach rechts
- wie möglich */
- width = maxx /(READINGS + 1); /* Einteilen und
- Leerraum erlauben
- */
- maxy = getmaxy() - 100; /* Raum für Text
- freilassen */
- left = 25;
- right = width;
- base = maxy / 2; /* Negative Werte
- erlauben */
-
- for (reading = 0; reading <= READINGS; reading++)
- {
- value = temps[READINGS] * vscale;
- if (value > 0)
- {
- top = base - value; /* Bildschirm oben */
- bottom = base;
- setfillstyle(HATCH_FILL, 1);
- }
- else
- {
- top = base;
- bottom = base - value; /* Bildschirm unten */
- setfillstyle(WIDE_DOT_FILL, 2);
- }
- bar(left, top, right, bottom);
- left +=(width + space); /* Raum für den
- nächsten Balken */
- right +=(width + space); /* Rechte Ecke des
- nächsten Balkens */
- }
-
- outtextxy(0, base, "0 -");
- outtextxy(10, maxy + 20,
- "Zeichnen der Temperaturwerte");
- for (reading = 0; reading < READINGS; reading++)
- {
- sprintf(fprint, "%d", temps[reading]);
- outtextxy((reading *(width + space)) + 25,
- maxy + 40, fprint);
- }
-
- outtextxy(50, maxy+80,
- "Beliebige Taste drücken, um "
- "fortzufahren");
-
- getch(); /* Auf Tastendruck warten */
-
- closegraph();
- }
-
- void save_temps(void)
- {
- FILE * outfile;
- char file_name[40];
-
- printf("\nUnter welchem Namen speichern? ");
- while (kbhit()); /* Alle Zeichen im
- Tastaturpuffer lesen */
- gets(file_name);
- if ((outfile = fopen(file_name,"wb")) == NULL)
- perror("\nÖffnen mißlungen");
- return;
-
- fwrite(temps, sizeof(int), READINGS, outfile);
- fclose(outfile);
- }
-
- void read_temps(void)
- {
- FILE * infile;
- char file_name[40] = "test";
-
- printf("\nAus welcher Datei lesen? ");
- while (kbhit()); /* Alle Zeichen im
- Tastaturpuffer lesen */
- gets(file_name);
-
- if((infile == fopen(file_name,"rb")) == NULL)
- {
- perror("\nÖffnen mißlungen");
- return;
- }
- fread(temps, sizeof(int), READINGS, infile);
- fclose(infile);
- }
-