home *** CD-ROM | disk | FTP | other *** search
- /*
- * chemtab - a periodic table data base (C) 1990 Jim King pulsar@lsrhs
- *
- * looke.c - look for an element, then print known stats
- */
-
- #include <curses.h>
- #include <stdio.h>
- #include <ctype.h>
- #include "element.h"
- #include "variables.h"
- #include "tune.h"
- #include "windows.h"
- #include "undefs.h"
-
- /*
- * matchstr(str)
- * input: string
- * return: int (number if found, 0 if not, -1 if ambiguous)
- * purpose: match chemical names
- */
- int matchstr(str)
- char *str;
- {
- int last, len, count = 0;
- struct elem *tmp;
-
- len = strlen(str);
-
- for (tmp = e; tmp != NULL; tmp = tmp->next) {
- if (!strncmp(str, tmp->name, len)) {
- last = tmp->anum;
- count++;
- }
- }
-
- if (!count) return(0);
- else if (count > 1) return(-1);
- else return(last);
- }
-
- /*
- * getlows(str)
- * input: none
- * output: string
- * purpose: get a lowercase string
- */
- char *getlows()
- {
- char input[80];
- int i;
-
- gets(input);
- for (i = 0; i < strlen(input); i++)
- input[i] = tolower(input[i]);
-
- return(input);
- }
-
- /*
- * disp(l)
- * input: l - int - referring to atomic number of elem. to display
- * output: curses only
- *
- * purpose: separate the displaying from the rest of the subroutine
- */
- disp(l)
- int l;
- {
- struct elem *tmp;
- int i;
-
- for (tmp = e; l != tmp->anum; tmp = tmp->next) ;
-
- wclear(mn); wrefresh(mn);
- wclear(graph);
- wmove(graph, 0, 0); wprintw(graph, "Atomic Name: %s", tmp->name);
- wmove(graph, 1, 0); wprintw(graph, "Atomic Symbol: %s", tmp->sym);
- wmove(graph, 2, 0); wprintw(graph, "Atomic Number: %d", tmp->anum);
- wmove(graph, 3, 0); wprintw(graph, "Atomic Mass: %3.3f a.m.u.", tmp->amass);
-
- if (tmp->melt == MEL)
- mvwaddstr(graph, 5, 0, "Melting Temp: NOT AVAILABLE");
- else {
- wmove(graph, 5, 0); wprintw(graph, "Melting Temp: %d Celcius (%4.0f Fahrenheit, %d Kelvin)", tmp->melt, ((float)tmp->melt * (9.0 / 5.0) + 32.0), tmp->melt + 273);
- }
- if (tmp->boil == BOI)
- mvwaddstr(graph, 6, 0, "Boiling Temp: NOT AVAILABLE");
-
- else {
- wmove(graph, 6, 0); wprintw(graph, "Boiling Temp: %d Celcius (%4.0f Fahrenheit, %d Kelvin)", tmp->boil, ((float)tmp->boil * (9.0 / 5.0) + 32.0), tmp->boil + 273);
- }
- if (tmp->spht == SPHT)
- mvwaddstr(graph, 8, 0, "Specific Heat: NOT AVAILABLE");
- else {
- wmove(graph, 8, 0); wprintw(graph, "Specific Heat: %1.3f Calories/gram-Celcius", tmp->spht);
- }
- if (tmp->dens == DENS)
- mvwaddstr(graph, 9, 0, "Density: NOT AVAILABLE");
- else {
- wmove(graph, 9, 0); wprintw(graph, "Density: %2.2f gram/cm cubed", tmp->dens);
- }
- if (tmp->arad == ARD)
- mvwaddstr(graph, 10, 0, "Atomic Radius: NOT AVAILABLE");
- else {
- wmove(graph, 10, 0); wprintw(graph, "Atomic Radius: %1.2f Angstroms", tmp->arad);
- }
- if (tmp->eneg == ENG)
- mvwaddstr(graph, 11, 0, "Electronegativity: NOT AVAILABLE");
- else {
- wmove(graph, 11, 0); wprintw(graph, "Electronegativity: %1.1f", tmp->eneg);
- }
- if (tmp->year == YEA)
- mvwaddstr(graph, 12, 0, "Discovery Year: ANCIENT, B.C.");
- else {
- wmove(graph, 12, 0); wprintw(graph, "Discovery Year: %d A.D.", tmp->year);
- }
- mvwaddstr(graph, 14, 0, "Family: ");
- switch(tmp->fam) {
- case 1: wprintw(graph, "IA (1)"); break;
- case 2: wprintw(graph, "IIA (2)"); break;
- case 3: wprintw(graph, "IB (3)"); break;
- case 4: wprintw(graph, "IIB (4)"); break;
- case 5: wprintw(graph, "IIIB (5)"); break;
- case 6: wprintw(graph, "IVB (6)"); break;
- case 7: wprintw(graph, "VB (7)"); break;
- case 8: wprintw(graph, "VIB (8)"); break;
- case 9: wprintw(graph, "VIIB (9)"); break;
- case 10: wprintw(graph, "VIIIB (10)"); break;
- case 11: wprintw(graph, "VIXB (11)"); break;
- case 12: wprintw(graph, "VXB (12)"); break;
- case 13: wprintw(graph, "IIIA (13)"); break;
- case 14: wprintw(graph, "IVA (14)"); break;
- case 15: wprintw(graph, "VA (15)"); break;
- case 16: wprintw(graph, "VIA (16)"); break;
- case 17: wprintw(graph, "VIIA (17)"); break;
- case 18: wprintw(graph, "VIIIA (18)"); break;
- default: break;
- }
- wmove(graph, 15, 0);
- wprintw(graph, "Row: %d\n", tmp->row);
- wrefresh(graph);
- capture(graph, 0, 0);
- spc(); /* space to continue? */
- }
-
- looke()
- {
- struct elem *tmp;
- char *strn, /* Random input string */
- srch[80], /* String comparison */
- c = '5'; /* choice input */
- int i, elk;
-
- noecho(); crmode();
- wclear(mn); wrefresh(mn);
- wclear(srt); wrefresh(srt);
- clear(); refresh();
-
- menu("View Elemental Information");
- mvwaddstr(mn, 2, 0, "Look for element by:");
- mvwaddstr(mn, 4, 0, "1] Atomic Name");
- mvwaddstr(mn, 5, 0, "2] Atomic Number");
- mvwaddstr(mn, 6, 0, "3] Atomic Symbol");
- mvwaddstr(mn, 7, 0, "4] Return to Main Menu");
- l9: mvwaddstr(mn, 9, 0, "Your Choice? ");
- wrefresh(mn);
- cur = mn; xp = 14; yp = 9;
- noecho();
- crmode();
- go: c = wgetch(mn);
- if (c == '?') { help(9); goto l9; }
- if (c < '1' || c > '4') goto go;
-
- if (c == '4') {
- wprintw(mn, "Return to Main Menu.");
- wrefresh(mn);
- wclear(mn);
- return(0);
- }
-
- if (c == '1') { /* look by name */
- wprintw(mn, "Look by Name (type in full or part of an element name)");
- wclrtoeol(mn);
- l10: mvwaddstr(mn, 11, 0, "Name of Element: ");
- wrefresh(mn);
- cur = mn; xp = 17; yp = 11;
- echo();
- nocrmode();
- strcpy(srch, getlows());
- if (srch[0] == '?') { help(10); goto l10; }
- }
-
- if (c == '2') { /* look by number */
- wprintw(mn, "Look by Number");
- wclrtoeol(mn);
- l11: mvwaddstr(mn, 11, 0, "Atomic Number: ");
- wrefresh(mn);
- cur = mn; xp = 17; yp = 11;
- echo();
- nocrmode();
- gets(srch);
- if (srch[0] == '?') { help(11); goto l11; }
- if (atoi(srch) < 1) looke();
- }
-
- if (c == '3') { /* look by symbol */
- wprintw(mn, "Look by Symbol");
- wclrtoeol(mn);
- l12: mvwaddstr(mn, 11, 0, "Atomic Symbol: ");
- wrefresh(mn);
- cur = mn; xp = 17; yp = 11;
- echo();
- nocrmode();
- gets(srch);
- if (srch[0] == '?') { help(12); goto l12; }
- }
-
- for (tmp = e; tmp != NULL; tmp = tmp->next) {
- switch(c) { /* then display it */
- case '1':
- elk = matchstr(srch);
- switch(elk) {
- case -1:
- if (c == '1')
- mvwaddstr(mn, 11, 0, "Element name is ambiguous.");
- else
- mvwaddstr(mn, 11, 0, "Element symbol is ambiguous.");
- wrefresh(mn);
- sleep(2);
- goto nd;
- case 0: break;
- default: disp(elk); goto nd;
- }
- break;
- case '3':
- if (strcmp(srch, tmp->sym) == 0) {
- disp(tmp->anum); goto nd;
- } else break;
- default:
- if (atoi(srch) == tmp->anum) {
- disp(tmp->anum); goto nd;
- } else
- break;
- }
- }
- mvwaddstr(mn, 10, 0, "No such element:");
- wrefresh(mn);
- sleep(2);
- nd: wclear(graph); wrefresh(graph);
- wclear(mn); wrefresh(mn);
- looke();
- }
-